Пример #1
0
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);
}
Пример #2
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;
		}
	}
}