Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / arch / alpha / kernel / core_titan.c
index 3662fef..7668649 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,68 +350,43 @@ 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)
 {
 #if 0
-       printk("%s: titan_init_arch()\n", __FUNCTION__);
-       printk("%s: CChip registers:\n", __FUNCTION__);
-       printk("%s: CSR_CSC 0x%lx\n", __FUNCTION__, TITAN_cchip->csc.csr);
-       printk("%s: CSR_MTR 0x%lx\n", __FUNCTION__, TITAN_cchip->mtr.csr);
-       printk("%s: CSR_MISC 0x%lx\n", __FUNCTION__, TITAN_cchip->misc.csr);
-       printk("%s: CSR_DIM0 0x%lx\n", __FUNCTION__, TITAN_cchip->dim0.csr);
-       printk("%s: CSR_DIM1 0x%lx\n", __FUNCTION__, TITAN_cchip->dim1.csr);
-       printk("%s: CSR_DIR0 0x%lx\n", __FUNCTION__, TITAN_cchip->dir0.csr);
-       printk("%s: CSR_DIR1 0x%lx\n", __FUNCTION__, TITAN_cchip->dir1.csr);
-       printk("%s: CSR_DRIR 0x%lx\n", __FUNCTION__, TITAN_cchip->drir.csr);
-
-       printk("%s: DChip registers:\n", __FUNCTION__);
-       printk("%s: CSR_DSC 0x%lx\n", __FUNCTION__, TITAN_dchip->dsc.csr);
-       printk("%s: CSR_STR 0x%lx\n", __FUNCTION__, TITAN_dchip->str.csr);
-       printk("%s: CSR_DREV 0x%lx\n", __FUNCTION__, TITAN_dchip->drev.csr);
+       printk("%s: titan_init_arch()\n", __func__);
+       printk("%s: CChip registers:\n", __func__);
+       printk("%s: CSR_CSC 0x%lx\n", __func__, TITAN_cchip->csc.csr);
+       printk("%s: CSR_MTR 0x%lx\n", __func__, TITAN_cchip->mtr.csr);
+       printk("%s: CSR_MISC 0x%lx\n", __func__, TITAN_cchip->misc.csr);
+       printk("%s: CSR_DIM0 0x%lx\n", __func__, TITAN_cchip->dim0.csr);
+       printk("%s: CSR_DIM1 0x%lx\n", __func__, TITAN_cchip->dim1.csr);
+       printk("%s: CSR_DIR0 0x%lx\n", __func__, TITAN_cchip->dir0.csr);
+       printk("%s: CSR_DIR1 0x%lx\n", __func__, TITAN_cchip->dir1.csr);
+       printk("%s: CSR_DRIR 0x%lx\n", __func__, TITAN_cchip->drir.csr);
+
+       printk("%s: DChip registers:\n", __func__);
+       printk("%s: CSR_DSC 0x%lx\n", __func__, TITAN_dchip->dsc.csr);
+       printk("%s: CSR_STR 0x%lx\n", __func__, TITAN_dchip->str.csr);
+       printk("%s: CSR_DREV 0x%lx\n", __func__, TITAN_dchip->drev.csr);
 #endif
 
        boot_cpuid = __hard_smp_processor_id();
 
        /* 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);
@@ -691,7 +680,7 @@ titan_agp_bind_memory(alpha_agp_info *agp, off_t pg_start, struct agp_memory *me
 {
        struct titan_agp_aperture *aper = agp->aperture.sysdata;
        return iommu_bind(aper->arena, aper->pg_start + pg_start, 
-                         mem->page_count, mem->memory);
+                         mem->page_count, mem->pages);
 }
 
 static int 
@@ -711,13 +700,13 @@ titan_agp_translate(alpha_agp_info *agp, dma_addr_t addr)
 
        if (addr < agp->aperture.bus_base ||
            addr >= agp->aperture.bus_base + agp->aperture.size) {
-               printk("%s: addr out of range\n", __FUNCTION__);
+               printk("%s: addr out of range\n", __func__);
                return -EINVAL;
        }
 
        pte = aper->arena->ptes[baddr >> PAGE_SHIFT];
        if (!(pte & 1)) {
-               printk("%s: pte not valid\n", __FUNCTION__);
+               printk("%s: pte not valid\n", __func__);
                return -EINVAL;
        }
 
@@ -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;