#ifndef _ISA_ISAVAR_H_
#define _ISA_ISAVAR_H_
struct buf;
struct isa_config;
struct isa_pnp_id;
typedef void isa_config_cb(void *arg, struct isa_config *config, int enable);
#include "isa_if.h"
#include "pnpvar.h"
#ifdef _KERNEL
#ifndef _INTRMASK_T_DECLARED
#define _INTRMASK_T_DECLARED
typedef __uint32_t intrmask_t;
#endif
#define ISA_ORDER_SENSITIVE 0
#define ISA_ORDER_SPECULATIVE 1
#define ISA_ORDER_PNP 2
#define ISA_NPORT 50
#define ISA_NMEM 8
#define ISA_NIRQ 2
#define ISA_NDRQ 2
#define ISADMA_READ 0x00000001
#define ISADMA_WRITE 0x00000002
#define ISADMA_RAW 0x00000004
struct isa_range {
u_int32_t ir_start;
u_int32_t ir_end;
u_int32_t ir_size;
u_int32_t ir_align;
};
struct isa_config {
struct isa_range ic_mem[ISA_NMEM];
struct isa_range ic_port[ISA_NPORT];
u_int32_t ic_irqmask[ISA_NIRQ];
u_int32_t ic_drqmask[ISA_NDRQ];
int ic_nmem;
int ic_nport;
int ic_nirq;
int ic_ndrq;
};
struct isa_pnp_id {
u_int32_t ip_id;
const char *ip_desc;
};
enum isa_device_ivars {
ISA_IVAR_PORT,
ISA_IVAR_PORT_0 = ISA_IVAR_PORT,
ISA_IVAR_PORT_1,
ISA_IVAR_PORTSIZE,
ISA_IVAR_PORTSIZE_0 = ISA_IVAR_PORTSIZE,
ISA_IVAR_PORTSIZE_1,
ISA_IVAR_MADDR,
ISA_IVAR_MADDR_0 = ISA_IVAR_MADDR,
ISA_IVAR_MADDR_1,
ISA_IVAR_MSIZE,
ISA_IVAR_MSIZE_0 = ISA_IVAR_MSIZE,
ISA_IVAR_MSIZE_1,
ISA_IVAR_IRQ,
ISA_IVAR_IRQ_0 = ISA_IVAR_IRQ,
ISA_IVAR_IRQ_1,
ISA_IVAR_DRQ,
ISA_IVAR_DRQ_0 = ISA_IVAR_DRQ,
ISA_IVAR_DRQ_1,
ISA_IVAR_VENDORID,
ISA_IVAR_SERIAL,
ISA_IVAR_LOGICALID,
ISA_IVAR_COMPATID,
ISA_IVAR_CONFIGATTR
};
#define ISACFGATTR_CANDISABLE (1 << 0)
#define ISACFGATTR_DYNAMIC (1 << 1)
#define ISACFGATTR_MULTI (1 << 2)
#define ISA_ACCESSOR(A, B, T) \
\
static __inline T isa_get_ ## A(device_t dev) \
{ \
uintptr_t v; \
BUS_READ_IVAR(device_get_parent(dev), dev, ISA_IVAR_ ## B, &v); \
return (T) v; \
} \
\
static __inline void isa_set_ ## A(device_t dev, T t) \
{ \
u_long v = (u_long) t; \
BUS_WRITE_IVAR(device_get_parent(dev), dev, ISA_IVAR_ ## B, v); \
}
ISA_ACCESSOR(port, PORT, int)
ISA_ACCESSOR(portsize, PORTSIZE, int)
ISA_ACCESSOR(irq, IRQ, int)
ISA_ACCESSOR(drq, DRQ, int)
ISA_ACCESSOR(maddr, MADDR, int)
ISA_ACCESSOR(msize, MSIZE, int)
ISA_ACCESSOR(vendorid, VENDORID, int)
ISA_ACCESSOR(serial, SERIAL, int)
ISA_ACCESSOR(logicalid, LOGICALID, int)
ISA_ACCESSOR(compatid, COMPATID, int)
ISA_ACCESSOR(configattr, CONFIGATTR, int)
extern devclass_t isab_devclass;
extern intrmask_t isa_irq_pending(void);
extern void isa_probe_children(device_t dev);
extern void isa_dmacascade (int chan);
extern void isa_dmadone (int flags, caddr_t addr, int nbytes, int chan);
extern int isa_dma_init (int chan, u_int bouncebufsize, int flags);
extern void isa_dmastart (int flags, caddr_t addr, u_int nbytes, int chan);
extern int isa_dma_acquire (int chan);
extern void isa_dma_release (int chan);
extern int isa_dmastatus (int chan);
extern int isa_dmastop (int chan);
unsigned isa_dmabp (struct buf *);
int isab_attach(device_t dev);
#define isa_dmainit(chan, size) do { \
if (isa_dma_init(chan, size, M_NOWAIT)) \
kprintf("WARNING: isa_dma_init(%d, %ju) failed\n", \
(int)(chan), (uintmax_t)(size)); \
} while (0)
#endif
#endif