#ifndef _X86_MPCONFIG_H_
#define _X86_MPCONFIG_H_
#include <sys/bus.h>
#include <dev/pci/pcivar.h>
#include <machine/pci_machdep.h>
#define MPS_INTTYPE_INT 0
#define MPS_INTTYPE_NMI 1
#define MPS_INTTYPE_SMI 2
#define MPS_INTTYPE_ExtINT 3
#define MPS_INTPO_DEF 0
#define MPS_INTPO_ACTHI 1
#define MPS_INTPO_ACTLO 3
#define MPS_INTTR_DEF 0
#define MPS_INTTR_EDGE 1
#define MPS_INTTR_LEVEL 3
#ifndef _LOCORE
struct mpbios_int;
struct mp_bus
{
const char *mb_name;
int mb_idx;
void (*mb_intr_print)(int);
void (*mb_intr_cfg)(const struct mpbios_int *, uint32_t *);
struct mp_intr_map *mb_intrs;
uint32_t mb_data;
device_t mb_dev;
pcitag_t *mb_pci_bridge_tag;
pci_chipset_tag_t mb_pci_chipset_tag;
};
struct mp_intr_map
{
struct mp_intr_map *next;
struct mp_bus *bus;
int bus_pin;
struct pic *ioapic;
int ioapic_pin;
intr_handle_t ioapic_ih;
int type;
int flags;
uint32_t redir;
uint32_t cpu_id;
int global_int;
int sflags;
void *linkdev;
int sourceindex;
};
#define MPI_OVR 0x0001
#if defined(_KERNEL)
extern int mp_verbose;
extern struct mp_bus *mp_busses;
extern struct mp_intr_map *mp_intrs;
extern int mp_nintr;
extern int mp_isa_bus, mp_eisa_bus;
extern int mp_nbus;
int mp_pci_scan(device_t, struct pcibus_attach_args *, cfprint_t);
void mp_pci_childdetached(device_t, device_t);
#endif
#endif
#endif