aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-12-15 17:16:47 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-12-15 17:16:47 -0500
commit6f12d2ee52dcf97dcefdadbd500e7650311eaa6a (patch)
treec202e2cfcfec48a841bf89ea808f1e42ba5db2a6 /drivers/firmware
parent88703f27758211fdda9bbbdf837330b27479e2b9 (diff)
parent935a9fee51c945b8942be2d7b4bae069167b4886 (diff)
Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/ibft
* 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/ibft: ibft: Fix finding IBFT ACPI table on UEFI
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/iscsi_ibft.c42
-rw-r--r--drivers/firmware/iscsi_ibft_find.c26
2 files changed, 42 insertions, 26 deletions
diff --git a/drivers/firmware/iscsi_ibft.c b/drivers/firmware/iscsi_ibft.c
index c811cb107904..2cce44a1d7d0 100644
--- a/drivers/firmware/iscsi_ibft.c
+++ b/drivers/firmware/iscsi_ibft.c
@@ -746,6 +746,37 @@ static void __exit ibft_exit(void)
746 ibft_cleanup(); 746 ibft_cleanup();
747} 747}
748 748
749#ifdef CONFIG_ACPI
750static const struct {
751 char *sign;
752} ibft_signs[] = {
753 /*
754 * One spec says "IBFT", the other says "iBFT". We have to check
755 * for both.
756 */
757 { ACPI_SIG_IBFT },
758 { "iBFT" },
759};
760
761static void __init acpi_find_ibft_region(void)
762{
763 int i;
764 struct acpi_table_header *table = NULL;
765
766 if (acpi_disabled)
767 return;
768
769 for (i = 0; i < ARRAY_SIZE(ibft_signs) && !ibft_addr; i++) {
770 acpi_get_table(ibft_signs[i].sign, 0, &table);
771 ibft_addr = (struct acpi_table_ibft *)table;
772 }
773}
774#else
775static void __init acpi_find_ibft_region(void)
776{
777}
778#endif
779
749/* 780/*
750 * ibft_init() - creates sysfs tree entries for the iBFT data. 781 * ibft_init() - creates sysfs tree entries for the iBFT data.
751 */ 782 */
@@ -753,9 +784,16 @@ static int __init ibft_init(void)
753{ 784{
754 int rc = 0; 785 int rc = 0;
755 786
787 /*
788 As on UEFI systems the setup_arch()/find_ibft_region()
789 is called before ACPI tables are parsed and it only does
790 legacy finding.
791 */
792 if (!ibft_addr)
793 acpi_find_ibft_region();
794
756 if (ibft_addr) { 795 if (ibft_addr) {
757 printk(KERN_INFO "iBFT detected at 0x%llx.\n", 796 pr_info("iBFT detected.\n");
758 (u64)isa_virt_to_bus(ibft_addr));
759 797
760 rc = ibft_check_device(); 798 rc = ibft_check_device();
761 if (rc) 799 if (rc)
diff --git a/drivers/firmware/iscsi_ibft_find.c b/drivers/firmware/iscsi_ibft_find.c
index bfe723266fd8..4da4eb9ae926 100644
--- a/drivers/firmware/iscsi_ibft_find.c
+++ b/drivers/firmware/iscsi_ibft_find.c
@@ -45,13 +45,6 @@ EXPORT_SYMBOL_GPL(ibft_addr);
45static const struct { 45static const struct {
46 char *sign; 46 char *sign;
47} ibft_signs[] = { 47} ibft_signs[] = {
48#ifdef CONFIG_ACPI
49 /*
50 * One spec says "IBFT", the other says "iBFT". We have to check
51 * for both.
52 */
53 { ACPI_SIG_IBFT },
54#endif
55 { "iBFT" }, 48 { "iBFT" },
56 { "BIFT" }, /* Broadcom iSCSI Offload */ 49 { "BIFT" }, /* Broadcom iSCSI Offload */
57}; 50};
@@ -62,14 +55,6 @@ static const struct {
62#define VGA_MEM 0xA0000 /* VGA buffer */ 55#define VGA_MEM 0xA0000 /* VGA buffer */
63#define VGA_SIZE 0x20000 /* 128kB */ 56#define VGA_SIZE 0x20000 /* 128kB */
64 57
65#ifdef CONFIG_ACPI
66static int __init acpi_find_ibft(struct acpi_table_header *header)
67{
68 ibft_addr = (struct acpi_table_ibft *)header;
69 return 0;
70}
71#endif /* CONFIG_ACPI */
72
73static int __init find_ibft_in_mem(void) 58static int __init find_ibft_in_mem(void)
74{ 59{
75 unsigned long pos; 60 unsigned long pos;
@@ -94,6 +79,7 @@ static int __init find_ibft_in_mem(void)
94 * the table cannot be valid. */ 79 * the table cannot be valid. */
95 if (pos + len <= (IBFT_END-1)) { 80 if (pos + len <= (IBFT_END-1)) {
96 ibft_addr = (struct acpi_table_ibft *)virt; 81 ibft_addr = (struct acpi_table_ibft *)virt;
82 pr_info("iBFT found at 0x%lx.\n", pos);
97 goto done; 83 goto done;
98 } 84 }
99 } 85 }
@@ -108,20 +94,12 @@ done:
108 */ 94 */
109unsigned long __init find_ibft_region(unsigned long *sizep) 95unsigned long __init find_ibft_region(unsigned long *sizep)
110{ 96{
111#ifdef CONFIG_ACPI
112 int i;
113#endif
114 ibft_addr = NULL; 97 ibft_addr = NULL;
115 98
116#ifdef CONFIG_ACPI
117 for (i = 0; i < ARRAY_SIZE(ibft_signs) && !ibft_addr; i++)
118 acpi_table_parse(ibft_signs[i].sign, acpi_find_ibft);
119#endif /* CONFIG_ACPI */
120
121 /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will 99 /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
122 * only use ACPI for this */ 100 * only use ACPI for this */
123 101
124 if (!ibft_addr && !efi_enabled) 102 if (!efi_enabled)
125 find_ibft_in_mem(); 103 find_ibft_in_mem();
126 104
127 if (ibft_addr) { 105 if (ibft_addr) {