ck804 pref mem 4G above support
authorYinghai Lu <yinghai.lu@amd.com>
Wed, 20 Dec 2006 20:15:33 +0000 (20:15 +0000)
committerYinghai Lu <yinghailu@gmail.com>
Wed, 20 Dec 2006 20:15:33 +0000 (20:15 +0000)
Signed-off-by: Yinghai Lu <yinghai.lu@amd.com>
Acked-by: Yinghai Lu <yinghai.lu@amd.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2532 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

src/southbridge/nvidia/ck804/ck804_pci.c

index 34e2e9c970cf5967fec1e8967d04fc1802b3a17d..b2477c1de6ca06a54ca6d40913707b77f8288e82 100644 (file)
@@ -14,6 +14,10 @@ static void pci_init(struct device *dev)
 {
 
        uint32_t dword;
+#if CONFIG_PCI_64BIT_PREF_MEM == 1
+       device_t pci_domain_dev;
+       struct resource *mem1, *mem2;
+#endif
        
        /* System error enable */
        dword = pci_read_config32(dev, 0x04);
@@ -34,8 +38,27 @@ static void pci_init(struct device *dev)
         pci_write_config32(dev, 0x4c, dword);
 #endif
 
+#if CONFIG_PCI_64BIT_PREF_MEM == 1
+       pci_domain_dev = dev->bus->dev;
+       while(pci_domain_dev) {
+               if(pci_domain_dev->path.type == DEVICE_PATH_PCI_DOMAIN) break;
+               pci_domain_dev = pci_domain_dev->bus->dev;
+       }
+
+       if(!pci_domain_dev) return; // impossiable
+       mem1 = find_resource(pci_domain_dev, 1); // prefmem, it could be 64bit
+       mem2 = find_resource(pci_domain_dev, 2); // mem
+       if(mem1->base > mem2->base) {
+               dword = mem2->base  & (0xffff0000UL);
+               printk_debug("PCI DOMAIN mem2 base = 0x%010Lx\n", mem2->base);
+       } else {
+               dword = mem1->base  & (0xffff0000UL);
+               printk_debug("PCI DOMAIN mem1 (prefmem) base = 0x%010Lx\n", mem1->base);
+       }
+#else
        dword = dev_root.resource[1].base & (0xffff0000UL);
-       printk_debug("dev_root mem base = 0x%010Lx\n", dev_root.resource[1].base);      
+       printk_debug("dev_root mem base = 0x%010Lx\n", dev_root.resource[1].base);
+#endif
 
        printk_debug("[0x50] <-- 0x%08x\n", dword);
         pci_write_config32(dev, 0x50, dword); //TOM