diff options
author | Andrey Panin <pazke@donpac.ru> | 2005-06-25 17:54:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-25 19:24:27 -0400 |
commit | aea00143a8db8c0b31dca85bff3c325444d93f0f (patch) | |
tree | 32bac9ee3f0017f36dedd270f166c4def609f1ad /arch/i386/kernel/acpi | |
parent | 856509d5da74aefeabe92a8df039cc472f4f7c5f (diff) |
[PATCH] dmi: move ACPI boot quirk
This patch moves ACPI boot quirks out of dmi_scan.c
Signed-off-by: Andrey Panin <pazke@donpac.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/i386/kernel/acpi')
-rw-r--r-- | arch/i386/kernel/acpi/boot.c | 219 |
1 files changed, 217 insertions, 2 deletions
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index 848bb97af7ca..0771596c5496 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/efi.h> | 29 | #include <linux/efi.h> |
30 | #include <linux/irq.h> | 30 | #include <linux/irq.h> |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/dmi.h> | ||
32 | 33 | ||
33 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
34 | #include <asm/io_apic.h> | 35 | #include <asm/io_apic.h> |
@@ -815,6 +816,218 @@ acpi_process_madt(void) | |||
815 | return; | 816 | return; |
816 | } | 817 | } |
817 | 818 | ||
819 | extern int acpi_force; | ||
820 | |||
821 | #ifdef __i386__ | ||
822 | |||
823 | #ifdef CONFIG_ACPI_PCI | ||
824 | static int __init disable_acpi_irq(struct dmi_system_id *d) | ||
825 | { | ||
826 | if (!acpi_force) { | ||
827 | printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n", | ||
828 | d->ident); | ||
829 | acpi_noirq_set(); | ||
830 | } | ||
831 | return 0; | ||
832 | } | ||
833 | |||
834 | static int __init disable_acpi_pci(struct dmi_system_id *d) | ||
835 | { | ||
836 | if (!acpi_force) { | ||
837 | printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", | ||
838 | d->ident); | ||
839 | acpi_disable_pci(); | ||
840 | } | ||
841 | return 0; | ||
842 | } | ||
843 | #endif | ||
844 | |||
845 | static int __init dmi_disable_acpi(struct dmi_system_id *d) | ||
846 | { | ||
847 | if (!acpi_force) { | ||
848 | printk(KERN_NOTICE "%s detected: acpi off\n",d->ident); | ||
849 | disable_acpi(); | ||
850 | } else { | ||
851 | printk(KERN_NOTICE | ||
852 | "Warning: DMI blacklist says broken, but acpi forced\n"); | ||
853 | } | ||
854 | return 0; | ||
855 | } | ||
856 | |||
857 | /* | ||
858 | * Limit ACPI to CPU enumeration for HT | ||
859 | */ | ||
860 | static int __init force_acpi_ht(struct dmi_system_id *d) | ||
861 | { | ||
862 | if (!acpi_force) { | ||
863 | printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident); | ||
864 | disable_acpi(); | ||
865 | acpi_ht = 1; | ||
866 | } else { | ||
867 | printk(KERN_NOTICE | ||
868 | "Warning: acpi=force overrules DMI blacklist: acpi=ht\n"); | ||
869 | } | ||
870 | return 0; | ||
871 | } | ||
872 | |||
873 | /* | ||
874 | * If your system is blacklisted here, but you find that acpi=force | ||
875 | * works for you, please contact acpi-devel@sourceforge.net | ||
876 | */ | ||
877 | static struct dmi_system_id __initdata acpi_dmi_table[] = { | ||
878 | /* | ||
879 | * Boxes that need ACPI disabled | ||
880 | */ | ||
881 | { | ||
882 | .callback = dmi_disable_acpi, | ||
883 | .ident = "IBM Thinkpad", | ||
884 | .matches = { | ||
885 | DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), | ||
886 | DMI_MATCH(DMI_BOARD_NAME, "2629H1G"), | ||
887 | }, | ||
888 | }, | ||
889 | |||
890 | /* | ||
891 | * Boxes that need acpi=ht | ||
892 | */ | ||
893 | { | ||
894 | .callback = force_acpi_ht, | ||
895 | .ident = "FSC Primergy T850", | ||
896 | .matches = { | ||
897 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
898 | DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"), | ||
899 | }, | ||
900 | }, | ||
901 | { | ||
902 | .callback = force_acpi_ht, | ||
903 | .ident = "DELL GX240", | ||
904 | .matches = { | ||
905 | DMI_MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"), | ||
906 | DMI_MATCH(DMI_BOARD_NAME, "OptiPlex GX240"), | ||
907 | }, | ||
908 | }, | ||
909 | { | ||
910 | .callback = force_acpi_ht, | ||
911 | .ident = "HP VISUALIZE NT Workstation", | ||
912 | .matches = { | ||
913 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
914 | DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"), | ||
915 | }, | ||
916 | }, | ||
917 | { | ||
918 | .callback = force_acpi_ht, | ||
919 | .ident = "Compaq Workstation W8000", | ||
920 | .matches = { | ||
921 | DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), | ||
922 | DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"), | ||
923 | }, | ||
924 | }, | ||
925 | { | ||
926 | .callback = force_acpi_ht, | ||
927 | .ident = "ASUS P4B266", | ||
928 | .matches = { | ||
929 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
930 | DMI_MATCH(DMI_BOARD_NAME, "P4B266"), | ||
931 | }, | ||
932 | }, | ||
933 | { | ||
934 | .callback = force_acpi_ht, | ||
935 | .ident = "ASUS P2B-DS", | ||
936 | .matches = { | ||
937 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
938 | DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"), | ||
939 | }, | ||
940 | }, | ||
941 | { | ||
942 | .callback = force_acpi_ht, | ||
943 | .ident = "ASUS CUR-DLS", | ||
944 | .matches = { | ||
945 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
946 | DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"), | ||
947 | }, | ||
948 | }, | ||
949 | { | ||
950 | .callback = force_acpi_ht, | ||
951 | .ident = "ABIT i440BX-W83977", | ||
952 | .matches = { | ||
953 | DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"), | ||
954 | DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"), | ||
955 | }, | ||
956 | }, | ||
957 | { | ||
958 | .callback = force_acpi_ht, | ||
959 | .ident = "IBM Bladecenter", | ||
960 | .matches = { | ||
961 | DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), | ||
962 | DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"), | ||
963 | }, | ||
964 | }, | ||
965 | { | ||
966 | .callback = force_acpi_ht, | ||
967 | .ident = "IBM eServer xSeries 360", | ||
968 | .matches = { | ||
969 | DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), | ||
970 | DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"), | ||
971 | }, | ||
972 | }, | ||
973 | { | ||
974 | .callback = force_acpi_ht, | ||
975 | .ident = "IBM eserver xSeries 330", | ||
976 | .matches = { | ||
977 | DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), | ||
978 | DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"), | ||
979 | }, | ||
980 | }, | ||
981 | { | ||
982 | .callback = force_acpi_ht, | ||
983 | .ident = "IBM eserver xSeries 440", | ||
984 | .matches = { | ||
985 | DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), | ||
986 | DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), | ||
987 | }, | ||
988 | }, | ||
989 | |||
990 | #ifdef CONFIG_ACPI_PCI | ||
991 | /* | ||
992 | * Boxes that need ACPI PCI IRQ routing disabled | ||
993 | */ | ||
994 | { | ||
995 | .callback = disable_acpi_irq, | ||
996 | .ident = "ASUS A7V", | ||
997 | .matches = { | ||
998 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"), | ||
999 | DMI_MATCH(DMI_BOARD_NAME, "<A7V>"), | ||
1000 | /* newer BIOS, Revision 1011, does work */ | ||
1001 | DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), | ||
1002 | }, | ||
1003 | }, | ||
1004 | |||
1005 | /* | ||
1006 | * Boxes that need ACPI PCI IRQ routing and PCI scan disabled | ||
1007 | */ | ||
1008 | { /* _BBN 0 bug */ | ||
1009 | .callback = disable_acpi_pci, | ||
1010 | .ident = "ASUS PR-DLS", | ||
1011 | .matches = { | ||
1012 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
1013 | DMI_MATCH(DMI_BOARD_NAME, "PR-DLS"), | ||
1014 | DMI_MATCH(DMI_BIOS_VERSION, "ASUS PR-DLS ACPI BIOS Revision 1010"), | ||
1015 | DMI_MATCH(DMI_BIOS_DATE, "03/21/2003") | ||
1016 | }, | ||
1017 | }, | ||
1018 | { | ||
1019 | .callback = disable_acpi_pci, | ||
1020 | .ident = "Acer TravelMate 36x Laptop", | ||
1021 | .matches = { | ||
1022 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
1023 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), | ||
1024 | }, | ||
1025 | }, | ||
1026 | #endif | ||
1027 | }; | ||
1028 | |||
1029 | #endif /* __i386__ */ | ||
1030 | |||
818 | /* | 1031 | /* |
819 | * acpi_boot_table_init() and acpi_boot_init() | 1032 | * acpi_boot_table_init() and acpi_boot_init() |
820 | * called from setup_arch(), always. | 1033 | * called from setup_arch(), always. |
@@ -843,6 +1056,10 @@ acpi_boot_table_init(void) | |||
843 | { | 1056 | { |
844 | int error; | 1057 | int error; |
845 | 1058 | ||
1059 | #ifdef __i386__ | ||
1060 | dmi_check_system(acpi_dmi_table); | ||
1061 | #endif | ||
1062 | |||
846 | /* | 1063 | /* |
847 | * If acpi_disabled, bail out | 1064 | * If acpi_disabled, bail out |
848 | * One exception: acpi=ht continues far enough to enumerate LAPICs | 1065 | * One exception: acpi=ht continues far enough to enumerate LAPICs |
@@ -870,8 +1087,6 @@ acpi_boot_table_init(void) | |||
870 | */ | 1087 | */ |
871 | error = acpi_blacklisted(); | 1088 | error = acpi_blacklisted(); |
872 | if (error) { | 1089 | if (error) { |
873 | extern int acpi_force; | ||
874 | |||
875 | if (acpi_force) { | 1090 | if (acpi_force) { |
876 | printk(KERN_WARNING PREFIX "acpi=force override\n"); | 1091 | printk(KERN_WARNING PREFIX "acpi=force override\n"); |
877 | } else { | 1092 | } else { |