diff --git a/sys/dev/proto/proto_bus_isa.c b/sys/dev/proto/proto_bus_isa.c new file mode 100644 index 000000000000..0bbd469c8636 --- /dev/null +++ b/sys/dev/proto/proto_bus_isa.c @@ -0,0 +1,121 @@ +/*- + * Copyright (c) 2015 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +static int proto_isa_probe(device_t dev); +static int proto_isa_attach(device_t dev); + +static device_method_t proto_isa_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, proto_isa_probe), + DEVMETHOD(device_attach, proto_isa_attach), + DEVMETHOD(device_detach, proto_detach), + DEVMETHOD_END +}; + +static driver_t proto_isa_driver = { + proto_driver_name, + proto_isa_methods, + sizeof(struct proto_softc), +}; + +static int +proto_isa_probe(device_t dev) +{ + struct sbuf *sb; + struct resource *res; + int rid, type; + + rid = 0; + type = SYS_RES_IOPORT; + res = bus_alloc_resource_any(dev, type, &rid, RF_ACTIVE); + if (res == NULL) { + type = SYS_RES_MEMORY; + res = bus_alloc_resource_any(dev, type, &rid, RF_ACTIVE); + } + if (res == NULL) + return (ENODEV); + + sb = sbuf_new_auto(); + sbuf_printf(sb, "isa:%#lx", rman_get_start(res)); + sbuf_finish(sb); + device_set_desc_copy(dev, sbuf_data(sb)); + sbuf_delete(sb); + bus_release_resource(dev, type, rid, res); + return (BUS_PROBE_HOOVER); +} + +static int +proto_isa_alloc(device_t dev, int type, int nrids) +{ + struct resource *res; + struct proto_softc *sc; + int count, rid; + + sc = device_get_softc(dev); + count = 0; + for (rid = 0; rid < nrids; rid++) { + res = bus_alloc_resource_any(dev, type, &rid, RF_ACTIVE); + if (res == NULL) + break; + proto_add_resource(sc, type, rid, res); + count++; + } + if (type == SYS_RES_DRQ && count > 0) + proto_add_resource(sc, PROTO_RES_BUSDMA, 0, NULL); + return (count); +} + +static int +proto_isa_attach(device_t dev) +{ + + proto_isa_alloc(dev, SYS_RES_IRQ, ISA_NIRQ); + proto_isa_alloc(dev, SYS_RES_DRQ, ISA_NDRQ); + proto_isa_alloc(dev, SYS_RES_IOPORT, ISA_NPORT); + proto_isa_alloc(dev, SYS_RES_MEMORY, ISA_NMEM); + return (proto_attach(dev)); +} + +DRIVER_MODULE(proto, acpi, proto_isa_driver, proto_devclass, NULL, NULL); +DRIVER_MODULE(proto, isa, proto_isa_driver, proto_devclass, NULL, NULL); diff --git a/sys/dev/proto/proto_core.c b/sys/dev/proto/proto_core.c index 86f08eb2e9d8..3021d037d86c 100644 --- a/sys/dev/proto/proto_core.c +++ b/sys/dev/proto/proto_core.c @@ -54,12 +54,15 @@ __FBSDID("$FreeBSD$"); #include CTASSERT(SYS_RES_IRQ != PROTO_RES_UNUSED && + SYS_RES_DRQ != PROTO_RES_UNUSED && SYS_RES_MEMORY != PROTO_RES_UNUSED && SYS_RES_IOPORT != PROTO_RES_UNUSED); CTASSERT(SYS_RES_IRQ != PROTO_RES_PCICFG && + SYS_RES_DRQ != PROTO_RES_PCICFG && SYS_RES_MEMORY != PROTO_RES_PCICFG && SYS_RES_IOPORT != PROTO_RES_PCICFG); CTASSERT(SYS_RES_IRQ != PROTO_RES_BUSDMA && + SYS_RES_DRQ != PROTO_RES_BUSDMA && SYS_RES_MEMORY != PROTO_RES_BUSDMA && SYS_RES_IOPORT != PROTO_RES_BUSDMA); @@ -132,6 +135,8 @@ proto_attach(device_t dev) case SYS_RES_IRQ: /* XXX TODO */ break; + case SYS_RES_DRQ: + break; case SYS_RES_MEMORY: case SYS_RES_IOPORT: r->r_size = rman_get_size(r->r_d.res); @@ -185,6 +190,10 @@ proto_detach(device_t dev) bus_release_resource(dev, r->r_type, r->r_rid, r->r_d.res); break; + case SYS_RES_DRQ: + bus_release_resource(dev, r->r_type, r->r_rid, + r->r_d.res); + break; case SYS_RES_MEMORY: case SYS_RES_IOPORT: bus_release_resource(dev, r->r_type, r->r_rid, diff --git a/sys/modules/proto/Makefile b/sys/modules/proto/Makefile index 3038c77f2f21..5db2dd831717 100644 --- a/sys/modules/proto/Makefile +++ b/sys/modules/proto/Makefile @@ -4,6 +4,7 @@ KMOD= proto SRCS= \ + proto_bus_isa.c \ proto_bus_pci.c \ proto_busdma.c \ proto_core.c @@ -11,10 +12,12 @@ SRCS= \ SRCS+= \ bus_if.h \ device_if.h \ - pci_if.h \ + isa_if.h \ + pci_if.h MFILES= \ dev/pci/pci_if.m \ + isa/isa_if.m \ kern/bus_if.m \ kern/device_if.m