Annotation of sys/arch/sparc64/dev/bbc.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: bbc.c,v 1.1 2007/04/10 19:05:52 kettenis Exp $ */
2:
3: /*
4: * Copyright (c) 2007 Mark Kettenis
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18:
19: #include <sys/param.h>
20: #include <sys/kernel.h>
21: #include <sys/device.h>
22: #include <sys/malloc.h>
23: #include <sys/systm.h>
24:
25: #include <machine/bus.h>
26: #include <machine/autoconf.h>
27:
28: #include <sparc64/dev/ebusreg.h>
29: #include <sparc64/dev/ebusvar.h>
30:
31: /* Watchdog Action */
32: #define BBC_WATCHDOG_ACTION 0x00004
33:
34: /* Perform system reset when watchdog timer expires. */
35: #define BBC_WATCHDOG_RESET 0x01
36:
37: struct bbc_softc {
38: struct device sc_dv;
39: bus_space_tag_t sc_iot;
40: bus_space_handle_t sc_ioh;
41: };
42:
43: int bbc_match(struct device *, void *, void *);
44: void bbc_attach(struct device *, struct device *, void *);
45:
46: struct cfattach bbc_ca = {
47: sizeof(struct bbc_softc), bbc_match, bbc_attach
48: };
49:
50: struct cfdriver bbc_cd = {
51: NULL, "bbc", DV_DULL
52: };
53:
54: int
55: bbc_match(struct device *parent, void *cf, void *aux)
56: {
57: struct ebus_attach_args *ea = aux;
58:
59: if (strcmp("bbc", ea->ea_name) == 0)
60: return (1);
61: return (0);
62: }
63:
64: void
65: bbc_attach(struct device *parent, struct device *self, void *aux)
66: {
67: struct bbc_softc *sc = (void *)self;
68: struct ebus_attach_args *ea = aux;
69:
70: /* Use prom address if available, otherwise map it. */
71: if (ea->ea_nvaddrs) {
72: if (bus_space_map(ea->ea_memtag, ea->ea_vaddrs[0], 0,
73: BUS_SPACE_MAP_PROMADDRESS, &sc->sc_ioh)) {
74: printf(": can't map PROM register space\n");
75: return;
76: }
77: sc->sc_iot = ea->ea_memtag;
78: } else if (ebus_bus_map(ea->ea_iotag, 0,
79: EBUS_PADDR_FROM_REG(&ea->ea_regs[0]),
80: ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) == 0) {
81: sc->sc_iot = ea->ea_iotag;
82: } else if (ebus_bus_map(ea->ea_memtag, 0,
83: EBUS_PADDR_FROM_REG(&ea->ea_regs[0]),
84: ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) == 0) {
85: sc->sc_iot = ea->ea_memtag;
86: } else {
87: printf("%s: can't map register space\n", self->dv_xname);
88: return;
89: }
90:
91: printf("\n");
92:
93: /*
94: * Make sure we actually reset the system when the watchdog
95: * timer expires.
96: */
97: bus_space_write_1(sc->sc_iot, sc->sc_ioh,
98: BBC_WATCHDOG_ACTION, BBC_WATCHDOG_RESET);
99: }
CVSweb