#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/rman.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <machine/bus.h>
#include <arm64/coresight/coresight.h>
#include <arm64/coresight/coresight_replicator.h>
#include "coresight_if.h"
static struct resource_spec replicator_spec[] = {
{ SYS_RES_MEMORY, 0, RF_ACTIVE },
{ -1, 0 }
};
static int
replicator_init(device_t dev)
{
struct replicator_softc *sc;
sc = device_get_softc(dev);
bus_write_4(sc->res, CORESIGHT_LAR, CORESIGHT_UNLOCK);
return (0);
}
static int
replicator_enable(device_t dev, struct endpoint *endp,
struct coresight_event *event)
{
struct replicator_softc *sc;
sc = device_get_softc(dev);
if (endp->reg == 0) {
bus_write_4(sc->res, REPLICATOR_IDFILTER0, 0x00);
bus_write_4(sc->res, REPLICATOR_IDFILTER1, 0xff);
} else {
bus_write_4(sc->res, REPLICATOR_IDFILTER0, 0xff);
bus_write_4(sc->res, REPLICATOR_IDFILTER1, 0x00);
}
return (0);
}
static void
replicator_disable(device_t dev, struct endpoint *endp,
struct coresight_event *event)
{
struct replicator_softc *sc;
sc = device_get_softc(dev);
bus_write_4(sc->res, REPLICATOR_IDFILTER0, 0xff);
bus_write_4(sc->res, REPLICATOR_IDFILTER1, 0xff);
}
int
replicator_attach(device_t dev)
{
struct replicator_softc *sc;
struct coresight_desc desc;
sc = device_get_softc(dev);
if (bus_alloc_resources(dev, replicator_spec, &sc->res) != 0) {
device_printf(dev, "cannot allocate resources for device\n");
return (ENXIO);
}
desc.pdata = sc->pdata;
desc.dev = dev;
desc.dev_type = CORESIGHT_DYNAMIC_REPLICATOR;
coresight_register(&desc);
return (0);
}
static device_method_t replicator_methods[] = {
DEVMETHOD(coresight_init, replicator_init),
DEVMETHOD(coresight_enable, replicator_enable),
DEVMETHOD(coresight_disable, replicator_disable),
DEVMETHOD_END
};
DEFINE_CLASS_0(replicator, replicator_driver, replicator_methods,
sizeof(struct replicator_softc));