#include "opt_platform.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/proc.h>
#include <sys/pcpu.h>
#include <sys/rman.h>
#include <sys/sched.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/resource.h>
#include <machine/tlb.h>
#include "portals.h"
int
dpaa_portal_alloc_res(device_t dev, int cpu)
{
struct dpaa_portal_softc *sc = device_get_softc(dev);
sc->sc_mres[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
0, RF_ACTIVE);
if (sc->sc_mres[0] == NULL) {
device_printf(dev,
"Could not allocate cache enabled memory.\n");
return (ENXIO);
}
sc->sc_mres[1] = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
1, RF_ACTIVE);
if (sc->sc_mres[1] == NULL) {
device_printf(dev,
"Could not allocate cache inhibited memory.\n");
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mres[0]);
return (ENXIO);
}
sc->sc_dev = dev;
sc->sc_ce_va = rman_get_bushandle(sc->sc_mres[0]);
sc->sc_ce_size = rman_get_size(sc->sc_mres[0]);
sc->sc_ce_pa = pmap_kextract(sc->sc_ce_va);
sc->sc_ci_va = rman_get_bushandle(sc->sc_mres[1]);
sc->sc_ci_size = rman_get_size(sc->sc_mres[1]);
sc->sc_ci_pa = pmap_kextract(sc->sc_ci_va);
tlb1_set_entry(sc->sc_ce_va, sc->sc_ce_pa, sc->sc_ce_size,
_TLB_ENTRY_MEM | _TLB_ENTRY_SHARED);
sc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, 0, RF_ACTIVE);
if (sc->sc_ires == NULL) {
device_printf(dev, "Could not allocate irq.\n");
return (ENXIO);
}
return (0);
}