Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Luis R. Rodriguez and committed by
Ingo Molnar
80dfd83d fa392794

+41 -1
+26
arch/x86/include/asm/x86_init.h
··· 142 142 struct 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 + */ 163 + struct x86_legacy_devices { 164 + int pnpbios; 165 + }; 166 + 167 + /** 145 168 * struct x86_legacy_features - legacy x86 features 146 169 * 147 170 * @rtc: this device has a CMOS real-time clock present 148 171 * @ebda_search: it's safe to search for the EBDA signature in the hardware's 149 172 * low RAM 173 + * @devices: legacy x86 devices, refer to struct x86_legacy_devices 174 + * documentation for further details. 150 175 */ 151 176 struct x86_legacy_features { 152 177 int rtc; 153 178 int ebda_search; 179 + struct x86_legacy_devices devices; 154 180 }; 155 181 156 182 /**
+11
arch/x86/kernel/platform-quirks.c
··· 8 8 { 9 9 x86_platform.legacy.rtc = 1; 10 10 x86_platform.legacy.ebda_search = 0; 11 + x86_platform.legacy.devices.pnpbios = 1; 11 12 12 13 switch (boot_params.hdr.hardware_subarch) { 13 14 case X86_SUBARCH_PC: ··· 16 15 break; 17 16 case X86_SUBARCH_XEN: 18 17 case X86_SUBARCH_LGUEST: 18 + x86_platform.legacy.devices.pnpbios = 0; 19 + x86_platform.legacy.rtc = 0; 20 + break; 19 21 case X86_SUBARCH_INTEL_MID: 20 22 x86_platform.legacy.rtc = 0; 21 23 break; ··· 27 23 if (x86_platform.set_legacy_features) 28 24 x86_platform.set_legacy_features(); 29 25 } 26 + 27 + #if defined(CONFIG_PNPBIOS) 28 + bool __init arch_pnpbios_disabled(void) 29 + { 30 + return x86_platform.legacy.devices.pnpbios == 0; 31 + } 32 + #endif
+2 -1
drivers/pnp/pnpbios/core.c
··· 521 521 int ret; 522 522 523 523 if (pnpbios_disabled || dmi_check_system(pnpbios_dmi_table) || 524 - paravirt_enabled()) { 524 + arch_pnpbios_disabled()) { 525 525 printk(KERN_INFO "PnPBIOS: Disabled\n"); 526 526 return -ENODEV; 527 527 } 528 + 528 529 #ifdef CONFIG_PNPACPI 529 530 if (!acpi_disabled && !pnpacpi_disabled) { 530 531 pnpbios_disabled = 1;
+2
include/linux/pnp.h
··· 337 337 338 338 #ifdef CONFIG_PNPBIOS 339 339 extern struct pnp_protocol pnpbios_protocol; 340 + extern bool arch_pnpbios_disabled(void); 340 341 #define pnp_device_is_pnpbios(dev) ((dev)->protocol == (&pnpbios_protocol)) 341 342 #else 342 343 #define pnp_device_is_pnpbios(dev) 0 344 + #define arch_pnpbios_disabled() false 343 345 #endif 344 346 345 347 #ifdef CONFIG_PNPACPI