int i81342_mem_bs_map(bus_space_tag_t tag, bus_addr_t bpa, bus_size_t size, int flags, bus_space_handle_t *bshp) { struct i81342_pci_softc *sc = (struct i81342_pci_softc *)tag->bs_privdata; struct i81342_pci_map *tmp; vm_offset_t addr, endaddr; vm_paddr_t paddr; /* Lookup to see if we already have a mapping at this address. */ tmp = sc->sc_pci_mappings; while (tmp) { if (tmp->paddr <= bpa && tmp->paddr + tmp->size > bpa + size) { *bshp = bpa - tmp->paddr + tmp->vaddr; return (0); } tmp = tmp->next; } addr = allocable; endaddr = ((addr + size) &~ (0x1000000 - 1)) + 0x1000000; if (endaddr >= IOP34X_VADDR) panic("PCI virtual memory exhausted"); allocable = endaddr; tmp = malloc(sizeof(*tmp), M_DEVBUF, M_WAITOK); tmp->next = NULL; paddr = bpa &~ (0x100000 - 1); tmp->paddr = paddr; tmp->vaddr = addr; tmp->size = 0; while (addr < endaddr) { pmap_kenter_supersection(addr, paddr + (sc->sc_is_atux ? IOP34X_PCIX_OMBAR : IOP34X_PCIE_OMBAR), 0); addr += 0x1000000; paddr += 0x1000000; tmp->size += 0x1000000; } tmp->next = sc->sc_pci_mappings; sc->sc_pci_mappings = tmp; *bshp = bpa - tmp->paddr + tmp->vaddr; return (0); }
void arm_init_smallalloc(void) { vm_offset_t to_map = 0, mapaddr; int i; /* * We need to use dump_avail and not phys_avail, since we want to * map the whole memory and not just the memory available to the VM * to be able to do a pa => va association for any address. */ for (i = 0; dump_avail[i + 1]; i+= 2) { to_map += (dump_avail[i + 1] & S_FRAME) + S_SIZE - (dump_avail[i] & S_FRAME); } alloc_firstaddr = mapaddr = KERNBASE - to_map; for (i = 0; dump_avail[i + 1]; i+= 2) { vm_offset_t size = (dump_avail[i + 1] & S_FRAME) + S_SIZE - (dump_avail[i] & S_FRAME); vm_offset_t did = 0; while (size > 0) { #ifdef ARM_HAVE_SUPERSECTIONS pmap_kenter_supersection(mapaddr, (dump_avail[i] & L1_SUP_FRAME) + did, SECTION_CACHE); #else pmap_kenter_section(mapaddr, (dump_avail[i] & L1_S_FRAME) + did, SECTION_CACHE); #endif mapaddr += S_SIZE; did += S_SIZE; size -= S_SIZE; } } }