History

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

Linus Torvalds committed 14 years ago

Commit 6f12d2e2 parents 88703f2 935a9fe2 files · +42 −26Browse files

Unified · Split

2 files
  1. drivers/firmware/iscsi_ibft.c +40 −2
  2. drivers/firmware/iscsi_ibft_find.c +2 −24
drivers/firmware/iscsi_ibft.c+40−2
@@ -746,6 +746,37 @@ static void __exit ibft_exit(void) · 745 unmodified lines
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) · 1 unmodified line
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)
drivers/firmware/iscsi_ibft_find.c+2−24
@@ -45,13 +45,6 @@ EXPORT_SYMBOL_GPL(ibft_addr); · 44 unmodified lines
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 { · 4 unmodified lines
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) · 18 unmodified lines
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: · 8 unmodified lines
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 will99 /* 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) {