summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2002-09-23 15:50:06 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2002-09-23 15:50:06 +0000
commite8e951ce31f0038ec2039d397189ee13ee5c1a4f (patch)
treed2c401dca9dccaa5da479d17de421c8622fef66c
parent8d9b45ee328ca81a65ce895adcc360adf918f5f4 (diff)
Notes
-rw-r--r--sys/amd64/amd64/legacy.c555
-rw-r--r--sys/amd64/include/legacyvar.h18
-rw-r--r--sys/conf/files.i3861
-rw-r--r--sys/i386/i386/legacy.c555
-rw-r--r--sys/i386/include/legacyvar.h18
5 files changed, 225 insertions, 922 deletions
diff --git a/sys/amd64/amd64/legacy.c b/sys/amd64/amd64/legacy.c
index cd450803677ad..e25b7ae03347a 100644
--- a/sys/amd64/amd64/legacy.c
+++ b/sys/amd64/amd64/legacy.c
@@ -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;
-};
-#define DEVTONX(dev) ((struct nexus_device *)device_get_ivars(dev))
+static MALLOC_DEFINE(M_LEGACYDEV, "legacydrv", "legacy system device");
+struct legacy_device {
+ struct resource_list lg_resources;
+ int lg_pcibus;
+};
-static struct rman irq_rman, drq_rman, port_rman, mem_rman;
+#define DEVTOAT(dev) ((struct legacy_device *)device_get_ivars(dev))
-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 device_method_t nexus_methods[] = {
+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 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;
-
- /*
- * 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;
+ struct legacy_device *atdev = DEVTOAT(child);
+ struct resource_list *rl = &atdev->lg_resources;
- 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;
-}
-
-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));
+ return (resource_list_alloc(rl, bus, child, type, rid, start, end,
+ count, flags));
}
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));
-}
-
-/*
- * 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!");
+ struct legacy_device *atdev = DEVTOAT(child);
+ struct resource_list *rl = &atdev->lg_resources;
- *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));
-}
-
-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;
+ struct legacy_device *atdev = DEVTOAT(child);
+ struct resource_list *rl = &atdev->lg_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 */
diff --git a/sys/amd64/include/legacyvar.h b/sys/amd64/include/legacyvar.h
index be38f33a0753f..3d7728df6a2b1 100644
--- a/sys/amd64/include/legacyvar.h
+++ b/sys/amd64/include/legacyvar.h
@@ -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_ */
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 5f163c8506153..0e8f44a3d2fbf 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -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
diff --git a/sys/i386/i386/legacy.c b/sys/i386/i386/legacy.c
index cd450803677ad..e25b7ae03347a 100644
--- a/sys/i386/i386/legacy.c
+++ b/sys/i386/i386/legacy.c
@@ -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;
-};
-#define DEVTONX(dev) ((struct nexus_device *)device_get_ivars(dev))
+static MALLOC_DEFINE(M_LEGACYDEV, "legacydrv", "legacy system device");
+struct legacy_device {
+ struct resource_list lg_resources;
+ int lg_pcibus;
+};
-static struct rman irq_rman, drq_rman, port_rman, mem_rman;
+#define DEVTOAT(dev) ((struct legacy_device *)device_get_ivars(dev))
-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 device_method_t nexus_methods[] = {
+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 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;
-
- /*
- * 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;
+ struct legacy_device *atdev = DEVTOAT(child);
+ struct resource_list *rl = &atdev->lg_resources;
- 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;
-}
-
-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));
+ return (resource_list_alloc(rl, bus, child, type, rid, start, end,
+ count, flags));
}
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));
-}
-
-/*
- * 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!");
+ struct legacy_device *atdev = DEVTOAT(child);
+ struct resource_list *rl = &atdev->lg_resources;
- *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));
-}
-
-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;
+ struct legacy_device *atdev = DEVTOAT(child);
+ struct resource_list *rl = &atdev->lg_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 */
diff --git a/sys/i386/include/legacyvar.h b/sys/i386/include/legacyvar.h
index be38f33a0753f..3d7728df6a2b1 100644
--- a/sys/i386/include/legacyvar.h
+++ b/sys/i386/include/legacyvar.h
@@ -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_ */