aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad@kernel.org>2010-04-08 12:35:55 -0400
committerKonrad Rzeszutek Wilk <konrad@kernel.org>2010-05-11 13:02:37 -0400
commit1303a35bfe153370cddb1b6e58e2287469e35f34 (patch)
treeb0ed308023b36f1616a0b18cc18c3d12c8160bac /drivers/firmware
parent4e639fdf0d0d745648aa62228ab8a0d9c03a563f (diff)
ibft: For UEFI machines actually do scan ACPI for iBFT.
For machines with IBFT 1.03 do scan the ACPI table for 'iBFT' or for 'IBFT'. If the machine is in UEFI mode, only do the ACPI table scan. For all other machines (pre IBFT 1.03) do a memory scan if not found in the ACPI tables. Signed-off-by: Peter Jones <pjones@redhat.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad@kernel.org> Tested-by: Mike Christie <michaelc@cs.wisc.edu>
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/iscsi_ibft_find.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/drivers/firmware/iscsi_ibft_find.c b/drivers/firmware/iscsi_ibft_find.c
index dd85555d3296..82a7a1566290 100644
--- a/drivers/firmware/iscsi_ibft_find.c
+++ b/drivers/firmware/iscsi_ibft_find.c
@@ -57,23 +57,12 @@ static int __init acpi_find_ibft(struct acpi_table_header *header)
57} 57}
58#endif /* CONFIG_ACPI */ 58#endif /* CONFIG_ACPI */
59 59
60/* 60static int __init find_ibft_in_mem(void)
61 * Routine used to find the iSCSI Boot Format Table. The logical
62 * kernel address is set in the ibft_addr global variable.
63 */
64unsigned long __init find_ibft_region(unsigned long *sizep)
65{ 61{
66 unsigned long pos; 62 unsigned long pos;
67 unsigned int len = 0; 63 unsigned int len = 0;
68 void *virt; 64 void *virt;
69 65
70 ibft_addr = NULL;
71
72 /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
73 * only use ACPI for this */
74 if (efi_enabled)
75 return 0;
76
77 for (pos = IBFT_START; pos < IBFT_END; pos += 16) { 66 for (pos = IBFT_START; pos < IBFT_END; pos += 16) {
78 /* The table can't be inside the VGA BIOS reserved space, 67 /* The table can't be inside the VGA BIOS reserved space,
79 * so skip that area */ 68 * so skip that area */
@@ -92,6 +81,17 @@ unsigned long __init find_ibft_region(unsigned long *sizep)
92 } 81 }
93 } 82 }
94 } 83 }
84 return len;
85}
86/*
87 * Routine used to find the iSCSI Boot Format Table. The logical
88 * kernel address is set in the ibft_addr global variable.
89 */
90unsigned long __init find_ibft_region(unsigned long *sizep)
91{
92
93 ibft_addr = NULL;
94
95#ifdef CONFIG_ACPI 95#ifdef CONFIG_ACPI
96 /* 96 /*
97 * One spec says "IBFT", the other says "iBFT". We have to check 97 * One spec says "IBFT", the other says "iBFT". We have to check
@@ -102,6 +102,13 @@ unsigned long __init find_ibft_region(unsigned long *sizep)
102 if (!ibft_addr) 102 if (!ibft_addr)
103 acpi_table_parse("iBFT", acpi_find_ibft); 103 acpi_table_parse("iBFT", acpi_find_ibft);
104#endif /* CONFIG_ACPI */ 104#endif /* CONFIG_ACPI */
105
106 /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
107 * only use ACPI for this */
108
109 if (!ibft_addr && !efi_enabled)
110 find_ibft_in_mem();
111
105 if (ibft_addr) { 112 if (ibft_addr) {
106 *sizep = PAGE_ALIGN(ibft_addr->header.length); 113 *sizep = PAGE_ALIGN(ibft_addr->header.length);
107 return (u64)isa_virt_to_bus(ibft_addr); 114 return (u64)isa_virt_to_bus(ibft_addr);