src/sys/dev/isa/isavar.h

436 lines
14 KiB
C

/* $OpenBSD: isavar.h,v 1.59 2024/03/31 09:49:33 miod Exp $ */
/* $NetBSD: isavar.h,v 1.26 1997/06/06 23:43:57 thorpej Exp $ */
/*-
* Copyright (c) 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.
*
* 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.
*/
/*
* Copyright (c) 1995 Chris G. Demetriou
* Copyright (c) 1992 Berkeley Software Design, Inc.
* 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 Berkeley Software
* Design, Inc.
* 4. The name of Berkeley Software Design must not be used to endorse
* or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN, INC. ``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 BERKELEY SOFTWARE DESIGN, INC. 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.
*
* BSDI Id: isavar.h,v 1.5 1992/12/01 18:06:00 karels Exp
*/
#ifndef _DEV_ISA_ISAVAR_H_
#define _DEV_ISA_ISAVAR_H_
/*
* Definitions for ISA and ISA PnP autoconfiguration.
*/
#include <sys/queue.h>
#include <machine/bus.h>
#ifndef NISADMA
#include "isadma.h"
#endif
/*
* Structures and definitions needed by the machine-dependent header.
*/
struct isabus_attach_args;
#if defined(__alpha__)
#include <alpha/isa/isa_machdep.h>
#elif defined(__i386__)
#include <i386/isa/isa_machdep.h>
#else
#include <machine/isa_machdep.h>
#endif
#include "isapnp.h"
#if NISAPNP > 0
/*
* Structures and definitions needed by the machine-dependent header.
*/
struct isapnp_softc;
#if defined(__alpha__)
#include <alpha/isa/isapnp_machdep.h>
#elif defined(__i386__)
#include <i386/isa/isapnp_machdep.h>
#else
#error COMPILING ISAPNP FOR UNSUPPORTED MACHINE.
#endif
#endif /* NISAPNP */
# define ISAPNP_WRITE_ADDR(sc, v) \
bus_space_write_1(sc->sc_iot, sc->sc_addr_ioh, 0, v)
# define ISAPNP_WRITE_DATA(sc, v) \
bus_space_write_1(sc->sc_iot, sc->sc_wrdata_ioh, 0, v)
# define ISAPNP_READ_DATA(sc) \
bus_space_read_1(sc->sc_iot, sc->sc_read_ioh, 0)
# define ISAPNP_CLONE_SETUP(dest, src) \
do { \
bzero((dest), sizeof(*(dest))); \
(dest)->ia_ic = (src)->ia_ic; \
} while (0)
#ifndef _DEV_ISA_ISAPNPREG_H_
/*
* `reg' defines needed only for these structures.
*/
#define ISAPNP_MAX_CARDS 8
#define ISAPNP_MAX_IDENT 32
#define ISAPNP_MAX_DEVCLASS 16
#define ISAPNP_SERIAL_SIZE 9
#define ISAPNP_NUM_MEM 4
#define ISAPNP_NUM_IO 8
#define ISAPNP_NUM_IRQ 16
#define ISAPNP_NUM_DRQ 8
#define ISAPNP_NUM_MEM32 4
#endif /* _DEV_ISA_ISAPNPREG_H_ */
/*
* ISA PnP-specific structures.
*/
struct isapnp_softc {
struct device sc_dev;
TAILQ_HEAD(, isadev)
sc_subdevs; /* list of all children */
bus_space_tag_t sc_iot; /* isa io space tag */
bus_space_tag_t sc_memt; /* isa mem space tag */
#if NISADMA > 0
bus_dma_tag_t sc_dmat; /* isa DMA tag */
#endif /* NISADMA > 0 */
int sc_read_port;
bus_space_handle_t sc_addr_ioh;
bus_space_handle_t sc_wrdata_ioh;
bus_space_handle_t sc_read_ioh;
bus_space_handle_t sc_memh;
u_int8_t sc_ncards;
u_int8_t sc_id[ISAPNP_MAX_CARDS][ISAPNP_SERIAL_SIZE];
};
struct isapnp_region {
bus_space_handle_t h;
u_int32_t base;
u_int32_t minbase;
u_int32_t maxbase;
u_int32_t length;
u_int32_t align;
u_int8_t flags;
};
struct isapnp_pin {
int16_t num;
u_int8_t flags:4;
u_int8_t type:4;
u_int16_t bits;
};
struct isapnp_knowndev {
const char pnpid[8];
const char driver[5];
};
/*
* ISA bus attach arguments
*/
struct isabus_attach_args {
char *iba_busname; /* XXX should be common */
bus_space_tag_t iba_iot; /* isa i/o space tag */
bus_space_tag_t iba_memt; /* isa mem space tag */
#if NISADMA > 0
bus_dma_tag_t iba_dmat; /* isa DMA tag */
#endif
isa_chipset_tag_t iba_ic;
};
/*
* ISA/ISA PnP shared driver attach arguments
*/
struct isa_attach_args {
struct device *ia_isa; /* isa device */
bus_space_tag_t ia_iot; /* isa i/o space tag */
bus_space_tag_t ia_memt; /* isa mem space tag */
#if NISADMA > 0
bus_dma_tag_t ia_dmat; /* DMA tag */
#endif
bus_space_handle_t ia_delaybah; /* i/o handle for `delay port' */
isa_chipset_tag_t ia_ic;
/*
* ISA PnP configuration support. `ipa_' prefixes are used to denote
* PnP specific members of this structure.
*/
struct isa_attach_args *ipa_sibling;
struct isa_attach_args *ipa_child;
char ipa_devident[ISAPNP_MAX_IDENT];
char ipa_devlogic[ISAPNP_MAX_DEVCLASS];
char ipa_devcompat[ISAPNP_MAX_DEVCLASS];
char ipa_devclass[ISAPNP_MAX_DEVCLASS];
u_char ipa_pref;
u_char ipa_devnum;
u_char ipa_nio;
u_char ipa_nirq;
u_char ipa_ndrq;
u_char ipa_nmem;
u_char ipa_nmem32;
struct isapnp_region ipa_io[ISAPNP_NUM_IO];
struct isapnp_region ipa_mem[ISAPNP_NUM_MEM];
struct isapnp_region ipa_mem32[ISAPNP_NUM_MEM32];
struct isapnp_pin ipa_irq[ISAPNP_NUM_IRQ];
struct isapnp_pin ipa_drq[ISAPNP_NUM_DRQ];
/*
* Compatibility defines for ISA drivers.
*/
#define ia_iobase ipa_io[0].base
#define ia_iosize ipa_io[0].length
#define ia_ioh ipa_io[0].h
#define ia_irq ipa_irq[0].num
#define ia_drq ipa_drq[0].num
#define ia_drq2 ipa_drq[1].num
#define ia_maddr ipa_mem[0].base
#define ia_msize ipa_mem[0].length
#define ia_memh ipa_mem[0].h
void *ia_aux; /* driver specific */
};
#define IOBASEUNK -1 /* i/o address is unknown */
#define IRQUNK -1 /* interrupt request line is unknown */
#define DRQUNK -1 /* DMA request line is unknown */
#define MADDRUNK -1 /* shared memory address is unknown */
/*
* Per-device ISA variables
*/
struct isadev {
struct device *id_dev; /* back pointer to generic */
TAILQ_ENTRY(isadev)
id_bchain; /* bus chain */
};
/*
* ISA master bus
*/
struct isa_softc {
struct device sc_dev; /* base device */
TAILQ_HEAD(, isadev)
sc_subdevs; /* list of all children */
bus_space_tag_t sc_iot; /* isa io space tag */
bus_space_tag_t sc_memt; /* isa mem space tag */
#if NISADMA > 0
bus_dma_tag_t sc_dmat; /* isa DMA tag */
#endif /* NISADMA > 0 */
isa_chipset_tag_t sc_ic;
#if NISADMA > 0
/*
* Bitmap representing the DRQ channels available
* for ISA.
*/
int sc_drqmap;
#define sc_drq sc_drqmap /* XXX compatibility mode */
bus_space_handle_t sc_dma1h; /* i/o handle for DMA controller #1 */
bus_space_handle_t sc_dma2h; /* i/o handle for DMA controller #2 */
bus_space_handle_t sc_dmapgh; /* i/o handle for DMA page registers */
/*
* DMA maps used for the 8 DMA channels.
*/
bus_dmamap_t sc_dmamaps[8];
bus_size_t sc_dmalength[8];
int sc_dmareads; /* state for isa_dmadone() */
int sc_dmafinished; /* DMA completion state */
#endif /* NISADMA > 0 */
/*
* This i/o handle is used to map port 0x84, which is
* read to provide a 1.25us delay. This access handle
* is mapped in isaattach(), and exported to drivers
* via isa_attach_args.
*/
bus_space_handle_t sc_delaybah;
};
#define ISA_DRQ_ISFREE(isadev, drq) \
((((struct isa_softc *)(isadev))->sc_drqmap & (1 << (drq))) == 0)
#define ISA_DRQ_ALLOC(isadev, drq) \
((struct isa_softc *)(isadev))->sc_drqmap |= (1 << (drq))
#define ISA_DRQ_FREE(isadev, drq) \
((struct isa_softc *)(isadev))->sc_drqmap &= ~(1 << (drq))
#define cf_iobase cf_loc[0]
#define cf_iosize cf_loc[1]
#define cf_maddr cf_loc[2]
#define cf_msize cf_loc[3]
#define cf_irq cf_loc[4]
#define cf_drq cf_loc[5]
#define cf_drq2 cf_loc[6]
/*
* ISA interrupt handler manipulation.
*
* To establish an ISA interrupt handler, a driver calls isa_intr_establish()
* with the interrupt number, type, level, function, and function argument of
* the interrupt it wants to handle. Isa_intr_establish() returns an opaque
* handle to an event descriptor if it succeeds, and invokes panic() if it
* fails. (XXX It should return NULL, then drivers should handle that, but
* what should they do?) Interrupt handlers should return 0 for "interrupt
* not for me", 1 for "I took care of it", or -1 for "I guess it was mine,
* but I wasn't expecting it."
*
* To remove an interrupt handler, the driver calls isa_intr_disestablish()
* with the handle returned by isa_intr_establish() for that handler.
*/
/* ISA interrupt sharing types */
char *isa_intr_typename(int type);
void isascan(struct device *parent, void *match);
int isaprint(void *, const char *);
/*
* Some ISA devices (e.g. on a VLB) can perform 32-bit DMA. This
* flag is passed to bus_dmamap_create() to indicate that fact.
*/
#define ISABUS_DMA_32BIT BUS_DMA_BUS1
/*
* ISA PnP prototypes and support macros.
*/
static __inline void isapnp_write_reg(struct isapnp_softc *, int, u_char);
static __inline u_char isapnp_read_reg(struct isapnp_softc *, int);
static __inline void
isapnp_write_reg(struct isapnp_softc *sc, int r, u_char v)
{
ISAPNP_WRITE_ADDR(sc, r);
ISAPNP_WRITE_DATA(sc, v);
}
static __inline u_char
isapnp_read_reg(struct isapnp_softc *sc, int r)
{
ISAPNP_WRITE_ADDR(sc, r);
return ISAPNP_READ_DATA(sc);
}
struct isa_attach_args *
isapnp_get_resource(struct isapnp_softc *, int, struct isa_attach_args *);
char *isapnp_id_to_vendor(char *, const u_char *);
int isapnp_config(bus_space_tag_t, bus_space_tag_t,
struct isa_attach_args *);
void isapnp_unconfig(bus_space_tag_t, bus_space_tag_t,
struct isa_attach_args *);
void isapnp_isa_attach_hook(struct isa_softc *);
#ifdef DEBUG_ISAPNP
void isapnp_print_mem(const char *, const struct isapnp_region *);
void isapnp_print_io(const char *, const struct isapnp_region *);
void isapnp_print_irq(const char *, const struct isapnp_pin *);
void isapnp_print_drq(const char *, const struct isapnp_pin *);
void isapnp_print_dep_start(const char *, const u_char);
void isapnp_print_attach(const struct isa_attach_args *);
void isapnp_get_config(struct isapnp_softc *,
struct isa_attach_args *);
void isapnp_print_config(const struct isa_attach_args *);
#endif /* DEBUG_ISAPNP */
#endif /* _DEV_ISA_ISAVAR_H_ */