The iommu "bus" now presents its own attach arguments to its children.
This commit is contained in:
parent
d19772ea9e
commit
71fc7f093d
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: iommu.c,v 1.15 1998/01/12 20:24:08 thorpej Exp $ */
|
/* $NetBSD: iommu.c,v 1.16 1998/03/21 12:21:18 pk Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1996
|
* Copyright (c) 1996
|
||||||
|
@ -47,6 +47,7 @@
|
||||||
#include <sparc/sparc/vaddrs.h>
|
#include <sparc/sparc/vaddrs.h>
|
||||||
#include <sparc/sparc/cpuvar.h>
|
#include <sparc/sparc/cpuvar.h>
|
||||||
#include <sparc/sparc/iommureg.h>
|
#include <sparc/sparc/iommureg.h>
|
||||||
|
#include <sparc/sparc/iommuvar.h>
|
||||||
|
|
||||||
struct iommu_softc {
|
struct iommu_softc {
|
||||||
struct device sc_dev; /* base device */
|
struct device sc_dev; /* base device */
|
||||||
|
@ -81,10 +82,10 @@ iommu_print(args, iommu)
|
||||||
void *args;
|
void *args;
|
||||||
const char *iommu;
|
const char *iommu;
|
||||||
{
|
{
|
||||||
register struct confargs *ca = args;
|
struct iommu_attach_args *ia = args;
|
||||||
|
|
||||||
if (iommu)
|
if (iommu)
|
||||||
printf("%s at %s", ca->ca_ra.ra_name, iommu);
|
printf("%s at %s", ia->iom_name, iommu);
|
||||||
return (UNCONF);
|
return (UNCONF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,12 +95,11 @@ iommu_match(parent, cf, aux)
|
||||||
struct cfdata *cf;
|
struct cfdata *cf;
|
||||||
void *aux;
|
void *aux;
|
||||||
{
|
{
|
||||||
register struct confargs *ca = aux;
|
struct mainbus_attach_args *ma = aux;
|
||||||
register struct romaux *ra = &ca->ca_ra;
|
|
||||||
|
|
||||||
if (CPU_ISSUN4OR4C)
|
if (CPU_ISSUN4OR4C)
|
||||||
return (0);
|
return (0);
|
||||||
return (strcmp(cf->cf_driver->cd_name, ra->ra_name) == 0);
|
return (strcmp(cf->cf_driver->cd_name, ma->ma_name) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -113,10 +113,10 @@ iommu_attach(parent, self, aux)
|
||||||
{
|
{
|
||||||
#if defined(SUN4M)
|
#if defined(SUN4M)
|
||||||
register struct iommu_softc *sc = (struct iommu_softc *)self;
|
register struct iommu_softc *sc = (struct iommu_softc *)self;
|
||||||
struct confargs oca, *ca = aux;
|
struct mainbus_attach_args *ma = aux;
|
||||||
register struct romaux *ra = &ca->ca_ra;
|
|
||||||
register int node;
|
register int node;
|
||||||
register char *name;
|
struct bootpath *bp;
|
||||||
|
bus_space_handle_t bh;
|
||||||
register u_int pbase, pa;
|
register u_int pbase, pa;
|
||||||
register int i, mmupcrsave, s;
|
register int i, mmupcrsave, s;
|
||||||
register iopte_t *tpte_p;
|
register iopte_t *tpte_p;
|
||||||
|
@ -133,7 +133,7 @@ iommu_attach(parent, self, aux)
|
||||||
printf(" unsupported\n");
|
printf(" unsupported\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
node = ra->ra_node;
|
node = ma->ma_node;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (ra->ra_vaddr)
|
if (ra->ra_vaddr)
|
||||||
|
@ -147,8 +147,18 @@ iommu_attach(parent, self, aux)
|
||||||
* XXX struct iommureg is bigger than ra->ra_len; what are the
|
* XXX struct iommureg is bigger than ra->ra_len; what are the
|
||||||
* other fields for?
|
* other fields for?
|
||||||
*/
|
*/
|
||||||
sc->sc_reg = (struct iommureg *)
|
if (sparc_bus_map(
|
||||||
mapiodev(ra->ra_reg, 0, ra->ra_len);
|
ma->ma_bustag,
|
||||||
|
ma->ma_iospace,
|
||||||
|
(bus_addr_t)ma->ma_paddr,
|
||||||
|
sizeof(struct iommureg),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&bh) != 0) {
|
||||||
|
printf("iommu_attach: cannot map registers\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sc->sc_reg = (struct iommureg *)bh;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sc->sc_hasiocache = node_has_property(node, "cache-coherence?");
|
sc->sc_hasiocache = node_has_property(node, "cache-coherence?");
|
||||||
|
@ -239,20 +249,27 @@ iommu_attach(parent, self, aux)
|
||||||
sc->sc_range >> 20);
|
sc->sc_range >> 20);
|
||||||
|
|
||||||
/* Propagate bootpath */
|
/* Propagate bootpath */
|
||||||
if (ra->ra_bp != NULL && strcmp(ra->ra_bp->name, "iommu") == 0)
|
if (ma->ma_bp != NULL && strcmp(ma->ma_bp->name, "iommu") == 0)
|
||||||
oca.ca_ra.ra_bp = ra->ra_bp + 1;
|
bp = ma->ma_bp + 1;
|
||||||
else
|
else
|
||||||
oca.ca_ra.ra_bp = NULL;
|
bp = NULL;
|
||||||
|
printf("[[iommu: bootpath component: %s]]\n", bp?bp->name:"NULL!");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Loop through ROM children (expect Sbus among them).
|
* Loop through ROM children (expect Sbus among them).
|
||||||
*/
|
*/
|
||||||
for (node = firstchild(node); node; node = nextsibling(node)) {
|
for (node = firstchild(node); node; node = nextsibling(node)) {
|
||||||
name = getpropstring(node, "name");
|
struct iommu_attach_args ia;
|
||||||
if (!romprop(&oca.ca_ra, name, node))
|
|
||||||
continue;
|
bzero(&ia, sizeof ia);
|
||||||
oca.ca_bustype = BUS_MAIN; /* ??? */
|
ia.iom_name = getpropstring(node, "name");
|
||||||
(void) config_found(&sc->sc_dev, (void *)&oca, iommu_print);
|
|
||||||
|
/* Propagate BUS & DMA tags */
|
||||||
|
ia.iom_bustag = ma->ma_bustag;
|
||||||
|
ia.iom_dmatag = ma->ma_dmatag;
|
||||||
|
ia.iom_node = node;
|
||||||
|
ia.iom_bp = bp;
|
||||||
|
(void) config_found(&sc->sc_dev, (void *)&ia, iommu_print);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
struct iommu_attach_args {
|
||||||
|
bus_space_tag_t iom_bustag;
|
||||||
|
bus_dma_tag_t iom_dmatag;
|
||||||
|
char *iom_name; /* PROM node name */
|
||||||
|
int iom_node; /* PROM handle */
|
||||||
|
struct bootpath *iom_bp; /* used for locating boot device */
|
||||||
|
};
|
Loading…
Reference in New Issue