Add resource activation routines to pcic driver. Minor cleanup of
socket attach code. We now have at least a chance for pccard devices appearing in the future. This is a snapshot of ongoing work. Proceed at your own risk.
This commit is contained in:
parent
92ac5ca18b
commit
7633169b11
56
sys/dev/pccard/card_if.m
Normal file
56
sys/dev/pccard/card_if.m
Normal file
@ -0,0 +1,56 @@
|
||||
#
|
||||
# Copyright (c) 1999 M. Warner Losh.
|
||||
# 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
INTERFACE card;
|
||||
|
||||
#
|
||||
# Companion interface for pccard. We need to set attributes for memory
|
||||
# and i/o port mappings (as well as other types of attributes) that have
|
||||
# a well defined meaning inside the pccard/cardbus system. The bus
|
||||
# methods are inadequate for this because this must be done at the time the
|
||||
# resources are set for the device, which predates their activation. Also,
|
||||
# the driver activating the resources doesn't necessarily know or need to know
|
||||
# these attributes.
|
||||
#
|
||||
# XXX A nagging doubt in the back of my mind suggests that these sorts of
|
||||
# XXX things might be able to be done with ivars. This nagging doubt doesn't
|
||||
# XXX offer a good way to actually do this, but remains nonetheless.
|
||||
#
|
||||
METHOD int set_resource_attribute {
|
||||
device_t dev;
|
||||
device_t child;
|
||||
int *rid;
|
||||
u_int flags;
|
||||
};
|
||||
|
||||
METHOD int get_resource_attribute {
|
||||
device_t dev;
|
||||
device_t child;
|
||||
int rid;
|
||||
u_int *flags;
|
||||
};
|
53
sys/dev/pccard/power_if.m
Normal file
53
sys/dev/pccard/power_if.m
Normal file
@ -0,0 +1,53 @@
|
||||
#
|
||||
# Copyright (c) 1999 M. Warner Losh.
|
||||
# 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
INTERFACE power;
|
||||
|
||||
#
|
||||
# Interface for powering cards on/off. It is hoped that this will be
|
||||
# generic enough to be used for other systems in addition to the pccard
|
||||
# <-> pcic interface that it was originally written for.
|
||||
#
|
||||
METHOD int set_slot {
|
||||
device_t dev;
|
||||
device_t child;
|
||||
int slot;
|
||||
int vpp;
|
||||
int vcc;
|
||||
};
|
||||
|
||||
#
|
||||
# Gets the current power requirements of the card.
|
||||
#
|
||||
METHOD int get_slot {
|
||||
device_t dev;
|
||||
device_t child;
|
||||
int slot;
|
||||
int *vpp;
|
||||
int *vcc;
|
||||
};
|
@ -83,8 +83,8 @@ int pcic_debug = 0;
|
||||
|
||||
#define PCIC_MEM_ALIGN PCIC_MEM_PAGESIZE
|
||||
|
||||
void pcic_attach_socket __P((struct pcic_handle *));
|
||||
void pcic_init_socket __P((struct pcic_handle *));
|
||||
static void pcic_attach_socket(device_t, struct pcic_handle *);
|
||||
static void pcic_init_socket(struct pcic_handle *);
|
||||
|
||||
#if XXX
|
||||
int pcic_submatch __P((struct device *, struct cfdata *, void *));
|
||||
@ -343,23 +343,19 @@ pcic_attach(device_t dev)
|
||||
}
|
||||
|
||||
void
|
||||
pcic_attach_sockets(sc)
|
||||
struct pcic_softc *sc;
|
||||
pcic_attach_sockets(device_t dev)
|
||||
{
|
||||
struct pcic_softc *sc = (struct pcic_softc *) device_get_softc(dev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCIC_NSLOTS; i++)
|
||||
if (sc->handle[i].flags & PCIC_FLAG_SOCKETP)
|
||||
pcic_attach_socket(&sc->handle[i]);
|
||||
pcic_attach_socket(dev, &sc->handle[i]);
|
||||
}
|
||||
|
||||
void
|
||||
pcic_attach_socket(h)
|
||||
struct pcic_handle *h;
|
||||
pcic_attach_socket(device_t dev, struct pcic_handle *h)
|
||||
{
|
||||
struct pccardbus_attach_args paa;
|
||||
struct pcic_softc *sc = (struct pcic_softc *)(h->ph_parent);
|
||||
|
||||
/* initialize the rest of the handle */
|
||||
|
||||
h->shutdown = 0;
|
||||
@ -367,20 +363,19 @@ pcic_attach_socket(h)
|
||||
h->ioalloc = 0;
|
||||
h->ih_irq = 0;
|
||||
|
||||
/* now, config one pccard device per socket */
|
||||
|
||||
paa.paa_busname = "pccard";
|
||||
paa.pct = (pccard_chipset_tag_t) sc->pct;
|
||||
paa.pch = (pccard_chipset_handle_t) h;
|
||||
paa.iobase = sc->iobase;
|
||||
paa.iosize = sc->iosize;
|
||||
|
||||
#if XXX
|
||||
h->pccard = config_found_sm(&sc->dev, &paa, pcic_print,
|
||||
pcic_submatch);
|
||||
#endif
|
||||
/*
|
||||
* now, config one pccard device per socket
|
||||
*
|
||||
* XXX This should add all devices that can attach to pcic, which
|
||||
* is what we want in the general case.
|
||||
*
|
||||
* XXX Notice we don't use h AT ALL. This should be considered to
|
||||
* XXX be BAD.
|
||||
*/
|
||||
device_add_child(dev, NULL, -1, NULL);
|
||||
|
||||
/* if there's actually a pccard device attached, initialize the slot */
|
||||
/* XXX WE SHOULD MOVE THIS TO CHILD ATTACHED */
|
||||
|
||||
if (h->pccard)
|
||||
pcic_init_socket(h);
|
||||
@ -518,7 +513,7 @@ pcic_init_socket(h)
|
||||
*/
|
||||
#ifdef DIAGNOSTIC
|
||||
if (h->event_thread != NULL)
|
||||
panic("pcic_attach_socket: event thread");
|
||||
panic("pcic_init_socket: event thread");
|
||||
#endif
|
||||
pcic_create_event_thread(h);
|
||||
|
||||
@ -1440,3 +1435,15 @@ st_pcic_write(h, idx, data)
|
||||
|
||||
bus_space_write_1(h->ph_bus_t, h->ph_bus_h, PCIC_REG_DATA, data);
|
||||
}
|
||||
|
||||
int pcic_activate_resource(device_t dev, device_t child, int type, int rid,
|
||||
struct resource *r)
|
||||
{
|
||||
return bus_generic_activate_resource(dev, child, type, rid, r);
|
||||
}
|
||||
|
||||
int pcic_deactivate_resource(device_t dev, device_t child, int type, int rid,
|
||||
struct resource *r)
|
||||
{
|
||||
return bus_generic_deactivate_resource(dev, child, type, rid, r);
|
||||
}
|
||||
|
@ -170,8 +170,6 @@ pcic_isa_attach(device_t dev)
|
||||
((rman_get_end(sc->mem_res) - rman_get_start(sc->mem_res) + 1) /
|
||||
PCIC_MEM_PAGESIZE)) - 1;
|
||||
|
||||
sc->pct = (pccard_chipset_tag_t) & pcic_isa_functions;
|
||||
|
||||
sc->irq_rid = 0;
|
||||
sc->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irq_rid,
|
||||
0, ~0, 1, RF_ACTIVE);
|
||||
@ -210,7 +208,7 @@ pcic_isa_attach(device_t dev)
|
||||
rman_get_start(sc->port_res),
|
||||
rman_get_end(sc->port_res) - rman_get_end(sc->port_res) + 1);
|
||||
|
||||
pcic_attach_sockets(sc);
|
||||
pcic_attach_sockets(dev);
|
||||
#endif
|
||||
return 0;
|
||||
error:
|
||||
@ -232,14 +230,30 @@ pcic_isa_detach(device_t dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static device_method_t pcic_isa_methods[] = {
|
||||
/* Device interface */
|
||||
DEVMETHOD(device_probe, pcic_isa_probe),
|
||||
DEVMETHOD(device_attach, pcic_isa_attach),
|
||||
DEVMETHOD(device_detach, pcic_isa_detach),
|
||||
DEVMETHOD(device_shutdown, bus_generic_shutdown),
|
||||
DEVMETHOD(device_suspend, bus_generic_suspend),
|
||||
DEVMETHOD(device_resume, bus_generic_resume),
|
||||
|
||||
/* Bus Interface */
|
||||
DEVMETHOD(bus_driver_added, bus_generic_driver_added),
|
||||
DEVMETHOD(bus_activate_resource, pcic_activate_resource),
|
||||
DEVMETHOD(bus_deactivate_resource, pcic_deactivate_resource),
|
||||
DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
|
||||
DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
|
||||
|
||||
#if 0
|
||||
/* pccard/cardbus interface */
|
||||
DEVMETHOD(card_set_resource_attribute, pcic_set_resource_attribute),
|
||||
DEVMETHOD(card_get_resource_attribute, pcic_get_resource_attribute),
|
||||
|
||||
/* Power Interface */
|
||||
/* Not yet */
|
||||
#endif
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
|
@ -120,8 +120,6 @@ struct pcic_softc {
|
||||
/* XXX isa_chipset_tag_t, pci_chipset_tag_t, etc. */
|
||||
void *intr_est;
|
||||
|
||||
pccard_chipset_tag_t pct;
|
||||
|
||||
/* this needs to be large enough to hold PCIC_MEM_PAGES bits */
|
||||
int subregionmask;
|
||||
#define PCIC_MAX_MEM_PAGES (8 * sizeof(int))
|
||||
@ -151,7 +149,7 @@ int pcic_vendor __P((struct pcic_handle *));
|
||||
char *pcic_vendor_to_string __P((int));
|
||||
|
||||
void pcic_attach(device_t dev);
|
||||
void pcic_attach_sockets __P((struct pcic_softc *));
|
||||
void pcic_attach_sockets(device_t dev);
|
||||
int pcic_intr __P((void *arg));
|
||||
|
||||
int pcic_chip_mem_alloc __P((pccard_chipset_handle_t, bus_size_t,
|
||||
@ -207,3 +205,11 @@ pcic_write(h, idx, data)
|
||||
(*(h)->ph_write)((h), (idx), (data))
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* bus/device/etc routines
|
||||
*/
|
||||
int pcic_activate_resource(device_t dev, device_t child, int type, int rid,
|
||||
struct resource *r);
|
||||
int pcic_deactivate_resource(device_t dev, device_t child, int type, int rid,
|
||||
struct resource *r);
|
||||
|
@ -3,7 +3,7 @@
|
||||
.PATH: ${.CURDIR}/../../dev/pccard
|
||||
KMOD= pccard
|
||||
SRCS= pccard.c pccard_cis.c pccard_cis_quirks.c \
|
||||
device_if.h bus_if.h isa_if.h
|
||||
device_if.h bus_if.h card_if.h card_if.c power_if.h power_if.c
|
||||
NOMAN=
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
@ -3,7 +3,7 @@
|
||||
.PATH: ${.CURDIR}/../../dev/pcic
|
||||
KMOD= pcic
|
||||
SRCS= i82365.c i82365_isa.c i82365_isasubr.c \
|
||||
device_if.h bus_if.h isa_if.h
|
||||
device_if.h bus_if.h isa_if.h power_if.h card_if.h
|
||||
NOMAN=
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
Loading…
Reference in New Issue
Block a user