use bus_space(9) rather than the memory mapped register set. This is

the first step towrads merging pcic and pccbb for 16-bit cards.
This commit is contained in:
Warner Losh 2002-01-14 02:59:06 +00:00
parent 3fc6a31403
commit 6015f06948
3 changed files with 115 additions and 82 deletions

View file

@ -95,10 +95,6 @@
* XXX all the pcic code really doesn't belong here and needs to be
* XXX migrated to its own file, shared with the 16-bit code
*/
#define PCIC_READ(SC,REG) \
(((u_int8_t*)((SC)->sc_socketreg))[0x800+(REG)])
#define PCIC_WRITE(SC,REG,val) \
(((u_int8_t*)((SC)->sc_socketreg))[0x800+(REG)]) = (val)
#define PCIC_MASK(SC,REG,MASK) \
PCIC_WRITE(SC,REG,PCIC_READ(SC,REG) MASK)
#define PCIC_MASK2(SC,REG,MASK,MASK2) \
@ -116,7 +112,7 @@ static STAILQ_HEAD(, pccbb_sclist) softcs;
static int softcs_init = 0;
struct yenta_chipinfo {
u_int32_t yc_id;
uint32_t yc_id;
const char *yc_name;
int yc_chiptype;
int yc_flags;
@ -205,7 +201,7 @@ SYSCTL_ULONG(_hw_pccbb, OID_AUTO, start_mem, CTLFLAG_RD,
&pccbb_start_mem, PCCBB_START_MEM,
"Starting address for memory allocations");
static int cb_chipset(u_int32_t pci_id, const char **namep, int *flagp);
static int cb_chipset(uint32_t pci_id, const char **namep, int *flagp);
static int pccbb_probe(device_t brdev);
static void pccbb_chipinit(struct pccbb_softc *sc);
static int pccbb_attach(device_t brdev);
@ -227,10 +223,10 @@ static int pccbb_cardbus_power_enable_socket(device_t brdev,
device_t child);
static void pccbb_cardbus_power_disable_socket(device_t brdev,
device_t child);
static int pccbb_cardbus_io_open(device_t brdev, int win, u_int32_t start,
u_int32_t end);
static int pccbb_cardbus_io_open(device_t brdev, int win, uint32_t start,
uint32_t end);
static int pccbb_cardbus_mem_open(device_t brdev, int win,
u_int32_t start, u_int32_t end);
uint32_t start, uint32_t end);
static void pccbb_cardbus_auto_open(struct pccbb_softc *sc, int type);
static int pccbb_cardbus_activate_resource(device_t brdev, device_t child,
int type, int rid, struct resource *res);
@ -238,7 +234,7 @@ static int pccbb_cardbus_deactivate_resource(device_t brdev,
device_t child, int type, int rid, struct resource *res);
static struct resource *pccbb_cardbus_alloc_resource(device_t brdev,
device_t child, int type, int *rid, u_long start,
u_long end, u_long count, u_int flags);
u_long end, u_long count, uint flags);
static int pccbb_cardbus_release_resource(device_t brdev, device_t child,
int type, int rid, struct resource *res);
static int pccbb_pcic_power_enable_socket(device_t brdev, device_t child);
@ -262,13 +258,13 @@ static int pccbb_pcic_deactivate_resource(device_t brdev, device_t child,
int type, int rid, struct resource *res);
static struct resource *pccbb_pcic_alloc_resource(device_t brdev,
device_t child, int type, int *rid, u_long start,
u_long end, u_long count, u_int flags);
u_long end, u_long count, uint flags);
static int pccbb_pcic_release_resource(device_t brdev, device_t child,
int type, int rid, struct resource *res);
static int pccbb_pcic_set_res_flags(device_t brdev, device_t child,
int type, int rid, u_int32_t flags);
int type, int rid, uint32_t flags);
static int pccbb_pcic_set_memory_offset(device_t brdev, device_t child,
int rid, u_int32_t cardaddr, u_int32_t *deltap);
int rid, uint32_t cardaddr, uint32_t *deltap);
static int pccbb_power_enable_socket(device_t brdev, device_t child);
static void pccbb_power_disable_socket(device_t brdev, device_t child);
static int pccbb_activate_resource(device_t brdev, device_t child,
@ -277,7 +273,7 @@ static int pccbb_deactivate_resource(device_t brdev, device_t child,
int type, int rid, struct resource *r);
static struct resource *pccbb_alloc_resource(device_t brdev, device_t child,
int type, int *rid, u_long start, u_long end, u_long count,
u_int flags);
uint flags);
static int pccbb_release_resource(device_t brdev, device_t child,
int type, int rid, struct resource *r);
static int pccbb_read_ivar(device_t brdev, device_t child, int which,
@ -285,17 +281,57 @@ static int pccbb_read_ivar(device_t brdev, device_t child, int which,
static int pccbb_write_ivar(device_t brdev, device_t child, int which,
uintptr_t value);
static int pccbb_maxslots(device_t brdev);
static u_int32_t pccbb_read_config(device_t brdev, int b, int s, int f,
static uint32_t pccbb_read_config(device_t brdev, int b, int s, int f,
int reg, int width);
static void pccbb_write_config(device_t brdev, int b, int s, int f,
int reg, u_int32_t val, int width);
int reg, uint32_t val, int width);
/*
*/
static __inline void
pccbb_set(struct pccbb_softc *sc, uint32_t reg, uint32_t val)
{
bus_space_write_4(sc->sc_bst, sc->sc_bsh, reg, val);
}
static __inline uint32_t
pccbb_get(struct pccbb_softc *sc, uint32_t reg)
{
return (bus_space_read_4(sc->sc_bst, sc->sc_bsh, reg));
}
static __inline void
pccbb_setb(struct pccbb_softc *sc, uint32_t reg, uint32_t bits)
{
pccbb_set(sc, reg, pccbb_get(sc, reg) | bits);
}
static __inline void
pccbb_clrb(struct pccbb_softc *sc, uint32_t reg, uint32_t bits)
{
pccbb_set(sc, reg, pccbb_get(sc, reg) & ~bits);
}
static __inline uint8_t
pccbb_pcic_read(struct pccbb_softc *sc, uint32_t reg)
{
return (bus_space_read_1(sc->sc_bst, sc->sc_bsh, 0x800 + reg));
}
static __inline void
pccbb_pcic_write(struct pccbb_softc *sc, uint32_t reg, uint8_t val)
{
return (bus_space_write_1(sc->sc_bst, sc->sc_bsh, 0x800 + reg, val));
}
#define PCIC_READ(SC,REG) pccbb_pcic_read(SC, REG)
#define PCIC_WRITE(SC,REG,VAL) pccbb_pcic_write(SC, REG, VAL)
/************************************************************************/
/* Probe/Attach */
/************************************************************************/
static int
cb_chipset(u_int32_t pci_id, const char **namep, int *flagp)
cb_chipset(uint32_t pci_id, const char **namep, int *flagp)
{
int loopend = sizeof(yc_chipsets)/sizeof(yc_chipsets[0]);
struct yenta_chipinfo *ycp, *ycend;
@ -413,8 +449,7 @@ pccbb_attach(device_t brdev)
{
struct pccbb_softc *sc = (struct pccbb_softc *)device_get_softc(brdev);
int rid;
u_int32_t sockbase;
u_int32_t tmp;
uint32_t sockbase;
struct pccbb_sclist *sclist;
if (!softcs_init) {
@ -470,16 +505,15 @@ pccbb_attach(device_t brdev)
}
}
sc->sc_socketreg =
(struct pccbb_socketreg *)rman_get_virtual(sc->sc_base_res);
sc->sc_bst = rman_get_bustag(sc->sc_base_res);
sc->sc_bsh = rman_get_bushandle(sc->sc_base_res);
pccbb_chipinit(sc);
/* CSC Interrupt: Card detect interrupt on */
sc->sc_socketreg->socket_mask |= PCCBB_SOCKET_MASK_CD;
pccbb_setb(sc, PCCBB_SOCKET_MASK, PCCBB_SOCKET_MASK_CD);
/* reset interrupt */
tmp = sc->sc_socketreg->socket_event;
sc->sc_socketreg->socket_event = tmp;
pccbb_set(sc, PCCBB_SOCKET_EVENT, pccbb_get(sc, PCCBB_SOCKET_EVENT));
/* Map and establish the interrupt. */
rid=0;
@ -594,7 +628,7 @@ pccbb_shutdown(device_t brdev)
PCI_MASK_CONFIG(brdev, PCCBBR_BRIDGECTRL, |PCCBBM_BRIDGECTRL_RESET, 2);
PCIC_MASK(sc, PCIC_INTR, & ~PCIC_INTR_RESET);
sc->sc_socketreg->socket_mask = 0;
pccbb_set(sc, PCCBB_SOCKET_MASK, 0);
pccbb_power(brdev, CARD_VCC_0V | CARD_VPP_0V);
@ -619,12 +653,12 @@ pccbb_driver_added(device_t brdev, driver_t *driver)
int tmp;
int numdevs;
int wake;
u_int32_t sockstate;
uint32_t sockstate;
DEVICE_IDENTIFY(driver, brdev);
device_get_children(brdev, &devlist, &numdevs);
wake = 0;
sockstate = sc->sc_socketreg->socket_state;
sockstate = pccbb_get(sc, PCCBB_SOCKET_STATE);
for (tmp = 0; tmp < numdevs; tmp++) {
if (device_get_state(devlist[tmp]) == DS_NOTPRESENT &&
device_probe_and_attach(devlist[tmp]) == 0) {
@ -649,8 +683,8 @@ pccbb_driver_added(device_t brdev, driver_t *driver)
free(devlist, M_TEMP);
if (wake > 0) {
if ((sc->sc_socketreg->socket_state & PCCBB_SOCKET_STAT_CD) ==
0) {
if ((pccbb_get(sc, PCCBB_SOCKET_STATE) & PCCBB_SOCKET_STAT_CD)
== 0) {
mtx_lock(&sc->sc_mtx);
wakeup(sc);
mtx_unlock(&sc->sc_mtx);
@ -677,9 +711,9 @@ pccbb_card_reprobe(device_t brdev, device_t busdev)
{
struct pccbb_softc *sc = device_get_softc(brdev);
int wake = 0;
u_int32_t sockstate;
uint32_t sockstate;
sockstate = sc->sc_socketreg->socket_state;
sockstate = pccbb_get(sc, PCCBB_SOCKET_STATE);
if ((sockstate & PCCBB_SOCKET_STAT_CD) == 0) {
if (busdev == sc->sc_cbdev &&
@ -708,7 +742,7 @@ static void
pccbb_event_thread(void *arg)
{
struct pccbb_softc *sc = arg;
u_int32_t status;
uint32_t status;
mtx_lock(&Giant);
for(;;) {
@ -733,7 +767,7 @@ pccbb_event_thread(void *arg)
if (sc->sc_flags & PCCBB_KTHREAD_DONE)
break;
status = sc->sc_socketreg->socket_state;
status = pccbb_get(sc, PCCBB_SOCKET_STATE);
if ((status & PCCBB_SOCKET_STAT_CD) == 0) {
pccbb_insert(sc);
} else {
@ -775,12 +809,12 @@ pccbb_start_threads(void *arg)
static void
pccbb_insert(struct pccbb_softc *sc)
{
u_int32_t sockevent, sockstate;
uint32_t sockevent, sockstate;
int timeout = 30;
do {
sockevent = sc->sc_socketreg->socket_event;
sockstate = sc->sc_socketreg->socket_state;
sockevent = pccbb_get(sc, PCCBB_SOCKET_EVENT);
sockstate = pccbb_get(sc, PCCBB_SOCKET_STATE);
} while (sockstate & PCCBB_SOCKET_STAT_CD && --timeout > 0);
if (timeout < 0) {
@ -832,15 +866,15 @@ static void
pccbb_intr(void *arg)
{
struct pccbb_softc *sc = arg;
u_int32_t sockevent;
uint32_t sockevent;
if (!(sockevent = sc->sc_socketreg->socket_event)) {
if (!(sockevent = pccbb_get(sc, PCCBB_SOCKET_EVENT))) {
/* not for me. */
return;
}
/* reset bit */
sc->sc_socketreg->socket_event = sockevent | 0x01;
pccbb_setb(sc, PCCBB_SOCKET_EVENT, 0x01); /* XXXmagic */
if (sockevent & PCCBB_SOCKET_EVENT_CD) {
mtx_lock(&sc->sc_mtx);
@ -849,11 +883,11 @@ pccbb_intr(void *arg)
} else {
if (sockevent & PCCBB_SOCKET_EVENT_CSTS) {
DPRINTF((" cstsevent occures, 0x%08x\n",
sc->sc_socketreg->socket_state));
pccbb_get(sc, PCCBB_SOCKET_STATE)));
}
if (sockevent & PCCBB_SOCKET_EVENT_POWER) {
DPRINTF((" pwrevent occures, 0x%08x\n",
sc->sc_socketreg->socket_state));
pccbb_get(sc, PCCBB_SOCKET_STATE)));
}
}
}
@ -866,10 +900,10 @@ static int
pccbb_detect_voltage(device_t brdev)
{
struct pccbb_softc *sc = device_get_softc(brdev);
u_int32_t psr;
uint32_t psr;
int vol = CARD_UKN_CARD;
psr = sc->sc_socketreg->socket_state;
psr = pccbb_get(sc, PCCBB_SOCKET_STATE);
if (psr & PCCBB_SOCKET_STAT_5VCARD)
vol |= CARD_5V_CARD;
@ -886,10 +920,10 @@ pccbb_detect_voltage(device_t brdev)
static int
pccbb_power(device_t brdev, int volts)
{
u_int32_t status, sock_ctrl;
uint32_t status, sock_ctrl;
struct pccbb_softc *sc = device_get_softc(brdev);
int timeout;
u_int32_t sockevent;
uint32_t sockevent;
DEVPRINTF((sc->sc_dev, "pccbb_power: %s and %s [%x]\n",
(volts & CARD_VCCMASK) == CARD_VCC_UC ? "CARD_VCC_UC" :
@ -906,8 +940,8 @@ pccbb_power(device_t brdev, int volts)
"VPP-UNKNOWN",
volts));
status = sc->sc_socketreg->socket_state;
sock_ctrl = sc->sc_socketreg->socket_control;
status = pccbb_get(sc, PCCBB_SOCKET_STATE);
sock_ctrl = pccbb_get(sc, PCCBB_SOCKET_CONTROL);
switch (volts & CARD_VCCMASK) {
case CARD_VCC_UC:
@ -954,11 +988,11 @@ pccbb_power(device_t brdev, int volts)
break;
}
if (sc->sc_socketreg->socket_control == sock_ctrl)
if (pccbb_get(sc, PCCBB_SOCKET_CONTROL) == sock_ctrl)
return (1); /* no change necessary */
sc->sc_socketreg->socket_control = sock_ctrl;
status = sc->sc_socketreg->socket_state;
pccbb_set(sc, PCCBB_SOCKET_CONTROL, sock_ctrl);
status = pccbb_get(sc, PCCBB_SOCKET_STATE);
/*
* XXX This busy wait is bogus. We should wait for a power
@ -969,11 +1003,11 @@ pccbb_power(device_t brdev, int volts)
timeout = 20;
do {
DELAY(20*1000);
sockevent = sc->sc_socketreg->socket_event;
sockevent = pccbb_get(sc, PCCBB_SOCKET_EVENT);
} while (!(sockevent & PCCBB_SOCKET_EVENT_POWER) && --timeout > 0);
/* reset event status */
/* XXX should only reset EVENT_POWER */
sc->sc_socketreg->socket_event = sockevent;
pccbb_set(sc, PCCBB_SOCKET_EVENT, sockevent);
if (timeout < 0) {
printf ("VCC supply failed.\n");
return (0);
@ -1027,7 +1061,7 @@ pccbb_cardbus_reset(device_t brdev)
DELAY(delay_us);
/* If a card exists, unreset it! */
if ((sc->sc_socketreg->socket_state & PCCBB_SOCKET_STAT_CD) == 0) {
if ((pccbb_get(sc, PCCBB_SOCKET_STATE) & PCCBB_SOCKET_STAT_CD) == 0) {
PCI_MASK_CONFIG(brdev, PCCBBR_BRIDGECTRL,
&~PCCBBM_BRIDGECTRL_RESET, 2);
DELAY(delay_us);
@ -1040,7 +1074,7 @@ pccbb_cardbus_power_enable_socket(device_t brdev, device_t child)
struct pccbb_softc *sc = device_get_softc(brdev);
int voltage;
if ((sc->sc_socketreg->socket_state & PCCBB_SOCKET_STAT_CD) ==
if ((pccbb_get(sc, PCCBB_SOCKET_STATE) & PCCBB_SOCKET_STAT_CD) ==
PCCBB_SOCKET_STAT_CD)
return (ENODEV);
@ -1072,7 +1106,7 @@ pccbb_cardbus_power_disable_socket(device_t brdev, device_t child)
/************************************************************************/
static int
pccbb_cardbus_io_open(device_t brdev, int win, u_int32_t start, u_int32_t end)
pccbb_cardbus_io_open(device_t brdev, int win, uint32_t start, uint32_t end)
{
int basereg;
int limitreg;
@ -1092,7 +1126,7 @@ pccbb_cardbus_io_open(device_t brdev, int win, u_int32_t start, u_int32_t end)
}
static int
pccbb_cardbus_mem_open(device_t brdev, int win, u_int32_t start, u_int32_t end)
pccbb_cardbus_mem_open(device_t brdev, int win, uint32_t start, uint32_t end)
{
int basereg;
int limitreg;
@ -1114,12 +1148,12 @@ pccbb_cardbus_mem_open(device_t brdev, int win, u_int32_t start, u_int32_t end)
static void
pccbb_cardbus_auto_open(struct pccbb_softc *sc, int type)
{
u_int32_t starts[2];
u_int32_t ends[2];
uint32_t starts[2];
uint32_t ends[2];
struct pccbb_reslist *rle;
int align;
int prefetchable[2];
u_int32_t reg;
uint32_t reg;
starts[0] = starts[1] = 0xffffffff;
ends[0] = ends[1] = 0;
@ -1171,7 +1205,7 @@ pccbb_cardbus_auto_open(struct pccbb_softc *sc, int type)
(rman_get_flags(rle->res) & RF_PREFETCHABLE)) {
starts[1] = rman_get_start(rle->res);
} else {
u_int32_t diffs[2];
uint32_t diffs[2];
int win;
diffs[0] = diffs[1] = 0xffffffff;
@ -1248,7 +1282,7 @@ pccbb_cardbus_deactivate_resource(device_t brdev, device_t child, int type,
static struct resource *
pccbb_cardbus_alloc_resource(device_t brdev, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
u_long start, u_long end, u_long count, uint flags)
{
struct pccbb_softc *sc = device_get_softc(brdev);
struct pccbb_reslist *rle;
@ -1777,7 +1811,7 @@ pccbb_pcic_deactivate_resource(device_t brdev, device_t child, int type,
static struct resource *
pccbb_pcic_alloc_resource(device_t brdev, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
u_long start, u_long end, u_long count, uint flags)
{
struct resource *res = NULL;
struct pccbb_softc *sc = device_get_softc(brdev);
@ -1872,7 +1906,7 @@ pccbb_pcic_release_resource(device_t brdev, device_t child, int type,
static int
pccbb_pcic_set_res_flags(device_t brdev, device_t child, int type, int rid,
u_int32_t flags)
uint32_t flags)
{
struct pccbb_softc *sc = device_get_softc(brdev);
struct resource *res;
@ -1909,13 +1943,13 @@ pccbb_pcic_set_res_flags(device_t brdev, device_t child, int type, int rid,
static int
pccbb_pcic_set_memory_offset(device_t brdev, device_t child, int rid,
u_int32_t cardaddr, u_int32_t *deltap)
uint32_t cardaddr, uint32_t *deltap)
{
struct pccbb_softc *sc = device_get_softc(brdev);
int win;
struct pccbb_reslist *rle;
struct resource *res;
u_int32_t delta;
uint32_t delta;
win = -1;
@ -2013,7 +2047,7 @@ pccbb_deactivate_resource(device_t brdev, device_t child, int type,
static struct resource *
pccbb_alloc_resource(device_t brdev, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
u_long start, u_long end, u_long count, uint flags)
{
struct pccbb_softc *sc = device_get_softc(brdev);
@ -2075,7 +2109,7 @@ pccbb_maxslots(device_t brdev)
return (0);
}
static u_int32_t
static uint32_t
pccbb_read_config(device_t brdev, int b, int s, int f, int reg, int width)
{
/*
@ -2086,7 +2120,7 @@ pccbb_read_config(device_t brdev, int b, int s, int f, int reg, int width)
}
static void
pccbb_write_config(device_t brdev, int b, int s, int f, int reg, u_int32_t val,
pccbb_write_config(device_t brdev, int b, int s, int f, int reg, uint32_t val,
int width)
{
/*
@ -2112,7 +2146,7 @@ pccbb_resume(device_t self)
{
int error = 0;
struct pccbb_softc *sc = (struct pccbb_softc *)device_get_softc(self);
u_int32_t tmp;
uint32_t tmp;
pci_write_config(self, PCCBBR_SOCKBASE,
rman_get_start(sc->sc_base_res), 4);
@ -2122,11 +2156,11 @@ pccbb_resume(device_t self)
pccbb_chipinit(sc);
/* CSC Interrupt: Card detect interrupt on */
sc->sc_socketreg->socket_mask |= PCCBB_SOCKET_MASK_CD;
pccbb_setb(sc, PCCBB_SOCKET_MASK, PCCBB_SOCKET_MASK_CD);
/* reset interrupt */
tmp = sc->sc_socketreg->socket_event;
sc->sc_socketreg->socket_event = tmp;
tmp = pccbb_get(sc, PCCBB_SOCKET_EVENT);
pccbb_set(sc, PCCBB_SOCKET_EVENT, tmp);
/* re-establish the interrupt. */
if (bus_setup_intr(self, sc->sc_irq_res, INTR_TYPE_BIO, pccbb_intr, sc,

View file

@ -157,3 +157,10 @@
#define PCCBB_SOCKET_CTRL_STOPCLK 0x80
#include <dev/pccbb/pccbbdevid.h>
#define PCCBB_SOCKET_EVENT 0x00
#define PCCBB_SOCKET_MASK 0x04
#define PCCBB_SOCKET_STATE 0x08
#define PCCBB_SOCKET_FORCE 0x0c
#define PCCBB_SOCKET_CONTROL 0x10
#define PCCBB_SOCKET_POWER 0x14

View file

@ -38,15 +38,6 @@ struct intrhand {
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;
};
struct pccbb_reslist {
SLIST_ENTRY(pccbb_reslist) link;
struct resource *res;
@ -66,7 +57,8 @@ struct pccbb_softc {
struct resource *sc_base_res;
struct resource *sc_irq_res;
void *sc_intrhand;
struct pccbb_socketreg *sc_socketreg;
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh;
u_int8_t sc_secbus;
u_int8_t sc_subbus;
struct mtx sc_mtx;