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

revert "x86, serial: convert legacy COM ports to platform devices"

Revert 7e92b4fc345f5b6f57585fbe5ffdb0f24d7c9b26. It broke Sébastien Dugué's
machine and Jeff said (persuasively)

This seems like it will break decades-long-working stuff, in favor of
breaking new ground in our favorite area, "trusting the BIOS."

It's just not worth it for serial ports, IMO. Serial ports are something
that just shouldn't break at this late stage in the game. My new Intel
platform boxes don't even have serial ports, so I question the value of
messing with serial port probing even more... because... just wait a year,
and your box won't have a serial port either! :)

I certainly don't object to the use of platform devices (or isa_driver),
but the probe change seems questionable. That's sorta analagous to
rewriting the floppy driver probe routine. Sure you could do it... but why
risk all that damage and go through debugging all over again?

It seems clear from this report that we cannot, should not, trust BIOS for
something (a) so simple and (b) that has been working for over a decade.

Much discussion ensued and we've decided to have another go at all of this.

Cc: Sébastien Dugué <sebastien.dugue@bull.net>
Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
Cc: Len Brown <lenb@kernel.org>
Cc: Adam Belay <ambx1@neo.rr.com>
Cc: Matthew Garrett <mjg59@srcf.ucam.org>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Jeff Garzik <jeff@garzik.org>
Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Michal Piotrowski <michal.k.k.piotrowski@gmail.com>
Cc: Sascha Sommer <saschasommer@freenet.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Andrew Morton and committed by
Linus Torvalds
57d4810e a583f1b5

