1*89ed722cSmpi /* $OpenBSD: pgs.c,v 1.6 2022/03/13 12:33:01 mpi Exp $ */
2de98894eSjasper /*
3de98894eSjasper * Copyright (c) 2010 Jasper Lievisse Adriaanse <jasper@openbsd.org>
4de98894eSjasper *
5de98894eSjasper * Permission to use, copy, modify, and distribute this software for any
6de98894eSjasper * purpose with or without fee is hereby granted, provided that the above
7de98894eSjasper * copyright notice and this permission notice appear in all copies.
8de98894eSjasper *
9de98894eSjasper * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10de98894eSjasper * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11de98894eSjasper * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12de98894eSjasper * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13de98894eSjasper * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14de98894eSjasper * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15de98894eSjasper * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16de98894eSjasper */
17de98894eSjasper
18de98894eSjasper /*
19de98894eSjasper * This driver allows entering DDB by pushing the "Programmers Switch",
202981fc10Sjasper * which can be found on many "Old World" and some early "New World" MacPPC.
21de98894eSjasper */
22de98894eSjasper
23de98894eSjasper #include <sys/param.h>
24de98894eSjasper #include <sys/systm.h>
25de98894eSjasper #include <sys/proc.h>
26de98894eSjasper #include <sys/device.h>
27de98894eSjasper
28de98894eSjasper #include <ddb/db_var.h>
29de98894eSjasper #include <dev/ofw/openfirm.h>
30de98894eSjasper
31de98894eSjasper #include <machine/bus.h>
32de98894eSjasper #include <machine/autoconf.h>
33de98894eSjasper
34de98894eSjasper struct pgs_softc {
35de98894eSjasper struct device sc_dev;
36de98894eSjasper int sc_node;
37de98894eSjasper int sc_intr;
38de98894eSjasper };
39de98894eSjasper
40de98894eSjasper void pgs_attach(struct device *, struct device *, void *);
41de98894eSjasper int pgs_match(struct device *, void *, void *);
42de98894eSjasper int pgs_intr(void *);
43de98894eSjasper
44*89ed722cSmpi const struct cfattach pgs_ca = {
45de98894eSjasper sizeof(struct pgs_softc), pgs_match, pgs_attach
46de98894eSjasper };
47de98894eSjasper
48de98894eSjasper struct cfdriver pgs_cd = {
49de98894eSjasper NULL, "pgs", DV_DULL
50de98894eSjasper };
51de98894eSjasper
52de98894eSjasper int
pgs_match(struct device * parent,void * arg,void * aux)53de98894eSjasper pgs_match(struct device *parent, void *arg, void *aux)
54de98894eSjasper {
55de98894eSjasper struct confargs *ca = aux;
56ee1beec4Skettenis char type[32];
57de98894eSjasper
58ee1beec4Skettenis if (strcmp(ca->ca_name, "programmer-switch") != 0)
59de98894eSjasper return 0;
60ee1beec4Skettenis
61ee1beec4Skettenis OF_getprop(ca->ca_node, "device_type", type, sizeof(type));
62ee1beec4Skettenis if (strcmp(type, "programmer-switch") != 0)
63ee1beec4Skettenis return 0;
64ee1beec4Skettenis
65ee1beec4Skettenis return 1;
66de98894eSjasper }
67de98894eSjasper
68de98894eSjasper void
pgs_attach(struct device * parent,struct device * self,void * aux)69de98894eSjasper pgs_attach(struct device *parent, struct device *self, void *aux)
70de98894eSjasper {
71de98894eSjasper struct pgs_softc *sc = (struct pgs_softc *)self;
72de98894eSjasper struct confargs *ca = aux;
73de98894eSjasper int intr[2];
74de98894eSjasper
75de98894eSjasper sc->sc_node = ca->ca_node;
76de98894eSjasper
77de98894eSjasper OF_getprop(sc->sc_node, "interrupts", intr, sizeof(intr));
78de98894eSjasper sc->sc_intr = intr[0];
79de98894eSjasper
80de98894eSjasper printf(": irq %d\n", sc->sc_intr);
81de98894eSjasper
82de98894eSjasper mac_intr_establish(parent, sc->sc_intr, IST_LEVEL,
83de98894eSjasper IPL_HIGH, pgs_intr, sc, sc->sc_dev.dv_xname);
84de98894eSjasper }
85de98894eSjasper
86de98894eSjasper int
pgs_intr(void * v)87de98894eSjasper pgs_intr(void *v)
88de98894eSjasper {
89de98894eSjasper #ifdef DDB
90de98894eSjasper if (db_console)
91e97088d6Smpi db_enter();
92de98894eSjasper #else
93de98894eSjasper printf("programmer-switch pressed, debugger not available.\n");
94de98894eSjasper #endif
95de98894eSjasper
96de98894eSjasper return 1;
97de98894eSjasper }
98