/* * Unmap a previously mapped device. */ void iounmap(void *kva, int size) { #ifdef DEBUG if (((vaddr_t)kva & PGOFSET) || (size & PGOFSET)) panic("iounmap: unaligned"); if ((uint8_t *)kva < extiobase || (uint8_t *)kva >= extiobase + ptoa(EIOMAPSIZE)) panic("iounmap: bad address"); #endif physunaccess(kva, size); if (extent_free(extio_ex, (vaddr_t)kva, size, EX_NOWAIT | (extio_ex_malloc_safe ? EX_MALLOCOK : 0))) printf("iounmap: kva %p size 0x%x: can't free region\n", kva, size); }
void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size) { vaddr_t kva; vsize_t offset; if (t->bustype == HP300_BUS_SPACE_INTIO) { /* * Intio space is direct-mapped in pmap_bootstrap(); nothing * to do */ return; } if (t->bustype != HP300_BUS_SPACE_DIO && t->bustype != HP300_BUS_SPACE_SGC) panic("%s: bad space tag", __func__); kva = m68k_trunc_page(bsh); offset = m68k_page_offset(bsh); size = m68k_round_page(offset + size); #ifdef DIAGNOSTIC if (bsh < (vaddr_t)extiobase || bsh >= ((vaddr_t)extiobase + ptoa(EIOMAPSIZE))) panic("%s: bad bus space handle", __func__); #endif /* * Unmap the range. */ physunaccess((void *)kva, size); /* * Free it from the extio extent map. */ if (extent_free(extio_ex, kva, size, EX_NOWAIT | (extio_ex_malloc_safe ? EX_MALLOCOK : 0))) printf("%s: kva 0x%lx size 0x%lx: " "can't free region\n", __func__, (u_long)bsh, size); }