From 938534dec0b3e31a45f59774cefa271e95a0d5c9 Mon Sep 17 00:00:00 2001 From: Jason Downs Date: Sun, 21 Dec 1997 14:44:35 +0000 Subject: ISA PnP supporting code from NetBSD, and a pccom driver that supports ISA PnP. --- sys/arch/i386/isa/isa_machdep.c | 119 +++++++++++++++++++++++++- sys/arch/i386/isa/isa_machdep.h | 1 + sys/arch/i386/isa/isapnp_machdep.c | 169 +++++++++++++++++++++++++++++++++++++ sys/arch/i386/isa/isapnp_machdep.h | 76 +++++++++++++++++ sys/arch/i386/isa/pccom.c | 76 ++++++++++++++--- 5 files changed, 426 insertions(+), 15 deletions(-) create mode 100644 sys/arch/i386/isa/isapnp_machdep.c create mode 100644 sys/arch/i386/isa/isapnp_machdep.h (limited to 'sys/arch') diff --git a/sys/arch/i386/isa/isa_machdep.c b/sys/arch/i386/isa/isa_machdep.c index 362f0262f71..25cf63fb31d 100644 --- a/sys/arch/i386/isa/isa_machdep.c +++ b/sys/arch/i386/isa/isa_machdep.c @@ -1,8 +1,46 @@ -/* $OpenBSD: isa_machdep.c,v 1.23 1997/12/09 03:36:42 deraadt Exp $ */ +/* $OpenBSD: isa_machdep.c,v 1.24 1997/12/21 14:44:32 downsj Exp $ */ /* $NetBSD: isa_machdep.c,v 1.14 1996/05/12 23:06:18 mycroft Exp $ */ /*- - * Copyright (c) 1993, 1994 Charles Hannum. + * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research Center. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/*- + * Copyright (c) 1993, 1994, 1996, 1997 + * Charles M. Hannum. All rights reserved. * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * @@ -229,6 +267,80 @@ fakeintr(arg) #define LEGAL_IRQ(x) ((x) >= 0 && (x) < ICU_LEN && (x) != 2) +int +isa_intr_alloc(ic, mask, type, irq) + isa_chipset_tag_t ic; + int mask; + int type; + int *irq; +{ + int i, bestirq, count; + int tmp; + struct intrhand **p, *q; + + if (type == IST_NONE) + panic("intr_alloc: bogus type"); + + bestirq = -1; + count = -1; + + /* some interrupts should never be dynamically allocated */ + mask &= 0xdef8; + + /* + * XXX some interrupts will be used later (6 for fdc, 12 for pms). + * the right answer is to do "breadth-first" searching of devices. + */ + mask &= 0xefbf; + + for (i = 0; i < ICU_LEN; i++) { + if (LEGAL_IRQ(i) == 0 || (mask & (1<ih_next, tmp++) + ; + if ((bestirq == -1) || (count > tmp)) { + bestirq = i; + count = tmp; + } + break; + + case IST_PULSE: + /* this just isn't shareable */ + continue; + } + } + + if (bestirq == -1) + return (1); + + *irq = bestirq; + + return (0); +} + /* * Set up an interrupt handler to start being called. * XXX PRONE TO RACE CONDITIONS, UGLY, 'INTERESTING' INSERTION ALGORITHM. @@ -256,6 +368,9 @@ isa_intr_establish(ic, irq, type, level, ih_fun, ih_arg, ih_what) panic("intr_establish: bogus irq or type"); switch (intrtype[irq]) { + case IST_NONE: + intrtype[irq] = type; + break; case IST_EDGE: case IST_LEVEL: if (type == intrtype[irq]) diff --git a/sys/arch/i386/isa/isa_machdep.h b/sys/arch/i386/isa/isa_machdep.h index e62aefdb0d8..a2c8482979b 100644 --- a/sys/arch/i386/isa/isa_machdep.h +++ b/sys/arch/i386/isa/isa_machdep.h @@ -67,6 +67,7 @@ struct isabus_attach_args; /* XXX */ */ void isa_attach_hook __P((struct device *, struct device *, struct isabus_attach_args *)); +int isa_intr_alloc __P((isa_chipset_tag_t, int, int, int *)); void *isa_intr_establish __P((isa_chipset_tag_t ic, int irq, int type, int level, int (*ih_fun)(void *), void *ih_arg, char *ih_what)); void isa_intr_disestablish __P((isa_chipset_tag_t ic, void *handler)); diff --git a/sys/arch/i386/isa/isapnp_machdep.c b/sys/arch/i386/isa/isapnp_machdep.c new file mode 100644 index 00000000000..ac41c667b9c --- /dev/null +++ b/sys/arch/i386/isa/isapnp_machdep.c @@ -0,0 +1,169 @@ +/* $OpenBSD: isapnp_machdep.c,v 1.1 1997/12/21 14:44:33 downsj Exp $ */ +/* $NetBSD: isapnp_machdep.c,v 1.5 1997/10/04 17:32:30 thorpej Exp $ */ + +/*- + * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research Center. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copyright (c) 1996 Christos Zoulas. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christos Zoulas. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Machine-dependent portions of ISA PnP bus autoconfiguration. + * + * N.B. This file exists mostly to get around some lameness surrounding + * the PnP spec. ISA PnP registers live where some `normal' ISA + * devices do, but are e.g. write-only registers where the normal + * device has a read-only register. This breaks in the presence of + * i/o port accounting. This file takes care of mapping ISA PnP + * registers without actually allocating them in extent maps. + * + * Since this is a machine-dependent file, we make all sorts of + * assumptions about bus.h's guts. Beware! + */ + +#include +#include +#include +#include + +#include + +#include + +#include +#include + +/* isapnp_map(): + * Map I/O regions used by PnP + */ +int +isapnp_map(sc) + struct isapnp_softc *sc; +{ + +#ifdef DIAGNOSTIC + if (sc->sc_iot != I386_BUS_SPACE_IO) + panic("isapnp_map: bogus bus space tag"); +#endif + + sc->sc_addr_ioh = ISAPNP_ADDR; + sc->sc_wrdata_ioh = ISAPNP_WRDATA; + return (0); +} + +/* isapnp_unmap(): + * Unmap I/O regions used by PnP + */ +void +isapnp_unmap(sc) + struct isapnp_softc *sc; +{ + + /* Do nothing. */ +} + +/* isapnp_map_readport(): + * Called to map the PnP `read port', which is mapped independently + * of the `write' and `addr' ports. + * + * NOTE: assumes the caller has filled in sc->sc_read_port! + */ +int +isapnp_map_readport(sc) + struct isapnp_softc *sc; +{ +#ifdef _KERNEL + int error; +#endif + +#ifdef DIAGNOSTIC + if (sc->sc_iot != I386_BUS_SPACE_IO) + panic("isapnp_map_readport: bogus bus space tag"); +#endif + +#ifdef _KERNEL + /* Check if some other device has already claimed this port. */ + if ((error = bus_space_map(sc->sc_iot, sc->sc_read_port, 1, 0, + &sc->sc_read_ioh)) != 0) + return error; + + /* + * XXX: We unmap the port because it can and will be used by other + * devices such as a joystick. We need a better port accounting + * scheme with read and write ports. + */ + bus_space_unmap(sc->sc_iot, sc->sc_read_ioh, 1); +#endif + return 0; +} + +/* isapnp_unmap_readport(): + * Pretend to unmap a previously mapped `read port'. + */ +void +isapnp_unmap_readport(sc) + struct isapnp_softc *sc; +{ + + /* Do nothing */ +} diff --git a/sys/arch/i386/isa/isapnp_machdep.h b/sys/arch/i386/isa/isapnp_machdep.h new file mode 100644 index 00000000000..c719afdabe7 --- /dev/null +++ b/sys/arch/i386/isa/isapnp_machdep.h @@ -0,0 +1,76 @@ +/* $OpenBSD: isapnp_machdep.h,v 1.1 1997/12/21 14:44:34 downsj Exp $ */ +/* $NetBSD: isapnp_machdep.h,v 1.2 1997/10/04 17:32:32 thorpej Exp $ */ + +/*- + * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research Center. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copyright (c) 1996 Christos Zoulas. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christos Zoulas. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Functions provided to machine-independent ISA PnP code. + */ +int isapnp_map __P((struct isapnp_softc *)); +void isapnp_unmap __P((struct isapnp_softc *)); +int isapnp_map_readport __P((struct isapnp_softc *)); +void isapnp_unmap_readport __P((struct isapnp_softc *)); diff --git a/sys/arch/i386/isa/pccom.c b/sys/arch/i386/isa/pccom.c index 2b400d5b69f..3ab89444bea 100644 --- a/sys/arch/i386/isa/pccom.c +++ b/sys/arch/i386/isa/pccom.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pccom.c,v 1.13 1997/10/07 06:49:49 mickey Exp $ */ +/* $OpenBSD: pccom.c,v 1.14 1997/12/21 14:44:34 downsj Exp $ */ /* $NetBSD: com.c,v 1.82.4.1 1996/06/02 09:08:00 mrg Exp $ */ /*- @@ -59,7 +59,10 @@ #include #include +#include #include +#include +#include #include #include #ifdef COM_HAYESP @@ -91,6 +94,12 @@ struct cfattach pccom_isa_ca = { }; #endif +#if NPCCOM_ISAPNP +struct cfattach pccom_isapnp_ca = { + sizeof(struct com_softc), comprobe, comattach +}; +#endif + #if NPCCOM_COMMULTI struct cfattach pccom_commulti_ca = { sizeof(struct com_softc), comprobe, comattach @@ -138,6 +147,23 @@ extern int kgdb_debug_init; #define CLR(t, f) (t) &= ~(f) #define ISSET(t, f) ((t) & (f)) +/* Macros for determining bus type. */ +#if NPCCOM_ISA || NPCCOM_PCMCIA +#define IS_ISA(parent) \ + (!strcmp((parent)->dv_cfdata->cf_driver->cd_name, "isa") || \ + !strcmp((parent)->dv_cfdata->cf_driver->cd_name, "pcmcia")) +#elif NPCCOM_ISA +#define IS_ISA(parent) \ + !strcmp((parent)->dv_cfdata->cf_driver->cd_name, "isa") +#endif + +#if NPCCOM_ISAPNP +#define IS_ISAPNP(parent) \ + !strcmp((parent)->dv_cfdata->cf_driver->cd_name, "isapnp") +#else +#define IS_ISAPNP(parent) 0 +#endif + #if NPCCOM_PCMCIA #include @@ -454,14 +480,6 @@ comprobe(parent, match, aux) int iobase, needioh; int rv = 1; -#if NPCCOM_ISA || NPCCOM_PCMCIA -#define IS_ISA(parent) \ - (!strcmp((parent)->dv_cfdata->cf_driver->cd_name, "isa") || \ - !strcmp((parent)->dv_cfdata->cf_driver->cd_name, "pcmcia")) -#elif NPCCOM_ISA -#define IS_ISA(parent) \ - !strcmp((parent)->dv_cfdata->cf_driver->cd_name, "isa") -#endif /* * XXX should be broken out into functions for isa probe and * XXX for commulti probe, with a helper function that contains @@ -476,6 +494,17 @@ comprobe(parent, match, aux) needioh = 1; } else #endif +#if NPCCOM_ISAPNP + if (IS_ISAPNP(parent)) { + struct isapnp_attach_args *ipa = aux; + + /* XXX: is the modem always on region 0? */ + iot = ipa->ipa_iot; + iobase = ipa->ipa_io[0].base; + ioh = ipa->ipa_io[0].h; + needioh = 0; + } else +#endif #if NPCCOM_COMMULTI if (1) { struct cfdata *cf = match; @@ -552,14 +581,27 @@ comattach(parent, self, aux) */ iobase = ia->ia_iobase; iot = ia->ia_iot; - if (iobase != comconsaddr) { - if (bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh)) + if (iobase != comconsaddr) { + if (bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh)) panic("comattach: io mapping failed"); } else - ioh = comconsioh; + ioh = comconsioh; irq = ia->ia_irq; } else #endif +#if NPCCOM_ISAPNP + if (IS_ISAPNP(parent)) { + struct isapnp_attach_args *ipa = aux; + + /* + * We're living on ISA PnP. No console support. + */ + iobase = ipa->ipa_io[0].base; + iot = ipa->ipa_iot; + ioh = ipa->ipa_io[0].h; + irq = ipa->ipa_irq[0].num; + } else +#endif #if NPCCOM_COMMULTI if (1) { struct commulti_attach_args *ca = aux; @@ -649,6 +691,15 @@ comattach(parent, self, aux) IST_EDGE, IPL_HIGH, comintr, sc, sc->sc_dev.dv_xname); } else +#endif +#if NPCCOM_ISAPNP + if (IS_ISAPNP(parent)) { + struct isapnp_attach_args *ipa = aux; + + sc->sc_ih = isa_intr_establish(ipa->ipa_ic, irq, + IST_EDGE, IPL_HIGH, comintr, sc, + sc->sc_dev.dv_xname); + } else #endif panic("comattach: IRQ but can't have one"); } @@ -1598,7 +1649,6 @@ comintr(arg) /* * Following are all routines needed for PCCOM to act as console */ -#include void comcnprobe(cp) -- cgit v1.2.3