xref: /openbsd-src/sys/arch/powerpc64/dev/xics.c (revision 471aeecfc619bc9b69519928152daf993376c2a1)
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