diff options
| -rw-r--r-- | drivers/firmware/iscsi_ibft.c | 42 | ||||
| -rw-r--r-- | drivers/firmware/iscsi_ibft_find.c | 26 |
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 | ||
| 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 | * 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); | |||
| 45 | static const struct { | 45 | static 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 | ||
| 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 | static int __init find_ibft_in_mem(void) | 58 | static 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 | */ |
| 109 | unsigned long __init find_ibft_region(unsigned long *sizep) | 95 | unsigned 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) { |
