A VMEbus RAM board configured for use by mvme68k can now be
treated as just another available VMEbus slave image as far as bus_dma(9) is concerned. To preserve faster onboard memory, mvmebus_dmamem_alloc() will allocate first from the offboard VMEbus RAM slave image if present, and assuming its address modifier matches the caller's constraints. This can be overidden by specifying the BUS_DMA_ONBOARD_RAM flag.
This commit is contained in:
parent
365ec2aa42
commit
72f826d727
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: mvmebus.c,v 1.3 2000/08/20 21:51:31 scw Exp $ */
|
/* $NetBSD: mvmebus.c,v 1.4 2000/08/21 20:50:13 scw Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2000 The NetBSD Foundation, Inc.
|
* Copyright (c) 2000 The NetBSD Foundation, Inc.
|
||||||
@ -41,6 +41,7 @@
|
|||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
#include <sys/device.h>
|
#include <sys/device.h>
|
||||||
#include <sys/malloc.h>
|
#include <sys/malloc.h>
|
||||||
|
#include <sys/kcore.h>
|
||||||
|
|
||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#define _MVME68K_BUS_DMA_PRIVATE
|
#define _MVME68K_BUS_DMA_PRIVATE
|
||||||
@ -66,6 +67,7 @@ static const char *mvmebus_mod_string(vme_addr_t, vme_size_t,
|
|||||||
vme_am_t, vme_datasize_t);
|
vme_am_t, vme_datasize_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void mvmebus_offboard_ram(struct mvmebus_softc *);
|
||||||
static int mvmebus_dmamap_load_common(struct mvmebus_softc *, bus_dmamap_t);
|
static int mvmebus_dmamap_load_common(struct mvmebus_softc *, bus_dmamap_t);
|
||||||
|
|
||||||
vme_am_t _mvmebus_am_cap[] = {
|
vme_am_t _mvmebus_am_cap[] = {
|
||||||
@ -79,6 +81,67 @@ vme_am_t _mvmebus_am_cap[] = {
|
|||||||
MVMEBUS_AM_CAP_BLK | MVMEBUS_AM_CAP_SUPER
|
MVMEBUS_AM_CAP_BLK | MVMEBUS_AM_CAP_SUPER
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern phys_ram_seg_t mem_clusters[0];
|
||||||
|
extern int mem_cluster_cnt;
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
mvmebus_offboard_ram(sc)
|
||||||
|
struct mvmebus_softc *sc;
|
||||||
|
{
|
||||||
|
struct mvmebus_range *svr, *mvr;
|
||||||
|
vme_addr_t start, end, size;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we have any offboard RAM (i.e. a VMEbus RAM board) then
|
||||||
|
* we need to record its details since it's effectively another
|
||||||
|
* VMEbus slave image as far as we're concerned.
|
||||||
|
* The chip-specific backend will have reserved sc->sc_slaves[0]
|
||||||
|
* for exactly this purpose.
|
||||||
|
*/
|
||||||
|
svr = sc->sc_slaves;
|
||||||
|
if (mem_cluster_cnt < 2) {
|
||||||
|
svr->vr_am = MVMEBUS_AM_DISABLED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
start = mem_clusters[1].start;
|
||||||
|
size = mem_clusters[1].size - 1;
|
||||||
|
end = start + size;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Figure out which VMEbus master image the RAM is
|
||||||
|
* visible through. This will tell us the address
|
||||||
|
* modifier and datasizes it uses, as well as allowing
|
||||||
|
* us to calculate its `real' VMEbus address.
|
||||||
|
*/
|
||||||
|
for (i = 0, mvr = sc->sc_masters; i < sc->sc_nmasters; i++, mvr++) {
|
||||||
|
vme_addr_t vstart = mvr->vr_locstart + mvr->vr_vmestart;
|
||||||
|
|
||||||
|
if (start >= vstart &&
|
||||||
|
end <= vstart + (mvr->vr_vmeend - mvr->vr_vmestart))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == sc->sc_nmasters) {
|
||||||
|
svr->vr_am = MVMEBUS_AM_DISABLED;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("%s: No VMEbus master mapping for offboard RAM!\n",
|
||||||
|
sc->sc_dev.dv_xname);
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
svr->vr_locstart = start;
|
||||||
|
svr->vr_vmestart = start & mvr->vr_mask;
|
||||||
|
svr->vr_vmeend = svr->vr_vmestart + size;
|
||||||
|
svr->vr_datasize = mvr->vr_datasize;
|
||||||
|
svr->vr_mask = mvr->vr_mask;
|
||||||
|
svr->vr_am = mvr->vr_am & VME_AM_ADRSIZEMASK;
|
||||||
|
svr->vr_am |= MVMEBUS_AM_CAP_DATA | MVMEBUS_AM_CAP_PROG |
|
||||||
|
MVMEBUS_AM_CAP_SUPER | MVMEBUS_AM_CAP_USER;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mvmebus_attach(sc)
|
mvmebus_attach(sc)
|
||||||
struct mvmebus_softc *sc;
|
struct mvmebus_softc *sc;
|
||||||
@ -90,6 +153,9 @@ mvmebus_attach(sc)
|
|||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
sc->sc_irqref[i] = 0;
|
sc->sc_irqref[i] = 0;
|
||||||
|
|
||||||
|
/* If there's offboard RAM, get its VMEbus slave attributes */
|
||||||
|
mvmebus_offboard_ram(sc);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
for (i = 0; i < sc->sc_nmasters; i++) {
|
for (i = 0; i < sc->sc_nmasters; i++) {
|
||||||
struct mvmebus_range *vr = &sc->sc_masters[i];
|
struct mvmebus_range *vr = &sc->sc_masters[i];
|
||||||
@ -722,6 +788,9 @@ mvmebus_dmamem_alloc(vsc, len, am, datasize, swap, segs, nsegs, rsegs, flags)
|
|||||||
if (vr->vr_am == MVMEBUS_AM_DISABLED)
|
if (vr->vr_am == MVMEBUS_AM_DISABLED)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (i == 0 && (flags & BUS_DMA_ONBOARD_RAM) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (am == (vr->vr_am & VME_AM_ADRSIZEMASK) &&
|
if (am == (vr->vr_am & VME_AM_ADRSIZEMASK) &&
|
||||||
cap == (vr->vr_am & cap) && datasize <= vr->vr_datasize &&
|
cap == (vr->vr_am & cap) && datasize <= vr->vr_datasize &&
|
||||||
len <= (vr->vr_vmeend - vr->vr_vmestart))
|
len <= (vr->vr_vmeend - vr->vr_vmestart))
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: vme_pccvar.h,v 1.5 2000/08/20 21:51:32 scw Exp $ */
|
/* $NetBSD: vme_pccvar.h,v 1.6 2000/08/21 20:50:13 scw Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||||
@ -39,10 +39,11 @@
|
|||||||
#ifndef _MVME68K_VME_PCCVAR_H
|
#ifndef _MVME68K_VME_PCCVAR_H
|
||||||
#define _MVME68K_VME_PCCVAR_H
|
#define _MVME68K_VME_PCCVAR_H
|
||||||
|
|
||||||
#define VME1_SLAVE_A32 0
|
#define VME1_SLAVE_OFFBOARD_RAM 0
|
||||||
#define VME1_SLAVE_A24 1
|
#define VME1_SLAVE_A32 1
|
||||||
#define VME1_SLAVE_A16 2
|
#define VME1_SLAVE_A24 2
|
||||||
#define VME1_NSLAVES 3
|
#define VME1_SLAVE_A16 3
|
||||||
|
#define VME1_NSLAVES 4
|
||||||
|
|
||||||
struct vme_pcc_softc {
|
struct vme_pcc_softc {
|
||||||
struct mvmebus_softc sc_mvmebus;
|
struct mvmebus_softc sc_mvmebus;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: vme_twovar.h,v 1.6 2000/08/20 17:07:42 scw Exp $ */
|
/* $NetBSD: vme_twovar.h,v 1.7 2000/08/21 20:50:13 scw Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||||
@ -43,11 +43,12 @@
|
|||||||
#define VME2_MASTER_FIXED_A24 1
|
#define VME2_MASTER_FIXED_A24 1
|
||||||
#define VME2_MASTER_FIXED_A32 2
|
#define VME2_MASTER_FIXED_A32 2
|
||||||
#define VME2_MASTER_PROG_START 3
|
#define VME2_MASTER_PROG_START 3
|
||||||
#define VME2_SLAVE_A16 0
|
#define VME2_SLAVE_OFFBOARD_RAM 0
|
||||||
#define VME2_SLAVE_PROG_START 1
|
#define VME2_SLAVE_PROG_START 1
|
||||||
|
#define VME2_SLAVE_A16 (VME2_SLAVE_PROG_START+(VME2_SLAVE_WINDOWS*2))
|
||||||
|
|
||||||
#define VME2_NMASTERS (VME2_MASTER_PROG_START + VME2_MASTER_WINDOWS)
|
#define VME2_NMASTERS (VME2_MASTER_PROG_START + VME2_MASTER_WINDOWS)
|
||||||
#define VME2_NSLAVES (VME2_SLAVE_PROG_START+(VME2_SLAVE_WINDOWS * 2))
|
#define VME2_NSLAVES (VME2_SLAVE_A16 + 1)
|
||||||
|
|
||||||
struct vmetwo_softc {
|
struct vmetwo_softc {
|
||||||
struct mvmebus_softc sc_mvmebus;
|
struct mvmebus_softc sc_mvmebus;
|
||||||
|
Loading…
Reference in New Issue
Block a user