Re: [PATCH -v2] ibft: Fix finding IBFT ACPI table on UEFI

From: Konrad Rzeszutek Wilk
Date: Thu Dec 08 2011 - 14:08:31 EST


On Thu, Dec 08, 2011 at 08:52:33AM -0800, Yinghai Lu wrote:
>
> Found one system with UEFI/iBFT, Kernel does not detect the iBFT during
^^^^^ - lowercase 'kernel' please.
> iscsi_ibft module loading.

I get this when compiling it:

Setup is 16588 bytes (padded to 16896 bytes).
System is 6277 kB
CRC 7fe65506
Kernel: arch/x86/boot/bzImage is ready (#2)
ERROR: "find_ibft_region" [drivers/firmware/iscsi_ibft.ko] undefined!

This is on i386 x86 build when doing 'make allmodconfig'.

>
> the root cause: for x86, We have calling of find_ibft_region() much early.
^^ - You only need to uppercase it if you
start a sentence - which is not what you are doing. So please make it
lowercase.
> in setup_arch() before ACPI is enabled.

This is what I changed the git description to:

Root cause: on x86 (UEFI), we are calling find_ibft_region() much
earlier - specifically in setup_arch() before ACPI is enabled.

>
> Try to call find_ibft_region() second time in ibft_init().
>
> At that time ACPI iBFT already get permanent mapped with ioremap.
> So isa_virt_to_bus will get wrong phys from right virt address.
> We could just skip that phys address printing.
>
> For legacy one, print the found address early.
>
> -v2: update comments and description according to Konrad.
>
> Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx>
>
> ---
> drivers/firmware/iscsi_ibft.c | 14 ++++++++++++--
> drivers/firmware/iscsi_ibft_find.c | 1 +
> 2 files changed, 13 insertions(+), 2 deletions(-)
>
> Index: linux-2.6/drivers/firmware/iscsi_ibft.c
> ===================================================================
> --- linux-2.6.orig/drivers/firmware/iscsi_ibft.c
> +++ linux-2.6/drivers/firmware/iscsi_ibft.c
> @@ -753,9 +753,19 @@ static int __init ibft_init(void)
> {
> int rc = 0;
>
> + /*
> + Retry as on UEFI systems the setup_arch()/find_ibft_region()
> + is called before ACPI tables are parsed so we never
> + get the data.
> + */
> + if (!ibft_addr) {
> + unsigned long size = 0;
> +
> + find_ibft_region(&size);
> + }
> +
> if (ibft_addr) {
> - printk(KERN_INFO "iBFT detected at 0x%llx.\n",
> - (u64)isa_virt_to_bus(ibft_addr));
> + pr_info("iBFT detected.\n");
>
> rc = ibft_check_device();
> if (rc)
> Index: linux-2.6/drivers/firmware/iscsi_ibft_find.c
> ===================================================================
> --- linux-2.6.orig/drivers/firmware/iscsi_ibft_find.c
> +++ linux-2.6/drivers/firmware/iscsi_ibft_find.c
> @@ -94,6 +94,7 @@ static int __init find_ibft_in_mem(void)
> * the table cannot be valid. */
> if (pos + len <= (IBFT_END-1)) {
> ibft_addr = (struct acpi_table_ibft *)virt;
> + pr_info("iBFT found at 0x%lx.\n", pos);
> goto done;
> }
> }
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/