Patch to extend the PCDP vga setup code to support PCI io/mem translations
for the legacy vga ioport and ram spaces on architectures (e.g. altix) which
need them.  Diffs were generated against the last available ia64 bk test tree.

Summary of the changes:

drivers/firmware/pcdp.c
-----------------------
+ add declaration for the spec-defined PCI interface struct (pcdp_if_pci)
  as well as support macros.

+ extend setup_vga_console() to know about pcdp_if_pci and add a couple of
  globals to hold the io and mem translation offsets if present.

arch/ia64/kernel/setup.c
------------------------
+ tweek early_console_setup() to allow multiple early console setup routines
  to be called.

drivers/firmware/pcdp.h
-----------------------
+ new struct pcdp_if_pci and associated macros

include/asm-ia64/vga.h
----------------------
+ make VGA_MAP_MEM pcdp_vga_mem_base asware if we're in a PCDP environment

Signed-off-by: Mark Maule <[EMAIL PROTECTED]>

diff -Nru a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c  2005-04-21 14:39:56 -05:00
+++ b/arch/ia64/kernel/setup.c  2005-04-21 14:39:56 -05:00
@@ -273,23 +273,25 @@
 static inline int __init
 early_console_setup (char *cmdline)
 {
+       int earlycons = 0;
+
 #ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
        {
                extern int sn_serial_console_early_setup(void);
                if (!sn_serial_console_early_setup())
-                       return 0;
+                       earlycons++;
        }
 #endif
 #ifdef CONFIG_EFI_PCDP
        if (!efi_setup_pcdp_console(cmdline))
-               return 0;
+               earlycons++;
 #endif
 #ifdef CONFIG_SERIAL_8250_CONSOLE
        if (!early_serial_console_init(cmdline))
-               return 0;
+               earlycons++;
 #endif
 
-       return -1;
+       return (earlycons) ? 0 : -1;
 }
 
 static inline void
diff -Nru a/drivers/firmware/pcdp.c b/drivers/firmware/pcdp.c
--- a/drivers/firmware/pcdp.c   2005-04-21 14:39:56 -05:00
+++ b/drivers/firmware/pcdp.c   2005-04-21 14:39:56 -05:00
@@ -35,11 +35,32 @@
 #endif
 }
 
+unsigned long  pcdp_vga_io_base;
+unsigned long  pcdp_vga_mem_base;
+
 static int __init
-setup_vga_console(struct pcdp_vga *vga)
+setup_vga_console(struct pcdp_device *dev)
 {
+
 #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
-       if (efi_mem_type(0xA0000) == EFI_CONVENTIONAL_MEMORY) {
+       u8                      *if_ptr;
+
+       if_ptr = ((u8 *)dev + sizeof(struct pcdp_device));
+       if (if_ptr[0] == PCDP_IF_PCI) {
+               struct pcdp_if_pci      if_pci;
+
+               /* struct copy since ifptr might not be correctly aligned */
+
+               memcpy(&if_pci, if_ptr, sizeof(struct pcdp_if_pci));
+
+               if (if_pci.trans & PCDP_PCI_TRANS_IOPORT)
+                       pcdp_vga_io_base = if_pci.ioport_tra;
+
+               if (if_pci.trans & PCDP_PCI_TRANS_MMIO)
+                       pcdp_vga_mem_base = if_pci.mmio_tra;
+       }
+
+       if (efi_mem_type(pcdp_vga_mem_base + 0xA0000) == 
EFI_CONVENTIONAL_MEMORY) {
                printk(KERN_ERR "PCDP: VGA selected, but frame buffer is not 
MMIO!\n");
                return -ENODEV;
        }
@@ -91,7 +112,7 @@
             dev = (struct pcdp_device *) ((u8 *) dev + dev->length)) {
                if (dev->flags & PCDP_PRIMARY_CONSOLE) {
                        if (dev->type == PCDP_CONSOLE_VGA) {
-                               return setup_vga_console((struct pcdp_vga *) 
dev);
+                               return setup_vga_console(dev);
                        }
                }
        }
diff -Nru a/drivers/firmware/pcdp.h b/drivers/firmware/pcdp.h
--- a/drivers/firmware/pcdp.h   2005-04-21 14:39:56 -05:00
+++ b/drivers/firmware/pcdp.h   2005-04-21 14:39:56 -05:00
@@ -52,11 +52,34 @@
        u32                             clock_rate;
        u8                              pci_prog_intfc;
        u8                              flags;
-};
+} __attribute__((packed));
+
+#define PCDP_IF_PCI    1
+
+/* pcdp_if_pci.trans */
+#define PCDP_PCI_TRANS_IOPORT  0x02
+#define PCDP_PCI_TRANS_MMIO    0x01
+
+struct pcdp_if_pci {
+       u8                      interconnect;
+       u8                      reserved;
+       u16                     length;
+       u8                      segment;
+       u8                      bus;
+       u8                      dev;
+       u8                      fun;
+       u16                     dev_id;
+       u16                     vendor_id;
+       u32                     acpi_interrupt;
+       u64                     mmio_tra;
+       u64                     ioport_tra;
+       u8                      flags;
+       u8                      trans;
+} __attribute__((packed));
 
 struct pcdp_vga {
        u8                      count;          /* address space descriptors */
-};
+} __attribute__((packed));
 
 /* pcdp_device.flags */
 #define PCDP_PRIMARY_CONSOLE   1
@@ -66,7 +89,9 @@
        u8                      flags;
        u16                     length;
        u16                     efi_index;
-};
+       /* next data is pcdp_if_pci or pcdp_if_acpi (not yet supported) */
+       /* next data is device specific type (currently only pcdp_vga) */
+} __attribute__((packed));
 
 struct pcdp {
        u8                      signature[4];
@@ -81,4 +106,4 @@
        u32                     num_uarts;
        struct pcdp_uart        uart[0];        /* actual size is num_uarts */
        /* remainder of table is pcdp_device structures */
-};
+} __attribute__((packed));
diff -Nru a/include/asm-ia64/vga.h b/include/asm-ia64/vga.h
--- a/include/asm-ia64/vga.h    2005-04-21 14:39:56 -05:00
+++ b/include/asm-ia64/vga.h    2005-04-21 14:39:56 -05:00
@@ -11,10 +11,18 @@
 
 /*
  * On the PC, we can just recalculate addresses and then access the
- * videoram directly without any black magic.
+ * videoram directly without any black magic.  If we're in a PCDP
+ * environment, add in the vga mmio offset supplied by the table.
  */
 
+#if defined(CONFIG_EFI_PCDP)
+extern unsigned long pcdp_vga_io_base;
+extern unsigned long pcdp_vga_mem_base;
+
+#define VGA_MAP_MEM(x) ((unsigned long) ioremap(pcdp_vga_mem_base + (x), 0))
+#else
 #define VGA_MAP_MEM(x) ((unsigned long) ioremap((x), 0))
+#endif
 
 #define vga_readb(x)   (*(x))
 #define vga_writeb(x,y)        (*(y) = (x))
-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to