aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@kernel.org>2016-04-13 20:04:41 -0400
committerIngo Molnar <mingo@kernel.org>2016-04-22 04:29:05 -0400
commit80dfd83dfab6e49a31ab8fc484a801aef1c567bd (patch)
treecd0e8267f6575c90dac27b1b69404dcd22491adc
parentfa392794ed8329379f3f637da7c3c2f078309a77 (diff)
x86, drivers/pnpbios: Replace paravirt_enabled() check with legacy device check
Since we are removing paravirt_enabled() replace it with a logical equivalent. Even though PNPBIOS is x86 specific we add an arch-specific type call, which can be implemented by any architecture to show how other legacy attribute devices can later be also checked for with other ACPI legacy attribute flags. This implicates the first ACPI 5.2.9.3 IA-PC Boot Architecture ACPI_FADT_LEGACY_DEVICES flag device, and shows how to add more. The reason pnpbios gets a defined structure and as such uses a different approach than the RTC legacy quirk is that ACPI has a respective RTC flag, while pnpbios does not. We fold the pnpbios quirk under ACPI_FADT_LEGACY_DEVICES ACPI flag use case, and use a struct of possible devices to enable future extensions of this. As per 0-day, this bumps the vmlinux size using i386-tinyconfig as follows: TOTAL TEXT init.text x86_early_init_platform_quirks() +32 +28 +28 +28 That's 4 byte overhead total, the rest is cleared out on init as its all __init text. v2: split out subarch handlng on switch to make it easier later to add other subarchs. The 'fall-through' switch handling can be confusing and we'll remove it later when we add handling for X86_SUBARCH_CE4100. v3: document vmlinux size impact as per 0-day, and also explain why pnpbios is treated differently than the RTC legacy feature. Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: andrew.cooper3@citrix.com Cc: andriy.shevchenko@linux.intel.com Cc: bigeasy@linutronix.de Cc: boris.ostrovsky@oracle.com Cc: david.vrabel@citrix.com Cc: ffainelli@freebox.fr Cc: george.dunlap@citrix.com Cc: glin@suse.com Cc: jgross@suse.com Cc: jlee@suse.com Cc: josh@joshtriplett.org Cc: julien.grall@linaro.org Cc: konrad.wilk@oracle.com Cc: kozerkov@parallels.com Cc: lenb@kernel.org Cc: lguest@lists.ozlabs.org Cc: linux-acpi@vger.kernel.org Cc: lv.zheng@intel.com Cc: matt@codeblueprint.co.uk Cc: mbizon@freebox.fr Cc: rjw@rjwysocki.net Cc: robert.moore@intel.com Cc: rusty@rustcorp.com.au Cc: tiwai@suse.de Cc: toshi.kani@hp.com Cc: xen-devel@lists.xensource.com Link: http://lkml.kernel.org/r/1460592286-300-12-git-send-email-mcgrof@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/include/asm/x86_init.h26
-rw-r--r--arch/x86/kernel/platform-quirks.c11
-rw-r--r--drivers/pnp/pnpbios/core.c3
-rw-r--r--include/linux/pnp.h2
4 files changed, 41 insertions, 1 deletions
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index 89d9d57e145d..4dcdf74dfed8 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -142,15 +142,41 @@ struct x86_cpuinit_ops {
142struct timespec; 142struct timespec;
143 143
144/** 144/**
145 * struct x86_legacy_devices - legacy x86 devices
146 *
147 * @pnpbios: this platform can have a PNPBIOS. If this is disabled the platform
148 * is known to never have a PNPBIOS.
149 *
150 * These are devices known to require LPC or ISA bus. The definition of legacy
151 * devices adheres to the ACPI 5.2.9.3 IA-PC Boot Architecture flag
152 * ACPI_FADT_LEGACY_DEVICES. These devices consist of user visible devices on
153 * the LPC or ISA bus. User visible devices are devices that have end-user
154 * accessible connectors (for example, LPT parallel port). Legacy devices on
155 * the LPC bus consist for example of serial and parallel ports, PS/2 keyboard
156 * / mouse, and the floppy disk controller. A system that lacks all known
157 * legacy devices can assume all devices can be detected exclusively via
158 * standard device enumeration mechanisms including the ACPI namespace.
159 *
160 * A system which has does not have ACPI_FADT_LEGACY_DEVICES enabled must not
161 * have any of the legacy devices enumerated below present.
162 */
163struct x86_legacy_devices {
164 int pnpbios;
165};
166
167/**
145 * struct x86_legacy_features - legacy x86 features 168 * struct x86_legacy_features - legacy x86 features
146 * 169 *
147 * @rtc: this device has a CMOS real-time clock present 170 * @rtc: this device has a CMOS real-time clock present
148 * @ebda_search: it's safe to search for the EBDA signature in the hardware's 171 * @ebda_search: it's safe to search for the EBDA signature in the hardware's
149 * low RAM 172 * low RAM
173 * @devices: legacy x86 devices, refer to struct x86_legacy_devices
174 * documentation for further details.
150 */ 175 */
151struct x86_legacy_features { 176struct x86_legacy_features {
152 int rtc; 177 int rtc;
153 int ebda_search; 178 int ebda_search;
179 struct x86_legacy_devices devices;
154}; 180};
155 181
156/** 182/**
diff --git a/arch/x86/kernel/platform-quirks.c b/arch/x86/kernel/platform-quirks.c
index 01b159781d96..ab643825a7aa 100644
--- a/arch/x86/kernel/platform-quirks.c
+++ b/arch/x86/kernel/platform-quirks.c
@@ -8,6 +8,7 @@ void __init x86_early_init_platform_quirks(void)
8{ 8{
9 x86_platform.legacy.rtc = 1; 9 x86_platform.legacy.rtc = 1;
10 x86_platform.legacy.ebda_search = 0; 10 x86_platform.legacy.ebda_search = 0;
11 x86_platform.legacy.devices.pnpbios = 1;
11 12
12 switch (boot_params.hdr.hardware_subarch) { 13 switch (boot_params.hdr.hardware_subarch) {
13 case X86_SUBARCH_PC: 14 case X86_SUBARCH_PC:
@@ -15,6 +16,9 @@ void __init x86_early_init_platform_quirks(void)
15 break; 16 break;
16 case X86_SUBARCH_XEN: 17 case X86_SUBARCH_XEN:
17 case X86_SUBARCH_LGUEST: 18 case X86_SUBARCH_LGUEST:
19 x86_platform.legacy.devices.pnpbios = 0;
20 x86_platform.legacy.rtc = 0;
21 break;
18 case X86_SUBARCH_INTEL_MID: 22 case X86_SUBARCH_INTEL_MID:
19 x86_platform.legacy.rtc = 0; 23 x86_platform.legacy.rtc = 0;
20 break; 24 break;
@@ -23,3 +27,10 @@ void __init x86_early_init_platform_quirks(void)
23 if (x86_platform.set_legacy_features) 27 if (x86_platform.set_legacy_features)
24 x86_platform.set_legacy_features(); 28 x86_platform.set_legacy_features();
25} 29}
30
31#if defined(CONFIG_PNPBIOS)
32bool __init arch_pnpbios_disabled(void)
33{
34 return x86_platform.legacy.devices.pnpbios == 0;
35}
36#endif
diff --git a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c
index facd43b8516c..81603d99082b 100644
--- a/drivers/pnp/pnpbios/core.c
+++ b/drivers/pnp/pnpbios/core.c
@@ -521,10 +521,11 @@ static int __init pnpbios_init(void)
521 int ret; 521 int ret;
522 522
523 if (pnpbios_disabled || dmi_check_system(pnpbios_dmi_table) || 523 if (pnpbios_disabled || dmi_check_system(pnpbios_dmi_table) ||
524 paravirt_enabled()) { 524 arch_pnpbios_disabled()) {
525 printk(KERN_INFO "PnPBIOS: Disabled\n"); 525 printk(KERN_INFO "PnPBIOS: Disabled\n");
526 return -ENODEV; 526 return -ENODEV;
527 } 527 }
528
528#ifdef CONFIG_PNPACPI 529#ifdef CONFIG_PNPACPI
529 if (!acpi_disabled && !pnpacpi_disabled) { 530 if (!acpi_disabled && !pnpacpi_disabled) {
530 pnpbios_disabled = 1; 531 pnpbios_disabled = 1;
diff --git a/include/linux/pnp.h b/include/linux/pnp.h
index 5df733b8f704..2588ca6a9028 100644
--- a/include/linux/pnp.h
+++ b/include/linux/pnp.h
@@ -337,9 +337,11 @@ extern struct mutex pnp_res_mutex;
337 337
338#ifdef CONFIG_PNPBIOS 338#ifdef CONFIG_PNPBIOS
339extern struct pnp_protocol pnpbios_protocol; 339extern struct pnp_protocol pnpbios_protocol;
340extern bool arch_pnpbios_disabled(void);
340#define pnp_device_is_pnpbios(dev) ((dev)->protocol == (&pnpbios_protocol)) 341#define pnp_device_is_pnpbios(dev) ((dev)->protocol == (&pnpbios_protocol))
341#else 342#else
342#define pnp_device_is_pnpbios(dev) 0 343#define pnp_device_is_pnpbios(dev) 0
344#define arch_pnpbios_disabled() false
343#endif 345#endif
344 346
345#ifdef CONFIG_PNPACPI 347#ifdef CONFIG_PNPACPI