summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2002-09-23 15:50:06 +0000
committerjhb <jhb@FreeBSD.org>2002-09-23 15:50:06 +0000
commit3c64027d75bd45300a5257bbac9ecdbac3ebd5b7 (patch)
treed2c401dca9dccaa5da479d17de421c8622fef66c
parent236b22fa5bb198d3dbd732b1e06467b9f95588f7 (diff)
downloadFreeBSD-src-3c64027d75bd45300a5257bbac9ecdbac3ebd5b7.zip
FreeBSD-src-3c64027d75bd45300a5257bbac9ecdbac3ebd5b7.tar.gz
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.
-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 cd45080..e25b7ae 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 be38f33..3d7728d 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 5f163c8..0e8f44a 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 cd45080..e25b7ae 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 be38f33..3d7728d 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_ */
OpenPOWER on IntegriCloud