Lines Matching +full:sc +full:- +full:resource

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2000-2001 Jonathan Chen All rights reserved.
5 * Copyright (c) 2002-2004 M. Warner Losh <imp@FreeBSD.org>
30 /*-
65 * http://www-s.ti.com/cgi-bin/sc/generic2.cgi?family=PCI+CARDBUS+CONTROLLERS
90 #include <machine/resource.h>
137 "Starting ioport for 16-bit cards");
142 "Starting ioport for 32-bit cards");
148 static void cbb_insert(struct cbb_softc *sc);
149 static void cbb_removal(struct cbb_softc *sc);
156 static void cbb_cardbus_auto_open(struct cbb_softc *sc, int type);
158 struct resource *res);
160 device_t child, struct resource *res);
161 static struct resource *cbb_cardbus_alloc_resource(device_t brdev,
165 struct resource *res);
174 cbb_remove_res(struct cbb_softc *sc, struct resource *res) in cbb_remove_res() argument
178 SLIST_FOREACH(rle, &sc->rl, link) { in cbb_remove_res()
179 if (rle->res == res) { in cbb_remove_res()
180 SLIST_REMOVE(&sc->rl, rle, cbb_reslist, link); in cbb_remove_res()
187 static struct resource *
188 cbb_find_res(struct cbb_softc *sc, int type, int rid) in cbb_find_res() argument
192 SLIST_FOREACH(rle, &sc->rl, link) in cbb_find_res()
193 if (SYS_RES_MEMORY == rle->type && rid == rle->rid) in cbb_find_res()
194 return (rle->res); in cbb_find_res()
199 cbb_insert_res(struct cbb_softc *sc, struct resource *res, int type, in cbb_insert_res() argument
205 * Need to record allocated resource so we can iterate through in cbb_insert_res()
211 rle->res = res; in cbb_insert_res()
212 rle->type = type; in cbb_insert_res()
213 rle->rid = rid; in cbb_insert_res()
214 SLIST_INSERT_HEAD(&sc->rl, rle, link); in cbb_insert_res()
218 cbb_destroy_res(struct cbb_softc *sc) in cbb_destroy_res() argument
222 while ((rle = SLIST_FIRST(&sc->rl)) != NULL) { in cbb_destroy_res()
223 device_printf(sc->dev, "Danger Will Robinson: Resource " in cbb_destroy_res()
225 "(rid=%x, type=%d, addr=%jx)\n", rle->rid, rle->type, in cbb_destroy_res()
226 rman_get_start(rle->res)); in cbb_destroy_res()
227 SLIST_REMOVE_HEAD(&sc->rl, link); in cbb_destroy_res()
244 cbb_disable_func_intr(struct cbb_softc *sc) in cbb_disable_func_intr() argument
249 reg = (exca_getb(&sc->exca, EXCA_INTR) & ~EXCA_INTR_IRQ_MASK) | in cbb_disable_func_intr()
251 exca_putb(&sc->exca, EXCA_INTR, reg); in cbb_disable_func_intr()
263 cbb_enable_func_intr(struct cbb_softc *sc) in cbb_enable_func_intr() argument
267 reg = (exca_getb(&sc->exca, EXCA_INTR) & ~EXCA_INTR_IRQ_MASK) | in cbb_enable_func_intr()
269 PCI_MASK_CONFIG(sc->dev, CBBR_BRIDGECTRL, in cbb_enable_func_intr()
271 exca_putb(&sc->exca, EXCA_INTR, reg); in cbb_enable_func_intr()
277 struct cbb_softc *sc = device_get_softc(brdev); in cbb_detach() local
285 cbb_set(sc, CBB_SOCKET_MASK, 0); in cbb_detach()
287 /* reset 16-bit pcmcia bus */ in cbb_detach()
288 exca_clrb(&sc->exca, EXCA_INTR, EXCA_INTR_RESET); in cbb_detach()
294 cbb_set(sc, CBB_SOCKET_EVENT, 0xffffffff); in cbb_detach()
304 bus_teardown_intr(brdev, sc->irq_res, sc->intrhand); in cbb_detach()
305 mtx_lock(&sc->mtx); in cbb_detach()
306 sc->flags |= CBB_KTHREAD_DONE; in cbb_detach()
307 while (sc->flags & CBB_KTHREAD_RUNNING) { in cbb_detach()
308 DEVPRINTF((sc->dev, "Waiting for thread to die\n")); in cbb_detach()
309 wakeup(&sc->intrhand); in cbb_detach()
310 msleep(sc->event_thread, &sc->mtx, PWAIT, "cbbun", 0); in cbb_detach()
312 mtx_unlock(&sc->mtx); in cbb_detach()
314 bus_release_resource(brdev, SYS_RES_IRQ, 0, sc->irq_res); in cbb_detach()
316 sc->base_res); in cbb_detach()
317 mtx_destroy(&sc->mtx); in cbb_detach()
322 cbb_setup_intr(device_t dev, device_t child, struct resource *irq, in cbb_setup_intr()
327 struct cbb_softc *sc = device_get_softc(dev); in cbb_setup_intr() local
336 ih->filt = filt; in cbb_setup_intr()
337 ih->intr = intr; in cbb_setup_intr()
338 ih->arg = arg; in cbb_setup_intr()
339 ih->sc = sc; in cbb_setup_intr()
346 &ih->cookie); in cbb_setup_intr()
351 cbb_enable_func_intr(sc); in cbb_setup_intr()
352 sc->cardok = 1; in cbb_setup_intr()
357 cbb_teardown_intr(device_t dev, device_t child, struct resource *irq, in cbb_teardown_intr()
366 ih->cookie); in cbb_teardown_intr()
376 struct cbb_softc *sc = device_get_softc(brdev); in cbb_driver_added() local
398 wakeup(&sc->intrhand); in cbb_driver_added()
404 struct cbb_softc *sc = device_get_softc(brdev); in cbb_child_detached() local
407 if (child != sc->cbdev && child != sc->exca.pccarddev) in cbb_child_detached()
419 struct cbb_softc *sc = arg; in cbb_event_thread() local
427 * should add a lock that's shared on a per-slot basis so that only in cbb_event_thread()
430 pause("cbbstart", hz * device_get_unit(sc->dev) * 2); in cbb_event_thread()
431 mtx_lock(&sc->mtx); in cbb_event_thread()
432 sc->flags |= CBB_KTHREAD_RUNNING; in cbb_event_thread()
433 while ((sc->flags & CBB_KTHREAD_DONE) == 0) { in cbb_event_thread()
434 mtx_unlock(&sc->mtx); in cbb_event_thread()
435 status = cbb_get(sc, CBB_SOCKET_STATE); in cbb_event_thread()
439 cbb_removal(sc); in cbb_event_thread()
449 DEVPRINTF((sc->dev, in cbb_event_thread()
451 cbb_setb(sc, CBB_SOCKET_FORCE, CBB_FORCE_CV_TEST); in cbb_event_thread()
453 device_printf(sc->dev, in cbb_event_thread()
458 cbb_insert(sc); in cbb_event_thread()
465 if (sc->sc_root_token) { in cbb_event_thread()
466 root_mount_rel(sc->sc_root_token); in cbb_event_thread()
467 sc->sc_root_token = NULL; in cbb_event_thread()
474 * ISR, we signal sc->cv from the detach path after we've in cbb_event_thread()
484 mtx_lock(&sc->mtx); in cbb_event_thread()
485 cbb_setb(sc, CBB_SOCKET_MASK, CBB_SOCKET_MASK_CD | CBB_SOCKET_MASK_CSTS); in cbb_event_thread()
486 msleep(&sc->intrhand, &sc->mtx, 0, "-", 0); in cbb_event_thread()
489 (sc->flags & CBB_KTHREAD_DONE) == 0) in cbb_event_thread()
490 err = msleep(&sc->intrhand, &sc->mtx, 0, "-", hz / 5); in cbb_event_thread()
492 DEVPRINTF((sc->dev, "Thread terminating\n")); in cbb_event_thread()
493 sc->flags &= ~CBB_KTHREAD_RUNNING; in cbb_event_thread()
494 mtx_unlock(&sc->mtx); in cbb_event_thread()
503 cbb_insert(struct cbb_softc *sc) in cbb_insert() argument
507 sockevent = cbb_get(sc, CBB_SOCKET_EVENT); in cbb_insert()
508 sockstate = cbb_get(sc, CBB_SOCKET_STATE); in cbb_insert()
510 DEVPRINTF((sc->dev, "card inserted: event=0x%08x, state=%08x\n", in cbb_insert()
514 if (device_is_attached(sc->exca.pccarddev)) { in cbb_insert()
515 sc->flags |= CBB_16BIT_CARD; in cbb_insert()
516 exca_insert(&sc->exca); in cbb_insert()
518 device_printf(sc->dev, in cbb_insert()
519 "16-bit card inserted, but no pccard bus.\n"); in cbb_insert()
522 if (device_is_attached(sc->cbdev)) { in cbb_insert()
523 sc->flags &= ~CBB_16BIT_CARD; in cbb_insert()
524 CARD_ATTACH_CARD(sc->cbdev); in cbb_insert()
526 device_printf(sc->dev, in cbb_insert()
534 device_printf(sc->dev, "Unsupported card type detected\n"); in cbb_insert()
539 cbb_removal(struct cbb_softc *sc) in cbb_removal() argument
541 sc->cardok = 0; in cbb_removal()
542 if (sc->flags & CBB_16BIT_CARD) { in cbb_removal()
543 exca_removal(&sc->exca); in cbb_removal()
545 if (device_is_attached(sc->cbdev)) in cbb_removal()
546 CARD_DETACH_CARD(sc->cbdev); in cbb_removal()
548 cbb_destroy_res(sc); in cbb_removal()
559 struct cbb_softc *sc = ih->sc; in cbb_func_filt() local
564 if (!sc->cardok) in cbb_func_filt()
566 if (!CBB_CARD_PRESENT(cbb_get(sc, CBB_SOCKET_STATE))) { in cbb_func_filt()
567 sc->cardok = 0; in cbb_func_filt()
571 return ((*ih->filt)(ih->arg)); in cbb_func_filt()
578 struct cbb_softc *sc = ih->sc; in cbb_func_intr() local
593 if (ih->filt == NULL) { in cbb_func_intr()
594 if (!sc->cardok) in cbb_func_intr()
596 if (!CBB_CARD_PRESENT(cbb_get(sc, CBB_SOCKET_STATE))) { in cbb_func_intr()
597 sc->cardok = 0; in cbb_func_intr()
602 ih->intr(ih->arg); in cbb_func_intr()
612 struct cbb_softc *sc = device_get_softc(brdev); in cbb_detect_voltage() local
616 psr = cbb_get(sc, CBB_SOCKET_STATE); in cbb_detect_voltage()
631 cbb_o2micro_power_hack(struct cbb_softc *sc) in cbb_o2micro_power_hack() argument
664 reg = exca_getb(&sc->exca, EXCA_INTR); in cbb_o2micro_power_hack()
665 exca_putb(&sc->exca, EXCA_INTR, (reg & 0xf0) | 1); in cbb_o2micro_power_hack()
675 cbb_o2micro_power_hack2(struct cbb_softc *sc, uint8_t reg) in cbb_o2micro_power_hack2() argument
677 exca_putb(&sc->exca, EXCA_INTR, reg); in cbb_o2micro_power_hack2()
684 struct cbb_softc *sc = device_get_softc(brdev); in cbb_power() local
690 sock_ctrl = cbb_get(sc, CBB_SOCKET_CONTROL); in cbb_power()
720 if (cbb_get(sc, CBB_SOCKET_CONTROL) == sock_ctrl) in cbb_power()
722 DEVPRINTF((sc->dev, "cbb_power: %dV\n", volts)); in cbb_power()
723 if (volts != 0 && sc->chipset == CB_O2MICRO) in cbb_power()
724 reg = cbb_o2micro_power_hack(sc); in cbb_power()
731 * bit generally only affects 16-bit cards. Some bridges allow one to in cbb_power()
732 * set another bit to have it also affect 32-bit cards. Since 32-bit in cbb_power()
737 * EXCA CSC register for 16-bit cards, and disable the CD bit? in cbb_power()
739 mask = cbb_get(sc, CBB_SOCKET_MASK); in cbb_power()
742 cbb_set(sc, CBB_SOCKET_MASK, mask); in cbb_power()
745 cbb_set(sc, CBB_SOCKET_CONTROL, sock_ctrl); in cbb_power()
747 mtx_lock(&sc->mtx); in cbb_power()
748 cnt = sc->powerintr; in cbb_power()
751 * not generate a POWER_CYCLE event for 16-bit cards. In in cbb_power()
758 while (!(cbb_get(sc, CBB_SOCKET_STATE) & CBB_STATE_POWER_CYCLE) && in cbb_power()
759 cnt == sc->powerintr && sane-- > 0) in cbb_power()
760 msleep(&sc->powerintr, &sc->mtx, 0, "-", hz / 20); in cbb_power()
761 mtx_unlock(&sc->mtx); in cbb_power()
779 if (sc->chipset == CB_TOPIC95) in cbb_power()
782 device_printf(sc->dev, "power timeout, doom?\n"); in cbb_power()
799 cbb_clrb(sc, CBB_SOCKET_MASK, CBB_SOCKET_MASK_POWER); in cbb_power()
800 status = cbb_get(sc, CBB_SOCKET_STATE); in cbb_power()
801 if (on && sc->chipset != CB_TOPIC95) { in cbb_power()
803 device_printf(sc->dev, "Power not on?\n"); in cbb_power()
806 device_printf(sc->dev, "Bad Vcc requested\n"); in cbb_power()
814 cbb_set(sc, CBB_SOCKET_CONTROL, sock_ctrl); in cbb_power()
818 cbb_set(sc, CBB_SOCKET_FORCE, status); in cbb_power()
821 if (sc->chipset == CB_TOPIC97) { in cbb_power()
822 reg_ctrl = pci_read_config(sc->dev, TOPIC_REG_CTRL, 4); in cbb_power()
828 pci_write_config(sc->dev, TOPIC_REG_CTRL, reg_ctrl, 4); in cbb_power()
832 if (volts != 0 && sc->chipset == CB_O2MICRO) in cbb_power()
833 cbb_o2micro_power_hack2(sc, reg); in cbb_power()
840 struct cbb_softc *sc = device_get_softc(brdev); in cbb_current_voltage() local
843 ctrl = cbb_get(sc, CBB_SOCKET_CONTROL); in cbb_current_voltage()
872 struct cbb_softc *sc = device_get_softc(brdev); in cbb_do_power() local
877 exca_clrb(&sc->exca, EXCA_PWRCTL, EXCA_PWRCTL_OE); in cbb_do_power()
881 status = cbb_get(sc, CBB_SOCKET_STATE); in cbb_do_power()
908 struct cbb_softc *sc = device_get_softc(brdev); in cbb_cardbus_reset_power() local
917 delay = sc->chipset == CB_RF5C47X ? 400 : 20; in cbb_cardbus_reset_power()
927 * followed. In PCI spec v2.2 Table 4-6, Trhfa (Reset High to first in cbb_cardbus_reset_power()
938 if (on && CBB_CARD_PRESENT(cbb_get(sc, CBB_SOCKET_STATE))) { in cbb_cardbus_reset_power()
946 0xfffffffful && --count >= 0); in cbb_cardbus_reset_power()
953 * multi-function cards, but have nonsense for some of the in cbb_cardbus_reset_power()
986 struct cbb_softc *sc = device_get_softc(brdev); in cbb_cardbus_power_enable_socket() local
989 if (!CBB_CARD_PRESENT(cbb_get(sc, CBB_SOCKET_STATE))) in cbb_cardbus_power_enable_socket()
1003 } while (err != 0 && count-- > 0); in cbb_cardbus_power_enable_socket()
1008 /* CardBus Resource */
1064 cbb_cardbus_auto_open(struct cbb_softc *sc, int type) in cbb_cardbus_auto_open() argument
1082 SLIST_FOREACH(rle, &sc->rl, link) { in cbb_cardbus_auto_open()
1083 if (rle->type != type) in cbb_cardbus_auto_open()
1085 if (rle->res == NULL) in cbb_cardbus_auto_open()
1087 if (!(rman_get_flags(rle->res) & RF_ACTIVE)) in cbb_cardbus_auto_open()
1089 if (rman_get_flags(rle->res) & RF_PREFETCHABLE) in cbb_cardbus_auto_open()
1093 if (rman_get_start(rle->res) < starts[i]) in cbb_cardbus_auto_open()
1094 starts[i] = rman_get_start(rle->res); in cbb_cardbus_auto_open()
1095 if (rman_get_end(rle->res) > ends[i]) in cbb_cardbus_auto_open()
1096 ends[i] = rman_get_end(rle->res); in cbb_cardbus_auto_open()
1101 starts[i] &= ~(align - 1); in cbb_cardbus_auto_open()
1102 ends[i] = roundup2(ends[i], align) - 1; in cbb_cardbus_auto_open()
1107 device_printf(sc->dev, "Overlapping ranges" in cbb_cardbus_auto_open()
1108 " for prefetch and non-prefetch memory\n"); in cbb_cardbus_auto_open()
1113 device_printf(sc->dev, "Overlapping ranges" in cbb_cardbus_auto_open()
1114 " for prefetch and non-prefetch memory\n"); in cbb_cardbus_auto_open()
1121 cbb_cardbus_mem_open(sc->dev, 0, starts[0], ends[0]); in cbb_cardbus_auto_open()
1122 cbb_cardbus_mem_open(sc->dev, 1, starts[1], ends[1]); in cbb_cardbus_auto_open()
1123 reg = pci_read_config(sc->dev, CBBR_BRIDGECTRL, 2); in cbb_cardbus_auto_open()
1128 pci_write_config(sc->dev, CBBR_BRIDGECTRL, reg, 2); in cbb_cardbus_auto_open()
1130 device_printf(sc->dev, "Opening memory:\n"); in cbb_cardbus_auto_open()
1132 device_printf(sc->dev, "Normal: %#x-%#x\n", in cbb_cardbus_auto_open()
1135 device_printf(sc->dev, "Prefetch: %#x-%#x\n", in cbb_cardbus_auto_open()
1139 cbb_cardbus_io_open(sc->dev, 0, starts[0], ends[0]); in cbb_cardbus_auto_open()
1140 cbb_cardbus_io_open(sc->dev, 1, starts[1], ends[1]); in cbb_cardbus_auto_open()
1142 device_printf(sc->dev, "Opening I/O: %#x-%#x\n", in cbb_cardbus_auto_open()
1149 struct resource *res) in cbb_cardbus_activate_resource()
1163 struct resource *res) in cbb_cardbus_deactivate_resource()
1175 static struct resource *
1179 struct cbb_softc *sc = device_get_softc(brdev); in cbb_cardbus_alloc_resource() local
1181 struct resource *res; in cbb_cardbus_alloc_resource()
1186 tmp = rman_get_start(sc->irq_res); in cbb_cardbus_alloc_resource()
1188 device_printf(child, "requested interrupt %jd-%jd," in cbb_cardbus_alloc_resource()
1225 cbb_insert_res(sc, res, type, *rid); in cbb_cardbus_alloc_resource()
1237 struct resource *res) in cbb_cardbus_release_resource()
1239 struct cbb_softc *sc = device_get_softc(brdev); in cbb_cardbus_release_resource() local
1247 cbb_remove_res(sc, res); in cbb_cardbus_release_resource()
1259 struct cbb_softc *sc = device_get_softc(brdev); in cbb_pcic_power_enable_socket() local
1268 exca_reset(&sc->exca, child); in cbb_pcic_power_enable_socket()
1276 struct cbb_softc *sc = device_get_softc(brdev); in cbb_pcic_power_disable_socket() local
1281 exca_putb(&sc->exca, EXCA_INTR, 0); in cbb_pcic_power_disable_socket()
1286 exca_putb(&sc->exca, EXCA_PWRCTL, 0); in cbb_pcic_power_disable_socket()
1292 exca_putb(&sc->exca, EXCA_INTR, EXCA_INTR_ENABLE); in cbb_pcic_power_disable_socket()
1303 struct cbb_softc *sc = device_get_softc(brdev); in cbb_power_enable_socket() local
1305 if (sc->flags & CBB_16BIT_CARD) in cbb_power_enable_socket()
1313 struct cbb_softc *sc = device_get_softc(brdev); in cbb_power_disable_socket() local
1314 if (sc->flags & CBB_16BIT_CARD) in cbb_power_disable_socket()
1321 struct resource *res) in cbb_pcic_activate_resource()
1323 struct cbb_softc *sc = device_get_softc(brdev); in cbb_pcic_activate_resource() local
1326 error = exca_activate_resource(&sc->exca, child, res); in cbb_pcic_activate_resource()
1334 struct resource *res) in cbb_pcic_deactivate_resource()
1336 struct cbb_softc *sc = device_get_softc(brdev); in cbb_pcic_deactivate_resource() local
1337 return (exca_deactivate_resource(&sc->exca, child, res)); in cbb_pcic_deactivate_resource()
1340 static struct resource *
1344 struct resource *res = NULL; in cbb_pcic_alloc_resource()
1345 struct cbb_softc *sc = device_get_softc(brdev); in cbb_pcic_alloc_resource() local
1370 tmp = rman_get_start(sc->irq_res); in cbb_pcic_alloc_resource()
1372 device_printf(child, "requested interrupt %jd-%jd," in cbb_pcic_alloc_resource()
1378 start = end = rman_get_start(sc->irq_res); in cbb_pcic_alloc_resource()
1385 cbb_insert_res(sc, res, type, *rid); in cbb_pcic_alloc_resource()
1398 struct resource *res) in cbb_pcic_release_resource()
1400 struct cbb_softc *sc = device_get_softc(brdev); in cbb_pcic_release_resource() local
1408 cbb_remove_res(sc, res); in cbb_pcic_release_resource()
1421 struct cbb_softc *sc = device_get_softc(brdev); in cbb_pcic_set_res_flags() local
1422 struct resource *res; in cbb_pcic_set_res_flags()
1426 res = cbb_find_res(sc, type, rid); in cbb_pcic_set_res_flags()
1432 return (exca_mem_set_flags(&sc->exca, res, flags)); in cbb_pcic_set_res_flags()
1439 struct cbb_softc *sc = device_get_softc(brdev); in cbb_pcic_set_memory_offset() local
1440 struct resource *res; in cbb_pcic_set_memory_offset()
1442 res = cbb_find_res(sc, SYS_RES_MEMORY, rid); in cbb_pcic_set_memory_offset()
1448 return (exca_mem_set_offset(&sc->exca, res, cardaddr, deltap)); in cbb_pcic_set_memory_offset()
1456 cbb_activate_resource(device_t brdev, device_t child, struct resource *r) in cbb_activate_resource()
1458 struct cbb_softc *sc = device_get_softc(brdev); in cbb_activate_resource() local
1460 if (sc->flags & CBB_16BIT_CARD) in cbb_activate_resource()
1467 cbb_deactivate_resource(device_t brdev, device_t child, struct resource *r) in cbb_deactivate_resource()
1469 struct cbb_softc *sc = device_get_softc(brdev); in cbb_deactivate_resource() local
1471 if (sc->flags & CBB_16BIT_CARD) in cbb_deactivate_resource()
1477 struct resource *
1481 struct cbb_softc *sc = device_get_softc(brdev); in cbb_alloc_resource() local
1483 if (sc->flags & CBB_16BIT_CARD) in cbb_alloc_resource()
1492 cbb_release_resource(device_t brdev, device_t child, struct resource *r) in cbb_release_resource()
1494 struct cbb_softc *sc = device_get_softc(brdev); in cbb_release_resource() local
1496 if (sc->flags & CBB_16BIT_CARD) in cbb_release_resource()
1505 struct cbb_softc *sc = device_get_softc(brdev); in cbb_read_ivar() local
1509 *result = sc->domain; in cbb_read_ivar()
1512 *result = sc->bus.sec; in cbb_read_ivar()
1539 struct cbb_softc *sc = (struct cbb_softc *)device_get_softc(parent); in cbb_child_present() local
1542 sockstate = cbb_get(sc, CBB_SOCKET_STATE); in cbb_child_present()
1543 return (CBB_CARD_PRESENT(sockstate) && sc->cardok); in cbb_child_present()