1*471aeecfSnaddy /* $OpenBSD: xics.c,v 1.4 2022/04/06 18:59:27 naddy Exp $ */
268715befSkettenis /*
368715befSkettenis * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
468715befSkettenis *
568715befSkettenis * Permission to use, copy, modify, and distribute this software for any
668715befSkettenis * purpose with or without fee is hereby granted, provided that the above
768715befSkettenis * copyright notice and this permission notice appear in all copies.
868715befSkettenis *
968715befSkettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1068715befSkettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1168715befSkettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1268715befSkettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1368715befSkettenis * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1468715befSkettenis * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1568715befSkettenis * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1668715befSkettenis */
1768715befSkettenis
1868715befSkettenis #include <sys/param.h>
1968715befSkettenis #include <sys/systm.h>
2068715befSkettenis #include <sys/device.h>
2168715befSkettenis #include <sys/evcount.h>
2268715befSkettenis #include <sys/malloc.h>
2368715befSkettenis #include <sys/queue.h>
2468715befSkettenis
2568715befSkettenis #include <machine/bus.h>
2668715befSkettenis #include <machine/fdt.h>
2768715befSkettenis #include <machine/opal.h>
2868715befSkettenis
2968715befSkettenis #include <dev/ofw/openfirm.h>
3068715befSkettenis #include <dev/ofw/fdt.h>
3168715befSkettenis
3268715befSkettenis struct xics_softc {
3368715befSkettenis struct device sc_dev;
3468715befSkettenis
3568715befSkettenis struct interrupt_controller sc_ic;
3668715befSkettenis };
3768715befSkettenis
3868715befSkettenis int xics_match(struct device *, void *, void *);
3968715befSkettenis void xics_attach(struct device *, struct device *, void *);
4068715befSkettenis
41*471aeecfSnaddy const struct cfattach xics_ca = {
4268715befSkettenis sizeof (struct xics_softc), xics_match, xics_attach
4368715befSkettenis };
4468715befSkettenis
4568715befSkettenis struct cfdriver xics_cd = {
4668715befSkettenis NULL, "xics", DV_DULL
4768715befSkettenis };
4868715befSkettenis
4968715befSkettenis void *xics_intr_establish(void *, int *, int,
5068715befSkettenis struct cpu_info *, int (*)(void *), void *, char *);
51fcf94dc6Skettenis void xics_intr_send_ipi(void *);
52fcf94dc6Skettenis
5368715befSkettenis int
xics_match(struct device * parent,void * match,void * aux)5468715befSkettenis xics_match(struct device *parent, void *match, void *aux)
5568715befSkettenis {
5668715befSkettenis struct fdt_attach_args *faa = aux;
5768715befSkettenis
5868715befSkettenis return OF_is_compatible(faa->fa_node, "ibm,opal-xive-vc");
5968715befSkettenis }
6068715befSkettenis
6168715befSkettenis void
xics_attach(struct device * parent,struct device * self,void * aux)6268715befSkettenis xics_attach(struct device *parent, struct device *self, void *aux)
6368715befSkettenis {
6468715befSkettenis struct xics_softc *sc = (struct xics_softc *)self;
6568715befSkettenis struct fdt_attach_args *faa = aux;
6668715befSkettenis
6768715befSkettenis printf("\n");
6868715befSkettenis
6968715befSkettenis sc->sc_ic.ic_node = faa->fa_node;
7068715befSkettenis sc->sc_ic.ic_cookie = self;
7168715befSkettenis sc->sc_ic.ic_establish = xics_intr_establish;
72fcf94dc6Skettenis sc->sc_ic.ic_send_ipi = xics_intr_send_ipi;
7368715befSkettenis interrupt_controller_register(&sc->sc_ic);
7468715befSkettenis }
7568715befSkettenis
7668715befSkettenis void *
xics_intr_establish(void * cookie,int * cell,int level,struct cpu_info * ci,int (* func)(void *),void * arg,char * name)7768715befSkettenis xics_intr_establish(void *cookie, int *cell, int level,
7868715befSkettenis struct cpu_info *ci, int (*func)(void *), void *arg, char *name)
7968715befSkettenis {
8068715befSkettenis uint32_t girq = cell[0];
8168715befSkettenis int type = cell[1];
8268715befSkettenis
83a940e3deSkettenis return _intr_establish(girq, type, level, ci, func, arg, name);
84fcf94dc6Skettenis }
85fcf94dc6Skettenis
86fcf94dc6Skettenis void
xics_intr_send_ipi(void * cookie)87fcf94dc6Skettenis xics_intr_send_ipi(void *cookie)
88fcf94dc6Skettenis {
89fcf94dc6Skettenis return _intr_send_ipi(cookie);
9068715befSkettenis }
91