I'm confused about the propagation of resource values. Most of it seems to be happening correctly, but it's not quite there.
in the dts I see domain@0 which I assume is PCI_DOMAIN: 0000 in the log. The problem is that although the resource for PCI_DOMAIN 0000 resource 02 get set correctly to [0xfd000000 - 0xfe1fffff], PCI: 00:18.0 has no corresponding resource. That seems wrong.
How can the resources for the domain be getting set correctly when it's child's resources aren't?
Am I asking the wrong questions? It's taking a long time tracing all the indirection in the code.
Thanks, Myles
/{ mainboard_vendor = "AMD"; mainboard_name = "Serengeti"; cpus { }; apic@0 { }; domain@0 { /config/("northbridge/amd/k8/domain"); pci@1,0{ }; /* guesses; we need a real lspci */ pci0@18,0 { /config/("northbridge/amd/k8/pci"); pci@0,0 { /config/("southbridge/amd/amd8111/pci.dts"); pci@1,0{ /config/("southbridge/amd/amd8111/nic.dts"); enabled = "0"; }; 8< --------------- SNIP ------------------------------------------------------
Here's a snippet of a verbose log from serengeti v3: read_resources: root(Root Device) dtsname domain_0 have_resources 1 enabled 1 read_resources: root(Root Device) read_resources bus 0 link: 0 done PCI_DOMAIN: 0000: resource 0 base: 00001000 limit: 00000000 flags = 0000ffff mask = 00000000, type = 40000100 PCI_DOMAIN: 0000: resource 1 base: 01200000 limit: 00000000 flags = ffffffff mask = 000000fc, type = 40001200 PCI_DOMAIN: 0000: resource 1 base: 01200000 limit: 00000000 PCI_DOMAIN: 0000: resource 2 base: 00000000 limit: 00000000 flags = febfffff mask = 00000000, type = 40000200 PCI_DOMAIN: 0000: resource 2 base: 00000000 limit: 00000000 Root Device in loop base: fd000000 bridge->base: fd000000 PCI_DOMAIN: 0000 02 * [0xfd000000 - 0xfe1fffff] mem Root Device MEM base: fe200000 bridge->base: fd000000 PCI_DOMAIN: 0000: resource 0 base: 00001000 limit: 00000000 flags = 0000ffff mask = 00000000, type = 40000100 PCI_DOMAIN: 0000: resource 1 base: 01200000 limit: 00000000 flags = ffffffff mask = 000000fc, type = 40001200 PCI_DOMAIN: 0000: resource 1 base: 01200000 limit: 00000000 PCI_DOMAIN: 0000: resource 2 base: fd000000 limit: 00000000 flags = febfffff mask = 00000000, type = 40000200 PCI_DOMAIN: 0000: resource 2 base: fd000000 limit: 00000000 Root Device in loop base: fe200000 bridge->base: fd000000 PCI_DOMAIN: 0000 01 * [0xfe200000 - 0xfe1fffff] prefmem Root Device MEM base: fe200000 bridge->base: fd000000 PCI_DOMAIN: 0000: resource 0 base: 00001000 limit: 00000000 flags = 0000ffff mask = 00000000, type = 40000100 PCI_DOMAIN: 0000: resource 1 base: fe200000 limit: 00000000 flags = ffffffff mask = 000000fc, type = 40001200 PCI_DOMAIN: 0000: resource 1 base: fe200000 limit: 00000000 PCI_DOMAIN: 0000: resource 2 base: fd000000 limit: 00000000 flags = febfffff mask = 00000000, type = 40000200 PCI_DOMAIN: 0000: resource 2 base: fd000000 limit: 00000000 Root Device size: 01200000 Root Device base: fd000000 Root Device after align_up base: fd000000 Root Device compute_allocate_mem: base: fe200000 bridge->base: fd000000 size: 01200000 align: 24 gran: 0 done root_dev_set_resources is the failure here? root_dev_set_resources bus->dev Root Device root_dev_set_resources MEM resource base fd000000 size 0 align 1200000 gran 0 limit 18 flags 0
At this point the Root device has the memory resource with a reasonable base.
root(Root Device) assign_resources, bus 0 link: 0 cpus: Unknown device path type: 0 cpus() skipped apic_0(APIC: 00) skipped domain_0(PCI_DOMAIN: 0000) assign_resources k8_pci_domain_set_resources PCI: 00:18.0: resource 0 base: 00000000 limit: 00000000 flags = ffffffff mask = 000000ff, type = 00001200 PCI: 00:18.0: resource 0 base: 00000000 limit: 00000000 PCI: 00:18.0 best is NULL new->base: 00000000 PCI: 00:18.0: resource 1 base: 00001000 limit: 00000000 flags = 0000ffff mask = 00000000, type = 40000100 PCI: 00:18.0: resource 2 base: 00000000 limit: 00000000 flags = febfffff mask = 00000000, type = 40000200 PCI: 00:18.0: resource 2 base: 00000000 limit: 00000000 PCI: 00:18.0 best is NULL new->base: 00000000 PCI: 00:18.0: resource 3 base: 00003000 limit: 00000000 flags = 0000ffff mask = 00000000, type = 40000100 PCI: 00:18.0: resource 4 base: 00000000 limit: 00000000 flags = ffffffff mask = 000000ff, type = 00001200 PCI: 00:18.0: resource 4 base: 00000000 limit: 00000000 PCI: 00:18.0 best is NULL new->base: 00000000 PCI: 00:18.0: resource 5 base: 01200000 limit: 00000000 flags = ffffffff mask = 000000ff, type = 40000200 PCI: 00:18.0: resource 5 base: 01200000 limit: 00000000 PCI: 00:18.0 best is NULL new->base: 01200000 better! find_pci_tolm: tolm=01200000 1: pci_tolm=01200000 1: mmio_basek=00004800 2: mmio_basek=00004800 3: mmio_basek=00000000 node 0 : mmio_basek=00000000, basek=00000300, limitk=00040000 domain_0(PCI_DOMAIN: 0000) assign_resources, bus 0 link: 0 domain_0_pci0_18_0(PCI: 00:18.0) assign_resources amdk8_set_resources: nodeid 0