- 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:
parent
5d490515c3
commit
396e0d581d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=252395
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user