Lines Matching +full:sc +full:- +full:resource
1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause AND BSD-2-Clause
4 * Copyright (c) 2002-2005 M. Warner Losh <imp@FreeBSD.org>
72 #include <machine/resource.h>
91 "Intel i82365SL-A/B or clone",
92 "Intel i82365sl-DF step",
144 exca_mem_getb(struct exca_softc *sc, int reg)
146 return (bus_space_read_1(sc->bst, sc->bsh, sc->offset + reg));
150 exca_mem_putb(struct exca_softc *sc, int reg, uint8_t val)
152 bus_space_write_1(sc->bst, sc->bsh, sc->offset + reg, val);
156 exca_io_getb(struct exca_softc *sc, int reg)
158 bus_space_write_1(sc->bst, sc->bsh, EXCA_REG_INDEX, reg + sc->offset);
159 return (bus_space_read_1(sc->bst, sc->bsh, EXCA_REG_DATA));
163 exca_io_putb(struct exca_softc *sc, int reg, uint8_t val)
165 bus_space_write_1(sc->bst, sc->bsh, EXCA_REG_INDEX, reg + sc->offset);
166 bus_space_write_1(sc->bst, sc->bsh, EXCA_REG_DATA, val);
176 exca_do_mem_map(struct exca_softc *sc, int win)
185 mem = &sc->mem[win];
186 mem16 = (mem->kind & PCCARD_MEM_16BIT) ?
188 attrmem = (mem->kind & PCCARD_MEM_ATTR) ?
190 offset = ((mem->cardaddr >> EXCA_CARDMEM_ADDRX_SHIFT) -
191 (mem->addr >> EXCA_SYSMEM_ADDRX_SHIFT)) & 0x3fff;
192 exca_putb(sc, map->sysmem_start_lsb,
193 mem->addr >> EXCA_SYSMEM_ADDRX_SHIFT);
194 exca_putb(sc, map->sysmem_start_msb,
195 ((mem->addr >> (EXCA_SYSMEM_ADDRX_SHIFT + 8)) &
198 exca_putb(sc, map->sysmem_stop_lsb,
199 (mem->addr + mem->realsize - 1) >> EXCA_SYSMEM_ADDRX_SHIFT);
200 exca_putb(sc, map->sysmem_stop_msb,
201 (((mem->addr + mem->realsize - 1) >>
205 exca_putb(sc, map->sysmem_win, mem->addr >> EXCA_MEMREG_WIN_SHIFT);
207 exca_putb(sc, map->cardmem_lsb, offset & 0xff);
208 exca_putb(sc, map->cardmem_msb, ((offset >> 8) &
211 DPRINTF("%s %d-bit memory",
212 mem->kind & PCCARD_MEM_ATTR ? "attribute" : "common",
213 mem->kind & PCCARD_MEM_16BIT ? 16 : 8);
214 exca_setb(sc, EXCA_ADDRWIN_ENABLE, map->memenable |
221 r1 = exca_getb(sc, map->sysmem_start_msb);
222 r2 = exca_getb(sc, map->sysmem_start_lsb);
223 r3 = exca_getb(sc, map->sysmem_stop_msb);
224 r4 = exca_getb(sc, map->sysmem_stop_lsb);
225 r5 = exca_getb(sc, map->cardmem_msb);
226 r6 = exca_getb(sc, map->cardmem_lsb);
227 r7 = exca_getb(sc, map->sysmem_win);
231 mem->addr, mem->size, mem->realsize,
232 mem->cardaddr, mem->kind);
238 * public interface to map a resource. kind is the type of memory to
241 * to set it on a struct resource after it has been mapped, we're safe
246 exca_mem_map(struct exca_softc *sc, int kind, struct resource *res)
251 if ((sc->memalloc & (1 << win)) == 0) {
252 sc->memalloc |= (1 << win);
258 if (sc->flags & EXCA_HAS_MEMREG_WIN) {
261 device_printf(sc->dev,
268 device_printf(sc->dev,
274 sc->mem[win].cardaddr = 0;
275 sc->mem[win].memt = rman_get_bustag(res);
276 sc->mem[win].memh = rman_get_bushandle(res);
277 sc->mem[win].addr = rman_get_start(res);
278 sc->mem[win].size = rman_get_end(res) - sc->mem[win].addr + 1;
279 sc->mem[win].realsize = sc->mem[win].size + EXCA_MEM_PAGESIZE - 1;
280 sc->mem[win].realsize = sc->mem[win].realsize -
281 (sc->mem[win].realsize % EXCA_MEM_PAGESIZE);
282 sc->mem[win].kind = kind;
284 win, sc->mem[win].addr, sc->mem[win].size, sc->mem[win].cardaddr);
285 exca_do_mem_map(sc, win);
299 exca_mem_unmap(struct exca_softc *sc, int window)
304 exca_clrb(sc, EXCA_ADDRWIN_ENABLE, mem_map_index[window].memenable);
305 sc->memalloc &= ~(1 << window);
309 * Find the map that we're using to hold the resource. This works well
316 exca_mem_findmap(struct exca_softc *sc, struct resource *res)
321 if (sc->mem[win].memt == rman_get_bustag(res) &&
322 sc->mem[win].addr == rman_get_start(res) &&
323 sc->mem[win].size == rman_get_size(res))
326 return (-1);
339 exca_mem_set_flags(struct exca_softc *sc, struct resource *res, uint32_t flags)
343 win = exca_mem_findmap(sc, res);
345 device_printf(sc->dev,
346 "set_res_flags: specified resource not active\n");
353 sc->mem[win].kind |= PCCARD_MEM_ATTR;
356 sc->mem[win].kind &= ~PCCARD_MEM_ATTR;
359 sc->mem[win].kind |= PCCARD_MEM_16BIT;
362 sc->mem[win].kind &= ~PCCARD_MEM_16BIT;
365 exca_do_mem_map(sc, win);
370 * Given a resource, go ahead and unmap it if we can find it in the
374 exca_mem_unmap_res(struct exca_softc *sc, struct resource *res)
378 win = exca_mem_findmap(sc, res);
381 exca_mem_unmap(sc, win);
392 exca_mem_set_offset(struct exca_softc *sc, struct resource *res,
398 win = exca_mem_findmap(sc, res);
400 device_printf(sc->dev,
401 "set_memory_offset: specified resource not active\n");
404 sc->mem[win].cardaddr = rounddown2(cardaddr, EXCA_MEM_PAGESIZE);
408 sc->mem[win].realsize = sc->mem[win].size + delta +
409 EXCA_MEM_PAGESIZE - 1;
410 sc->mem[win].realsize = sc->mem[win].realsize -
411 (sc->mem[win].realsize % EXCA_MEM_PAGESIZE);
412 exca_do_mem_map(sc, win);
454 exca_do_io_map(struct exca_softc *sc, int win)
461 io = &sc->io[win];
462 exca_putb(sc, map->start_lsb, io->addr & 0xff);
463 exca_putb(sc, map->start_msb, (io->addr >> 8) & 0xff);
465 exca_putb(sc, map->stop_lsb, (io->addr + io->size - 1) & 0xff);
466 exca_putb(sc, map->stop_msb, ((io->addr + io->size - 1) >> 8) & 0xff);
468 exca_clrb(sc, EXCA_IOCTL, map->ioctlmask);
469 exca_setb(sc, EXCA_IOCTL, map->ioctlbits[io->width]);
471 exca_setb(sc, EXCA_ADDRWIN_ENABLE, map->ioenable);
475 r1 = exca_getb(sc, map->start_msb);
476 r2 = exca_getb(sc, map->start_lsb);
477 r3 = exca_getb(sc, map->stop_msb);
478 r4 = exca_getb(sc, map->stop_lsb);
481 io->addr, io->size);
487 exca_io_map(struct exca_softc *sc, int width, struct resource *r)
494 if ((sc->ioalloc & (1 << win)) == 0) {
495 sc->ioalloc |= (1 << win);
502 sc->io[win].iot = rman_get_bustag(r);
503 sc->io[win].ioh = rman_get_bushandle(r);
504 sc->io[win].addr = rman_get_start(r);
505 sc->io[win].size = rman_get_end(r) - sc->io[win].addr + 1;
506 sc->io[win].flags = 0;
507 sc->io[win].width = width;
509 win, width_names[width], sc->io[win].addr,
510 sc->io[win].size);
511 exca_do_io_map(sc, win);
517 exca_io_unmap(struct exca_softc *sc, int window)
522 exca_clrb(sc, EXCA_ADDRWIN_ENABLE, io_map_index[window].ioenable);
524 sc->ioalloc &= ~(1 << window);
526 sc->io[window].iot = 0;
527 sc->io[window].ioh = 0;
528 sc->io[window].addr = 0;
529 sc->io[window].size = 0;
530 sc->io[window].flags = 0;
531 sc->io[window].width = 0;
535 exca_io_findmap(struct exca_softc *sc, struct resource *res)
540 if (sc->io[win].iot == rman_get_bustag(res) &&
541 sc->io[win].addr == rman_get_start(res) &&
542 sc->io[win].size == rman_get_size(res))
545 return (-1);
550 exca_io_unmap_res(struct exca_softc *sc, struct resource *res)
554 win = exca_io_findmap(sc, res);
557 exca_io_unmap(sc, win);
572 exca_wait_ready(struct exca_softc *sc)
575 DEVPRINTF(sc->dev, "exca_wait_ready: status 0x%02x\n",
576 exca_getb(sc, EXCA_IF_STATUS));
578 if (exca_getb(sc, EXCA_IF_STATUS) & EXCA_IF_STATUS_READY)
582 device_printf(sc->dev, "ready never happened, status = %02x\n",
583 exca_getb(sc, EXCA_IF_STATUS));
600 exca_reset(struct exca_softc *sc, device_t child)
605 exca_setb(sc, EXCA_PWRCTL, EXCA_PWRCTL_OE);
607 exca_putb(sc, EXCA_INTR, EXCA_INTR_ENABLE);
611 exca_setb(sc, EXCA_INTR, EXCA_INTR_RESET);
615 exca_wait_ready(sc);
618 exca_putb(sc, EXCA_ADDRWIN_ENABLE, 0);
620 exca_setb(sc, EXCA_INTR, EXCA_INTR_CARDTYPE_IO);
621 DEVPRINTF(sc->dev, "card type is io\n");
625 if (sc->memalloc & (1 << win))
626 exca_do_mem_map(sc, win);
628 if (sc->ioalloc & (1 << win))
629 exca_do_io_map(sc, win);
636 exca_init(struct exca_softc *sc, device_t dev,
639 sc->dev = dev;
640 sc->memalloc = 0;
641 sc->ioalloc = 0;
642 sc->bst = bst;
643 sc->bsh = bsh;
644 sc->offset = offset;
645 sc->flags = 0;
646 sc->getb = exca_mem_getb;
647 sc->putb = exca_mem_putb;
648 sc->pccarddev = device_add_child(dev, "pccard", DEVICE_UNIT_ANY);
649 if (sc->pccarddev == NULL)
651 else if (device_probe_and_attach(sc->pccarddev) != 0)
664 exca->chipset = EXCA_BOGUS;
672 DEVPRINTF(exca->dev, "Ident is %x\n", c);
683 exca->chipset = EXCA_I82365;
691 bus_space_write_1(exca->bst, exca->bsh, EXCA_REG_INDEX,
693 bus_space_write_1(exca->bst, exca->bsh, EXCA_REG_INDEX,
700 exca->chipset = EXCA_VG365;
703 exca->chipset = EXCA_VG465;
706 exca->chipset = EXCA_VG468;
709 exca->chipset = EXCA_VG469;
720 exca->chipset = EXCA_RF5C396;
723 exca->chipset = EXCA_RF5C296;
736 exca->chipset = EXCA_PD6722;
738 exca->chipset = EXCA_PD6710;
746 * Intel i82365sl-DF step or maybe a vlsi 82c146
749 * XXXX Except we didn't -- this is a regression but VLSI
752 exca->chipset = EXCA_I82365SL_DF;
756 exca->chipset = EXCA_IBM;
759 exca->chipset = EXCA_IBM_KING;
784 exca->getb = exca_io_getb;
785 exca->putb = exca_io_putb;
797 if (device_is_attached(exca->pccarddev)) {
798 if (CARD_ATTACH_CARD(exca->pccarddev) != 0)
799 device_printf(exca->dev,
802 device_printf(exca->dev,
811 if (device_is_attached(exca->pccarddev))
812 CARD_DETACH_CARD(exca->pccarddev);
817 struct resource *res)
823 err = BUS_ACTIVATE_RESOURCE(device_get_parent(exca->dev), child,
836 BUS_DEACTIVATE_RESOURCE(device_get_parent(exca->dev), child,
843 struct resource *res)
857 return (BUS_DEACTIVATE_RESOURCE(device_get_parent(exca->dev), child,
862 static struct resource *
863 exca_alloc_resource(struct exca_softc *sc, device_t child, int type, int *rid,
866 struct resource *res = NULL;
885 tmp = rman_get_start(sc->irq_res);
887 device_printf(child, "requested interrupt %ld-%ld,"
893 start = end = rman_get_start(sc->irq_res);
900 cbb_insert_res(sc, res, type, *rid);
912 exca_release_resource(struct exca_softc *sc, device_t child, int type,
913 int rid, struct resource *res)
922 cbb_remove_res(sc, res);