int __BS(get_window)(void *v, int window, struct mips_bus_space_translation *mbst) { switch (window) { #ifdef CHIP_W1_BUS_START case 0: mbst->mbst_bus_start = CHIP_W1_BUS_START(v); mbst->mbst_bus_end = CHIP_W1_BUS_END(v); mbst->mbst_sys_start = CHIP_W1_SYS_START(v); mbst->mbst_sys_end = CHIP_W1_SYS_END(v); mbst->mbst_align_stride = CHIP_ALIGN_STRIDE; mbst->mbst_flags = 0; break; #endif #ifdef CHIP_W2_BUS_START case 1: mbst->mbst_bus_start = CHIP_W2_BUS_START(v); mbst->mbst_bus_end = CHIP_W2_BUS_END(v); mbst->mbst_sys_start = CHIP_W2_SYS_START(v); mbst->mbst_sys_end = CHIP_W2_SYS_END(v); mbst->mbst_align_stride = CHIP_ALIGN_STRIDE; mbst->mbst_flags = 0; break; #endif #ifdef CHIP_W3_BUS_START case 2: mbst->mbst_bus_start = CHIP_W3_BUS_START(v); mbst->mbst_bus_end = CHIP_W3_BUS_END(v); mbst->mbst_sys_start = CHIP_W3_SYS_START(v); mbst->mbst_sys_end = CHIP_W3_SYS_END(v); mbst->mbst_align_stride = CHIP_ALIGN_STRIDE; mbst->mbst_flags = 0; break; #endif default: panic(__S(__BS(get_window)) ": invalid window %d", window); } return (0); }
void __BS(unmap)(void *v, bus_space_handle_t h, bus_size_t size, int acct) { #ifdef CHIP_EXTENT bus_addr_t addr; int error; if (acct == 0) return; #ifdef EXTENT_DEBUG printf("xxx: freeing handle 0x%lx for 0x%lx\n", h, size); #endif if (h >= MIPS_KSEG0_START && h < MIPS_KSEG1_START) h = MIPS_KSEG0_TO_PHYS(h); else h = MIPS_KSEG1_TO_PHYS(h); #ifdef CHIP_W1_BUS_START if (h >= CHIP_W1_SYS_START(v) && h <= CHIP_W1_SYS_END(v)) { addr = CHIP_W1_BUS_START(v) + (h - CHIP_W1_SYS_START(v)); } else #endif #ifdef CHIP_W2_BUS_START if (h >= CHIP_W2_SYS_START(v) && h <= CHIP_W2_SYS_END(v)) { addr = CHIP_W2_BUS_START(v) + (h - CHIP_W2_SYS_START(v)); } else #endif #ifdef CHIP_W3_BUS_START if (h >= CHIP_W3_SYS_START(v) && h <= CHIP_W3_SYS_END(v)) { addr = CHIP_W3_BUS_START(v) + (h - CHIP_W3_SYS_START(v)); } else #endif { printf("\n"); #ifdef CHIP_W1_BUS_START printf("%s: sys window[1]=0x%lx-0x%lx\n", __S(__BS(map)), (u_long)CHIP_W1_SYS_START(v), (u_long)CHIP_W1_SYS_END(v)); #endif #ifdef CHIP_W2_BUS_START printf("%s: sys window[2]=0x%lx-0x%lx\n", __S(__BS(map)), (u_long)CHIP_W2_SYS_START(v), (u_long)CHIP_W2_SYS_END(v)); #endif #ifdef CHIP_W3_BUS_START printf("%s: sys window[3]=0x%lx-0x%lx\n", __S(__BS(map)), (u_long)CHIP_W3_SYS_START(v), (u_long)CHIP_W3_SYS_END(v)); #endif panic("%s: don't know how to unmap %lx", __S(__BS(unmap)), h); } #ifdef EXTENT_DEBUG printf("xxx: freeing 0x%lx to 0x%lx\n", addr, addr + size - 1); #endif error = extent_free(CHIP_EXTENT(v), addr, size, EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)); if (error) { printf("%s: WARNING: could not unmap 0x%lx-0x%lx (error %d)\n", __S(__BS(unmap)), addr, addr + size - 1, error); #ifdef EXTENT_DEBUG extent_print(CHIP_EXTENT(v)); #endif } #endif /* CHIP_EXTENT */ }
static void __BS(unmap)(void *v, bus_space_handle_t h, bus_size_t size, int acct) { #if !defined(_LP64) || defined(CHIP_EXTENT) bus_addr_t addr = 0; /* initialize to appease gcc */ #endif #ifndef _LP64 bool handle_is_km; /* determine if h is addr obtained from uvm_km_alloc */ handle_is_km = !(MIPS_KSEG0_P(h) || MIPS_KSEG1_P(h)); #ifdef __mips_n32 if (handle_is_km == true) handle_is_km = !MIPS_XKPHYS_P(h); #endif if (handle_is_km == true) { paddr_t pa; vaddr_t va = (vaddr_t)trunc_page(h); vsize_t sz = (vsize_t)round_page((h % PAGE_SIZE) + size); int s; s = splhigh(); if (pmap_extract(pmap_kernel(), (vaddr_t)h, &pa) == false) panic("%s: pmap_extract failed", __func__); addr = (bus_addr_t)pa; #if 0 printf("%s:%d: addr %#"PRIxBUSADDR", sz %#"PRIxVSIZE"\n", __func__, __LINE__, addr, sz); #endif /* sanity check: this is why we couldn't map w/ kseg[0,1] */ KASSERT (((addr + sz) & ~MIPS_PHYS_MASK) != 0); pmap_kremove(va, sz); pmap_update(pmap_kernel()); uvm_km_free(kernel_map, va, sz, UVM_KMF_VAONLY); splx(s); } #endif /* _LP64 */ #ifdef CHIP_EXTENT if (acct == 0) return; #ifdef EXTENT_DEBUG printf("%s: freeing handle %#"PRIxBSH" for %#"PRIxBUSSIZE"\n", __S(__BS(unmap)), h, size); #endif #ifdef _LP64 KASSERT(MIPS_XKPHYS_P(h)); addr = MIPS_XKPHYS_TO_PHYS(h); #else if (handle_is_km == false) { if (MIPS_KSEG0_P(h)) addr = MIPS_KSEG0_TO_PHYS(h); #ifdef __mips_n32 else if (MIPS_XKPHYS_P(h)) addr = MIPS_XKPHYS_TO_PHYS(h); #endif else addr = MIPS_KSEG1_TO_PHYS(h); } #endif #ifdef CHIP_W1_BUS_START if (addr >= CHIP_W1_SYS_START(v) && addr <= CHIP_W1_SYS_END(v)) { addr = CHIP_W1_BUS_START(v) + (addr - CHIP_W1_SYS_START(v)); } else #endif #ifdef CHIP_W2_BUS_START if (addr >= CHIP_W2_SYS_START(v) && addr <= CHIP_W2_SYS_END(v)) { addr = CHIP_W2_BUS_START(v) + (addr - CHIP_W2_SYS_START(v)); } else #endif #ifdef CHIP_W3_BUS_START if (addr >= CHIP_W3_SYS_START(v) && addr <= CHIP_W3_SYS_END(v)) { addr = CHIP_W3_BUS_START(v) + (addr - CHIP_W3_SYS_START(v)); } else #endif { printf("\n"); #ifdef CHIP_W1_BUS_START printf("%s: sys window[1]=0x%lx-0x%lx\n", __S(__BS(unmap)), (u_long)CHIP_W1_SYS_START(v), (u_long)CHIP_W1_SYS_END(v)); #endif #ifdef CHIP_W2_BUS_START printf("%s: sys window[2]=0x%lx-0x%lx\n", __S(__BS(unmap)), (u_long)CHIP_W2_SYS_START(v), (u_long)CHIP_W2_SYS_END(v)); #endif #ifdef CHIP_W3_BUS_START printf("%s: sys window[3]=0x%lx-0x%lx\n", __S(__BS(unmap)), (u_long)CHIP_W3_SYS_START(v), (u_long)CHIP_W3_SYS_END(v)); #endif panic("%s: don't know how to unmap %#"PRIxBSH, __S(__BS(unmap)), h); } #ifdef EXTENT_DEBUG printf("%s: freeing %#"PRIxBUSADDR" to %#"PRIxBUSADDR"\n", __S(__BS(unmap)), addr, addr + size - 1); #endif int error = extent_free(CHIP_EXTENT(v), addr, size, EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)); if (error) { printf("%s: WARNING: could not unmap" " %#"PRIxBUSADDR"-%#"PRIxBUSADDR" (error %d)\n", __S(__BS(unmap)), addr, addr + size - 1, error); #ifdef EXTENT_DEBUG extent_print(CHIP_EXTENT(v)); #endif } #endif /* CHIP_EXTENT */ #if !defined(_LP64) || defined(CHIP_EXTENT) __USE(addr); #endif }