+37 -84
-5
Documentation/kernel-parameters.txt
··· 864 864 lasi= [HW,SCSI] PARISC LASI driver for the 53c700 chip 865 865 Format: addr:<io>,irq:<irq> 866 866 867 - legacy_serial.force [HW,X86-32,X86-64] 868 - Probe for COM ports at legacy addresses even 869 - if PNPBIOS or ACPI should describe them. This 870 - is for working around firmware defects. 871 - 872 867 load_ramdisk= [RAM] List of ramdisks to load from floppy 873 868 See Documentation/ramdisk.txt. 874 869
-1
arch/i386/kernel/Makefile
··· 35 35 obj-$(CONFIG_ACPI_SRAT) += srat.o 36 36 obj-$(CONFIG_EFI) += efi.o efi_stub.o 37 37 obj-$(CONFIG_DOUBLEFAULT) += doublefault.o 38 - obj-$(CONFIG_SERIAL_8250) += legacy_serial.o 39 38 obj-$(CONFIG_VM86) += vm86.o 40 39 obj-$(CONFIG_EARLY_PRINTK) += early_printk.o 41 40 obj-$(CONFIG_HPET_TIMER) += hpet.o
-67
arch/i386/kernel/legacy_serial.c
··· 1 - /* 2 - * Legacy COM port devices for x86 platforms without PNPBIOS or ACPI. 3 - * Data taken from include/asm-i386/serial.h. 4 - * 5 - * (c) Copyright 2007 Hewlett-Packard Development Company, L.P. 6 - * Bjorn Helgaas <bjorn.helgaas@hp.com> 7 - * 8 - * This program is free software; you can redistribute it and/or modify 9 - * it under the terms of the GNU General Public License version 2 as 10 - * published by the Free Software Foundation. 11 - */ 12 - #include <linux/module.h> 13 - #include <linux/init.h> 14 - #include <linux/pnp.h> 15 - #include <linux/serial_8250.h> 16 - 17 - /* Standard COM flags (except for COM4, because of the 8514 problem) */ 18 - #ifdef CONFIG_SERIAL_DETECT_IRQ 19 - #define COM_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_AUTO_IRQ) 20 - #define COM4_FLAGS (UPF_BOOT_AUTOCONF | UPF_AUTO_IRQ) 21 - #else 22 - #define COM_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST) 23 - #define COM4_FLAGS UPF_BOOT_AUTOCONF 24 - #endif 25 - 26 - #define PORT(_base,_irq,_flags) \ 27 - { \ 28 - .iobase = _base, \ 29 - .irq = _irq, \ 30 - .uartclk = 1843200, \ 31 - .iotype = UPIO_PORT, \ 32 - .flags = _flags, \ 33 - } 34 - 35 - static struct plat_serial8250_port x86_com_data[] = { 36 - PORT(0x3F8, 4, COM_FLAGS), 37 - PORT(0x2F8, 3, COM_FLAGS), 38 - PORT(0x3E8, 4, COM_FLAGS), 39 - PORT(0x2E8, 3, COM4_FLAGS), 40 - { }, 41 - }; 42 - 43 - static struct platform_device x86_com_device = { 44 - .name = "serial8250", 45 - .id = PLAT8250_DEV_PLATFORM, 46 - .dev = { 47 - .platform_data = x86_com_data, 48 - }, 49 - }; 50 - 51 - static int force_legacy_probe; 52 - module_param_named(force, force_legacy_probe, bool, 0); 53 - MODULE_PARM_DESC(force, "Force legacy serial port probe"); 54 - 55 - static int __init serial8250_x86_com_init(void) 56 - { 57 - if (pnp_platform_devices && !force_legacy_probe) 58 - return -ENODEV; 59 - 60 - return platform_device_register(&x86_com_device); 61 - } 62 - 63 - module_init(serial8250_x86_com_init); 64 - 65 - MODULE_AUTHOR("Bjorn Helgaas"); 66 - MODULE_LICENSE("GPL"); 67 - MODULE_DESCRIPTION("Generic 8250/16x50 legacy probe module");
-2
arch/x86_64/kernel/Makefile
··· 32 32 obj-$(CONFIG_IOMMU) += pci-gart.o aperture.o 33 33 obj-$(CONFIG_CALGARY_IOMMU) += pci-calgary.o tce.o 34 34 obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o 35 - obj-$(CONFIG_SERIAL_8250) += legacy_serial.o 36 35 obj-$(CONFIG_KPROBES) += kprobes.o 37 36 obj-$(CONFIG_X86_PM_TIMER) += pmtimer.o 38 37 obj-$(CONFIG_X86_VSMP) += vsmp.o ··· 50 51 51 52 therm_throt-y += ../../i386/kernel/cpu/mcheck/therm_throt.o 52 53 bootflag-y += ../../i386/kernel/bootflag.o 53 - legacy_serial-y += ../../i386/kernel/legacy_serial.o 54 54 cpuid-$(subst m,y,$(CONFIG_X86_CPUID)) += ../../i386/kernel/cpuid.o 55 55 topology-y += ../../i386/kernel/topology.o 56 56 microcode-$(subst m,y,$(CONFIG_MICROCODE)) += ../../i386/kernel/microcode.o
+5 -9
drivers/serial/Kconfig
··· 88 88 depends on SERIAL_8250 && PCI 89 89 default SERIAL_8250 90 90 help 91 - Say Y here if you have PCI serial ports. 92 - 93 - To compile this driver as a module, choose M here: the module 94 - will be called 8250_pci. 91 + This builds standard PCI serial support. You may be able to 92 + disable this feature if you only need legacy serial support. 93 + Saves about 9K. 95 94 96 95 config SERIAL_8250_PNP 97 96 tristate "8250/16550 PNP device support" if EMBEDDED 98 97 depends on SERIAL_8250 && PNP 99 98 default SERIAL_8250 100 99 help 101 - Say Y here if you have serial ports described by PNPBIOS or ACPI. 102 - These are typically ports built into the system board. 103 - 104 - To compile this driver as a module, choose M here: the module 105 - will be called 8250_pnp. 100 + This builds standard PNP serial support. You may be able to 101 + disable this feature if you only need legacy serial support. 106 102 107 103 config SERIAL_8250_HP300 108 104 tristate
+16
include/asm-i386/serial.h
··· 11 11 * megabits/second; but this requires the faster clock. 12 12 */ 13 13 #define BASE_BAUD ( 1843200 / 16 ) 14 + 15 + /* Standard COM flags (except for COM4, because of the 8514 problem) */ 16 + #ifdef CONFIG_SERIAL_DETECT_IRQ 17 + #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ) 18 + #define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ) 19 + #else 20 + #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) 21 + #define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF 22 + #endif 23 + 24 + #define SERIAL_PORT_DFNS \ 25 + /* UART CLK PORT IRQ FLAGS */ \ 26 + { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS }, /* ttyS0 */ \ 27 + { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS }, /* ttyS1 */ \ 28 + { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS }, /* ttyS2 */ \ 29 + { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS }, /* ttyS3 */
+16
include/asm-x86_64/serial.h
··· 11 11 * megabits/second; but this requires the faster clock. 12 12 */ 13 13 #define BASE_BAUD ( 1843200 / 16 ) 14 + 15 + /* Standard COM flags (except for COM4, because of the 8514 problem) */ 16 + #ifdef CONFIG_SERIAL_DETECT_IRQ 17 + #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ) 18 + #define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ) 19 + #else 20 + #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) 21 + #define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF 22 + #endif 23 + 24 + #define SERIAL_PORT_DFNS \ 25 + /* UART CLK PORT IRQ FLAGS */ \ 26 + { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS }, /* ttyS0 */ \ 27 + { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS }, /* ttyS1 */ \ 28 + { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS }, /* ttyS2 */ \ 29 + { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS }, /* ttyS3 */