* 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/ibft: ibft: Fix finding IBFT ACPI table on UEFI
Unified · Split
| @@ -746,6 +746,37 @@ static void __exit ibft_exit(void) · 745 unmodified lines | ||
| 746 | 746 | ibft_cleanup(); |
| 747 | 747 | } |
| 748 | 748 | |
| 749 | +#ifdef CONFIG_ACPI | |
| 750 | +static 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 | + | |
| 761 | +static 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 | |
| 775 | +static void __init acpi_find_ibft_region(void) | |
| 776 | +{ | |
| 777 | +} | |
| 778 | +#endif | |
| 779 | + | |
| 749 | 780 | /* |
| 750 | 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 | 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 | 795 | if (ibft_addr) { |
| 757 | − printk(KERN_INFO "iBFT detected at 0x%llx.\n", | |
| 758 | − (u64)isa_virt_to_bus(ibft_addr)); | |
| 796 | + pr_info("iBFT detected.\n"); | |
| 759 | 797 | |
| 760 | 798 | rc = ibft_check_device(); |
| 761 | 799 | if (rc) |
| @@ -45,13 +45,6 @@ EXPORT_SYMBOL_GPL(ibft_addr); · 44 unmodified lines | ||
| 45 | 45 | static const struct { |
| 46 | 46 | char *sign; |
| 47 | 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 | 48 | { "iBFT" }, |
| 56 | 49 | { "BIFT" }, /* Broadcom iSCSI Offload */ |
| 57 | 50 | }; |
| @@ -62,14 +55,6 @@ static const struct { · 4 unmodified lines | ||
| 62 | 55 | #define VGA_MEM 0xA0000 /* VGA buffer */ |
| 63 | 56 | #define VGA_SIZE 0x20000 /* 128kB */ |
| 64 | 57 | |
| 65 | −#ifdef CONFIG_ACPI | |
| 66 | −static 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 | − | |
| 73 | 58 | static int __init find_ibft_in_mem(void) |
| 74 | 59 | { |
| 75 | 60 | unsigned long pos; |
| @@ -94,6 +79,7 @@ static int __init find_ibft_in_mem(void) · 18 unmodified lines | ||
| 94 | 79 | * the table cannot be valid. */ |
| 95 | 80 | if (pos + len <= (IBFT_END-1)) { |
| 96 | 81 | ibft_addr = (struct acpi_table_ibft *)virt; |
| 82 | + pr_info("iBFT found at 0x%lx.\n", pos); | |
| 97 | 83 | goto done; |
| 98 | 84 | } |
| 99 | 85 | } |
| @@ -108,20 +94,12 @@ done: · 8 unmodified lines | ||
| 108 | 94 | */ |
| 109 | 95 | unsigned long __init find_ibft_region(unsigned long *sizep) |
| 110 | 96 | { |
| 111 | −#ifdef CONFIG_ACPI | |
| 112 | − int i; | |
| 113 | −#endif | |
| 114 | 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 | 99 | /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will |
| 122 | 100 | * only use ACPI for this */ |
| 123 | 101 | |
| 124 | − if (!ibft_addr && !efi_enabled) | |
| 102 | + if (!efi_enabled) | |
| 125 | 103 | find_ibft_in_mem(); |
| 126 | 104 | |
| 127 | 105 | if (ibft_addr) { |