Enable a few more bus_space functions.
If a region is outside the regular obio space in obio_bs_map(), create mappings for it.
This commit is contained in:
parent
9f57359336
commit
147ab60754
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: obio_space.c,v 1.3 2002/09/27 15:36:01 provos Exp $ */
|
/* $NetBSD: obio_space.c,v 1.4 2003/01/02 23:04:08 briggs Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2002 Wasabi Systems, Inc.
|
* Copyright (c) 2001, 2002 Wasabi Systems, Inc.
|
||||||
|
@ -46,9 +46,12 @@
|
||||||
|
|
||||||
#include <machine/bus.h>
|
#include <machine/bus.h>
|
||||||
|
|
||||||
|
#include "iq80321reg.h"
|
||||||
|
|
||||||
/* Prototypes for all the bus_space structure functions */
|
/* Prototypes for all the bus_space structure functions */
|
||||||
bs_protos(obio);
|
bs_protos(obio);
|
||||||
bs_protos(generic);
|
bs_protos(generic);
|
||||||
|
bs_protos(generic_armv4);
|
||||||
bs_protos(bs_notimpl);
|
bs_protos(bs_notimpl);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -79,7 +82,7 @@ struct bus_space obio_bs_tag = {
|
||||||
|
|
||||||
/* read (single) */
|
/* read (single) */
|
||||||
generic_bs_r_1,
|
generic_bs_r_1,
|
||||||
bs_notimpl_bs_r_2,
|
generic_armv4_bs_r_2,
|
||||||
generic_bs_r_4,
|
generic_bs_r_4,
|
||||||
bs_notimpl_bs_r_8,
|
bs_notimpl_bs_r_8,
|
||||||
|
|
||||||
|
@ -90,14 +93,14 @@ struct bus_space obio_bs_tag = {
|
||||||
bs_notimpl_bs_rm_8,
|
bs_notimpl_bs_rm_8,
|
||||||
|
|
||||||
/* read region */
|
/* read region */
|
||||||
bs_notimpl_bs_rr_1,
|
generic_bs_rr_1,
|
||||||
bs_notimpl_bs_rr_2,
|
bs_notimpl_bs_rr_2,
|
||||||
bs_notimpl_bs_rr_4,
|
bs_notimpl_bs_rr_4,
|
||||||
bs_notimpl_bs_rr_8,
|
bs_notimpl_bs_rr_8,
|
||||||
|
|
||||||
/* write (single) */
|
/* write (single) */
|
||||||
generic_bs_w_1,
|
generic_bs_w_1,
|
||||||
bs_notimpl_bs_w_2,
|
generic_armv4_bs_w_2,
|
||||||
generic_bs_w_4,
|
generic_bs_w_4,
|
||||||
bs_notimpl_bs_w_8,
|
bs_notimpl_bs_w_8,
|
||||||
|
|
||||||
|
@ -136,12 +139,41 @@ int
|
||||||
obio_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
|
obio_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
|
||||||
bus_space_handle_t *bshp)
|
bus_space_handle_t *bshp)
|
||||||
{
|
{
|
||||||
|
uint32_t startpa, endpa, pa;
|
||||||
|
vaddr_t va;
|
||||||
|
pt_entry_t *pte;
|
||||||
|
|
||||||
/*
|
if (bpa > IQ80321_IOPXS_VBASE) {
|
||||||
* IQ80321 on-board devices are mapped VA==PA. All addresses
|
/*
|
||||||
* we're provided, therefore, don't need any additional mapping.
|
* IQ80321 on-board devices are mapped VA==PA. All
|
||||||
*/
|
* addresses we're provided, therefore, don't need
|
||||||
*bshp = bpa;
|
* any additional mapping.
|
||||||
|
*/
|
||||||
|
*bshp = bpa;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Some devices, however, may lie outside the
|
||||||
|
* already-mapped space (notably flash).
|
||||||
|
*/
|
||||||
|
startpa = trunc_page(bpa);
|
||||||
|
endpa = round_page(bpa + size);
|
||||||
|
|
||||||
|
/* XXX use some extent to check for duplicate mappings? */
|
||||||
|
|
||||||
|
va = uvm_km_valloc(kernel_map, endpa - startpa);
|
||||||
|
if (! va)
|
||||||
|
return ENOMEM;
|
||||||
|
|
||||||
|
*bshp = (bus_space_handle_t) (va + (bpa - startpa));
|
||||||
|
|
||||||
|
for (pa=startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
|
||||||
|
pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE);
|
||||||
|
pte = vtopte(va);
|
||||||
|
*pte &= ~L2_S_CACHE_MASK;
|
||||||
|
PTE_SYNC(pte);
|
||||||
|
}
|
||||||
|
pmap_update(pmap_kernel());
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -161,6 +193,9 @@ obio_bs_unmap(void *t, bus_space_handle_t bsh, bus_size_t size)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
|
/* XXX -- technically, if we alloc and map above, we should
|
||||||
|
* unmap and free here, but we bail on this for now.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue