/* Find PROM mappings (for console support). */ void zs_init(void) { vaddr_t va; int i; for (i = 0; i < NZS; i++) { if (find_prom_map(zs_physaddr[i], PMAP_OBIO, sizeof(struct zschan), &va) == 0) zsaddr[i] = (void *)va; } }
int sun68k_bus_map(bus_space_tag_t t, bus_type_t iospace, bus_addr_t addr, bus_size_t size, int flags, vaddr_t vaddr, bus_space_handle_t *hp) { bus_size_t offset; vaddr_t v; /* * If we suspect there might be one, try to find * and use a PROM mapping. */ if ((flags & _SUN68K_BUS_MAP_USE_PROM) != 0 && find_prom_map(addr, iospace, size, &v) == 0) { *hp = (bus_space_handle_t)v; return (0); } /* * Adjust the user's request to be page-aligned. */ offset = addr & PGOFSET; addr -= offset; size += offset; size = m68k_round_page(size); if (size == 0) { printf("sun68k_bus_map: zero size\n"); return (EINVAL); } /* Get some kernel virtual address space. */ if (vaddr) v = vaddr; else v = uvm_km_alloc(kernel_map, size, 0, UVM_KMF_VAONLY | UVM_KMF_WAITVA); if (v == 0) panic("sun68k_bus_map: no memory"); /* note: preserve page offset */ *hp = (bus_space_handle_t)(v | offset); /* * Map the device. */ addr |= iospace | PMAP_NC; pmap_map(v, addr, addr + size, VM_PROT_ALL); return (0); }
/* * Make a permanent mapping for a device. */ void * bus_mapin(int bustype, int pa, int sz) { vaddr_t va; int off; if ((bustype < 0) || (bustype >= BUS__NTYPES)) panic("bus_mapin: bustype"); off = pa & PGOFSET; pa -= off; sz += off; sz = m68k_round_page(sz); /* Borrow PROM mappings if we can. */ if (bustype == BUS_OBIO) { if (find_prom_map(pa, PMAP_OBIO, sz, &va) == 0) goto done; } pa &= bus_info[bustype].mask; pa |= bus_info[bustype].base; pa |= bus_info[bustype].type; pa |= PMAP_NC; /* non-cached */ /* Get some kernel virtual address space. */ va = uvm_km_alloc(kernel_map, sz, 0, UVM_KMF_VAONLY | UVM_KMF_WAITVA); if (va == 0) panic("bus_mapin"); /* Map it to the specified bus. */ pmap_map(va, pa, pa + sz, VM_PROT_ALL); done: return ((void*)(va + off)); }