|
@@ -367,3 +367,113 @@ mk_conf_addr(struct pci_bus *pbus, unsigned int device_fn, int where,
|
|
|
bus = 0;
|
|
|
*type1 = (bus != 0);
|
|
|
|
|
|
+ addr = (bus << 16) | (device_fn << 8) | where;
|
|
|
+ addr |= hose->config_space_base;
|
|
|
+
|
|
|
+ *pci_addr = addr;
|
|
|
+ DBG_CFG(("mk_conf_addr: returning pci_addr 0x%lx\n", addr));
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+wildfire_read_config(struct pci_bus *bus, unsigned int devfn, int where,
|
|
|
+ int size, u32 *value)
|
|
|
+{
|
|
|
+ unsigned long addr;
|
|
|
+ unsigned char type1;
|
|
|
+
|
|
|
+ if (mk_conf_addr(bus, devfn, where, &addr, &type1))
|
|
|
+ return PCIBIOS_DEVICE_NOT_FOUND;
|
|
|
+
|
|
|
+ switch (size) {
|
|
|
+ case 1:
|
|
|
+ *value = __kernel_ldbu(*(vucp)addr);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ *value = __kernel_ldwu(*(vusp)addr);
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ *value = *(vuip)addr;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return PCIBIOS_SUCCESSFUL;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+wildfire_write_config(struct pci_bus *bus, unsigned int devfn, int where,
|
|
|
+ int size, u32 value)
|
|
|
+{
|
|
|
+ unsigned long addr;
|
|
|
+ unsigned char type1;
|
|
|
+
|
|
|
+ if (mk_conf_addr(bus, devfn, where, &addr, &type1))
|
|
|
+ return PCIBIOS_DEVICE_NOT_FOUND;
|
|
|
+
|
|
|
+ switch (size) {
|
|
|
+ case 1:
|
|
|
+ __kernel_stb(value, *(vucp)addr);
|
|
|
+ mb();
|
|
|
+ __kernel_ldbu(*(vucp)addr);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ __kernel_stw(value, *(vusp)addr);
|
|
|
+ mb();
|
|
|
+ __kernel_ldwu(*(vusp)addr);
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ *(vuip)addr = value;
|
|
|
+ mb();
|
|
|
+ *(vuip)addr;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return PCIBIOS_SUCCESSFUL;
|
|
|
+}
|
|
|
+
|
|
|
+struct pci_ops wildfire_pci_ops =
|
|
|
+{
|
|
|
+ .read = wildfire_read_config,
|
|
|
+ .write = wildfire_write_config,
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * NUMA Support
|
|
|
+ */
|
|
|
+int wildfire_pa_to_nid(unsigned long pa)
|
|
|
+{
|
|
|
+ return pa >> 36;
|
|
|
+}
|
|
|
+
|
|
|
+int wildfire_cpuid_to_nid(int cpuid)
|
|
|
+{
|
|
|
+ /* assume 4 CPUs per node */
|
|
|
+ return cpuid >> 2;
|
|
|
+}
|
|
|
+
|
|
|
+unsigned long wildfire_node_mem_start(int nid)
|
|
|
+{
|
|
|
+ /* 64GB per node */
|
|
|
+ return (unsigned long)nid * (64UL * 1024 * 1024 * 1024);
|
|
|
+}
|
|
|
+
|
|
|
+unsigned long wildfire_node_mem_size(int nid)
|
|
|
+{
|
|
|
+ /* 64GB per node */
|
|
|
+ return 64UL * 1024 * 1024 * 1024;
|
|
|
+}
|
|
|
+
|
|
|
+#if DEBUG_DUMP_REGS
|
|
|
+
|
|
|
+static void __init
|
|
|
+wildfire_dump_pci_regs(int qbbno, int hoseno)
|
|
|
+{
|
|
|
+ wildfire_pci *pci = WILDFIRE_pci(qbbno, hoseno);
|
|
|
+ int i;
|
|
|
+
|
|
|
+ printk(KERN_ERR "PCI registers for QBB %d hose %d (%p)\n",
|
|
|
+ qbbno, hoseno, pci);
|
|
|
+
|
|
|
+ printk(KERN_ERR " PCI_IO_ADDR_EXT: 0x%16lx\n",
|
|
|
+ pci->pci_io_addr_ext.csr);
|