Add a new legacy(4) device driver for use on machines that do not have

ACPI or for when ACPI support is disabled or not present in the kernel.
Basically, the nexus device is now split into two with some parts
(such as adding default ISA, MCA, and EISA busses if they aren't found
as well as support for PCI bus device ivars) being moved to the legacy
driver.
This commit is contained in:
jhb 2002-09-23 15:50:06 +00:00
parent 236b22fa5b
commit 3c64027d75
5 changed files with 221 additions and 918 deletions

View File

@ -30,234 +30,122 @@
*/
/*
* This code implements a `root nexus' for Intel Architecture
* machines. The function of the root nexus is to serve as an
* attachment point for both processors and buses, and to manage
* resources which are common to all of them. In particular,
* this code implements the core resource managers for interrupt
* requests, DMA requests (which rightfully should be a part of the
* ISA code but it's easier to do it here for now), I/O port addresses,
* and I/O memory address space.
* This code implements a system driver for legacy systems that do not
* support ACPI or when ACPI support is not present in the kernel.
*/
#include "opt_isa.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <sys/interrupt.h>
#include <machine/vmparam.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/pmap.h>
#include <machine/nexusvar.h>
#include <machine/legacyvar.h>
#include <machine/resource.h>
#ifdef APIC_IO
#include <machine/smp.h>
#include <machine/mpapic.h>
#endif
#ifdef DEV_ISA
#include <isa/isavar.h>
#ifdef PC98
#include <pc98/pc98/pc98.h>
#else
#include <i386/isa/isa.h>
#endif
#endif
#include <i386/isa/icu.h>
#include <i386/isa/intr_machdep.h>
#include <sys/rtprio.h>
static MALLOC_DEFINE(M_NEXUSDEV, "nexusdev", "Nexus device");
struct nexus_device {
struct resource_list nx_resources;
int nx_pcibus;
static MALLOC_DEFINE(M_LEGACYDEV, "legacydrv", "legacy system device");
struct legacy_device {
struct resource_list lg_resources;
int lg_pcibus;
};
#define DEVTONX(dev) ((struct nexus_device *)device_get_ivars(dev))
#define DEVTOAT(dev) ((struct legacy_device *)device_get_ivars(dev))
static struct rman irq_rman, drq_rman, port_rman, mem_rman;
static int nexus_probe(device_t);
static int nexus_attach(device_t);
static int nexus_print_all_resources(device_t dev);
static int nexus_print_child(device_t, device_t);
static device_t nexus_add_child(device_t bus, int order, const char *name,
static int legacy_probe(device_t);
static int legacy_attach(device_t);
static int legacy_print_child(device_t, device_t);
static device_t legacy_add_child(device_t bus, int order, const char *name,
int unit);
static struct resource *nexus_alloc_resource(device_t, device_t, int, int *,
static struct resource *legacy_alloc_resource(device_t, device_t, int, int *,
u_long, u_long, u_long, u_int);
static int nexus_read_ivar(device_t, device_t, int, uintptr_t *);
static int nexus_write_ivar(device_t, device_t, int, uintptr_t);
static int nexus_activate_resource(device_t, device_t, int, int,
struct resource *);
static int nexus_deactivate_resource(device_t, device_t, int, int,
struct resource *);
static int nexus_release_resource(device_t, device_t, int, int,
static int legacy_read_ivar(device_t, device_t, int, uintptr_t *);
static int legacy_write_ivar(device_t, device_t, int, uintptr_t);
static int legacy_release_resource(device_t, device_t, int, int,
struct resource *);
static int nexus_setup_intr(device_t, device_t, struct resource *, int flags,
void (*)(void *), void *, void **);
static int nexus_teardown_intr(device_t, device_t, struct resource *,
void *);
static int nexus_set_resource(device_t, device_t, int, int, u_long, u_long);
static int nexus_get_resource(device_t, device_t, int, int, u_long *, u_long *);
static void nexus_delete_resource(device_t, device_t, int, int);
static int legacy_set_resource(device_t, device_t, int, int, u_long, u_long);
static int legacy_get_resource(device_t, device_t, int, int, u_long *, u_long *);
static void legacy_delete_resource(device_t, device_t, int, int);
static device_method_t nexus_methods[] = {
static device_method_t legacy_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, nexus_probe),
DEVMETHOD(device_attach, nexus_attach),
DEVMETHOD(device_probe, legacy_probe),
DEVMETHOD(device_attach, legacy_attach),
DEVMETHOD(device_detach, bus_generic_detach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
/* Bus interface */
DEVMETHOD(bus_print_child, nexus_print_child),
DEVMETHOD(bus_add_child, nexus_add_child),
DEVMETHOD(bus_read_ivar, nexus_read_ivar),
DEVMETHOD(bus_write_ivar, nexus_write_ivar),
DEVMETHOD(bus_alloc_resource, nexus_alloc_resource),
DEVMETHOD(bus_release_resource, nexus_release_resource),
DEVMETHOD(bus_activate_resource, nexus_activate_resource),
DEVMETHOD(bus_deactivate_resource, nexus_deactivate_resource),
DEVMETHOD(bus_setup_intr, nexus_setup_intr),
DEVMETHOD(bus_teardown_intr, nexus_teardown_intr),
DEVMETHOD(bus_set_resource, nexus_set_resource),
DEVMETHOD(bus_get_resource, nexus_get_resource),
DEVMETHOD(bus_delete_resource, nexus_delete_resource),
DEVMETHOD(bus_print_child, legacy_print_child),
DEVMETHOD(bus_add_child, legacy_add_child),
DEVMETHOD(bus_read_ivar, legacy_read_ivar),
DEVMETHOD(bus_write_ivar, legacy_write_ivar),
DEVMETHOD(bus_set_resource, legacy_set_resource),
DEVMETHOD(bus_get_resource, legacy_get_resource),
DEVMETHOD(bus_alloc_resource, legacy_alloc_resource),
DEVMETHOD(bus_release_resource, legacy_release_resource),
DEVMETHOD(bus_delete_resource, legacy_delete_resource),
DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
{ 0, 0 }
};
static driver_t nexus_driver = {
"nexus",
nexus_methods,
static driver_t legacy_driver = {
"legacy",
legacy_methods,
1, /* no softc */
};
static devclass_t nexus_devclass;
static devclass_t legacy_devclass;
DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0);
DRIVER_MODULE(legacy, nexus, legacy_driver, legacy_devclass, 0, 0);
static int
nexus_probe(device_t dev)
legacy_probe(device_t dev)
{
device_quiet(dev); /* suppress attach message for neatness */
/*
* XXX working notes:
*
* - IRQ resource creation should be moved to the PIC/APIC driver.
* - DRQ resource creation should be moved to the DMAC driver.
* - The above should be sorted to probe earlier than any child busses.
*
* - Leave I/O and memory creation here, as child probes may need them.
* (especially eg. ACPI)
*/
/*
* IRQ's are on the mainboard on old systems, but on the ISA part
* of PCI->ISA bridges. There would be multiple sets of IRQs on
* multi-ISA-bus systems. PCI interrupts are routed to the ISA
* component, so in a way, PCI can be a partial child of an ISA bus(!).
* APIC interrupts are global though.
*
* XXX We depend on the AT PIC driver correctly claiming IRQ 2
* to prevent its reuse elsewhere in the !APIC_IO case.
*/
irq_rman.rm_start = 0;
irq_rman.rm_type = RMAN_ARRAY;
irq_rman.rm_descr = "Interrupt request lines";
#ifdef APIC_IO
irq_rman.rm_end = APIC_INTMAPSIZE - 1;
#else
irq_rman.rm_end = 15;
#endif
if (rman_init(&irq_rman)
|| rman_manage_region(&irq_rman,
irq_rman.rm_start, irq_rman.rm_end))
panic("nexus_probe irq_rman");
/*
* ISA DMA on PCI systems is implemented in the ISA part of each
* PCI->ISA bridge and the channels can be duplicated if there are
* multiple bridges. (eg: laptops with docking stations)
*/
drq_rman.rm_start = 0;
#ifdef PC98
drq_rman.rm_end = 3;
#else
drq_rman.rm_end = 7;
#endif
drq_rman.rm_type = RMAN_ARRAY;
drq_rman.rm_descr = "DMA request lines";
/* XXX drq 0 not available on some machines */
if (rman_init(&drq_rman)
|| rman_manage_region(&drq_rman,
drq_rman.rm_start, drq_rman.rm_end))
panic("nexus_probe drq_rman");
/*
* However, IO ports and Memory truely are global at this level,
* as are APIC interrupts (however many IO APICS there turn out
* to be on large systems..)
*/
port_rman.rm_start = 0;
port_rman.rm_end = 0xffff;
port_rman.rm_type = RMAN_ARRAY;
port_rman.rm_descr = "I/O ports";
if (rman_init(&port_rman)
|| rman_manage_region(&port_rman, 0, 0xffff))
panic("nexus_probe port_rman");
mem_rman.rm_start = 0;
mem_rman.rm_end = ~0u;
mem_rman.rm_type = RMAN_ARRAY;
mem_rman.rm_descr = "I/O memory addresses";
if (rman_init(&mem_rman)
|| rman_manage_region(&mem_rman, 0, ~0))
panic("nexus_probe mem_rman");
return bus_generic_probe(dev);
device_set_desc(dev, "legacy system");
device_quiet(dev);
return (0);
}
static int
nexus_attach(device_t dev)
legacy_attach(device_t dev)
{
device_t child;
/*
* First, deal with the children we know about already
* First, let our child driver's identify any child devices that
* they can find. Once that is done attach any devices that we
* found.
*/
bus_generic_probe(dev);
bus_generic_attach(dev);
/*
* And if we didn't see EISA or ISA on a pci bridge, create some
* If we didn't see EISA or ISA on a pci bridge, create some
* connection points now so they show up "on motherboard".
*/
if (!devclass_get_device(devclass_find("eisa"), 0)) {
child = BUS_ADD_CHILD(dev, 0, "eisa", 0);
if (child == NULL)
panic("nexus_attach eisa");
panic("legacy_attach eisa");
device_probe_and_attach(child);
}
if (!devclass_get_device(devclass_find("mca"), 0)) {
child = BUS_ADD_CHILD(dev, 0, "mca", 0);
if (child == 0)
panic("nexus_probe mca");
panic("legacy_probe mca");
device_probe_and_attach(child);
}
if (!devclass_get_device(devclass_find("isa"), 0)) {
child = BUS_ADD_CHILD(dev, 0, "isa", 0);
if (child == NULL)
panic("nexus_attach isa");
panic("legacy_attach isa");
device_probe_and_attach(child);
}
@ -265,13 +153,13 @@ nexus_attach(device_t dev)
}
static int
nexus_print_all_resources(device_t dev)
legacy_print_all_resources(device_t dev)
{
struct nexus_device *ndev = DEVTONX(dev);
struct resource_list *rl = &ndev->nx_resources;
struct legacy_device *atdev = DEVTOAT(dev);
struct resource_list *rl = &atdev->lg_resources;
int retval = 0;
if (SLIST_FIRST(rl) || ndev->nx_pcibus != -1)
if (SLIST_FIRST(rl) || atdev->lg_pcibus != -1)
retval += printf(" at");
retval += resource_list_print_type(rl, "port", SYS_RES_IOPORT, "%#lx");
@ -282,48 +170,49 @@ nexus_print_all_resources(device_t dev)
}
static int
nexus_print_child(device_t bus, device_t child)
legacy_print_child(device_t bus, device_t child)
{
struct nexus_device *ndev = DEVTONX(child);
struct legacy_device *atdev = DEVTOAT(child);
int retval = 0;
retval += bus_print_child_header(bus, child);
retval += nexus_print_all_resources(child);
if (ndev->nx_pcibus != -1)
retval += printf(" pcibus %d", ndev->nx_pcibus);
retval += legacy_print_all_resources(child);
if (atdev->lg_pcibus != -1)
retval += printf(" pcibus %d", atdev->lg_pcibus);
retval += printf(" on motherboard\n"); /* XXX "motherboard", ick */
return (retval);
}
static device_t
nexus_add_child(device_t bus, int order, const char *name, int unit)
legacy_add_child(device_t bus, int order, const char *name, int unit)
{
device_t child;
struct nexus_device *ndev;
device_t child;
struct legacy_device *atdev;
ndev = malloc(sizeof(struct nexus_device), M_NEXUSDEV, M_NOWAIT|M_ZERO);
if (!ndev)
atdev = malloc(sizeof(struct legacy_device), M_LEGACYDEV,
M_NOWAIT | M_ZERO);
if (!atdev)
return(0);
resource_list_init(&ndev->nx_resources);
ndev->nx_pcibus = -1;
resource_list_init(&atdev->lg_resources);
atdev->lg_pcibus = -1;
child = device_add_child_ordered(bus, order, name, unit);
/* should we free this in nexus_child_detached? */
device_set_ivars(child, ndev);
/* should we free this in legacy_child_detached? */
device_set_ivars(child, atdev);
return(child);
}
static int
nexus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
legacy_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
{
struct nexus_device *ndev = DEVTONX(child);
struct legacy_device *atdev = DEVTOAT(child);
switch (which) {
case NEXUS_IVAR_PCIBUS:
*result = ndev->nx_pcibus;
case LEGACY_IVAR_PCIBUS:
*result = atdev->lg_pcibus;
break;
default:
return ENOENT;
@ -333,13 +222,13 @@ nexus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
static int
nexus_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
legacy_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
{
struct nexus_device *ndev = DEVTONX(child);
struct legacy_device *atdev = DEVTOAT(child);
switch (which) {
case NEXUS_IVAR_PCIBUS:
ndev->nx_pcibus = value;
case LEGACY_IVAR_PCIBUS:
atdev->lg_pcibus = value;
break;
default:
return ENOENT;
@ -348,235 +237,47 @@ nexus_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
}
/*
* Allocate a resource on behalf of child. NB: child is usually going to be a
* child of one of our descendants, not a direct child of nexus0.
* (Exceptions include npx.)
*/
static struct resource *
nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
legacy_alloc_resource(device_t bus, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
{
struct nexus_device *ndev = DEVTONX(child);
struct resource *rv;
struct resource_list_entry *rle;
struct rman *rm;
int needactivate = flags & RF_ACTIVE;
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
/*
* If this is an allocation of the "default" range for a given RID, and
* we know what the resources for this device are (ie. they aren't maintained
* by a child bus), then work out the start/end values.
*/
if ((start == 0UL) && (end == ~0UL) && (count == 1)) {
if (ndev == NULL)
return(NULL);
rle = resource_list_find(&ndev->nx_resources, type, *rid);
if (rle == NULL)
return(NULL);
start = rle->start;
end = rle->end;
count = rle->count;
}
flags &= ~RF_ACTIVE;
switch (type) {
case SYS_RES_IRQ:
rm = &irq_rman;
break;
case SYS_RES_DRQ:
rm = &drq_rman;
break;
case SYS_RES_IOPORT:
rm = &port_rman;
break;
case SYS_RES_MEMORY:
rm = &mem_rman;
break;
default:
return 0;
}
rv = rman_reserve_resource(rm, start, end, count, flags, child);
if (rv == 0)
return 0;
if (type == SYS_RES_MEMORY) {
rman_set_bustag(rv, I386_BUS_SPACE_MEM);
} else if (type == SYS_RES_IOPORT) {
rman_set_bustag(rv, I386_BUS_SPACE_IO);
#ifndef PC98
rman_set_bushandle(rv, rv->r_start);
#endif
}
#ifdef PC98
if ((type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) &&
i386_bus_space_handle_alloc(rv->r_bustag, rv->r_start, count,
&rv->r_bushandle) != 0) {
rman_release_resource(rv);
return 0;
}
#endif
if (needactivate) {
if (bus_activate_resource(child, type, *rid, rv)) {
#ifdef PC98
if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) {
i386_bus_space_handle_free(rv->r_bustag,
rv->r_bushandle, rv->r_bushandle->bsh_sz);
}
#endif
rman_release_resource(rv);
return 0;
}
}
return rv;
return (resource_list_alloc(rl, bus, child, type, rid, start, end,
count, flags));
}
static int
nexus_activate_resource(device_t bus, device_t child, int type, int rid,
struct resource *r)
{
/*
* If this is a memory resource, map it into the kernel.
*/
if (rman_get_bustag(r) == I386_BUS_SPACE_MEM) {
caddr_t vaddr = 0;
if (rman_get_end(r) < 1024 * 1024) {
/*
* The first 1Mb is mapped at KERNBASE.
*/
vaddr = (caddr_t)(uintptr_t)(KERNBASE + rman_get_start(r));
} else {
u_int32_t paddr;
u_int32_t psize;
u_int32_t poffs;
paddr = rman_get_start(r);
psize = rman_get_size(r);
poffs = paddr - trunc_page(paddr);
vaddr = (caddr_t) pmap_mapdev(paddr-poffs, psize+poffs) + poffs;
}
rman_set_virtual(r, vaddr);
#ifdef PC98
/* PC-98: the type of bus_space_handle_t is the structure. */
r->r_bushandle->bsh_base = (bus_addr_t) vaddr;
#else
/* IBM-PC: the type of bus_space_handle_t is u_int */
rman_set_bushandle(r, (bus_space_handle_t) vaddr);
#endif
}
return (rman_activate_resource(r));
}
static int
nexus_deactivate_resource(device_t bus, device_t child, int type, int rid,
struct resource *r)
{
/*
* If this is a memory resource, unmap it.
*/
if ((rman_get_bustag(r) == I386_BUS_SPACE_MEM) &&
(rman_get_end(r) >= 1024 * 1024)) {
u_int32_t psize;
psize = rman_get_size(r);
pmap_unmapdev((vm_offset_t)rman_get_virtual(r), psize);
}
return (rman_deactivate_resource(r));
}
static int
nexus_release_resource(device_t bus, device_t child, int type, int rid,
legacy_release_resource(device_t bus, device_t child, int type, int rid,
struct resource *r)
{
if (rman_get_flags(r) & RF_ACTIVE) {
int error = bus_deactivate_resource(child, type, rid, r);
if (error)
return error;
}
#ifdef PC98
if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) {
i386_bus_space_handle_free(r->r_bustag, r->r_bushandle,
r->r_bushandle->bsh_sz);
}
#endif
return (rman_release_resource(r));
}
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
/*
* Currently this uses the really grody interface from kern/kern_intr.c
* (which really doesn't belong in kern/anything.c). Eventually, all of
* the code in kern_intr.c and machdep_intr.c should get moved here, since
* this is going to be the official interface.
*/
static int
nexus_setup_intr(device_t bus, device_t child, struct resource *irq,
int flags, void (*ihand)(void *), void *arg, void **cookiep)
{
driver_t *driver;
int error;
/* somebody tried to setup an irq that failed to allocate! */
if (irq == NULL)
panic("nexus_setup_intr: NULL irq resource!");
*cookiep = 0;
if ((irq->r_flags & RF_SHAREABLE) == 0)
flags |= INTR_EXCL;
driver = device_get_driver(child);
/*
* We depend here on rman_activate_resource() being idempotent.
*/
error = rman_activate_resource(irq);
if (error)
return (error);
error = inthand_add(device_get_nameunit(child), irq->r_start,
ihand, arg, flags, cookiep);
return (error);
return (resource_list_release(rl, bus, child, type, rid, r));
}
static int
nexus_teardown_intr(device_t dev, device_t child, struct resource *r, void *ih)
legacy_set_resource(device_t dev, device_t child, int type, int rid,
u_long start, u_long count)
{
return (inthand_remove(ih));
}
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
static int
nexus_set_resource(device_t dev, device_t child, int type, int rid, u_long start, u_long count)
{
struct nexus_device *ndev = DEVTONX(child);
struct resource_list *rl = &ndev->nx_resources;
/* XXX this should return a success/failure indicator */
resource_list_add(rl, type, rid, start, start + count - 1, count);
return(0);
}
static int
nexus_get_resource(device_t dev, device_t child, int type, int rid, u_long *startp, u_long *countp)
legacy_get_resource(device_t dev, device_t child, int type, int rid,
u_long *startp, u_long *countp)
{
struct nexus_device *ndev = DEVTONX(child);
struct resource_list *rl = &ndev->nx_resources;
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
struct resource_list_entry *rle;
rle = resource_list_find(rl, type, rid);
device_printf(child, "type %d rid %d startp %p countp %p - got %p\n",
type, rid, startp, countp, rle);
if (!rle)
return(ENOENT);
if (startp)
@ -587,60 +288,10 @@ nexus_get_resource(device_t dev, device_t child, int type, int rid, u_long *star
}
static void
nexus_delete_resource(device_t dev, device_t child, int type, int rid)
legacy_delete_resource(device_t dev, device_t child, int type, int rid)
{
struct nexus_device *ndev = DEVTONX(child);
struct resource_list *rl = &ndev->nx_resources;
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
resource_list_delete(rl, type, rid);
}
#ifdef DEV_ISA
/*
* Placeholder which claims PnP 'devices' which describe system
* resources.
*/
static struct isa_pnp_id sysresource_ids[] = {
{ 0x010cd041 /* PNP0c01 */, "System Memory" },
{ 0x020cd041 /* PNP0c02 */, "System Resource" },
{ 0 }
};
static int
sysresource_probe(device_t dev)
{
int result;
if ((result = ISA_PNP_PROBE(device_get_parent(dev), dev, sysresource_ids)) <= 0) {
device_quiet(dev);
}
return(result);
}
static int
sysresource_attach(device_t dev)
{
return(0);
}
static device_method_t sysresource_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, sysresource_probe),
DEVMETHOD(device_attach, sysresource_attach),
DEVMETHOD(device_detach, bus_generic_detach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
{ 0, 0 }
};
static driver_t sysresource_driver = {
"sysresource",
sysresource_methods,
1, /* no softc */
};
static devclass_t sysresource_devclass;
DRIVER_MODULE(sysresource, isa, sysresource_driver, sysresource_devclass, 0, 0);
#endif /* DEV_ISA */

View File

@ -26,18 +26,18 @@
* $FreeBSD$
*/
#ifndef _MACHINE_NEXUSVAR_H_
#define _MACHINE_NEXUSVAR_H_ 1
#ifndef _MACHINE_LEGACYVAR_H_
#define _MACHINE_LEGACYVAR_H_
enum nexus_device_ivars {
NEXUS_IVAR_PCIBUS
enum legacy_device_ivars {
LEGACY_IVAR_PCIBUS
};
#define NEXUS_ACCESSOR(var, ivar, type) \
__BUS_ACCESSOR(nexus, var, NEXUS, ivar, type)
#define LEGACY_ACCESSOR(var, ivar, type) \
__BUS_ACCESSOR(legacy, var, LEGACY, ivar, type)
NEXUS_ACCESSOR(pcibus, PCIBUS, u_int32_t)
LEGACY_ACCESSOR(pcibus, PCIBUS, u_int32_t)
#undef NEXUS_ACCESSOR
#undef LEGACY_ACCESSOR
#endif /* !_MACHINE_NEXUSVAR_H_ */
#endif /* !_MACHINE_LEGACYVAR_H_ */

View File

@ -201,6 +201,7 @@ i386/i386/identcpu.c standard
i386/i386/in_cksum.c optional inet
i386/i386/initcpu.c standard
i386/i386/k6_mem.c standard
i386/i386/legacy.c standard
# locore.s needs to be handled in Makefile to put it first. Otherwise it's
# now normal.
# i386/i386/locore.s standard

View File

@ -30,234 +30,122 @@
*/
/*
* This code implements a `root nexus' for Intel Architecture
* machines. The function of the root nexus is to serve as an
* attachment point for both processors and buses, and to manage
* resources which are common to all of them. In particular,
* this code implements the core resource managers for interrupt
* requests, DMA requests (which rightfully should be a part of the
* ISA code but it's easier to do it here for now), I/O port addresses,
* and I/O memory address space.
* This code implements a system driver for legacy systems that do not
* support ACPI or when ACPI support is not present in the kernel.
*/
#include "opt_isa.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <sys/interrupt.h>
#include <machine/vmparam.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/pmap.h>
#include <machine/nexusvar.h>
#include <machine/legacyvar.h>
#include <machine/resource.h>
#ifdef APIC_IO
#include <machine/smp.h>
#include <machine/mpapic.h>
#endif
#ifdef DEV_ISA
#include <isa/isavar.h>
#ifdef PC98
#include <pc98/pc98/pc98.h>
#else
#include <i386/isa/isa.h>
#endif
#endif
#include <i386/isa/icu.h>
#include <i386/isa/intr_machdep.h>
#include <sys/rtprio.h>
static MALLOC_DEFINE(M_NEXUSDEV, "nexusdev", "Nexus device");
struct nexus_device {
struct resource_list nx_resources;
int nx_pcibus;
static MALLOC_DEFINE(M_LEGACYDEV, "legacydrv", "legacy system device");
struct legacy_device {
struct resource_list lg_resources;
int lg_pcibus;
};
#define DEVTONX(dev) ((struct nexus_device *)device_get_ivars(dev))
#define DEVTOAT(dev) ((struct legacy_device *)device_get_ivars(dev))
static struct rman irq_rman, drq_rman, port_rman, mem_rman;
static int nexus_probe(device_t);
static int nexus_attach(device_t);
static int nexus_print_all_resources(device_t dev);
static int nexus_print_child(device_t, device_t);
static device_t nexus_add_child(device_t bus, int order, const char *name,
static int legacy_probe(device_t);
static int legacy_attach(device_t);
static int legacy_print_child(device_t, device_t);
static device_t legacy_add_child(device_t bus, int order, const char *name,
int unit);
static struct resource *nexus_alloc_resource(device_t, device_t, int, int *,
static struct resource *legacy_alloc_resource(device_t, device_t, int, int *,
u_long, u_long, u_long, u_int);
static int nexus_read_ivar(device_t, device_t, int, uintptr_t *);
static int nexus_write_ivar(device_t, device_t, int, uintptr_t);
static int nexus_activate_resource(device_t, device_t, int, int,
struct resource *);
static int nexus_deactivate_resource(device_t, device_t, int, int,
struct resource *);
static int nexus_release_resource(device_t, device_t, int, int,
static int legacy_read_ivar(device_t, device_t, int, uintptr_t *);
static int legacy_write_ivar(device_t, device_t, int, uintptr_t);
static int legacy_release_resource(device_t, device_t, int, int,
struct resource *);
static int nexus_setup_intr(device_t, device_t, struct resource *, int flags,
void (*)(void *), void *, void **);
static int nexus_teardown_intr(device_t, device_t, struct resource *,
void *);
static int nexus_set_resource(device_t, device_t, int, int, u_long, u_long);
static int nexus_get_resource(device_t, device_t, int, int, u_long *, u_long *);
static void nexus_delete_resource(device_t, device_t, int, int);
static int legacy_set_resource(device_t, device_t, int, int, u_long, u_long);
static int legacy_get_resource(device_t, device_t, int, int, u_long *, u_long *);
static void legacy_delete_resource(device_t, device_t, int, int);
static device_method_t nexus_methods[] = {
static device_method_t legacy_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, nexus_probe),
DEVMETHOD(device_attach, nexus_attach),
DEVMETHOD(device_probe, legacy_probe),
DEVMETHOD(device_attach, legacy_attach),
DEVMETHOD(device_detach, bus_generic_detach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
/* Bus interface */
DEVMETHOD(bus_print_child, nexus_print_child),
DEVMETHOD(bus_add_child, nexus_add_child),
DEVMETHOD(bus_read_ivar, nexus_read_ivar),
DEVMETHOD(bus_write_ivar, nexus_write_ivar),
DEVMETHOD(bus_alloc_resource, nexus_alloc_resource),
DEVMETHOD(bus_release_resource, nexus_release_resource),
DEVMETHOD(bus_activate_resource, nexus_activate_resource),
DEVMETHOD(bus_deactivate_resource, nexus_deactivate_resource),
DEVMETHOD(bus_setup_intr, nexus_setup_intr),
DEVMETHOD(bus_teardown_intr, nexus_teardown_intr),
DEVMETHOD(bus_set_resource, nexus_set_resource),
DEVMETHOD(bus_get_resource, nexus_get_resource),
DEVMETHOD(bus_delete_resource, nexus_delete_resource),
DEVMETHOD(bus_print_child, legacy_print_child),
DEVMETHOD(bus_add_child, legacy_add_child),
DEVMETHOD(bus_read_ivar, legacy_read_ivar),
DEVMETHOD(bus_write_ivar, legacy_write_ivar),
DEVMETHOD(bus_set_resource, legacy_set_resource),
DEVMETHOD(bus_get_resource, legacy_get_resource),
DEVMETHOD(bus_alloc_resource, legacy_alloc_resource),
DEVMETHOD(bus_release_resource, legacy_release_resource),
DEVMETHOD(bus_delete_resource, legacy_delete_resource),
DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
{ 0, 0 }
};
static driver_t nexus_driver = {
"nexus",
nexus_methods,
static driver_t legacy_driver = {
"legacy",
legacy_methods,
1, /* no softc */
};
static devclass_t nexus_devclass;
static devclass_t legacy_devclass;
DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0);
DRIVER_MODULE(legacy, nexus, legacy_driver, legacy_devclass, 0, 0);
static int
nexus_probe(device_t dev)
legacy_probe(device_t dev)
{
device_quiet(dev); /* suppress attach message for neatness */
/*
* XXX working notes:
*
* - IRQ resource creation should be moved to the PIC/APIC driver.
* - DRQ resource creation should be moved to the DMAC driver.
* - The above should be sorted to probe earlier than any child busses.
*
* - Leave I/O and memory creation here, as child probes may need them.
* (especially eg. ACPI)
*/
/*
* IRQ's are on the mainboard on old systems, but on the ISA part
* of PCI->ISA bridges. There would be multiple sets of IRQs on
* multi-ISA-bus systems. PCI interrupts are routed to the ISA
* component, so in a way, PCI can be a partial child of an ISA bus(!).
* APIC interrupts are global though.
*
* XXX We depend on the AT PIC driver correctly claiming IRQ 2
* to prevent its reuse elsewhere in the !APIC_IO case.
*/
irq_rman.rm_start = 0;
irq_rman.rm_type = RMAN_ARRAY;
irq_rman.rm_descr = "Interrupt request lines";
#ifdef APIC_IO
irq_rman.rm_end = APIC_INTMAPSIZE - 1;
#else
irq_rman.rm_end = 15;
#endif
if (rman_init(&irq_rman)
|| rman_manage_region(&irq_rman,
irq_rman.rm_start, irq_rman.rm_end))
panic("nexus_probe irq_rman");
/*
* ISA DMA on PCI systems is implemented in the ISA part of each
* PCI->ISA bridge and the channels can be duplicated if there are
* multiple bridges. (eg: laptops with docking stations)
*/
drq_rman.rm_start = 0;
#ifdef PC98
drq_rman.rm_end = 3;
#else
drq_rman.rm_end = 7;
#endif
drq_rman.rm_type = RMAN_ARRAY;
drq_rman.rm_descr = "DMA request lines";
/* XXX drq 0 not available on some machines */
if (rman_init(&drq_rman)
|| rman_manage_region(&drq_rman,
drq_rman.rm_start, drq_rman.rm_end))
panic("nexus_probe drq_rman");
/*
* However, IO ports and Memory truely are global at this level,
* as are APIC interrupts (however many IO APICS there turn out
* to be on large systems..)
*/
port_rman.rm_start = 0;
port_rman.rm_end = 0xffff;
port_rman.rm_type = RMAN_ARRAY;
port_rman.rm_descr = "I/O ports";
if (rman_init(&port_rman)
|| rman_manage_region(&port_rman, 0, 0xffff))
panic("nexus_probe port_rman");
mem_rman.rm_start = 0;
mem_rman.rm_end = ~0u;
mem_rman.rm_type = RMAN_ARRAY;
mem_rman.rm_descr = "I/O memory addresses";
if (rman_init(&mem_rman)
|| rman_manage_region(&mem_rman, 0, ~0))
panic("nexus_probe mem_rman");
return bus_generic_probe(dev);
device_set_desc(dev, "legacy system");
device_quiet(dev);
return (0);
}
static int
nexus_attach(device_t dev)
legacy_attach(device_t dev)
{
device_t child;
/*
* First, deal with the children we know about already
* First, let our child driver's identify any child devices that
* they can find. Once that is done attach any devices that we
* found.
*/
bus_generic_probe(dev);
bus_generic_attach(dev);
/*
* And if we didn't see EISA or ISA on a pci bridge, create some
* If we didn't see EISA or ISA on a pci bridge, create some
* connection points now so they show up "on motherboard".
*/
if (!devclass_get_device(devclass_find("eisa"), 0)) {
child = BUS_ADD_CHILD(dev, 0, "eisa", 0);
if (child == NULL)
panic("nexus_attach eisa");
panic("legacy_attach eisa");
device_probe_and_attach(child);
}
if (!devclass_get_device(devclass_find("mca"), 0)) {
child = BUS_ADD_CHILD(dev, 0, "mca", 0);
if (child == 0)
panic("nexus_probe mca");
panic("legacy_probe mca");
device_probe_and_attach(child);
}
if (!devclass_get_device(devclass_find("isa"), 0)) {
child = BUS_ADD_CHILD(dev, 0, "isa", 0);
if (child == NULL)
panic("nexus_attach isa");
panic("legacy_attach isa");
device_probe_and_attach(child);
}
@ -265,13 +153,13 @@ nexus_attach(device_t dev)
}
static int
nexus_print_all_resources(device_t dev)
legacy_print_all_resources(device_t dev)
{
struct nexus_device *ndev = DEVTONX(dev);
struct resource_list *rl = &ndev->nx_resources;
struct legacy_device *atdev = DEVTOAT(dev);
struct resource_list *rl = &atdev->lg_resources;
int retval = 0;
if (SLIST_FIRST(rl) || ndev->nx_pcibus != -1)
if (SLIST_FIRST(rl) || atdev->lg_pcibus != -1)
retval += printf(" at");
retval += resource_list_print_type(rl, "port", SYS_RES_IOPORT, "%#lx");
@ -282,48 +170,49 @@ nexus_print_all_resources(device_t dev)
}
static int
nexus_print_child(device_t bus, device_t child)
legacy_print_child(device_t bus, device_t child)
{
struct nexus_device *ndev = DEVTONX(child);
struct legacy_device *atdev = DEVTOAT(child);
int retval = 0;
retval += bus_print_child_header(bus, child);
retval += nexus_print_all_resources(child);
if (ndev->nx_pcibus != -1)
retval += printf(" pcibus %d", ndev->nx_pcibus);
retval += legacy_print_all_resources(child);
if (atdev->lg_pcibus != -1)
retval += printf(" pcibus %d", atdev->lg_pcibus);
retval += printf(" on motherboard\n"); /* XXX "motherboard", ick */
return (retval);
}
static device_t
nexus_add_child(device_t bus, int order, const char *name, int unit)
legacy_add_child(device_t bus, int order, const char *name, int unit)
{
device_t child;
struct nexus_device *ndev;
device_t child;
struct legacy_device *atdev;
ndev = malloc(sizeof(struct nexus_device), M_NEXUSDEV, M_NOWAIT|M_ZERO);
if (!ndev)
atdev = malloc(sizeof(struct legacy_device), M_LEGACYDEV,
M_NOWAIT | M_ZERO);
if (!atdev)
return(0);
resource_list_init(&ndev->nx_resources);
ndev->nx_pcibus = -1;
resource_list_init(&atdev->lg_resources);
atdev->lg_pcibus = -1;
child = device_add_child_ordered(bus, order, name, unit);
/* should we free this in nexus_child_detached? */
device_set_ivars(child, ndev);
/* should we free this in legacy_child_detached? */
device_set_ivars(child, atdev);
return(child);
}
static int
nexus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
legacy_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
{
struct nexus_device *ndev = DEVTONX(child);
struct legacy_device *atdev = DEVTOAT(child);
switch (which) {
case NEXUS_IVAR_PCIBUS:
*result = ndev->nx_pcibus;
case LEGACY_IVAR_PCIBUS:
*result = atdev->lg_pcibus;
break;
default:
return ENOENT;
@ -333,13 +222,13 @@ nexus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
static int
nexus_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
legacy_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
{
struct nexus_device *ndev = DEVTONX(child);
struct legacy_device *atdev = DEVTOAT(child);
switch (which) {
case NEXUS_IVAR_PCIBUS:
ndev->nx_pcibus = value;
case LEGACY_IVAR_PCIBUS:
atdev->lg_pcibus = value;
break;
default:
return ENOENT;
@ -348,235 +237,47 @@ nexus_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
}
/*
* Allocate a resource on behalf of child. NB: child is usually going to be a
* child of one of our descendants, not a direct child of nexus0.
* (Exceptions include npx.)
*/
static struct resource *
nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
legacy_alloc_resource(device_t bus, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
{
struct nexus_device *ndev = DEVTONX(child);
struct resource *rv;
struct resource_list_entry *rle;
struct rman *rm;
int needactivate = flags & RF_ACTIVE;
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
/*
* If this is an allocation of the "default" range for a given RID, and
* we know what the resources for this device are (ie. they aren't maintained
* by a child bus), then work out the start/end values.
*/
if ((start == 0UL) && (end == ~0UL) && (count == 1)) {
if (ndev == NULL)
return(NULL);
rle = resource_list_find(&ndev->nx_resources, type, *rid);
if (rle == NULL)
return(NULL);
start = rle->start;
end = rle->end;
count = rle->count;
}
flags &= ~RF_ACTIVE;
switch (type) {
case SYS_RES_IRQ:
rm = &irq_rman;
break;
case SYS_RES_DRQ:
rm = &drq_rman;
break;
case SYS_RES_IOPORT:
rm = &port_rman;
break;
case SYS_RES_MEMORY:
rm = &mem_rman;
break;
default:
return 0;
}
rv = rman_reserve_resource(rm, start, end, count, flags, child);
if (rv == 0)
return 0;
if (type == SYS_RES_MEMORY) {
rman_set_bustag(rv, I386_BUS_SPACE_MEM);
} else if (type == SYS_RES_IOPORT) {
rman_set_bustag(rv, I386_BUS_SPACE_IO);
#ifndef PC98
rman_set_bushandle(rv, rv->r_start);
#endif
}
#ifdef PC98
if ((type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) &&
i386_bus_space_handle_alloc(rv->r_bustag, rv->r_start, count,
&rv->r_bushandle) != 0) {
rman_release_resource(rv);
return 0;
}
#endif
if (needactivate) {
if (bus_activate_resource(child, type, *rid, rv)) {
#ifdef PC98
if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) {
i386_bus_space_handle_free(rv->r_bustag,
rv->r_bushandle, rv->r_bushandle->bsh_sz);
}
#endif
rman_release_resource(rv);
return 0;
}
}
return rv;
return (resource_list_alloc(rl, bus, child, type, rid, start, end,
count, flags));
}
static int
nexus_activate_resource(device_t bus, device_t child, int type, int rid,
struct resource *r)
{
/*
* If this is a memory resource, map it into the kernel.
*/
if (rman_get_bustag(r) == I386_BUS_SPACE_MEM) {
caddr_t vaddr = 0;
if (rman_get_end(r) < 1024 * 1024) {
/*
* The first 1Mb is mapped at KERNBASE.
*/
vaddr = (caddr_t)(uintptr_t)(KERNBASE + rman_get_start(r));
} else {
u_int32_t paddr;
u_int32_t psize;
u_int32_t poffs;
paddr = rman_get_start(r);
psize = rman_get_size(r);
poffs = paddr - trunc_page(paddr);
vaddr = (caddr_t) pmap_mapdev(paddr-poffs, psize+poffs) + poffs;
}
rman_set_virtual(r, vaddr);
#ifdef PC98
/* PC-98: the type of bus_space_handle_t is the structure. */
r->r_bushandle->bsh_base = (bus_addr_t) vaddr;
#else
/* IBM-PC: the type of bus_space_handle_t is u_int */
rman_set_bushandle(r, (bus_space_handle_t) vaddr);
#endif
}
return (rman_activate_resource(r));
}
static int
nexus_deactivate_resource(device_t bus, device_t child, int type, int rid,
struct resource *r)
{
/*
* If this is a memory resource, unmap it.
*/
if ((rman_get_bustag(r) == I386_BUS_SPACE_MEM) &&
(rman_get_end(r) >= 1024 * 1024)) {
u_int32_t psize;
psize = rman_get_size(r);
pmap_unmapdev((vm_offset_t)rman_get_virtual(r), psize);
}
return (rman_deactivate_resource(r));
}
static int
nexus_release_resource(device_t bus, device_t child, int type, int rid,
legacy_release_resource(device_t bus, device_t child, int type, int rid,
struct resource *r)
{
if (rman_get_flags(r) & RF_ACTIVE) {
int error = bus_deactivate_resource(child, type, rid, r);
if (error)
return error;
}
#ifdef PC98
if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) {
i386_bus_space_handle_free(r->r_bustag, r->r_bushandle,
r->r_bushandle->bsh_sz);
}
#endif
return (rman_release_resource(r));
}
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
/*
* Currently this uses the really grody interface from kern/kern_intr.c
* (which really doesn't belong in kern/anything.c). Eventually, all of
* the code in kern_intr.c and machdep_intr.c should get moved here, since
* this is going to be the official interface.
*/
static int
nexus_setup_intr(device_t bus, device_t child, struct resource *irq,
int flags, void (*ihand)(void *), void *arg, void **cookiep)
{
driver_t *driver;
int error;
/* somebody tried to setup an irq that failed to allocate! */
if (irq == NULL)
panic("nexus_setup_intr: NULL irq resource!");
*cookiep = 0;
if ((irq->r_flags & RF_SHAREABLE) == 0)
flags |= INTR_EXCL;
driver = device_get_driver(child);
/*
* We depend here on rman_activate_resource() being idempotent.
*/
error = rman_activate_resource(irq);
if (error)
return (error);
error = inthand_add(device_get_nameunit(child), irq->r_start,
ihand, arg, flags, cookiep);
return (error);
return (resource_list_release(rl, bus, child, type, rid, r));
}
static int
nexus_teardown_intr(device_t dev, device_t child, struct resource *r, void *ih)
legacy_set_resource(device_t dev, device_t child, int type, int rid,
u_long start, u_long count)
{
return (inthand_remove(ih));
}
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
static int
nexus_set_resource(device_t dev, device_t child, int type, int rid, u_long start, u_long count)
{
struct nexus_device *ndev = DEVTONX(child);
struct resource_list *rl = &ndev->nx_resources;
/* XXX this should return a success/failure indicator */
resource_list_add(rl, type, rid, start, start + count - 1, count);
return(0);
}
static int
nexus_get_resource(device_t dev, device_t child, int type, int rid, u_long *startp, u_long *countp)
legacy_get_resource(device_t dev, device_t child, int type, int rid,
u_long *startp, u_long *countp)
{
struct nexus_device *ndev = DEVTONX(child);
struct resource_list *rl = &ndev->nx_resources;
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
struct resource_list_entry *rle;
rle = resource_list_find(rl, type, rid);
device_printf(child, "type %d rid %d startp %p countp %p - got %p\n",
type, rid, startp, countp, rle);
if (!rle)
return(ENOENT);
if (startp)
@ -587,60 +288,10 @@ nexus_get_resource(device_t dev, device_t child, int type, int rid, u_long *star
}
static void
nexus_delete_resource(device_t dev, device_t child, int type, int rid)
legacy_delete_resource(device_t dev, device_t child, int type, int rid)
{
struct nexus_device *ndev = DEVTONX(child);
struct resource_list *rl = &ndev->nx_resources;
struct legacy_device *atdev = DEVTOAT(child);
struct resource_list *rl = &atdev->lg_resources;
resource_list_delete(rl, type, rid);
}
#ifdef DEV_ISA
/*
* Placeholder which claims PnP 'devices' which describe system
* resources.
*/
static struct isa_pnp_id sysresource_ids[] = {
{ 0x010cd041 /* PNP0c01 */, "System Memory" },
{ 0x020cd041 /* PNP0c02 */, "System Resource" },
{ 0 }
};
static int
sysresource_probe(device_t dev)
{
int result;
if ((result = ISA_PNP_PROBE(device_get_parent(dev), dev, sysresource_ids)) <= 0) {
device_quiet(dev);
}
return(result);
}
static int
sysresource_attach(device_t dev)
{
return(0);
}
static device_method_t sysresource_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, sysresource_probe),
DEVMETHOD(device_attach, sysresource_attach),
DEVMETHOD(device_detach, bus_generic_detach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
{ 0, 0 }
};
static driver_t sysresource_driver = {
"sysresource",
sysresource_methods,
1, /* no softc */
};
static devclass_t sysresource_devclass;
DRIVER_MODULE(sysresource, isa, sysresource_driver, sysresource_devclass, 0, 0);
#endif /* DEV_ISA */

View File

@ -26,18 +26,18 @@
* $FreeBSD$
*/
#ifndef _MACHINE_NEXUSVAR_H_
#define _MACHINE_NEXUSVAR_H_ 1
#ifndef _MACHINE_LEGACYVAR_H_
#define _MACHINE_LEGACYVAR_H_
enum nexus_device_ivars {
NEXUS_IVAR_PCIBUS
enum legacy_device_ivars {
LEGACY_IVAR_PCIBUS
};
#define NEXUS_ACCESSOR(var, ivar, type) \
__BUS_ACCESSOR(nexus, var, NEXUS, ivar, type)
#define LEGACY_ACCESSOR(var, ivar, type) \
__BUS_ACCESSOR(legacy, var, LEGACY, ivar, type)
NEXUS_ACCESSOR(pcibus, PCIBUS, u_int32_t)
LEGACY_ACCESSOR(pcibus, PCIBUS, u_int32_t)
#undef NEXUS_ACCESSOR
#undef LEGACY_ACCESSOR
#endif /* !_MACHINE_NEXUSVAR_H_ */
#endif /* !_MACHINE_LEGACYVAR_H_ */