Non-functional changes to NEWCARD stuff.

This is the first part of a two-part update to NEWCARD.  Changes in this
commit are non-functional, and includes the following:
 * indentation and other changes to meet style(9).
 * other minor style consistancy changes
 * addition of comments
 * renaming of device_t variables to be consistant across all of NEWCARD.

(note that not all style violations are fixed in this commit -- those that
 aren't will be clobbered by the next commit.)
This commit is contained in:
Jonathan Chen 2001-08-26 23:55:34 +00:00
parent d1f717d179
commit 255b159f5f
9 changed files with 1042 additions and 1029 deletions

View File

@ -37,7 +37,7 @@
* Written by Jonathan Chen <jon@freebsd.org>
*/
#define CARDBUS_DEBUG
#define CARDBUS_DEBUG
#include <sys/param.h>
#include <sys/systm.h>
@ -62,24 +62,22 @@
#include "pcib_if.h"
#if defined CARDBUS_DEBUG
#define STATIC
#define DPRINTF(a) printf a
#define DEVPRINTF(x) device_printf x
#define DPRINTF(a) printf a
#define DEVPRINTF(x) device_printf x
#else
#define STATIC static
#define DPRINTF(a)
#define DEVPRINTF(x)
#define DPRINTF(a)
#define DEVPRINTF(x)
#endif
#if !defined(lint)
static const char rcsid[] =
"$FreeBSD$";
"$FreeBSD$";
#endif
struct cardbus_quirk {
u_int32_t devid; /* Vendor/device of the card */
int type;
#define CARDBUS_QUIRK_MAP_REG 1 /* PCI map register in weird place */
#define CARDBUS_QUIRK_MAP_REG 1 /* PCI map register in weird place */
int arg1;
int arg2;
};
@ -88,73 +86,76 @@ struct cardbus_quirk cardbus_quirks[] = {
{ 0 }
};
static int cardbus_probe(device_t dev);
static int cardbus_attach(device_t dev);
static void device_setup_regs(device_t cbdev, int b, int s, int f,
pcicfgregs *cfg);
static int cardbus_attach_card(device_t dev);
static int cardbus_detach_card(device_t dev, int flags);
static struct cardbus_devinfo *cardbus_read_device(device_t pcib,
int b, int s, int f);
static void cardbus_hdrtypedata(device_t pcib, int b, int s, int f,
pcicfgregs *cfg);
static int cardbus_freecfg(struct cardbus_devinfo *dinfo);
static void cardbus_print_verbose(struct cardbus_devinfo *dinfo);
static int cardbus_set_resource(device_t dev, device_t child, int type,
int rid, u_long start, u_long count);
static int cardbus_get_resource(device_t dev, device_t child, int type,
int rid, u_long *startp, u_long *countp);
static void cardbus_delete_resource(device_t dev, device_t child, int type,
int rid);
static int cardbus_set_resource_method(device_t dev, device_t child, int type,
int rid, u_long start, u_long count);
static int cardbus_get_resource_method(device_t dev, device_t child, int type,
int rid, u_long *startp, u_long *countp);
static int cardbus_add_map(device_t bdev, device_t dev, pcicfgregs *cfg,
int reg);
static void cardbus_add_resources(device_t dev, pcicfgregs* cfg);
static void cardbus_release_all_resources(device_t dev,
struct resource_list *rl);
static struct resource* cardbus_alloc_resource(device_t self, device_t child,
int type, int* rid,u_long start,
u_long end, u_long count,
u_int flags);
static int cardbus_release_resource(device_t dev, device_t child, int type,
int rid, struct resource *r);
static int cardbus_print_resources(struct resource_list *rl, const char *name,
int type, const char *format);
static int cardbus_print_child(device_t dev, device_t child);
static void cardbus_probe_nomatch(device_t dev, device_t child);
static int cardbus_read_ivar(device_t dev, device_t child, int which,
u_long *result);
static int cardbus_write_ivar(device_t dev, device_t child, int which,
uintptr_t value);
static u_int32_t cardbus_read_config_method(device_t dev, device_t child,
int reg, int width);
static void cardbus_write_config_method(device_t dev, device_t child, int reg,
u_int32_t val, int width);
static int cardbus_probe(device_t cbdev);
static int cardbus_attach(device_t cbdev);
static int cardbus_detach(device_t cbdev);
static void device_setup_regs(device_t brdev, int b, int s, int f,
pcicfgregs *cfg);
static int cardbus_attach_card(device_t cbdev);
static int cardbus_detach_card(device_t cbdev, int flags);
static void cardbus_driver_added(device_t cbdev, driver_t *driver);
static struct cardbus_devinfo * cardbus_read_device(device_t brdev, int b,
int s, int f);
static void cardbus_hdrtypedata(device_t brdev, int b, int s, int f,
pcicfgregs *cfg);
static int cardbus_freecfg(struct cardbus_devinfo *dinfo);
static void cardbus_print_verbose(struct cardbus_devinfo *dinfo);
static int cardbus_set_resource(device_t cbdev, device_t child, int type,
int rid, u_long start, u_long count);
static int cardbus_get_resource(device_t cbdev, device_t child, int type,
int rid, u_long *startp, u_long *countp);
static void cardbus_delete_resource(device_t cbdev, device_t child,
int type, int rid);
static int cardbus_set_resource_method(device_t cbdev, device_t child,
int type, int rid, u_long start, u_long count);
static int cardbus_get_resource_method(device_t cbdev, device_t child,
int type, int rid, u_long *startp, u_long *countp);
static void cardbus_delete_resource_method(device_t cbdev, device_t child,
int type, int rid);
static int cardbus_add_map(device_t cbdev, device_t dev, pcicfgregs *cfg,
int reg);
static void cardbus_add_resources(device_t dev, pcicfgregs* cfg);
static void cardbus_release_all_resources(device_t cbdev,
struct resource_list *rl);
static struct resource* cardbus_alloc_resource(device_t cbdev, device_t child,
int type, int* rid, u_long start, u_long end, u_long count,
u_int flags);
static int cardbus_release_resource(device_t cbdev, device_t child,
int type, int rid, struct resource *r);
static int cardbus_print_resources(struct resource_list *rl,
const char *name, int type, const char *format);
static int cardbus_print_child(device_t cbdev, device_t child);
static void cardbus_probe_nomatch(device_t cbdev, device_t child);
static int cardbus_read_ivar(device_t cbdev, device_t child, int which,
u_long *result);
static int cardbus_write_ivar(device_t cbdev, device_t child, int which,
uintptr_t value);
static u_int32_t cardbus_read_config_method(device_t cbdev,
device_t child, int reg, int width);
static void cardbus_write_config_method(device_t cbdev, device_t child,
int reg, u_int32_t val, int width);
/************************************************************************/
/* Probe/Attach */
/************************************************************************/
static int
cardbus_probe(device_t dev)
cardbus_probe(device_t cbdev)
{
device_set_desc(dev, "Cardbus bus (newcard)");
device_set_desc(cbdev, "Cardbus bus (newcard)");
return 0;
}
static int
cardbus_attach(device_t dev)
cardbus_attach(device_t cbdev)
{
return 0;
}
static int
cardbus_detach(device_t dev)
cardbus_detach(device_t cbdev)
{
cardbus_detach_card(dev, DETACH_FORCE);
cardbus_detach_card(cbdev, DETACH_FORCE);
return 0;
}
@ -163,37 +164,37 @@ cardbus_detach(device_t dev)
/************************************************************************/
static void
device_setup_regs(device_t bdev, int b, int s, int f, pcicfgregs *cfg)
device_setup_regs(device_t brdev, int b, int s, int f, pcicfgregs *cfg)
{
PCIB_WRITE_CONFIG(bdev, b, s, f, PCIR_INTLINE,
pci_get_irq(device_get_parent(bdev)), 1);
cfg->intline = PCIB_READ_CONFIG(bdev, b, s, f, PCIR_INTLINE, 1);
PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_INTLINE,
pci_get_irq(device_get_parent(brdev)), 1);
cfg->intline = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_INTLINE, 1);
PCIB_WRITE_CONFIG(bdev, b, s, f, PCIR_CACHELNSZ, 0x08, 1);
cfg->cachelnsz = PCIB_READ_CONFIG(bdev, b, s, f, PCIR_CACHELNSZ, 1);
PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_CACHELNSZ, 0x08, 1);
cfg->cachelnsz = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_CACHELNSZ, 1);
PCIB_WRITE_CONFIG(bdev, b, s, f, PCIR_LATTIMER, 0xa8, 1);
cfg->lattimer = PCIB_READ_CONFIG(bdev, b, s, f, PCIR_LATTIMER, 1);
PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_LATTIMER, 0xa8, 1);
cfg->lattimer = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_LATTIMER, 1);
PCIB_WRITE_CONFIG(bdev, b, s, f, PCIR_MINGNT, 0x14, 1);
cfg->mingnt = PCIB_READ_CONFIG(bdev, b, s, f, PCIR_MINGNT, 1);
PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_MINGNT, 0x14, 1);
cfg->mingnt = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_MINGNT, 1);
PCIB_WRITE_CONFIG(bdev, b, s, f, PCIR_MAXLAT, 0x14, 1);
cfg->maxlat = PCIB_READ_CONFIG(bdev, b, s, f, PCIR_MAXLAT, 1);
PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_MAXLAT, 0x14, 1);
cfg->maxlat = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_MAXLAT, 1);
}
static int
cardbus_attach_card(device_t dev)
cardbus_attach_card(device_t cbdev)
{
device_t bdev = device_get_parent(dev);
device_t brdev = device_get_parent(cbdev);
int cardattached = 0;
static int curr_bus_number = 2; /* XXX EVILE BAD (see below) */
int bus, slot, func;
cardbus_detach_card(dev, DETACH_NOWARN); /* detach existing cards */
cardbus_detach_card(cbdev, DETACH_NOWARN); /* detach existing cards */
POWER_ENABLE_SOCKET(bdev, dev);
bus = pcib_get_bus(dev);
POWER_ENABLE_SOCKET(brdev, cbdev);
bus = pcib_get_bus(cbdev);
if (bus == 0) {
/*
* XXX EVILE BAD XXX
@ -202,58 +203,62 @@ cardbus_attach_card(device_t dev)
* works.
*/
bus = curr_bus_number;
pci_write_config (bdev, PCIR_SECBUS_2, curr_bus_number, 1);
pci_write_config (bdev, PCIR_SUBBUS_2, curr_bus_number+2, 1);
pci_write_config(brdev, PCIR_SECBUS_2, curr_bus_number, 1);
pci_write_config(brdev, PCIR_SUBBUS_2, curr_bus_number + 2, 1);
curr_bus_number += 3;
}
/* For each function, set it up and try to attach a driver to it */
for (slot = 0; slot <= CARDBUS_SLOTMAX; slot++) {
int cardbusfunchigh = 0;
for (func = 0; func <= cardbusfunchigh; func++) {
struct cardbus_devinfo *dinfo =
cardbus_read_device(bdev, bus, slot, func);
cardbus_read_device(brdev, bus, slot, func);
if (dinfo == NULL) continue;
if (dinfo == NULL)
continue;
if (dinfo->cfg.mfdev)
cardbusfunchigh = CARDBUS_FUNCMAX;
device_setup_regs(bdev, bus, slot, func, &dinfo->cfg);
device_setup_regs(brdev, bus, slot, func, &dinfo->cfg);
cardbus_print_verbose(dinfo);
dinfo->cfg.dev = device_add_child(dev, NULL, -1);
dinfo->cfg.dev = device_add_child(cbdev, NULL, -1);
if (!dinfo->cfg.dev) {
DEVPRINTF((dev, "Cannot add child!\n"));
DEVPRINTF((cbdev, "Cannot add child!\n"));
cardbus_freecfg(dinfo);
continue;
}
resource_list_init(&dinfo->resources);
device_set_ivars(dinfo->cfg.dev, dinfo);
cardbus_add_resources(dinfo->cfg.dev, &dinfo->cfg);
cardbus_do_cis(dev, dinfo->cfg.dev);
cardbus_do_cis(cbdev, dinfo->cfg.dev);
if (device_probe_and_attach(dinfo->cfg.dev) != 0) {
/* when fail, release all resources */
cardbus_release_all_resources(dinfo->cfg.dev,
&dinfo->resources);
&dinfo->resources);
} else
cardattached++;
}
}
if (cardattached > 0) return 0;
POWER_DISABLE_SOCKET(bdev, dev);
if (cardattached > 0)
return 0;
POWER_DISABLE_SOCKET(brdev, cbdev);
return ENOENT;
}
static int
cardbus_detach_card(device_t dev, int flags)
cardbus_detach_card(device_t cbdev, int flags)
{
int numdevs;
device_t *devlist;
int tmp;
int err=0;
int err = 0;
device_get_children(dev, &devlist, &numdevs);
device_get_children(cbdev, &devlist, &numdevs);
if (numdevs == 0) {
if (!(flags & DETACH_NOWARN)) {
DEVPRINTF((dev, "Detaching card: no cards to detach!\n"));
POWER_DISABLE_SOCKET(device_get_parent(dev), dev);
DEVPRINTF((cbdev, "detach_card: no card to detach!\n"));
POWER_DISABLE_SOCKET(device_get_parent(cbdev), cbdev);
}
free(devlist, M_TEMP);
return ENOENT;
@ -265,33 +270,33 @@ cardbus_detach_card(device_t dev, int flags)
if (status == DS_ATTACHED || status == DS_BUSY) {
if (device_detach(dinfo->cfg.dev) == 0 ||
flags & DETACH_FORCE){
flags & DETACH_FORCE) {
cardbus_release_all_resources(dinfo->cfg.dev,
&dinfo->resources);
device_delete_child(dev, devlist[tmp]);
&dinfo->resources);
device_delete_child(cbdev, devlist[tmp]);
} else {
err++;
}
cardbus_freecfg(dinfo);
} else {
device_delete_child(dev, devlist[tmp]);
device_delete_child(cbdev, devlist[tmp]);
}
}
if (err == 0)
POWER_DISABLE_SOCKET(device_get_parent(dev), dev);
POWER_DISABLE_SOCKET(device_get_parent(cbdev), cbdev);
free(devlist, M_TEMP);
return err;
}
static void
cardbus_driver_added(device_t dev, driver_t *driver)
cardbus_driver_added(device_t cbdev, driver_t *driver)
{
int numdevs;
device_t *devlist;
device_t bdev = device_get_parent(dev);
device_t brdev = device_get_parent(cbdev);
int tmp, cardattached;
device_get_children(dev, &devlist, &numdevs);
device_get_children(cbdev, &devlist, &numdevs);
cardattached = 0;
for (tmp = 0; tmp < numdevs; tmp++) {
@ -300,25 +305,25 @@ cardbus_driver_added(device_t dev, driver_t *driver)
}
if (cardattached == 0)
POWER_ENABLE_SOCKET(bdev, dev);
DEVICE_IDENTIFY(driver, dev);
POWER_ENABLE_SOCKET(brdev, cbdev);
DEVICE_IDENTIFY(driver, cbdev);
for (tmp = 0; tmp < numdevs; tmp++) {
if (device_get_state(devlist[tmp]) == DS_NOTPRESENT){
if (device_get_state(devlist[tmp]) == DS_NOTPRESENT) {
struct cardbus_devinfo *dinfo;
dinfo = device_get_ivars(devlist[tmp]);
resource_list_init(&dinfo->resources);
cardbus_add_resources(dinfo->cfg.dev, &dinfo->cfg);
cardbus_do_cis(dev, dinfo->cfg.dev);
cardbus_do_cis(cbdev, dinfo->cfg.dev);
if (device_probe_and_attach(dinfo->cfg.dev) != 0) {
cardbus_release_all_resources(dinfo->cfg.dev,
&dinfo->resources);
&dinfo->resources);
} else
cardattached++;
}
}
if (cardattached == 0)
POWER_DISABLE_SOCKET(bdev, dev);
POWER_DISABLE_SOCKET(brdev, cbdev);
free(devlist, M_TEMP);
}
@ -329,15 +334,15 @@ cardbus_driver_added(device_t dev, driver_t *driver)
/* read configuration header into pcicfgrect structure */
static struct cardbus_devinfo *
cardbus_read_device(device_t pcib, int b, int s, int f)
cardbus_read_device(device_t brdev, int b, int s, int f)
{
#define REG(n, w) PCIB_READ_CONFIG(pcib, b, s, f, n, w)
#define REG(n, w) PCIB_READ_CONFIG(brdev, b, s, f, n, w)
pcicfgregs *cfg = NULL;
struct cardbus_devinfo *devlist_entry = NULL;
if (PCIB_READ_CONFIG(pcib, b, s, f, PCIR_DEVVENDOR, 4) != -1) {
if (PCIB_READ_CONFIG(brdev, b, s, f, PCIR_DEVVENDOR, 4) != -1) {
devlist_entry = malloc(sizeof(struct cardbus_devinfo),
M_DEVBUF, M_WAITOK | M_ZERO);
M_DEVBUF, M_WAITOK | M_ZERO);
if (devlist_entry == NULL)
return (NULL);
@ -397,7 +402,7 @@ cardbus_read_device(device_t pcib, int b, int s, int f)
cfg->mfdev = (cfg->hdrtype & PCIM_MFDEV) != 0;
cfg->hdrtype &= ~PCIM_MFDEV;
cardbus_hdrtypedata(pcib, b, s, f, cfg);
cardbus_hdrtypedata(brdev, b, s, f, cfg);
devlist_entry->conf.pc_sel.pc_bus = cfg->bus;
devlist_entry->conf.pc_sel.pc_dev = cfg->slot;
@ -415,15 +420,15 @@ cardbus_read_device(device_t pcib, int b, int s, int f)
devlist_entry->conf.pc_revid = cfg->revid;
}
return (devlist_entry);
#undef REG
#undef REG
}
/* extract header type specific config data */
static void
cardbus_hdrtypedata(device_t pcib, int b, int s, int f, pcicfgregs *cfg)
cardbus_hdrtypedata(device_t brdev, int b, int s, int f, pcicfgregs *cfg)
{
#define REG(n, w) PCIB_READ_CONFIG(pcib, b, s, f, n, w)
#define REG(n, w) PCIB_READ_CONFIG(brdev, b, s, f, n, w)
switch (cfg->hdrtype) {
case 0:
cfg->subvendor = REG(PCIR_SUBVEND_0, 2);
@ -441,7 +446,7 @@ cardbus_hdrtypedata(device_t pcib, int b, int s, int f, pcicfgregs *cfg)
cfg->nummaps = PCI_MAXMAPS_2;
break;
}
#undef REG
#undef REG
}
/* free pcicfgregs structure and all depending data structures */
@ -461,19 +466,23 @@ cardbus_print_verbose(struct cardbus_devinfo *dinfo)
pcicfgregs *cfg = &dinfo->cfg;
printf("found->\tvendor=0x%04x, dev=0x%04x, revid=0x%02x\n",
cfg->vendor, cfg->device, cfg->revid);
cfg->vendor, cfg->device, cfg->revid);
printf("\tclass=%02x-%02x-%02x, hdrtype=0x%02x, mfdev=%d\n",
cfg->baseclass, cfg->subclass, cfg->progif,
cfg->hdrtype, cfg->mfdev);
cfg->baseclass, cfg->subclass, cfg->progif,
cfg->hdrtype, cfg->mfdev);
#ifdef CARDBUS_DEBUG
printf("\tcmdreg=0x%04x, statreg=0x%04x, cachelnsz=%d (dwords)\n",
cfg->cmdreg, cfg->statreg, cfg->cachelnsz);
printf("\tlattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), maxlat=0x%02x (%d ns)\n",
cfg->lattimer, cfg->lattimer * 30,
cfg->mingnt, cfg->mingnt * 250, cfg->maxlat, cfg->maxlat * 250);
printf("\tcmdreg=0x%04x, statreg=0x%04x, "
"cachelnsz=%d (dwords)\n",
cfg->cmdreg, cfg->statreg, cfg->cachelnsz);
printf("\tlattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), "
"maxlat=0x%02x (%d ns)\n",
cfg->lattimer, cfg->lattimer * 30,
cfg->mingnt, cfg->mingnt * 250, cfg->maxlat,
cfg->maxlat * 250);
#endif /* CARDBUS_DEBUG */
if (cfg->intpin > 0)
printf("\tintpin=%c, irq=%d\n", cfg->intpin +'a' -1, cfg->intline);
printf("\tintpin=%c, irq=%d\n",
cfg->intpin + 'a' - 1, cfg->intline);
}
}
@ -482,20 +491,20 @@ cardbus_print_verbose(struct cardbus_devinfo *dinfo)
/************************************************************************/
static int
cardbus_set_resource(device_t dev, device_t child, int type, int rid,
u_long start, u_long count)
cardbus_set_resource(device_t cbdev, device_t child, int type, int rid,
u_long start, u_long count)
{
struct cardbus_devinfo *dinfo = device_get_ivars(child);
struct resource_list *rl = &dinfo->resources;
resource_list_add(rl, type, rid, start, start + count - 1, count);
if (device_get_parent(child) == dev)
if (device_get_parent(child) == cbdev)
pci_write_config(child, rid, start, 4);
return 0;
}
static int
cardbus_get_resource(device_t dev, device_t child, int type, int rid,
u_long *startp, u_long *countp)
cardbus_get_resource(device_t cbdev, device_t child, int type, int rid,
u_long *startp, u_long *countp)
{
struct cardbus_devinfo *dinfo = device_get_ivars(child);
struct resource_list *rl = &dinfo->resources;
@ -511,7 +520,7 @@ cardbus_get_resource(device_t dev, device_t child, int type, int rid,
}
static void
cardbus_delete_resource(device_t dev, device_t child, int type, int rid)
cardbus_delete_resource(device_t cbdev, device_t child, int type, int rid)
{
struct cardbus_devinfo *dinfo = device_get_ivars(child);
struct resource_list *rl = &dinfo->resources;
@ -519,42 +528,44 @@ cardbus_delete_resource(device_t dev, device_t child, int type, int rid)
rle = resource_list_find(rl, type, rid);
if (rle) {
if (rle->res)
bus_generic_release_resource(dev, child, type, rid,
rle->res);
bus_generic_release_resource(cbdev, child, type, rid,
rle->res);
resource_list_delete(rl, type, rid);
}
if (device_get_parent(child) == dev)
if (device_get_parent(child) == cbdev)
pci_write_config(child, rid, 0, 4);
}
static int
cardbus_set_resource_method(device_t dev, device_t child, int type, int rid,
u_long start, u_long count)
cardbus_set_resource_method(device_t cbdev, device_t child, int type, int rid,
u_long start, u_long count)
{
int ret;
ret = cardbus_set_resource(dev, child, type, rid, start, count);
if (ret != 0) return ret;
return BUS_SET_RESOURCE(device_get_parent(dev), child, type, rid,
start, count);
ret = cardbus_set_resource(cbdev, child, type, rid, start, count);
if (ret != 0)
return ret;
return BUS_SET_RESOURCE(device_get_parent(cbdev), child, type, rid,
start, count);
}
static int
cardbus_get_resource_method(device_t dev, device_t child, int type, int rid,
u_long *startp, u_long *countp)
cardbus_get_resource_method(device_t cbdev, device_t child, int type, int rid,
u_long *startp, u_long *countp)
{
int ret;
ret = cardbus_get_resource(dev, child, type, rid, startp, countp);
if (ret != 0) return ret;
return BUS_GET_RESOURCE(device_get_parent(dev), child, type, rid,
startp, countp);
ret = cardbus_get_resource(cbdev, child, type, rid, startp, countp);
if (ret != 0)
return ret;
return BUS_GET_RESOURCE(device_get_parent(cbdev), child, type, rid,
startp, countp);
}
static void
cardbus_delete_resource_method(device_t dev, device_t child,
int type, int rid)
cardbus_delete_resource_method(device_t cbdev, device_t child,
int type, int rid)
{
cardbus_delete_resource(dev, child, type, rid);
BUS_DELETE_RESOURCE(device_get_parent(dev), child, type, rid);
cardbus_delete_resource(cbdev, child, type, rid);
BUS_DELETE_RESOURCE(device_get_parent(cbdev), child, type, rid);
}
static int
@ -659,30 +670,29 @@ cardbus_add_resources(device_t dev, pcicfgregs* cfg)
}
static void
cardbus_release_all_resources(device_t dev, struct resource_list *rl)
cardbus_release_all_resources(device_t cbdev, struct resource_list *rl)
{
struct resource_list_entry *rle;
SLIST_FOREACH(rle, rl, link) {
if (rle->res) {
bus_generic_release_resource(device_get_parent(dev),
dev, rle->type, rle->rid,
bus_generic_release_resource(device_get_parent(cbdev),
cbdev, rle->type, rle->rid,
rle->res);
}
}
}
static struct resource*
cardbus_alloc_resource(device_t self, device_t child, int type,
int* rid, u_long start, u_long end,
u_long count, u_int flags)
cardbus_alloc_resource(device_t cbdev, device_t child, int type,
int* rid, u_long start, u_long end, u_long count, u_int flags)
{
struct cardbus_devinfo *dinfo = device_get_ivars(child);
struct resource_list *rl = &dinfo->resources;
struct resource_list_entry *rle = NULL;
struct resource *res;
if (device_get_parent(child) == self || child == self)
if (device_get_parent(child) == cbdev || child == cbdev)
rle = resource_list_find(rl, type, *rid);
if (rle) {
if (flags & RF_ACTIVE) {
@ -700,26 +710,26 @@ cardbus_alloc_resource(device_t self, device_t child, int type,
}
return rle->res; /* XXX: check if range within start/end */
} else {
res = bus_generic_alloc_resource(self, child, type, rid,
res = bus_generic_alloc_resource(cbdev, child, type, rid,
start, end, count, flags);
if (res) {
start = rman_get_start(res);
end = rman_get_end(res);
cardbus_set_resource(self, child, type, *rid, start,
cardbus_set_resource(cbdev, child, type, *rid, start,
end-start+1);
rle = resource_list_find(rl, type, *rid);
rle->res = res;
return res;
} else {
device_printf(self, "Resource Allocation Failed!\n");
device_printf(cbdev, "Resource Allocation Failed!\n");
return NULL;
}
}
}
static int
cardbus_release_resource(device_t dev, device_t child, int type, int rid,
struct resource *r)
cardbus_release_resource(device_t cbdev, device_t child, int type, int rid,
struct resource *r)
{
/*
* According to the PCI 2.2 spec, devices may share an address
@ -744,7 +754,7 @@ cardbus_release_resource(device_t dev, device_t child, int type, int rid,
static int
cardbus_print_resources(struct resource_list *rl, const char *name,
int type, const char *format)
int type, const char *format)
{
struct resource_list_entry *rle;
int printed, retval;
@ -763,7 +773,7 @@ cardbus_print_resources(struct resource_list *rl, const char *name,
if (rle->count > 1) {
retval += printf("-");
retval += printf(format, rle->start +
rle->count - 1);
rle->count - 1);
}
}
}
@ -771,7 +781,7 @@ cardbus_print_resources(struct resource_list *rl, const char *name,
}
static int
cardbus_print_child(device_t dev, device_t child)
cardbus_print_child(device_t cbdev, device_t child)
{
struct cardbus_devinfo *dinfo;
struct resource_list *rl;
@ -782,29 +792,31 @@ cardbus_print_child(device_t dev, device_t child)
cfg = &dinfo->cfg;
rl = &dinfo->resources;
retval += bus_print_child_header(dev, child);
retval += bus_print_child_header(cbdev, child);
retval += cardbus_print_resources(rl, "port", SYS_RES_IOPORT, "%#lx");
retval += cardbus_print_resources(rl, "mem", SYS_RES_MEMORY, "%#lx");
retval += cardbus_print_resources(rl, "irq", SYS_RES_IRQ, "%ld");
if (device_get_flags(dev))
retval += printf(" flags %#x", device_get_flags(dev));
if (device_get_flags(cbdev))
retval += printf(" flags %#x", device_get_flags(cbdev));
retval += printf(" at device %d.%d", pci_get_slot(child),
pci_get_function(child));
pci_get_function(child));
retval += bus_print_child_footer(dev, child);
retval += bus_print_child_footer(cbdev, child);
return (retval);
}
static void cardbus_probe_nomatch(device_t dev, device_t child) {
static void
cardbus_probe_nomatch(device_t cbdev, device_t child)
{
struct cardbus_devinfo *dinfo;
pcicfgregs *cfg;
dinfo = device_get_ivars(child);
cfg = &dinfo->cfg;
device_printf(dev, "<unknown card>");
device_printf(cbdev, "<unknown card>");
printf(" (vendor=0x%04x, dev=0x%04x)", cfg->vendor, cfg->device);
printf(" at %d.%d", pci_get_slot(child), pci_get_function(child));
if (cfg->intpin > 0 && cfg->intline != 255) {
@ -816,7 +828,7 @@ static void cardbus_probe_nomatch(device_t dev, device_t child) {
}
static int
cardbus_read_ivar(device_t dev, device_t child, int which, u_long *result)
cardbus_read_ivar(device_t cbdev, device_t child, int which, u_long *result)
{
struct cardbus_devinfo *dinfo;
pcicfgregs *cfg;
@ -874,7 +886,7 @@ cardbus_read_ivar(device_t dev, device_t child, int which, u_long *result)
}
static int
cardbus_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
cardbus_write_ivar(device_t cbdev, device_t child, int which, uintptr_t value)
{
struct cardbus_devinfo *dinfo;
pcicfgregs *cfg;
@ -909,26 +921,24 @@ cardbus_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
/************************************************************************/
static u_int32_t
cardbus_read_config_method(device_t dev, device_t child, int reg, int width)
cardbus_read_config_method(device_t cbdev, device_t child, int reg, int width)
{
struct cardbus_devinfo *dinfo = device_get_ivars(child);
pcicfgregs *cfg = &dinfo->cfg;
return PCIB_READ_CONFIG(device_get_parent(dev),
cfg->bus, cfg->slot, cfg->func,
reg, width);
return PCIB_READ_CONFIG(device_get_parent(cbdev),
cfg->bus, cfg->slot, cfg->func, reg, width);
}
static void
cardbus_write_config_method(device_t dev, device_t child, int reg,
u_int32_t val, int width)
cardbus_write_config_method(device_t cbdev, device_t child, int reg,
u_int32_t val, int width)
{
struct cardbus_devinfo *dinfo = device_get_ivars(child);
pcicfgregs *cfg = &dinfo->cfg;
PCIB_WRITE_CONFIG(device_get_parent(dev),
cfg->bus, cfg->slot, cfg->func,
reg, val, width);
PCIB_WRITE_CONFIG(device_get_parent(cbdev),
cfg->bus, cfg->slot, cfg->func, reg, val, width);
}
static device_method_t cardbus_methods[] = {

View File

@ -32,7 +32,7 @@
* CIS Handling for the Cardbus Bus
*/
#define CARDBUS_DEBUG
#define CARDBUS_DEBUG
#include <sys/param.h>
#include <sys/systm.h>
@ -52,65 +52,62 @@
#include "card_if.h"
#if defined CARDBUS_DEBUG
#define STATIC
#define DPRINTF(a) printf a
#define DEVPRINTF(x) device_printf x
#define DPRINTF(a) printf a
#define DEVPRINTF(x) device_printf x
#else
#define STATIC static
#define DPRINTF(a)
#define DEVPRINTF(x)
#define DPRINTF(a)
#define DEVPRINTF(x)
#endif
#if !defined(lint)
static const char rcsid[] =
"$FreeBSD$";
"$FreeBSD$";
#endif
struct tuple_callbacks;
static int cardbus_read_tuple_conf(device_t dev, device_t child,
u_int32_t *start, u_int32_t *off,
int *tupleid, int *len, u_int8_t *tupledata);
static int cardbus_read_tuple_exrom(device_t dev, struct resource *mem,
u_int32_t *start, u_int32_t *off,
int *tupleid, int *len, u_int8_t *tupledata);
static int cardbus_read_tuple_mem(device_t dev, device_t child, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata);
static int cardbus_read_tuple(device_t dev, device_t child, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata);
static int decode_tuple(device_t dev, device_t child, int tupleid, int len,
u_int8_t *tupledata, u_int32_t *start, u_int32_t *off,
struct tuple_callbacks *callbacks);
static int cardbus_parse_cis(device_t dev, device_t child,
struct tuple_callbacks *callbacks);
#define DECODE_PARAMS \
(device_t dev, device_t child, int id, int len, \
#define DECODE_PARAMS \
(device_t cbdev, device_t child, int id, int len, \
u_int8_t *tupledata, u_int32_t *start, u_int32_t *off, \
struct tuple_callbacks *info)
#define DECODE_PROTOTYPE(NAME) static int decode_tuple_ ## NAME DECODE_PARAMS
struct tuple_callbacks {
int id;
char *name;
int (*func) DECODE_PARAMS;
};
#define DECODE_PROTOTYPE(NAME) static int decode_tuple_ ## NAME DECODE_PARAMS
DECODE_PROTOTYPE(generic);
DECODE_PROTOTYPE(nothing);
DECODE_PROTOTYPE(copy);
DECODE_PROTOTYPE(bar);
DECODE_PROTOTYPE(linktarget);
DECODE_PROTOTYPE(vers_1);
DECODE_PROTOTYPE(manfid);
DECODE_PROTOTYPE(funcid);
DECODE_PROTOTYPE(manfid);
DECODE_PROTOTYPE(funce);
DECODE_PROTOTYPE(end);
DECODE_PROTOTYPE(bar);
DECODE_PROTOTYPE(unhandled);
DECODE_PROTOTYPE(end);
static int cardbus_read_tuple_conf(device_t cbdev, device_t child,
u_int32_t *start, u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata);
static int cardbus_read_tuple_exrom(device_t cbdev, struct resource *mem,
u_int32_t *start, u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata);
static int cardbus_read_tuple_mem(device_t cbdev, device_t child,
u_int32_t *start, u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata);
static int cardbus_read_tuple(device_t cbdev, device_t child,
u_int32_t *start, u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata);
static int decode_tuple(device_t cbdev, device_t child, int tupleid,
int len, u_int8_t *tupledata, u_int32_t *start,
u_int32_t *off, struct tuple_callbacks *callbacks);
static int cardbus_parse_cis(device_t cbdev, device_t child,
struct tuple_callbacks *callbacks);
struct tuple_callbacks {
int id;
char* name;
int (*func) DECODE_PARAMS;
};
#define MAKETUPLE(NAME,FUNC) { CISTPL_ ## NAME, #NAME, decode_tuple_ ## FUNC }
#define MAKETUPLE(NAME,FUNC) { CISTPL_ ## NAME, #NAME, decode_tuple_ ## FUNC }
static char* funcnames[] = {
static char *funcnames[] = {
"Multi-Functioned",
"Memory",
"Serial Port",
@ -123,25 +120,29 @@ static char* funcnames[] = {
"Security"
};
static struct cis_tupleinfo* cisread_buf;
static struct cis_tupleinfo *cisread_buf;
static int ncisread_buf;
/*
* Handler functions for various CIS tuples
*/
DECODE_PROTOTYPE(generic)
{
#ifdef CARDBUS_DEBUG
int i;
if (info)
printf ("TUPLE: %s [%d]:", info->name, len);
printf("TUPLE: %s [%d]:", info->name, len);
else
printf ("TUPLE: Unknown(0x%02x) [%d]:", id, len);
printf("TUPLE: Unknown(0x%02x) [%d]:", id, len);
for (i = 0; i < len; i++) {
if (i % 0x10 == 0 && len > 0x10)
printf ("\n 0x%02x:", i);
printf (" %02x", tupledata[i]);
printf("\n 0x%02x:", i);
printf(" %02x", tupledata[i]);
}
printf ("\n");
printf("\n");
#endif
return 0;
}
@ -153,13 +154,13 @@ DECODE_PROTOTYPE(nothing)
DECODE_PROTOTYPE(copy)
{
struct cis_tupleinfo* tmpbuf;
struct cis_tupleinfo *tmpbuf;
tmpbuf = malloc(sizeof(struct cis_tupleinfo)*(ncisread_buf+1),
M_DEVBUF, M_WAITOK);
tmpbuf = malloc(sizeof(struct cis_tupleinfo) * (ncisread_buf+1),
M_DEVBUF, M_WAITOK);
if (ncisread_buf > 0) {
memcpy(tmpbuf, cisread_buf,
sizeof(struct cis_tupleinfo)*ncisread_buf);
sizeof(struct cis_tupleinfo) * ncisread_buf);
free(cisread_buf, M_DEVBUF);
}
cisread_buf = tmpbuf;
@ -167,7 +168,7 @@ DECODE_PROTOTYPE(copy)
cisread_buf[ncisread_buf].id = id;
cisread_buf[ncisread_buf].len = len;
cisread_buf[ncisread_buf].data = malloc(len, M_DEVBUF, M_WAITOK);
memcpy (cisread_buf[ncisread_buf].data, tupledata, len);
memcpy(cisread_buf[ncisread_buf].data, tupledata, len);
ncisread_buf++;
return 0;
}
@ -177,20 +178,20 @@ DECODE_PROTOTYPE(linktarget)
#ifdef CARDBUS_DEBUG
int i;
printf ("TUPLE: %s [%d]:", info->name, len);
printf("TUPLE: %s [%d]:", info->name, len);
for (i = 0; i < len; i++) {
if (i % 0x10 == 0 && len > 0x10)
printf ("\n 0x%02x:", i);
printf (" %02x", tupledata[i]);
printf("\n 0x%02x:", i);
printf(" %02x", tupledata[i]);
}
printf ("\n");
printf("\n");
#endif
if (len != 3 || tupledata[0] != 'C' || tupledata[1] != 'I' ||
tupledata[2] != 'S') {
printf("Invalid data for CIS Link Target!\n");
decode_tuple_generic(dev, child, id, len, tupledata,
start, off, info);
decode_tuple_generic(cbdev, child, id, len, tupledata,
start, off, info);
return EINVAL;
}
return 0;
@ -203,7 +204,7 @@ DECODE_PROTOTYPE(vers_1)
printf("Product name: ");
for (i = 2; i < len; i++) {
if (tupledata[i] == '\0')
printf (" | ");
printf(" | ");
else if (tupledata[i] == 0xff)
break;
else
@ -216,24 +217,25 @@ DECODE_PROTOTYPE(vers_1)
DECODE_PROTOTYPE(funcid)
{
int i;
int numnames = sizeof(funcnames)/sizeof(funcnames[0]);
int numnames = sizeof(funcnames) / sizeof(funcnames[0]);
printf("Functions: ");
for(i = 0; i < len; i++) {
for (i = 0; i < len; i++) {
if (tupledata[i] < numnames)
printf ("%s", funcnames[tupledata[i]]);
printf("%s", funcnames[tupledata[i]]);
else
printf ("Unknown(%d)", tupledata[i]);
if (i < len-1) printf(", ");
printf("Unknown(%d)", tupledata[i]);
if (i < len-1)
printf(", ");
}
printf ("\n");
printf("\n");
return 0;
}
DECODE_PROTOTYPE(manfid)
{
int i;
printf ("Manufacturer ID: ");
printf("Manufacturer ID: ");
for (i = 0; i < len; i++)
printf("%02x", tupledata[i]);
printf("\n");
@ -243,7 +245,7 @@ DECODE_PROTOTYPE(manfid)
DECODE_PROTOTYPE(funce)
{
int i;
printf ("Function Extension: ");
printf("Function Extension: ");
for (i = 0; i < len; i++)
printf("%02x", tupledata[i]);
printf("\n");
@ -253,7 +255,7 @@ DECODE_PROTOTYPE(funce)
DECODE_PROTOTYPE(bar)
{
if (len != 6) {
printf ("*** ERROR *** BAR length not 6 (%d)\n", len);
printf("*** ERROR *** BAR length not 6 (%d)\n", len);
return EINVAL;
} else {
int type;
@ -263,25 +265,26 @@ DECODE_PROTOTYPE(bar)
struct resource *res;
reg = *(u_int16_t*)tupledata;
len = *(u_int32_t*)(tupledata+2);
len = *(u_int32_t*)(tupledata + 2);
if (reg & TPL_BAR_REG_AS) {
type = SYS_RES_IOPORT;
} else {
type = SYS_RES_MEMORY;
}
bar = (reg & TPL_BAR_REG_ASI_MASK) - 1;
if (bar < 0 || bar > 5 || (type == SYS_RES_IOPORT && bar == 5)) {
device_printf(dev, "Invalid BAR number: %02x(%02x)\n",
reg, bar);
if (bar < 0 || bar > 5 ||
(type == SYS_RES_IOPORT && bar == 5)) {
device_printf(cbdev, "Invalid BAR number: %02x(%02x)\n",
reg, bar);
return 0;
}
bar = CARDBUS_BASE0_REG + bar * 4;
DEVPRINTF((dev, "Opening BAR: type=%s, bar=%02x, len=%04x\n",
(type==SYS_RES_MEMORY)?"MEM":"IO", bar, len));
DEVPRINTF((cbdev, "Opening BAR: type=%s, bar=%02x, len=%04x\n",
(type==SYS_RES_MEMORY)?"MEM":"IO", bar, len));
res = bus_generic_alloc_resource(child, child, type, &bar, 0,
~0, len, rman_make_alignment_flags(len) | RF_ACTIVE);
~0, len, rman_make_alignment_flags(len) | RF_ACTIVE);
if (res == NULL) {
device_printf(dev, "Cannot allocate BAR %02x\n", bar);
device_printf(cbdev, "Cannot allocate BAR %02x\n", bar);
}
}
return 0;
@ -289,7 +292,7 @@ DECODE_PROTOTYPE(bar)
DECODE_PROTOTYPE(unhandled)
{
printf ("TUPLE: %s [%d] is unhandled! Bailing...", info->name, len);
printf("TUPLE: %s [%d] is unhandled! Bailing...", info->name, len);
return -1;
}
@ -299,10 +302,13 @@ DECODE_PROTOTYPE(end)
return 0;
}
/*
* Functions to read the a tuple from the card
*/
static int
cardbus_read_tuple_conf(device_t dev, device_t child, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata)
cardbus_read_tuple_conf(device_t cbdev, device_t child, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len, u_int8_t *tupledata)
{
int i, j;
u_int32_t e;
@ -310,8 +316,8 @@ cardbus_read_tuple_conf(device_t dev, device_t child, u_int32_t *start,
loc = CARDBUS_CIS_ADDR(*start) + *off;
e = pci_read_config(child, loc - loc%4, 4);
for (j = loc % 4; j>0; j--)
e = pci_read_config(child, loc - loc % 4, 4);
for (j = loc % 4; j > 0; j--)
e >>= 8;
*len = 0;
for (i = loc, j = -2; j < *len; j++, i++) {
@ -325,17 +331,15 @@ cardbus_read_tuple_conf(device_t dev, device_t child, u_int32_t *start,
tupledata[j] = 0xff & e;
e >>= 8;
}
*off += *len+2;
*off += *len + 2;
return 0;
}
static int
cardbus_read_tuple_exrom(device_t dev, struct resource *mem, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata)
cardbus_read_tuple_exrom(device_t cbdev, struct resource *mem, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len, u_int8_t *tupledata)
{
#define READROM(rom, type, offset) \
#define READROM(rom, type, offset) \
(*((u_int ## type ##_t *)(((unsigned char*)rom) + offset)))
int romnum = 0;
@ -348,7 +352,7 @@ cardbus_read_tuple_exrom(device_t dev, struct resource *mem, u_int32_t *start,
imagenum = CARDBUS_CIS_ASI_ROM_IMAGE(*start);
do {
if (READROM(image, 16, CARDBUS_EXROM_SIGNATURE) != 0xaa55) {
device_printf (dev, "Bad header in rom %d: %04x\n",
device_printf(cbdev, "Bad header in rom %d: %04x\n",
romnum, *(u_int16_t*)(image +
CARDBUS_EXROM_SIGNATURE));
return ENXIO;
@ -376,15 +380,14 @@ cardbus_read_tuple_exrom(device_t dev, struct resource *mem, u_int32_t *start,
image += imagesize;
romnum++;
} while ((READROM(data, 8, CARDBUS_EXROM_DATA_INDICATOR) & 0x80) == 0);
device_printf(dev, "Cannot read CIS: Not enough images of rom\n");
device_printf(cbdev, "Cannot read CIS: Not enough images of rom\n");
return ENOENT;
#undef READROM
}
static int
cardbus_read_tuple_mem(device_t dev, device_t child, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata)
cardbus_read_tuple_mem(device_t cbdev, device_t child, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len, u_int8_t *tupledata)
{
struct resource *mem;
bus_space_tag_t bt;
@ -403,12 +406,12 @@ cardbus_read_tuple_mem(device_t dev, device_t child, u_int32_t *start,
bt = rman_get_bustag(mem);
bh = rman_get_bushandle(mem);
if (mem == NULL) {
device_printf(dev, "Failed to get memory for CIS reading\n");
device_printf(cbdev, "Failed to get memory for CIS reading\n");
return ENOMEM;
}
if(CARDBUS_CIS_SPACE(*start) == CARDBUS_CIS_ASI_ROM) {
ret = cardbus_read_tuple_exrom(dev, mem, start, off, tupleid,
ret = cardbus_read_tuple_exrom(cbdev, mem, start, off, tupleid,
len, tupledata);
} else {
*tupleid = bus_space_read_1(bt, bh,
@ -426,14 +429,13 @@ cardbus_read_tuple_mem(device_t dev, device_t child, u_int32_t *start,
}
static int
cardbus_read_tuple(device_t dev, device_t child, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len,
u_int8_t *tupledata)
cardbus_read_tuple(device_t cbdev, device_t child, u_int32_t *start,
u_int32_t *off, int *tupleid, int *len, u_int8_t *tupledata)
{
switch(CARDBUS_CIS_SPACE(*start)) {
case CARDBUS_CIS_ASI_TUPLE:
return cardbus_read_tuple_conf(dev, child, start, off,
tupleid, len, tupledata);
return cardbus_read_tuple_conf(cbdev, child, start, off,
tupleid, len, tupledata);
case CARDBUS_CIS_ASI_BAR0:
case CARDBUS_CIS_ASI_BAR1:
case CARDBUS_CIS_ASI_BAR2:
@ -441,40 +443,43 @@ cardbus_read_tuple(device_t dev, device_t child, u_int32_t *start,
case CARDBUS_CIS_ASI_BAR4:
case CARDBUS_CIS_ASI_BAR5:
case CARDBUS_CIS_ASI_ROM:
return cardbus_read_tuple_mem(dev, child, start, off,
tupleid, len, tupledata);
return cardbus_read_tuple_mem(cbdev, child, start, off,
tupleid, len, tupledata);
default:
device_printf(dev, "Unable to read CIS: Unknown space: %d\n",
CARDBUS_CIS_SPACE(*start));
device_printf(cbdev, "Unable to read CIS: Unknown space: %d\n",
CARDBUS_CIS_SPACE(*start));
return EINVAL;
}
}
/*
* Dispatch the right handler function per tuple
*/
static int
decode_tuple(device_t dev, device_t child, int tupleid, int len,
u_int8_t *tupledata, u_int32_t *start, u_int32_t *off,
struct tuple_callbacks *callbacks)
decode_tuple(device_t cbdev, device_t child, int tupleid, int len,
u_int8_t *tupledata, u_int32_t *start, u_int32_t *off,
struct tuple_callbacks *callbacks)
{
int i;
for (i = 0; callbacks[i].id != CISTPL_GENERIC; i++) {
if (tupleid == callbacks[i].id)
return callbacks[i].func(dev, child, tupleid, len,
tupledata, start, off,
&callbacks[i]);
return callbacks[i].func(cbdev, child, tupleid, len,
tupledata, start, off, &callbacks[i]);
}
if (tupleid < CISTPL_CUSTOMSTART) {
device_printf(dev, "Undefined tuple encountered, CIS parsing terminated\n");
device_printf(cbdev, "Undefined tuple encountered, "
"CIS parsing terminated\n");
return EINVAL;
}
return callbacks[i].func(dev, child, tupleid, len,
tupledata, start, off,
NULL);
return callbacks[i].func(cbdev, child, tupleid, len,
tupledata, start, off, NULL);
}
static int
cardbus_parse_cis(device_t dev, device_t child,
struct tuple_callbacks *callbacks)
cardbus_parse_cis(device_t cbdev, device_t child,
struct tuple_callbacks *callbacks)
{
u_int8_t tupledata[MAXTUPLESIZE];
int tupleid;
@ -487,15 +492,15 @@ cardbus_parse_cis(device_t dev, device_t child,
start = pci_read_config(child, CARDBUS_CIS_REG, 4);
off = 0;
do {
cardbus_read_tuple(dev, child, &start, &off, &tupleid, &len,
cardbus_read_tuple(cbdev, child, &start, &off, &tupleid, &len,
tupledata);
if (expect_linktarget && tupleid != CISTPL_LINKTARGET) {
device_printf(dev, "Expecting link target, got 0x%x\n",
tupleid);
device_printf(cbdev, "Expecting link target, got 0x%x\n",
tupleid);
return EINVAL;
}
expect_linktarget = decode_tuple(dev, child, tupleid, len,
expect_linktarget = decode_tuple(cbdev, child, tupleid, len,
tupledata, &start, &off,
callbacks);
if (expect_linktarget != 0)
@ -505,8 +510,8 @@ cardbus_parse_cis(device_t dev, device_t child,
}
int
cardbus_cis_read(device_t dev, device_t child, u_int8_t id,
struct cis_tupleinfo** buff, int* nret)
cardbus_cis_read(device_t cbdev, device_t child, u_int8_t id,
struct cis_tupleinfo **buff, int *nret)
{
struct tuple_callbacks cisread_callbacks[] = {
MAKETUPLE(NULL, nothing),
@ -558,7 +563,7 @@ cardbus_cis_read(device_t dev, device_t child, u_int8_t id,
cisread_callbacks[0].func = decode_tuple_copy;
ncisread_buf = 0;
cisread_buf = NULL;
ret = cardbus_parse_cis(dev, child, cisread_callbacks);
ret = cardbus_parse_cis(cbdev, child, cisread_callbacks);
*buff = cisread_buf;
*nret = ncisread_buf;
@ -566,7 +571,7 @@ cardbus_cis_read(device_t dev, device_t child, u_int8_t id,
}
void
cardbus_cis_free(device_t dev, struct cis_tupleinfo *buff, int* nret)
cardbus_cis_free(device_t cbdev, struct cis_tupleinfo *buff, int* nret)
{
int i;
for (i = 0; i < *nret; i++)
@ -576,7 +581,7 @@ cardbus_cis_free(device_t dev, struct cis_tupleinfo *buff, int* nret)
}
int
cardbus_do_cis(device_t dev, device_t child)
cardbus_do_cis(device_t cbdev, device_t child)
{
struct tuple_callbacks init_callbacks[] = {
MAKETUPLE(NULL, generic),
@ -619,5 +624,5 @@ cardbus_do_cis(device_t dev, device_t child)
MAKETUPLE(END, end),
MAKETUPLE(GENERIC, generic),
};
return cardbus_parse_cis(dev, child, init_callbacks);
return cardbus_parse_cis(cbdev, child, init_callbacks);
}

View File

@ -34,74 +34,74 @@
struct cis_tupleinfo;
int cardbus_do_cis(device_t dev, device_t child);
int cardbus_cis_read(device_t dev, device_t child, u_int8_t id,
struct cis_tupleinfo** buff, int* nret);
void cardbus_cis_free(device_t dev, struct cis_tupleinfo *buff, int* nret);
int cardbus_do_cis(device_t, device_t);
int cardbus_cis_read(device_t, device_t, u_int8_t, struct cis_tupleinfo**,
int*);
void cardbus_cis_free(device_t, struct cis_tupleinfo*, int*);
#define MAXTUPLESIZE 0x400
#define MAXTUPLESIZE 0x400
/* CIS TUPLES */
#define CISTPL_NULL 0x00
#define CISTPL_DEVICE 0x01
#define CISTPL_LONG_LINK_CB 0x02
#define CISTPL_INDIRECT 0x03
#define CISTPL_CONFIG_CB 0x04
#define CISTPL_CFTABLE_ENTRY_CB 0x05
#define CISTPL_LONGLINK_MFC 0x06
#define CISTPL_BAR 0x07
#define CISTPL_PWR_MGMNT 0x08
#define CISTPL_EXTDEVICE 0x09
#define CISTPL_CHECKSUM 0x10
#define CISTPL_LONGLINK_A 0x11
#define CISTPL_LONGLINK_C 0x12
#define CISTPL_LINKTARGET 0x13
#define CISTPL_NO_LINK 0x14
#define CISTPL_VERS_1 0x15
#define CISTPL_ALTSTR 0x16
#define CISTPL_DEVICE_A 0x17
#define CISTPL_JEDEC_C 0x18
#define CISTPL_JEDEC_A 0x19
#define CISTPL_CONFIG 0x1A
#define CISTPL_CFTABLE_ENTRY 0x1B
#define CISTPL_DEVICE_OC 0x1C
#define CISTPL_DEVICE_OA 0x1D
#define CISTPL_DEVICE_GEO 0x1E
#define CISTPL_DEVICE_GEO_A 0x1F
#define CISTPL_MANFID 0x20
#define CISTPL_FUNCID 0x21
#define CISTPL_FUNCE 0x22
#define CISTPL_SWIL 0x23
#define CISTPL_VERS_2 0x40
#define CISTPL_FORMAT 0x41
#define CISTPL_GEOMETRY 0x42
#define CISTPL_BYTEORDER 0x43
#define CISTPL_DATE 0x44
#define CISTPL_BATTERY 0x45
#define CISTPL_ORG 0x46
#define CISTPL_CUSTOMSTART 0x80
#define CISTPL_END 0xFF
#define CISTPL_NULL 0x00
#define CISTPL_DEVICE 0x01
#define CISTPL_LONG_LINK_CB 0x02
#define CISTPL_INDIRECT 0x03
#define CISTPL_CONFIG_CB 0x04
#define CISTPL_CFTABLE_ENTRY_CB 0x05
#define CISTPL_LONGLINK_MFC 0x06
#define CISTPL_BAR 0x07
#define CISTPL_PWR_MGMNT 0x08
#define CISTPL_EXTDEVICE 0x09
#define CISTPL_CHECKSUM 0x10
#define CISTPL_LONGLINK_A 0x11
#define CISTPL_LONGLINK_C 0x12
#define CISTPL_LINKTARGET 0x13
#define CISTPL_NO_LINK 0x14
#define CISTPL_VERS_1 0x15
#define CISTPL_ALTSTR 0x16
#define CISTPL_DEVICE_A 0x17
#define CISTPL_JEDEC_C 0x18
#define CISTPL_JEDEC_A 0x19
#define CISTPL_CONFIG 0x1A
#define CISTPL_CFTABLE_ENTRY 0x1B
#define CISTPL_DEVICE_OC 0x1C
#define CISTPL_DEVICE_OA 0x1D
#define CISTPL_DEVICE_GEO 0x1E
#define CISTPL_DEVICE_GEO_A 0x1F
#define CISTPL_MANFID 0x20
#define CISTPL_FUNCID 0x21
#define CISTPL_FUNCE 0x22
#define CISTPL_SWIL 0x23
#define CISTPL_VERS_2 0x40
#define CISTPL_FORMAT 0x41
#define CISTPL_GEOMETRY 0x42
#define CISTPL_BYTEORDER 0x43
#define CISTPL_DATE 0x44
#define CISTPL_BATTERY 0x45
#define CISTPL_ORG 0x46
#define CISTPL_CUSTOMSTART 0x80
#define CISTPL_END 0xFF
#define CISTPL_GENERIC -1 /* catchall */
#define CISTPL_GENERIC -1 /* catchall */
/* BAR */
#define TPL_BAR_REG_ASI_MASK 0x07
#define TPL_BAR_REG_AS 0x10
#define TPL_BAR_REG_ASI_MASK 0x07
#define TPL_BAR_REG_AS 0x10
/* CISTPL_FUNC */
#define TPL_FUNC_MF 0 /* multi function tuple */
#define TPL_FUNC_MEM 1 /* memory */
#define TPL_FUNC_SERIAL 2 /* serial, including modem and fax */
#define TPL_FUNC_PARALLEL 3 /* parallel, including printer and SCSI */
#define TPL_FUNC_DISK 4 /* Disk */
#define TPL_FUNC_VIDEO 5 /* Video Adaptor */
#define TPL_FUNC_LAN 6 /* LAN Adaptor */
#define TPL_FUNC_AIMS 7 /* Auto Inclement Mass Strages */
#define TPL_FUNC_MF 0 /* multi function tuple */
#define TPL_FUNC_MEM 1 /* memory */
#define TPL_FUNC_SERIAL 2 /* serial, including modem and fax */
#define TPL_FUNC_PARALLEL 3 /* parallel, including printer and SCSI */
#define TPL_FUNC_DISK 4 /* Disk */
#define TPL_FUNC_VIDEO 5 /* Video Adaptor */
#define TPL_FUNC_LAN 6 /* LAN Adaptor */
#define TPL_FUNC_AIMS 7 /* Auto Inclement Mass Strages */
/* TPL_FUNC_LAN */
#define TPL_FUNCE_LAN_TECH 1 /* technology */
#define TPL_FUNCE_LAN_SPEED 2 /* speed */
#define TPL_FUNCE_LAN_MEDIA 2 /* which media do you use? */
#define TPL_FUNCE_LAN_NID 4 /* node id (address) */
#define TPL_FUNCE_LAN_CONN 5 /* connector type (shape) */
#define TPL_FUNCE_LAN_TECH 1 /* technology */
#define TPL_FUNCE_LAN_SPEED 2 /* speed */
#define TPL_FUNCE_LAN_MEDIA 2 /* which media do you use? */
#define TPL_FUNCE_LAN_NID 4 /* node id (address) */
#define TPL_FUNCE_LAN_CONN 5 /* connector type (shape) */

View File

@ -34,58 +34,58 @@
/* Cardbus bus constants */
#define CARDBUS_SLOTMAX 0
#define CARDBUS_FUNCMAX 7
#define CARDBUS_SLOTMAX 0
#define CARDBUS_FUNCMAX 7
/* Cardbus configuration header registers */
#define CARDBUS_BASE0_REG 0x10
#define CARDBUS_BASE1_REG 0x14
#define CARDBUS_BASE2_REG 0x18
#define CARDBUS_BASE3_REG 0x1C
#define CARDBUS_BASE4_REG 0x20
#define CARDBUS_BASE5_REG 0x24
#define CARDBUS_CIS_REG 0x28
# define CARDBUS_CIS_ASIMASK 0x07
# define CARDBUS_CIS_ADDRMASK 0x0ffffff8
# define CARDBUS_CIS_ASI_TUPLE 0x00
# define CARDBUS_CIS_ASI_BAR0 0x01
# define CARDBUS_CIS_ASI_BAR1 0x02
# define CARDBUS_CIS_ASI_BAR2 0x03
# define CARDBUS_CIS_ASI_BAR3 0x04
# define CARDBUS_CIS_ASI_BAR4 0x05
# define CARDBUS_CIS_ASI_BAR5 0x06
# define CARDBUS_CIS_ASI_ROM 0x07
#define CARDBUS_ROM_REG 0x30
# define CARDBUS_ROM_ENABLE 0x00000001
# define CARDBUS_ROM_ADDRMASK 0xfffff800
#define CARDBUS_BASE0_REG 0x10
#define CARDBUS_BASE1_REG 0x14
#define CARDBUS_BASE2_REG 0x18
#define CARDBUS_BASE3_REG 0x1C
#define CARDBUS_BASE4_REG 0x20
#define CARDBUS_BASE5_REG 0x24
#define CARDBUS_CIS_REG 0x28
# define CARDBUS_CIS_ASIMASK 0x07
# define CARDBUS_CIS_ADDRMASK 0x0ffffff8
# define CARDBUS_CIS_ASI_TUPLE 0x00
# define CARDBUS_CIS_ASI_BAR0 0x01
# define CARDBUS_CIS_ASI_BAR1 0x02
# define CARDBUS_CIS_ASI_BAR2 0x03
# define CARDBUS_CIS_ASI_BAR3 0x04
# define CARDBUS_CIS_ASI_BAR4 0x05
# define CARDBUS_CIS_ASI_BAR5 0x06
# define CARDBUS_CIS_ASI_ROM 0x07
#define CARDBUS_ROM_REG 0x30
# define CARDBUS_ROM_ENABLE 0x00000001
# define CARDBUS_ROM_ADDRMASK 0xfffff800
/* EXROM offsets for reading CIS */
#define CARDBUS_EXROM_SIGNATURE 0x00
#define CARDBUS_EXROM_DATA_PTR 0x18
#define CARDBUS_EXROM_SIGNATURE 0x00
#define CARDBUS_EXROM_DATA_PTR 0x18
#define CARDBUS_EXROM_DATA_SIGNATURE 0x00 /* Signature ("PCIR") */
#define CARDBUS_EXROM_DATA_VENDOR_ID 0x04 /* Vendor Identification */
#define CARDBUS_EXROM_DATA_DEVICE_ID 0x06 /* Device Identification */
#define CARDBUS_EXROM_DATA_LENGTH 0x0a /* PCI Data Structure Length */
#define CARDBUS_EXROM_DATA_REV 0x0c /* PCI Data Structure Revision */
#define CARDBUS_EXROM_DATA_CLASS_CODE 0x0d /* Class Code */
#define CARDBUS_EXROM_DATA_IMAGE_LENGTH 0x10 /* Image Length */
#define CARDBUS_EXROM_DATA_DATA_REV 0x12 /* Revision Level of Code/Data */
#define CARDBUS_EXROM_DATA_CODE_TYPE 0x14 /* Code Type */
#define CARDBUS_EXROM_DATA_INDICATOR 0x15 /* Indicator */
#define CARDBUS_EXROM_DATA_SIGNATURE 0x00 /* Signature ("PCIR") */
#define CARDBUS_EXROM_DATA_VENDOR_ID 0x04 /* Vendor Identification */
#define CARDBUS_EXROM_DATA_DEVICE_ID 0x06 /* Device Identification */
#define CARDBUS_EXROM_DATA_LENGTH 0x0a /* PCI Data Structure Length */
#define CARDBUS_EXROM_DATA_REV 0x0c /* PCI Data Structure Revision */
#define CARDBUS_EXROM_DATA_CLASS_CODE 0x0d /* Class Code */
#define CARDBUS_EXROM_DATA_IMAGE_LENGTH 0x10 /* Image Length */
#define CARDBUS_EXROM_DATA_DATA_REV 0x12 /* Revision Level of Code/Data */
#define CARDBUS_EXROM_DATA_CODE_TYPE 0x14 /* Code Type */
#define CARDBUS_EXROM_DATA_INDICATOR 0x15 /* Indicator */
/* useful macros */
#define CARDBUS_CIS_ADDR(x) \
#define CARDBUS_CIS_ADDR(x) \
(CARDBUS_CIS_ADDRMASK & (x))
#define CARDBUS_CIS_SPACE(x) \
#define CARDBUS_CIS_SPACE(x) \
(CARDBUS_CIS_ASIMASK & (x))
#define CARDBUS_CIS_ASI_BAR(x) \
#define CARDBUS_CIS_ASI_BAR(x) \
(((CARDBUS_CIS_ASIMASK & (x))-1)*4+0x10)
#define CARDBUS_CIS_ASI_ROM_IMAGE(x) \
#define CARDBUS_CIS_ASI_ROM_IMAGE(x) \
(((x) >> 28) & 0xf)
#define CARDBUS_MAPREG_MEM_ADDR_MASK 0x0ffffff0
#define CARDBUS_MAPREG_MEM_ADDR(mr) \
#define CARDBUS_MAPREG_MEM_ADDR_MASK 0x0ffffff0
#define CARDBUS_MAPREG_MEM_ADDR(mr) \
((mr) & CARDBUS_MAPREG_MEM_ADDR_MASK)
#define CARDBUS_MAPREG_MEM_SIZE(mr) \
#define CARDBUS_MAPREG_MEM_SIZE(mr) \
(CARDBUS_MAPREG_MEM_ADDR(mr) & -CARDBUS_MAPREG_MEM_ADDR(mr))

View File

@ -33,7 +33,7 @@
*/
struct cardbus_devinfo {
struct resource_list resources;
pcicfgregs cfg;
struct pci_conf conf;
struct resource_list resources;
pcicfgregs cfg;
struct pci_conf conf;
};

File diff suppressed because it is too large Load Diff

View File

@ -44,7 +44,7 @@
#define PCI_DEVICE_ID_RICOH_RL5C476 0x04761180ul
#define PCI_DEVICE_ID_RICOH_RL5C477 0x04771180ul
#define PCI_DEVICE_ID_RICOH_RL5C478 0x04781180ul
#define PCI_DEVICE_ID_PCIC_TI1031 0xac13104cul
#define PCI_DEVICE_ID_PCIC_TI1031 0xac13104cul
#define PCI_DEVICE_ID_PCIC_TI1130 0xac12104cul
#define PCI_DEVICE_ID_PCIC_TI1131 0xac15104cul
#define PCI_DEVICE_ID_PCIC_TI1210 0xac1a104cul

View File

@ -34,126 +34,126 @@
/* PCI header registers */
#define PCCBBR_SOCKBASE 0x10 /* len=4 */
#define PCCBBR_SOCKBASE 0x10 /* len=4 */
#define PCCBBR_MEMBASE0 0x1c /* len=4 */
#define PCCBBR_MEMLIMIT0 0x20 /* len=4 */
#define PCCBBR_MEMBASE1 0x24 /* len=4 */
#define PCCBBR_MEMLIMIT1 0x28 /* len=4 */
#define PCCBBR_IOBASE0 0x2c /* len=4 */
#define PCCBBR_IOLIMIT0 0x30 /* len=4 */
#define PCCBBR_IOBASE1 0x34 /* len=4 */
#define PCCBBR_IOLIMIT1 0x38 /* len=4 */
#define PCCBBR_MEMBASE0 0x1c /* len=4 */
#define PCCBBR_MEMLIMIT0 0x20 /* len=4 */
#define PCCBBR_MEMBASE1 0x24 /* len=4 */
#define PCCBBR_MEMLIMIT1 0x28 /* len=4 */
#define PCCBBR_IOBASE0 0x2c /* len=4 */
#define PCCBBR_IOLIMIT0 0x30 /* len=4 */
#define PCCBBR_IOBASE1 0x34 /* len=4 */
#define PCCBBR_IOLIMIT1 0x38 /* len=4 */
#define PCCBB_MEMALIGN 4096
#define PCCBB_IOALIGN 4
#define PCCBBR_INTRLINE 0x3c /* len=1 */
#define PCCBBR_INTRPIN 0x3d /* len=1 */
#define PCCBBR_BRIDGECTRL 0x3e /* len=2 */
# define PCCBBM_BRIDGECTRL_MASTER_ABORT 0x0020
# define PCCBBM_BRIDGECTRL_RESET 0x0040
# define PCCBBM_BRIDGECTRL_INTR_IREQ_EN 0x0080
# define PCCBBM_BRIDGECTRL_PREFETCH_0 0x0100
# define PCCBBM_BRIDGECTRL_PREFETCH_1 0x0200
# define PCCBBM_BRIDGECTRL_WRITE_POST_EN 0x0400
# define PCCBBM_BRIDGECTRL_MASTER_ABORT 0x0020
# define PCCBBM_BRIDGECTRL_RESET 0x0040
# define PCCBBM_BRIDGECTRL_INTR_IREQ_EN 0x0080
# define PCCBBM_BRIDGECTRL_PREFETCH_0 0x0100
# define PCCBBM_BRIDGECTRL_PREFETCH_1 0x0200
# define PCCBBM_BRIDGECTRL_WRITE_POST_EN 0x0400
/* additional bit for RF5C46[567] */
# define PCCBBM_BRIDGECTRL_RL_3E0_EN 0x0800
# define PCCBBM_BRIDGECTRL_RL_3E2_EN 0x1000
# define PCCBBM_BRIDGECTRL_RL_3E0_EN 0x0800
# define PCCBBM_BRIDGECTRL_RL_3E2_EN 0x1000
#define PCCBBR_LEGACY 0x44 /* len=4 */
#define PCCBBR_LEGACY 0x44 /* len=4 */
#define PCCBBR_CBCTRL 0x91 /* len=1 */
#define PCCBBR_CBCTRL 0x91 /* len=1 */
/* bits for TI 113X */
# define PCCBBM_CBCTRL_113X_RI_EN 0x80
# define PCCBBM_CBCTRL_113X_ZV_EN 0x40
# define PCCBBM_CBCTRL_113X_PCI_IRQ_EN 0x20
# define PCCBBM_CBCTRL_113X_PCI_INTR 0x10
# define PCCBBM_CBCTRL_113X_PCI_CSC 0x08
# define PCCBBM_CBCTRL_113X_PCI_CSC_D 0x04
# define PCCBBM_CBCTRL_113X_SPEAKER_EN 0x02
# define PCCBBM_CBCTRL_113X_INTR_DET 0x01
# define PCCBBM_CBCTRL_113X_RI_EN 0x80
# define PCCBBM_CBCTRL_113X_ZV_EN 0x40
# define PCCBBM_CBCTRL_113X_PCI_IRQ_EN 0x20
# define PCCBBM_CBCTRL_113X_PCI_INTR 0x10
# define PCCBBM_CBCTRL_113X_PCI_CSC 0x08
# define PCCBBM_CBCTRL_113X_PCI_CSC_D 0x04
# define PCCBBM_CBCTRL_113X_SPEAKER_EN 0x02
# define PCCBBM_CBCTRL_113X_INTR_DET 0x01
/* bits for TI 12XX */
# define PCCBBM_CBCTRL_12XX_RI_EN 0x80
# define PCCBBM_CBCTRL_12XX_ZV_EN 0x40
# define PCCBBM_CBCTRL_12XX_AUD2MUX 0x04
# define PCCBBM_CBCTRL_12XX_SPEAKER_EN 0x02
# define PCCBBM_CBCTRL_12XX_INTR_DET 0x01
#define PCCBBR_DEVCTRL 0x92 /* len=1 */
# define PCCBBM_DEVCTRL_INT_SERIAL 0x04
# define PCCBBM_DEVCTRL_INT_PCI 0x02
# define PCCBBM_CBCTRL_12XX_RI_EN 0x80
# define PCCBBM_CBCTRL_12XX_ZV_EN 0x40
# define PCCBBM_CBCTRL_12XX_AUD2MUX 0x04
# define PCCBBM_CBCTRL_12XX_SPEAKER_EN 0x02
# define PCCBBM_CBCTRL_12XX_INTR_DET 0x01
#define PCCBBR_DEVCTRL 0x92 /* len=1 */
# define PCCBBM_DEVCTRL_INT_SERIAL 0x04
# define PCCBBM_DEVCTRL_INT_PCI 0x02
#define PCCBBR_TOPIC_SOCKETCTRL 0x90
# define PCCBBM_TOPIC_SOCKETCTRL_SCR_IRQSEL 0x00000001 /* PCI intr */
#define PCCBBR_TOPIC_SOCKETCTRL 0x90
# define PCCBBM_TOPIC_SOCKETCTRL_SCR_IRQSEL 0x00000001 /* PCI intr */
#define PCCBBR_TOPIC_SLOTCTRL 0xa0
# define PCCBBM_TOPIC_SLOTCTRL_SLOTON 0x00000080
# define PCCBBM_TOPIC_SLOTCTRL_SLOTEN 0x00000040
# define PCCBBM_TOPIC_SLOTCTRL_ID_LOCK 0x00000020
# define PCCBBM_TOPIC_SLOTCTRL_ID_WP 0x00000010
# define PCCBBM_TOPIC_SLOTCTRL_PORT_MASK 0x0000000c
# define PCCBBM_TOPIC_SLOTCTRL_PORT_SHIFT 2
# define PCCBBM_TOPIC_SLOTCTRL_OSF_MASK 0x00000003
# define PCCBBM_TOPIC_SLOTCTRL_OSF_SHIFT 0
# define PCCBBM_TOPIC_SLOTCTRL_INTB 0x00002000
# define PCCBBM_TOPIC_SLOTCTRL_INTA 0x00001000
# define PCCBBM_TOPIC_SLOTCTRL_INT_MASK 0x00003000
# define PCCBBM_TOPIC_SLOTCTRL_CLOCK_MASK 0x00000c00
# define PCCBBM_TOPIC_SLOTCTRL_CLOCK_2 0x00000800 /* PCI Clock/2 */
# define PCCBBM_TOPIC_SLOTCTRL_CLOCK_1 0x00000400 /* PCI Clock */
# define PCCBBM_TOPIC_SLOTCTRL_CLOCK_0 0x00000000 /* no clock */
# define PCCBBM_TOPIC_SLOTCTRL_CARDBUS 0x80000000
# define PCCBBM_TOPIC_SLOTCTRL_VS1 0x04000000
# define PCCBBM_TOPIC_SLOTCTRL_VS2 0x02000000
# define PCCBBM_TOPIC_SLOTCTRL_SWDETECT 0x01000000
#define PCCBBR_TOPIC_SLOTCTRL 0xa0
# define PCCBBM_TOPIC_SLOTCTRL_SLOTON 0x00000080
# define PCCBBM_TOPIC_SLOTCTRL_SLOTEN 0x00000040
# define PCCBBM_TOPIC_SLOTCTRL_ID_LOCK 0x00000020
# define PCCBBM_TOPIC_SLOTCTRL_ID_WP 0x00000010
# define PCCBBM_TOPIC_SLOTCTRL_PORT_MASK 0x0000000c
# define PCCBBM_TOPIC_SLOTCTRL_PORT_SHIFT 2
# define PCCBBM_TOPIC_SLOTCTRL_OSF_MASK 0x00000003
# define PCCBBM_TOPIC_SLOTCTRL_OSF_SHIFT 0
# define PCCBBM_TOPIC_SLOTCTRL_INTB 0x00002000
# define PCCBBM_TOPIC_SLOTCTRL_INTA 0x00001000
# define PCCBBM_TOPIC_SLOTCTRL_INT_MASK 0x00003000
# define PCCBBM_TOPIC_SLOTCTRL_CLOCK_MASK 0x00000c00
# define PCCBBM_TOPIC_SLOTCTRL_CLOCK_2 0x00000800 /* PCI Clk/2 */
# define PCCBBM_TOPIC_SLOTCTRL_CLOCK_1 0x00000400 /* PCI Clk */
# define PCCBBM_TOPIC_SLOTCTRL_CLOCK_0 0x00000000 /* no clock */
# define PCCBBM_TOPIC_SLOTCTRL_CARDBUS 0x80000000
# define PCCBBM_TOPIC_SLOTCTRL_VS1 0x04000000
# define PCCBBM_TOPIC_SLOTCTRL_VS2 0x02000000
# define PCCBBM_TOPIC_SLOTCTRL_SWDETECT 0x01000000
/* Socket definitions */
#define PCCBB_SOCKET_EVENT_CSTS 0x01 /* Card Status Change */
#define PCCBB_SOCKET_EVENT_CD1 0x02 /* Card Detect 1 */
#define PCCBB_SOCKET_EVENT_CD2 0x04 /* Card Detect 2 */
#define PCCBB_SOCKET_EVENT_CD 0x06 /* Card Detect all */
#define PCCBB_SOCKET_EVENT_POWER 0x08 /* Power Cycle */
#define PCCBB_SOCKET_EVENT_CSTS 0x01 /* Card Status Change */
#define PCCBB_SOCKET_EVENT_CD1 0x02 /* Card Detect 1 */
#define PCCBB_SOCKET_EVENT_CD2 0x04 /* Card Detect 2 */
#define PCCBB_SOCKET_EVENT_CD 0x06 /* Card Detect all */
#define PCCBB_SOCKET_EVENT_POWER 0x08 /* Power Cycle */
#define PCCBB_SOCKET_MASK_CSTS 0x01 /* Card Status Change */
#define PCCBB_SOCKET_MASK_CD 0x06 /* Card Detect */
#define PCCBB_SOCKET_MASK_POWER 0x08 /* Power Cycle */
#define PCCBB_SOCKET_MASK_CSTS 0x01 /* Card Status Change */
#define PCCBB_SOCKET_MASK_CD 0x06 /* Card Detect */
#define PCCBB_SOCKET_MASK_POWER 0x08 /* Power Cycle */
#define PCCBB_SOCKET_STAT_CARDSTS 0x00000001 /* Card Status Change */
#define PCCBB_SOCKET_STAT_CD1 0x00000002 /* Card Detect 1 */
#define PCCBB_SOCKET_STAT_CD2 0x00000004 /* Card Detect 2 */
#define PCCBB_SOCKET_STAT_CD 0x00000006 /* Card Detect all */
#define PCCBB_SOCKET_STAT_PWRCYCLE 0x00000008 /* Power Cycle */
#define PCCBB_SOCKET_STAT_16BIT 0x00000010 /* 16-bit Card */
#define PCCBB_SOCKET_STAT_CB 0x00000020 /* Cardbus Card */
#define PCCBB_SOCKET_STAT_IREQ 0x00000040 /* Ready */
#define PCCBB_SOCKET_STAT_NOTCARD 0x00000080 /* Unrecognized Card */
#define PCCBB_SOCKET_STAT_DATALOST 0x00000100 /* Data Lost */
#define PCCBB_SOCKET_STAT_BADVCC 0x00000200 /* Bad VccRequest */
#define PCCBB_SOCKET_STAT_5VCARD 0x00000400 /* 5 V Card */
#define PCCBB_SOCKET_STAT_3VCARD 0x00000800 /* 3.3 V Card */
#define PCCBB_SOCKET_STAT_XVCARD 0x00001000 /* X.X V Card */
#define PCCBB_SOCKET_STAT_YVCARD 0x00002000 /* Y.Y V Card */
#define PCCBB_SOCKET_STAT_5VSOCK 0x10000000 /* 5 V Socket */
#define PCCBB_SOCKET_STAT_3VSOCK 0x20000000 /* 3.3 V Socket */
#define PCCBB_SOCKET_STAT_XVSOCK 0x40000000 /* X.X V Socket */
#define PCCBB_SOCKET_STAT_YVSOCK 0x80000000 /* Y.Y V Socket */
#define PCCBB_SOCKET_STAT_CARDSTS 0x00000001 /* Card Status Change */
#define PCCBB_SOCKET_STAT_CD1 0x00000002 /* Card Detect 1 */
#define PCCBB_SOCKET_STAT_CD2 0x00000004 /* Card Detect 2 */
#define PCCBB_SOCKET_STAT_CD 0x00000006 /* Card Detect all */
#define PCCBB_SOCKET_STAT_PWRCYCLE 0x00000008 /* Power Cycle */
#define PCCBB_SOCKET_STAT_16BIT 0x00000010 /* 16-bit Card */
#define PCCBB_SOCKET_STAT_CB 0x00000020 /* Cardbus Card */
#define PCCBB_SOCKET_STAT_IREQ 0x00000040 /* Ready */
#define PCCBB_SOCKET_STAT_NOTCARD 0x00000080 /* Unrecognized Card */
#define PCCBB_SOCKET_STAT_DATALOST 0x00000100 /* Data Lost */
#define PCCBB_SOCKET_STAT_BADVCC 0x00000200 /* Bad VccRequest */
#define PCCBB_SOCKET_STAT_5VCARD 0x00000400 /* 5 V Card */
#define PCCBB_SOCKET_STAT_3VCARD 0x00000800 /* 3.3 V Card */
#define PCCBB_SOCKET_STAT_XVCARD 0x00001000 /* X.X V Card */
#define PCCBB_SOCKET_STAT_YVCARD 0x00002000 /* Y.Y V Card */
#define PCCBB_SOCKET_STAT_5VSOCK 0x10000000 /* 5 V Socket */
#define PCCBB_SOCKET_STAT_3VSOCK 0x20000000 /* 3.3 V Socket */
#define PCCBB_SOCKET_STAT_XVSOCK 0x40000000 /* X.X V Socket */
#define PCCBB_SOCKET_STAT_YVSOCK 0x80000000 /* Y.Y V Socket */
#define PCCBB_SOCKET_FORCE_BADVCC 0x0200 /* Bad Vcc Request */
#define PCCBB_SOCKET_FORCE_BADVCC 0x0200 /* Bad Vcc Request */
#define PCCBB_SOCKET_CTRL_VPPMASK 0x07
#define PCCBB_SOCKET_CTRL_VPP_OFF 0x00
#define PCCBB_SOCKET_CTRL_VPP_12V 0x01
#define PCCBB_SOCKET_CTRL_VPP_5V 0x02
#define PCCBB_SOCKET_CTRL_VPP_3V 0x03
#define PCCBB_SOCKET_CTRL_VPP_XV 0x04
#define PCCBB_SOCKET_CTRL_VPP_YV 0x05
#define PCCBB_SOCKET_CTRL_VPPMASK 0x07
#define PCCBB_SOCKET_CTRL_VPP_OFF 0x00
#define PCCBB_SOCKET_CTRL_VPP_12V 0x01
#define PCCBB_SOCKET_CTRL_VPP_5V 0x02
#define PCCBB_SOCKET_CTRL_VPP_3V 0x03
#define PCCBB_SOCKET_CTRL_VPP_XV 0x04
#define PCCBB_SOCKET_CTRL_VPP_YV 0x05
#define PCCBB_SOCKET_CTRL_VCCMASK 0x70
#define PCCBB_SOCKET_CTRL_VCC_OFF 0x00
#define PCCBB_SOCKET_CTRL_VCC_5V 0x20
#define PCCBB_SOCKET_CTRL_VCC_3V 0x30
#define PCCBB_SOCKET_CTRL_VCC_XV 0x40
#define PCCBB_SOCKET_CTRL_VCC_YV 0x50
#define PCCBB_SOCKET_CTRL_VCCMASK 0x70
#define PCCBB_SOCKET_CTRL_VCC_OFF 0x00
#define PCCBB_SOCKET_CTRL_VCC_5V 0x20
#define PCCBB_SOCKET_CTRL_VCC_3V 0x30
#define PCCBB_SOCKET_CTRL_VCC_XV 0x40
#define PCCBB_SOCKET_CTRL_VCC_YV 0x50
#define PCCBB_SOCKET_CTRL_STOPCLK 0x80
#define PCCBB_SOCKET_CTRL_STOPCLK 0x80
#include <dev/pccbb/pccbbdevid.h>

View File

@ -34,47 +34,47 @@
struct intrhand {
void(*func)(void*arg);
void* arg;
void *arg;
STAILQ_ENTRY(intrhand) entries;
};
struct pccbb_socketreg {
u_int32_t socket_event;
u_int32_t socket_mask;
u_int32_t socket_state;
u_int32_t socket_force;
u_int32_t socket_control;
u_int32_t socket_power;
u_int32_t socket_event;
u_int32_t socket_mask;
u_int32_t socket_state;
u_int32_t socket_force;
u_int32_t socket_control;
u_int32_t socket_power;
};
struct pccbb_reslist {
SLIST_ENTRY(pccbb_reslist) entries;
int type;
int rid;
int type;
int rid;
u_int32_t start;
u_int32_t end;
device_t odev;
int win;
};
#define PCCBB_AUTO_OPEN_SMALLHOLE 0x100
#define PCCBB_AUTO_OPEN_SMALLHOLE 0x100
struct pccbb_softc {
device_t sc_dev;
struct resource *sc_base_res;
struct resource *sc_irq_res;
void *sc_intrhand;
struct pccbb_socketreg *sc_socketreg;
u_int8_t sc_secbus;
u_int8_t sc_subbus;
struct mtx sc_mtx;
u_int32_t sc_flags;
#define PCCBB_PCIC_IO_RELOC 0x01
#define PCCBB_PCIC_MEM_32 0x02
device_t sc_dev;
struct resource *sc_base_res;
struct resource *sc_irq_res;
void *sc_intrhand;
struct pccbb_socketreg *sc_socketreg;
u_int8_t sc_secbus;
u_int8_t sc_subbus;
struct mtx sc_mtx;
u_int32_t sc_flags;
#define PCCBB_PCIC_IO_RELOC 0x01
#define PCCBB_PCIC_MEM_32 0x02
#define PCCBB_16BIT_CARD 0x02000000
#define PCCBB_KTHREAD_RUNNING 0x04000000
#define PCCBB_KTHREAD_DONE 0x08000000
int sc_chipset; /* chipset id */
int sc_chipset; /* chipset id */
#define CB_UNKNOWN 0 /* NOT Cardbus-PCI bridge */
#define CB_TI113X 1 /* TI PCI1130/1131 */
#define CB_TI12XX 2 /* TI PCI1250/1220 */
@ -83,46 +83,46 @@ struct pccbb_softc {
#define CB_TOPIC95 5 /* Toshiba ToPIC95 */
#define CB_TOPIC95B 6 /* Toshiba ToPIC95B */
#define CB_TOPIC97 7 /* Toshiba ToPIC97/100 */
#define CB_CIRRUS 8 /* Cirrus Logic CLPD683x */
#define CB_CIRRUS 8 /* Cirrus Logic CLPD683x */
SLIST_HEAD(, pccbb_reslist) rl;
device_t sc_cbdev;
device_t sc_pccarddev;
device_t sc_cbdev;
device_t sc_pccarddev;
/* PC Card stuff */
int memalloc;
struct pccard_mem_handle mem[PCIC_MEM_WINS];
int ioalloc;
struct pccard_io_handle io[PCIC_IO_WINS];
int memalloc;
struct pccard_mem_handle mem[PCIC_MEM_WINS];
int ioalloc;
struct pccard_io_handle io[PCIC_IO_WINS];
/* kthread staff */
struct proc *event_thread;
struct proc *event_thread;
};
/* result of detect_card */
#define CARD_UKN_CARD 0x00
#define CARD_5V_CARD 0x01
#define CARD_3V_CARD 0x02
#define CARD_XV_CARD 0x04
#define CARD_YV_CARD 0x08
#define CARD_UKN_CARD 0x00
#define CARD_5V_CARD 0x01
#define CARD_3V_CARD 0x02
#define CARD_XV_CARD 0x04
#define CARD_YV_CARD 0x08
/* for power_socket */
#define CARD_VCC_UC 0x0000
#define CARD_VCC_3V 0x0001
#define CARD_VCC_XV 0x0002
#define CARD_VCC_YV 0x0003
#define CARD_VCC_0V 0x0004
#define CARD_VCC_5V 0x0005
#define CARD_VCCMASK 0x000f
#define CARD_VPP_UC 0x0000
#define CARD_VPP_VCC 0x0010
#define CARD_VPP_12V 0x0030
#define CARD_VPP_0V 0x0040
#define CARD_VPPMASK 0x00f0
#define CARD_VCC_UC 0x0000
#define CARD_VCC_3V 0x0001
#define CARD_VCC_XV 0x0002
#define CARD_VCC_YV 0x0003
#define CARD_VCC_0V 0x0004
#define CARD_VCC_5V 0x0005
#define CARD_VCCMASK 0x000f
#define CARD_VPP_UC 0x0000
#define CARD_VPP_VCC 0x0010
#define CARD_VPP_12V 0x0030
#define CARD_VPP_0V 0x0040
#define CARD_VPPMASK 0x00f0
/* XXX: rman is dumb */
#define CARDBUS_SYS_RES_MEMORY_START 0x44000000
#define CARDBUS_SYS_RES_MEMORY_END 0xEFFFFFFF
#define CARDBUS_SYS_RES_IOPORT_START 0x3000
#define CARDBUS_SYS_RES_IOPORT_END 0xEFFF
#define CARDBUS_SYS_RES_MEMORY_START 0x44000000
#define CARDBUS_SYS_RES_MEMORY_END 0xEFFFFFFF
#define CARDBUS_SYS_RES_IOPORT_START 0x3000
#define CARDBUS_SYS_RES_IOPORT_END 0xEFFF