|
@@ -150,3 +150,116 @@ irongate_write_config(struct pci_bus *bus, unsigned int devfn, int where,
|
|
mb();
|
|
mb();
|
|
*(vuip)addr;
|
|
*(vuip)addr;
|
|
break;
|
|
break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return PCIBIOS_SUCCESSFUL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+struct pci_ops irongate_pci_ops =
|
|
|
|
+{
|
|
|
|
+ .read = irongate_read_config,
|
|
|
|
+ .write = irongate_write_config,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+int
|
|
|
|
+irongate_pci_clr_err(void)
|
|
|
|
+{
|
|
|
|
+ unsigned int nmi_ctl=0;
|
|
|
|
+ unsigned int IRONGATE_jd;
|
|
|
|
+
|
|
|
|
+again:
|
|
|
|
+ IRONGATE_jd = IRONGATE0->stat_cmd;
|
|
|
|
+ printk("Iron stat_cmd %x\n", IRONGATE_jd);
|
|
|
|
+ IRONGATE0->stat_cmd = IRONGATE_jd; /* write again clears error bits */
|
|
|
|
+ mb();
|
|
|
|
+ IRONGATE_jd = IRONGATE0->stat_cmd; /* re-read to force write */
|
|
|
|
+
|
|
|
|
+ IRONGATE_jd = *IronECC;
|
|
|
|
+ printk("Iron ECC %x\n", IRONGATE_jd);
|
|
|
|
+ *IronECC = IRONGATE_jd; /* write again clears error bits */
|
|
|
|
+ mb();
|
|
|
|
+ IRONGATE_jd = *IronECC; /* re-read to force write */
|
|
|
|
+
|
|
|
|
+ /* Clear ALI NMI */
|
|
|
|
+ nmi_ctl = inb(0x61);
|
|
|
|
+ nmi_ctl |= 0x0c;
|
|
|
|
+ outb(nmi_ctl, 0x61);
|
|
|
|
+ nmi_ctl &= ~0x0c;
|
|
|
|
+ outb(nmi_ctl, 0x61);
|
|
|
|
+
|
|
|
|
+ IRONGATE_jd = *IronECC;
|
|
|
|
+ if (IRONGATE_jd & 0x300) goto again;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#define IRONGATE_3GB 0xc0000000UL
|
|
|
|
+
|
|
|
|
+/* On Albacore (aka UP1500) with 4Gb of RAM we have to reserve some
|
|
|
|
+ memory for PCI. At this point we just reserve memory above 3Gb. Most
|
|
|
|
+ of this memory will be freed after PCI setup is done. */
|
|
|
|
+static void __init
|
|
|
|
+albacore_init_arch(void)
|
|
|
|
+{
|
|
|
|
+ unsigned long memtop = max_low_pfn << PAGE_SHIFT;
|
|
|
|
+ unsigned long pci_mem = (memtop + 0x1000000UL) & ~0xffffffUL;
|
|
|
|
+ struct percpu_struct *cpu;
|
|
|
|
+ int pal_rev, pal_var;
|
|
|
|
+
|
|
|
|
+ cpu = (struct percpu_struct*)((char*)hwrpb + hwrpb->processor_offset);
|
|
|
|
+ pal_rev = cpu->pal_revision & 0xffff;
|
|
|
|
+ pal_var = (cpu->pal_revision >> 16) & 0xff;
|
|
|
|
+
|
|
|
|
+ /* Consoles earlier than A5.6-18 (OSF PALcode v1.62-2) set up
|
|
|
|
+ the CPU incorrectly (leave speculative stores enabled),
|
|
|
|
+ which causes memory corruption under certain conditions.
|
|
|
|
+ Issue a warning for such consoles. */
|
|
|
|
+ if (alpha_using_srm &&
|
|
|
|
+ (pal_rev < 0x13e || (pal_rev == 0x13e && pal_var < 2)))
|
|
|
|
+ printk(KERN_WARNING "WARNING! Upgrade to SRM A5.6-19 "
|
|
|
|
+ "or later\n");
|
|
|
|
+
|
|
|
|
+ if (pci_mem > IRONGATE_3GB)
|
|
|
|
+ pci_mem = IRONGATE_3GB;
|
|
|
|
+ IRONGATE0->pci_mem = pci_mem;
|
|
|
|
+ alpha_mv.min_mem_address = pci_mem;
|
|
|
|
+ if (memtop > pci_mem) {
|
|
|
|
+#ifdef CONFIG_BLK_DEV_INITRD
|
|
|
|
+ extern unsigned long initrd_start, initrd_end;
|
|
|
|
+ extern void *move_initrd(unsigned long);
|
|
|
|
+
|
|
|
|
+ /* Move the initrd out of the way. */
|
|
|
|
+ if (initrd_end && __pa(initrd_end) > pci_mem) {
|
|
|
|
+ unsigned long size;
|
|
|
|
+
|
|
|
|
+ size = initrd_end - initrd_start;
|
|
|
|
+ free_bootmem_node(NODE_DATA(0), __pa(initrd_start),
|
|
|
|
+ PAGE_ALIGN(size));
|
|
|
|
+ if (!move_initrd(pci_mem))
|
|
|
|
+ printk("irongate_init_arch: initrd too big "
|
|
|
|
+ "(%ldK)\ndisabling initrd\n",
|
|
|
|
+ size / 1024);
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+ reserve_bootmem_node(NODE_DATA(0), pci_mem, memtop -
|
|
|
|
+ pci_mem, BOOTMEM_DEFAULT);
|
|
|
|
+ printk("irongate_init_arch: temporarily reserving "
|
|
|
|
+ "region %08lx-%08lx for PCI\n", pci_mem, memtop - 1);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void __init
|
|
|
|
+irongate_setup_agp(void)
|
|
|
|
+{
|
|
|
|
+ /* Disable the GART window. AGPGART doesn't work due to yet
|
|
|
|
+ unresolved memory coherency issues... */
|
|
|
|
+ IRONGATE0->agpva = IRONGATE0->agpva & ~0xf;
|
|
|
|
+ alpha_agpgart_size = 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void __init
|
|
|
|
+irongate_init_arch(void)
|
|
|
|
+{
|
|
|
|
+ struct pci_controller *hose;
|
|
|
|
+ int amd761 = (IRONGATE0->dev_vendor >> 16) > 0x7006; /* Albacore? */
|
|
|
|
+
|