- Fix IMAPx registers values calculation

- Initialize SMAPx registers too although they're unused in QEMU
- Do not pass IO/MEM resources to upper bus for activation, handle them locally.
    Previously ACTIVATE method of upper bus was no-op so nothing bad
    happened. But now FDT maps physaddr to vaddr and it causes
    troubles: fdtbus_activate_resource resource assumes that
    bustag/bushandle are already set which in this case is wrong.
This commit is contained in:
Oleksandr Tymoshenko 2013-06-29 23:51:17 +00:00
parent 5d490515c3
commit 396e0d581d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=252395

View File

@ -173,16 +173,17 @@ versatile_pci_attach(device_t dev)
/*
* Setup memory windows
*/
versatile_pci_core_write_4(PCI_CORE_IMAP0, (PCI_IO_WINDOW >> 11));
versatile_pci_core_write_4(PCI_CORE_IMAP1, (PCI_NPREFETCH_WINDOW >> 11));
versatile_pci_core_write_4(PCI_CORE_IMAP2, (PCI_PREFETCH_WINDOW >> 11));
versatile_pci_core_write_4(PCI_CORE_IMAP0, (PCI_IO_WINDOW >> 28));
versatile_pci_core_write_4(PCI_CORE_IMAP1, (PCI_NPREFETCH_WINDOW >> 28));
versatile_pci_core_write_4(PCI_CORE_IMAP2, (PCI_PREFETCH_WINDOW >> 28));
/*
* XXX: this is SDRAM offset >> 28
* Unused as of QEMU 1.5
*/
versatile_pci_core_write_4(PCI_CORE_SMAP0, 0);
versatile_pci_core_write_4(PCI_CORE_SMAP1, 0);
versatile_pci_core_write_4(PCI_CORE_SMAP2, 0);
versatile_pci_core_write_4(PCI_CORE_SMAP0, (PCI_IO_WINDOW >> 28));
versatile_pci_core_write_4(PCI_CORE_SMAP1, (PCI_NPREFETCH_WINDOW >> 28));
versatile_pci_core_write_4(PCI_CORE_SMAP2, (PCI_NPREFETCH_WINDOW >> 28));
versatile_pci_sys_write_4(SYS_PCICTL, 1);
@ -307,7 +308,7 @@ versatile_pci_alloc_resource(device_t bus, device_t child, int type, int *rid,
struct resource *rv;
struct rman *rm;
printf("Alloc resources %d, %08lx..%08lx, %ld\n", type, start, end, count);
dprintf("Alloc resources %d, %08lx..%08lx, %ld\n", type, start, end, count);
switch (type) {
case SYS_RES_IOPORT:
@ -344,20 +345,23 @@ versatile_pci_activate_resource(device_t bus, device_t child, int type, int rid,
struct resource *r)
{
vm_offset_t vaddr;
int res = (BUS_ACTIVATE_RESOURCE(device_get_parent(bus),
child, type, rid, r));
int res;
if (!res) {
switch(type) {
case SYS_RES_MEMORY:
case SYS_RES_IOPORT:
vaddr = (vm_offset_t)pmap_mapdev(rman_get_start(r),
rman_get_size(r));
rman_set_bushandle(r, vaddr);
rman_set_bustag(r, versatile_bus_space_pcimem);
break;
}
switch(type) {
case SYS_RES_MEMORY:
case SYS_RES_IOPORT:
vaddr = (vm_offset_t)pmap_mapdev(rman_get_start(r),
rman_get_size(r));
rman_set_bushandle(r, vaddr);
rman_set_bustag(r, versatile_bus_space_pcimem);
res = rman_activate_resource(r);
break;
case SYS_RES_IRQ:
res = (BUS_ACTIVATE_RESOURCE(device_get_parent(bus),
child, type, rid, r));
break;
}
return (res);
}