]> err.no Git - linux-2.6/blobdiff - arch/alpha/kernel/core_titan.c
Merge branch 'xen-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen
[linux-2.6] / arch / alpha / kernel / core_titan.c
index 3662fef7db9a9c19413f01e06edf5de013e2edf9..819326627b966c3f166f76b38a11614ad51e11ec 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/smp.h>
 #include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
+#include <asm/vga.h>
 
 #include "proto.h"
 #include "pci_impl.h"
@@ -34,6 +35,11 @@ struct
        unsigned long tba[4];
 } saved_config[4] __attribute__((common));
 
+/*
+ * Is PChip 1 present? No need to query it more than once.
+ */
+static int titan_pchip1_present;
+
 /*
  * BIOS32-style PCI interface:
  */
@@ -344,43 +350,17 @@ titan_init_one_pachip_port(titan_pachip_port *port, int index)
 static void __init
 titan_init_pachips(titan_pachip *pachip0, titan_pachip *pachip1)
 {
-       int pchip1_present = TITAN_cchip->csc.csr & 1L<<14;
+       titan_pchip1_present = TITAN_cchip->csc.csr & 1L<<14;
 
        /* Init the ports in hose order... */
        titan_init_one_pachip_port(&pachip0->g_port, 0);        /* hose 0 */
-       if (pchip1_present)
+       if (titan_pchip1_present)
                titan_init_one_pachip_port(&pachip1->g_port, 1);/* hose 1 */
        titan_init_one_pachip_port(&pachip0->a_port, 2);        /* hose 2 */
-       if (pchip1_present)
+       if (titan_pchip1_present)
                titan_init_one_pachip_port(&pachip1->a_port, 3);/* hose 3 */
 }
 
-static void __init
-titan_init_vga_hose(void)
-{
-#ifdef CONFIG_VGA_HOSE
-       u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset);
-
-       if (pu64[7] == 3) {     /* TERM_TYPE == graphics */
-               struct pci_controller *hose;
-               int h = (pu64[30] >> 24) & 0xff;        /* console hose # */
-
-               /*
-                * Our hose numbering matches the console's, so just find
-                * the right one...
-                */
-               for (hose = hose_head; hose; hose = hose->next) {
-                       if (hose->index == h) break;
-               }
-
-               if (hose) {
-                       printk("Console graphics on hose %d\n", hose->index);
-                       pci_vga_hose = hose;
-               }
-       }
-#endif /* CONFIG_VGA_HOSE */
-}
-
 void __init
 titan_init_arch(void)
 {
@@ -406,6 +386,7 @@ titan_init_arch(void)
 
        /* With multiple PCI busses, we play with I/O as physical addrs.  */
        ioport_resource.end = ~0UL;
+       iomem_resource.end = ~0UL;
 
        /* PCI DMA Direct Mapping is 1GB at 2GB.  */
        __direct_map_base = 0x80000000;
@@ -415,7 +396,7 @@ titan_init_arch(void)
        titan_init_pachips(TITAN_pachip0, TITAN_pachip1);
 
        /* Check for graphic console location (if any).  */
-       titan_init_vga_hose();
+       find_console_vga_hose();
 }
 
 static void
@@ -441,9 +422,7 @@ titan_kill_one_pachip_port(titan_pachip_port *port, int index)
 static void
 titan_kill_pachips(titan_pachip *pachip0, titan_pachip *pachip1)
 {
-       int pchip1_present = TITAN_cchip->csc.csr & 1L<<14;
-
-       if (pchip1_present) {
+       if (titan_pchip1_present) {
                titan_kill_one_pachip_port(&pachip1->g_port, 1);
                titan_kill_one_pachip_port(&pachip1->a_port, 3);
        }
@@ -462,6 +441,14 @@ titan_kill_arch(int mode)
  * IO map support.
  */
 
+void __iomem *
+titan_ioportmap(unsigned long addr)
+{
+       FIXUP_IOADDR_VGA(addr);
+       return (void __iomem *)(addr + TITAN_IO_BIAS);
+}
+
+
 void __iomem *
 titan_ioremap(unsigned long addr, unsigned long size)
 {
@@ -475,14 +462,12 @@ titan_ioremap(unsigned long addr, unsigned long size)
        unsigned long pfn;
 
        /*
-        * Adjust the addr.
+        * Adjust the address and hose, if necessary.
         */ 
-#ifdef CONFIG_VGA_HOSE
-       if (pci_vga_hose && __titan_is_mem_vga(addr)) {
+       if (pci_vga_hose && __is_mem_vga(addr)) {
                h = pci_vga_hose->index;
                addr += pci_vga_hose->mem_space->start;
        }
-#endif
 
        /*
         * Find the hose.
@@ -521,8 +506,10 @@ titan_ioremap(unsigned long addr, unsigned long size)
                 * Map it
                 */
                area = get_vm_area(size, VM_IOREMAP);
-               if (!area)
+               if (!area) {
+                       printk("ioremap failed... no vm_area...\n");
                        return NULL;
+               }
 
                ptes = hose->sg_pci->ptes;
                for (vaddr = (unsigned long)area->addr; 
@@ -539,7 +526,7 @@ titan_ioremap(unsigned long addr, unsigned long size)
                        if (__alpha_remap_area_pages(vaddr,
                                                     pfn << PAGE_SHIFT, 
                                                     PAGE_SIZE, 0)) {
-                               printk("FAILED to map...\n");
+                               printk("FAILED to remap_area_pages...\n");
                                vfree(area->addr);
                                return NULL;
                        }
@@ -551,7 +538,8 @@ titan_ioremap(unsigned long addr, unsigned long size)
                return (void __iomem *) vaddr;
        }
 
-       return NULL;
+       /* Assume a legacy (read: VGA) address, and return appropriately. */
+       return (void __iomem *)(addr + TITAN_MEM_BIAS);
 }
 
 void
@@ -574,6 +562,7 @@ titan_is_mmio(const volatile void __iomem *xaddr)
 }
 
 #ifndef CONFIG_ALPHA_GENERIC
+EXPORT_SYMBOL(titan_ioportmap);
 EXPORT_SYMBOL(titan_ioremap);
 EXPORT_SYMBOL(titan_iounmap);
 EXPORT_SYMBOL(titan_is_mmio);
@@ -750,6 +739,7 @@ titan_agp_info(void)
        if (titan_query_agp(port))
                hosenum = 2;
        if (hosenum < 0 && 
+           titan_pchip1_present &&
            titan_query_agp(port = &TITAN_pachip1->a_port)) 
                hosenum = 3;