|
@@ -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;
|
|
|
|