From 6929487162c97c42ecc397c828df6e9a5b437d3f Mon Sep 17 00:00:00 2001 From: James Mckenzie Date: Tue, 8 Sep 2009 17:03:28 +0100 Subject: [PATCH] Automatically find serial cards --- master/serial-card | 89 ++++++++++++++++++++++++++++++++++++++++++++++ master/series | 1 + 2 files changed, 90 insertions(+) create mode 100644 master/serial-card diff --git a/master/serial-card b/master/serial-card new file mode 100644 index 0000000..763c0b1 --- /dev/null +++ b/master/serial-card @@ -0,0 +1,89 @@ +diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c +index 1f88907..9f77b7c 100644 +--- a/xen/drivers/char/ns16550.c ++++ b/xen/drivers/char/ns16550.c +@@ -15,6 +15,8 @@ + #include + #include + #include ++#include ++#include + #include + + /* +@@ -336,6 +338,52 @@ static int check_existence(struct ns16550 *uart) + return (status == 0x90); + } + ++static ++magic_uart_config (struct ns16550 *uart) ++{ ++ uint16_t class; ++ uint32_t bar0, len; ++ int b, d, f; ++ ++/*Skanky hack - start at bus 1 to avoid AMT, a plug in card cannot be on bus 1 */ ++ ++ for (b = 1; b < 0x100; ++b) ++ { ++ for (d = 0; d < 0x20:++d) ++ { ++ for (f = 0; f < 0x20; ++f) ++ { ++ ++ class = pci_conf_read16 (b, d, f, PCI_CLASS_DEVICE); ++ if (class != 0x700) ++ continue;; ++ ++ bar0 = pci_conf_read32 (b, d, f, PCI_BASE_ADDRESS_0); ++ ++/*Not IO*/ ++ if (!(bar0 & 1)) ++ continue; ++ ++ pci_conf_write32 (b, d, f, PCI_BASE_ADDRESS_0, 0xffffffff); ++ len = pci_conf_read32 (b, d, f, PCI_BASE_ADDRESS_0); ++ pci_conf_write32 (b, d, f, PCI_BASE_ADDRESS_0, bar0); ++ ++/*Not 8 bytes*/ ++ if (len != 0xfffffff9) ++ continue; ++ ++ uart->io_base = bar0 & 0xfffe; ++ uart->irq = 0; ++ ++ return; ++ ++ } ++ ++ } ++ } ++} ++ ++ + #define PARSE_ERR(_f, _a...) \ + do { \ + printk( "ERROR: " _f "\n" , ## _a ); \ +@@ -355,7 +403,6 @@ static void __init ns16550_parse_port_config( + goto config_parsed; + return; + } +- + if ( strncmp(conf, "auto", 4) == 0 ) + { + uart->baud = BAUD_AUTO; +@@ -384,7 +431,13 @@ static void __init ns16550_parse_port_config( + if ( *conf == ',' ) + { + conf++; +- uart->io_base = simple_strtoul(conf, &conf, 0); ++ ++ if ( strncmp(conf,"magic",5) == 0 ) { ++ magic_uart_config(uart); ++ conf+=5; ++ } else { ++ uart->io_base = simple_strtoul(conf, &conf, 0); ++ } + + if ( *conf == ',' ) + { diff --git a/master/series b/master/series index 31c3a33..ed56d33 100644 --- a/master/series +++ b/master/series @@ -19,3 +19,4 @@ default-iommu-inclusive-mapping igd-cmd-reg-change-for-reboot xblanker ugly-hack-to-fix-sata +serial-card -- 2.39.5