|
@@ -213,8 +213,9 @@ static unsigned int mem32_serial_in(unsigned long addr, int offset)
|
|
|
* early_pci_serial_init()
|
|
|
*
|
|
|
* This function is invoked when the early_printk param starts with "pciserial"
|
|
|
- * The rest of the param should be ",B:D.F,baud" where B, D & F describe the
|
|
|
- * location of a PCI device that must be a UART device.
|
|
|
+ * The rest of the param should be "[force],B:D.F,baud", where B, D & F describe
|
|
|
+ * the location of a PCI device that must be a UART device. "force" is optional
|
|
|
+ * and overrides the use of an UART device with a wrong PCI class code.
|
|
|
*/
|
|
|
static __init void early_pci_serial_init(char *s)
|
|
|
{
|
|
@@ -224,17 +225,23 @@ static __init void early_pci_serial_init(char *s)
|
|
|
u32 classcode, bar0;
|
|
|
u16 cmdreg;
|
|
|
char *e;
|
|
|
+ int force = 0;
|
|
|
|
|
|
-
|
|
|
- /*
|
|
|
- * First, part the param to get the BDF values
|
|
|
- */
|
|
|
if (*s == ',')
|
|
|
++s;
|
|
|
|
|
|
if (*s == 0)
|
|
|
return;
|
|
|
|
|
|
+ /* Force the use of an UART device with wrong class code */
|
|
|
+ if (!strncmp(s, "force,", 6)) {
|
|
|
+ force = 1;
|
|
|
+ s += 6;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Part the param to get the BDF values
|
|
|
+ */
|
|
|
bus = (u8)simple_strtoul(s, &e, 16);
|
|
|
s = e;
|
|
|
if (*s != ':')
|
|
@@ -253,7 +260,7 @@ static __init void early_pci_serial_init(char *s)
|
|
|
s++;
|
|
|
|
|
|
/*
|
|
|
- * Second, find the device from the BDF
|
|
|
+ * Find the device from the BDF
|
|
|
*/
|
|
|
cmdreg = read_pci_config(bus, slot, func, PCI_COMMAND);
|
|
|
classcode = read_pci_config(bus, slot, func, PCI_CLASS_REVISION);
|
|
@@ -264,8 +271,10 @@ static __init void early_pci_serial_init(char *s)
|
|
|
*/
|
|
|
if (((classcode >> 16 != PCI_CLASS_COMMUNICATION_MODEM) &&
|
|
|
(classcode >> 16 != PCI_CLASS_COMMUNICATION_SERIAL)) ||
|
|
|
- (((classcode >> 8) & 0xff) != 0x02)) /* 16550 I/F at BAR0 */
|
|
|
- return;
|
|
|
+ (((classcode >> 8) & 0xff) != 0x02)) /* 16550 I/F at BAR0 */ {
|
|
|
+ if (!force)
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Determine if it is IO or memory mapped
|
|
@@ -289,7 +298,7 @@ static __init void early_pci_serial_init(char *s)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Lastly, initialize the hardware
|
|
|
+ * Initialize the hardware
|
|
|
*/
|
|
|
if (*s) {
|
|
|
if (strcmp(s, "nocfg") == 0)
|