示例#1
0
/*
 * 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);
}
示例#2
0
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);
}