]> xenbits.xen.org Git - xenclient/xen-pq.git/commitdiff
Automatically find serial cards
authorJames Mckenzie <jamesmck@bob.uk.xensource.com>
Tue, 8 Sep 2009 16:03:28 +0000 (17:03 +0100)
committerJames Mckenzie <jamesmck@bob.uk.xensource.com>
Tue, 8 Sep 2009 16:03:28 +0000 (17:03 +0100)
master/serial-card [new file with mode: 0644]
master/series

diff --git a/master/serial-card b/master/serial-card
new file mode 100644 (file)
index 0000000..763c0b1
--- /dev/null
@@ -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 <xen/sched.h>
+ #include <xen/serial.h>
+ #include <xen/iocap.h>
++#include <xen/pci.h>
++#include <xen/pci_reg.h>
+ #include <asm/io.h>
+ /*
+@@ -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 == ',' )
+         {
index 31c3a33677d0191ce9b157f0f024dc39cf284ff4..ed56d33e2c64ada72edd9ff7514b06c6490391b1 100644 (file)
@@ -19,3 +19,4 @@ default-iommu-inclusive-mapping
 igd-cmd-reg-change-for-reboot
 xblanker
 ugly-hack-to-fix-sata
+serial-card