#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: zbbus.c,v 1.14 2021/08/07 16:19:04 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <mips/sibyte/include/zbbusvar.h>
#include "locators.h"
static int zbbus_match(device_t, cfdata_t, void *);
static void zbbus_attach(device_t, device_t, void *);
CFATTACH_DECL_NEW(zbbus, 0,
zbbus_match, zbbus_attach, NULL, NULL);
static int zbbus_print(void *, const char *);
static int zbbus_submatch(device_t, cfdata_t, const int *, void *);
static const char *zbbus_entity_type_name(enum zbbus_entity_type type);
static int zbbus_attached;
static const struct zbbus_attach_locs sb1250_zbbus_devs[] = {
{ 0, ZBBUS_ENTTYPE_CPU },
{ 1, ZBBUS_ENTTYPE_CPU },
{ 4, ZBBUS_ENTTYPE_SCD },
{ 2, ZBBUS_ENTTYPE_BRZ },
{ 3, ZBBUS_ENTTYPE_OBIO },
};
static const int sb1250_zbbus_dev_count =
sizeof sb1250_zbbus_devs / sizeof sb1250_zbbus_devs[0];
static int
zbbus_match(device_t parent, cfdata_t match, void *aux)
{
if (zbbus_attached)
return (0);
return 1;
}
static void
zbbus_attach(device_t parent, device_t self, void *aux)
{
struct zbbus_attach_args za;
int i;
printf("\n");
zbbus_attached = 1;
sb1250_icu_init();
for (i = 0; i < sb1250_zbbus_dev_count; i++) {
memset(&za, 0, sizeof za);
za.za_locs = sb1250_zbbus_devs[i];
config_found(self, &za, zbbus_print,
CFARGS(.submatch = zbbus_submatch));
}
return;
}
int
zbbus_print(void *aux, const char *pnp)
{
struct zbbus_attach_args *zap = aux;
if (pnp)
aprint_normal("%s at %s",
zbbus_entity_type_name(zap->za_locs.za_type), pnp);
aprint_normal(" busid %d", zap->za_locs.za_busid);
return (UNCONF);
}
static int
zbbus_submatch(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
{
struct zbbus_attach_args *zap = aux;
if (cf->cf_loc[ZBBUSCF_BUSID] != ZBBUSCF_BUSID_DEFAULT &&
cf->cf_loc[ZBBUSCF_BUSID] != zap->za_locs.za_busid)
return (0);
return (config_match(parent, cf, aux));
}
static const char *
zbbus_entity_type_name(enum zbbus_entity_type type)
{
switch (type) {
case ZBBUS_ENTTYPE_CPU:
return ("cpu");
case ZBBUS_ENTTYPE_SCD:
return ("sbscd");
case ZBBUS_ENTTYPE_BRZ:
return ("sbbrz");
case ZBBUS_ENTTYPE_OBIO:
return ("sbobio");
}
panic("zbbus_entity_type_name");
return ("panic");
}