Messages in this thread Patch in this message | | | Date | Thu, 08 Dec 2011 00:22:19 -0800 | From | Yinghai Lu <> | Subject | [PATCH] ibft: Fix finding ibft with ACPI tables |
| |
Found one system with UEFI/iBFT is not detected.
the root cause: for x86, We move calling of find_ibft_region() much earlier. in setup_arch() before ACPI is enabled.
Try to all find_ibft_region() second times 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 printing. For legacy one, print the found address early.
Signed-off-by: Yinghai Lu <yinghai.lu@kernel.org>
--- drivers/firmware/iscsi_ibft.c | 18 +++++++++++++++--- drivers/firmware/iscsi_ibft_find.c | 1 + 2 files changed, 16 insertions(+), 3 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,21 @@ static int __init ibft_init(void) { int rc = 0; + /* find that from acpi tables */ + if (!ibft_addr) { + unsigned long size = 0; + + find_ibft_region(&size); + barrier(); + } + if (ibft_addr) { - printk(KERN_INFO "iBFT detected at 0x%llx.\n", - (u64)isa_virt_to_bus(ibft_addr)); + /* + * Second try is from acpi permanent map with ioremap + * can not simply convert back to phys addr. + * and We don't need to print that table phys addr. + */ + pr_info("iBFT detected.\n"); rc = ibft_check_device(); if (rc) @@ -770,7 +782,7 @@ static int __init ibft_init(void) if (rc) goto out_free; } else - printk(KERN_INFO "No iBFT detected.\n"); + pr_info("No iBFT detected.\n"); return 0; 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; } }
| |