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

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
4 * Copyright (c) 2006-2008, Juniper Networks, Inc.
72 static int lbc_map_resource(device_t, device_t, struct resource *,
74 static int lbc_unmap_resource(device_t, device_t, struct resource *,
77 struct resource *r);
79 struct resource *r);
81 static struct resource *lbc_alloc_resource(device_t, device_t, int, int *,
83 static int lbc_adjust_resource(device_t, device_t, struct resource *,
86 static int lbc_release_resource(device_t, device_t, struct resource *);
133 * of 32KB - 4GB. Otherwise error code is returned. Value representing
153 return (0xffff8000 << (n - 15)); in lbc_address_mask()
157 lbc_banks_unmap(struct lbc_softc *sc) in lbc_banks_unmap() argument
163 if (sc->sc_range[r].size == 0) in lbc_banks_unmap()
166 pmap_unmapdev((void *)sc->sc_range[r].kva, in lbc_banks_unmap()
167 sc->sc_range[r].size); in lbc_banks_unmap()
168 law_disable(OCP85XX_TGTIF_LBC, sc->sc_range[r].addr, in lbc_banks_unmap()
169 sc->sc_range[r].size); in lbc_banks_unmap()
175 lbc_banks_map(struct lbc_softc *sc) in lbc_banks_map() argument
182 bzero(sc->sc_range, sizeof(sc->sc_range)); in lbc_banks_map()
189 size = sc->sc_banks[i].size; in lbc_banks_map()
193 start = sc->sc_banks[i].addr; in lbc_banks_map()
195 /* Avoid wrap-around bugs. */ in lbc_banks_map()
196 end = sc->sc_range[r].addr - 1 + sc->sc_range[r].size; in lbc_banks_map()
197 if (start > 0 && end == start - 1) { in lbc_banks_map()
198 sc->sc_range[r].size += size; in lbc_banks_map()
201 /* Avoid wrap-around bugs. */ in lbc_banks_map()
202 end = start - 1 + size; in lbc_banks_map()
203 if (sc->sc_range[r].addr > 0 && in lbc_banks_map()
204 end == sc->sc_range[r].addr - 1) { in lbc_banks_map()
205 sc->sc_range[r].addr = start; in lbc_banks_map()
206 sc->sc_range[r].size += size; in lbc_banks_map()
213 while (r < ranges && sc->sc_range[r].addr < start) in lbc_banks_map()
215 for (s = ranges; s > r; s--) in lbc_banks_map()
216 sc->sc_range[s] = sc->sc_range[s-1]; in lbc_banks_map()
217 sc->sc_range[r].addr = start; in lbc_banks_map()
218 sc->sc_range[r].size = size; in lbc_banks_map()
228 while (r < ranges - 1) { in lbc_banks_map()
229 end = sc->sc_range[r].addr + sc->sc_range[r].size; in lbc_banks_map()
230 if (end != sc->sc_range[r+1].addr) { in lbc_banks_map()
234 sc->sc_range[r].size += sc->sc_range[r+1].size; in lbc_banks_map()
235 for (s = r + 1; s < ranges - 1; s++) in lbc_banks_map()
236 sc->sc_range[s] = sc->sc_range[s+1]; in lbc_banks_map()
237 bzero(&sc->sc_range[s], sizeof(sc->sc_range[s])); in lbc_banks_map()
238 ranges--; in lbc_banks_map()
246 start = sc->sc_range[r].addr; in lbc_banks_map()
247 size = sc->sc_range[r].size; in lbc_banks_map()
251 sc->sc_range[r].kva = (vm_offset_t)pmap_mapdev(start, size); in lbc_banks_map()
260 size = sc->sc_banks[i].size; in lbc_banks_map()
264 start = sc->sc_banks[i].addr; in lbc_banks_map()
266 end = sc->sc_range[r].addr - 1 + sc->sc_range[r].size; in lbc_banks_map()
267 if (start >= sc->sc_range[r].addr && in lbc_banks_map()
268 start - 1 + size <= end) in lbc_banks_map()
272 sc->sc_banks[i].kva = sc->sc_range[r].kva + in lbc_banks_map()
273 (start - sc->sc_range[r].addr); in lbc_banks_map()
281 lbc_banks_enable(struct lbc_softc *sc) in lbc_banks_enable() argument
288 size = sc->sc_banks[i].size; in lbc_banks_enable()
295 regval = sc->sc_banks[i].addr; in lbc_banks_enable()
296 switch (sc->sc_banks[i].width) { in lbc_banks_enable()
310 regval |= (sc->sc_banks[i].decc << 9); in lbc_banks_enable()
311 regval |= (sc->sc_banks[i].wp << 8); in lbc_banks_enable()
312 regval |= (sc->sc_banks[i].msel << 5); in lbc_banks_enable()
313 regval |= (sc->sc_banks[i].atom << 2); in lbc_banks_enable()
315 bus_space_write_4(sc->sc_bst, sc->sc_bsh, in lbc_banks_enable()
322 switch (sc->sc_banks[i].msel) { in lbc_banks_enable()
338 bus_space_write_4(sc->sc_bst, sc->sc_bsh, in lbc_banks_enable()
345 lbc_banks_unmap(sc); in lbc_banks_enable()
350 fdt_lbc_fixup(phandle_t node, struct lbc_softc *sc, struct lbc_devinfo *di) in fdt_lbc_fixup() argument
355 if (OF_getprop(node, "bank-width", (void *)&width, sizeof(width)) <= 0) in fdt_lbc_fixup()
358 bank = di->di_bank; in fdt_lbc_fixup()
359 if (sc->sc_banks[bank].size == 0) in fdt_lbc_fixup()
363 sc->sc_banks[bank].width = width * 8; in fdt_lbc_fixup()
367 fdt_lbc_reg_decode(phandle_t node, struct lbc_softc *sc, in fdt_lbc_reg_decode() argument
391 di->di_bank = bank; in fdt_lbc_reg_decode()
396 for (j = 0; j < addr_cells - 1; j++) { in fdt_lbc_reg_decode()
402 count |= reg[addr_cells + j - 1]; in fdt_lbc_reg_decode()
404 reg += addr_cells - 1 + size_cells; in fdt_lbc_reg_decode()
407 start = sc->sc_banks[bank].kva + start; in fdt_lbc_reg_decode()
408 end = start + count - 1; in fdt_lbc_reg_decode()
414 resource_list_add(&di->di_res, SYS_RES_MEMORY, bank, start, in fdt_lbc_reg_decode()
425 struct lbc_softc *sc = arg; in lbc_intr() local
428 ltesr = bus_space_read_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTESR); in lbc_intr()
429 sc->sc_ltesr = ltesr; in lbc_intr()
430 bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTESR, ltesr); in lbc_intr()
431 wakeup(sc->sc_dev); in lbc_intr()
449 struct lbc_softc *sc; in lbc_attach() local
461 sc = device_get_softc(dev); in lbc_attach()
462 sc->sc_dev = dev; in lbc_attach()
464 sc->sc_mrid = 0; in lbc_attach()
465 sc->sc_mres = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_mrid, in lbc_attach()
467 if (sc->sc_mres == NULL) in lbc_attach()
470 sc->sc_bst = rman_get_bustag(sc->sc_mres); in lbc_attach()
471 sc->sc_bsh = rman_get_bushandle(sc->sc_mres); in lbc_attach()
474 bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_BR(bank), 0); in lbc_attach()
475 bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_OR(bank), 0); in lbc_attach()
480 * - enable Local Bus in lbc_attach()
481 * - set data buffer control signal function in lbc_attach()
482 * - disable parity byte select in lbc_attach()
483 * - set ECC parity type in lbc_attach()
484 * - set bus monitor timing and timer prescale in lbc_attach()
486 bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LBCR, 0); in lbc_attach()
490 * - disable PLL bypass mode in lbc_attach()
491 * - configure LCLK delay cycles for the assertion of LALE in lbc_attach()
492 * - set system clock divider in lbc_attach()
494 bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LCRR, 0x00030008); in lbc_attach()
496 bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTEDR, 0); in lbc_attach()
497 bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTESR, ~0); in lbc_attach()
498 bus_space_write_4(sc->sc_bst, sc->sc_bsh, LBC85XX_LTEIR, 0x64080001); in lbc_attach()
500 sc->sc_irid = 0; in lbc_attach()
501 sc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->sc_irid, in lbc_attach()
503 if (sc->sc_ires != NULL) { in lbc_attach()
504 error = bus_setup_intr(dev, sc->sc_ires, in lbc_attach()
505 INTR_TYPE_MISC | INTR_MPSAFE, NULL, lbc_intr, sc, in lbc_attach()
506 &sc->sc_icookie); in lbc_attach()
509 bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irid, in lbc_attach()
510 sc->sc_ires); in lbc_attach()
511 sc->sc_ires = NULL; in lbc_attach()
515 sc->sc_ltesr = ~0; in lbc_attach()
519 rm = &sc->sc_rman; in lbc_attach()
520 rm->rm_type = RMAN_ARRAY; in lbc_attach()
521 rm->rm_descr = "Local Bus Space"; in lbc_attach()
526 error = rman_manage_region(rm, rm->rm_start, rm->rm_end); in lbc_attach()
536 if ((fdt_addrsize_cells(node, &sc->sc_addr_cells, in lbc_attach()
537 &sc->sc_size_cells)) != 0) { in lbc_attach()
544 device_printf(dev, "unsupported parent #addr-cells\n"); in lbc_attach()
548 tuple_size = sizeof(pcell_t) * (sc->sc_addr_cells + par_addr_cells + in lbc_attach()
549 sc->sc_size_cells); in lbc_attach()
562 sc->sc_addr_cells, sc->sc_size_cells, tuple_size, tuples); in lbc_attach()
581 for (j = 0; j < sc->sc_addr_cells - 1; j++) { in lbc_attach()
595 size = fdt_data_get((void *)ranges, sc->sc_size_cells); in lbc_attach()
596 ranges += sc->sc_size_cells; in lbc_attach()
600 sc->sc_banks[bank].addr = start + offset; in lbc_attach()
601 sc->sc_banks[bank].size = size; in lbc_attach()
609 sc->sc_banks[bank].width = 16; in lbc_attach()
610 sc->sc_banks[bank].msel = LBCRES_MSEL_GPCM; in lbc_attach()
611 sc->sc_banks[bank].decc = LBCRES_DECC_DISABLED; in lbc_attach()
612 sc->sc_banks[bank].atom = LBCRES_ATOM_DISABLED; in lbc_attach()
613 sc->sc_banks[bank].wp = 0; in lbc_attach()
617 * Initialize mem-mappings for the LBC banks (i.e. chip selects). in lbc_attach()
619 error = lbc_banks_map(sc); in lbc_attach()
629 if (ofw_bus_gen_setup_devinfo(&di->di_ofw, child) != 0) { in lbc_attach()
635 resource_list_init(&di->di_res); in lbc_attach()
637 if (fdt_lbc_reg_decode(child, sc, di)) { in lbc_attach()
640 ofw_bus_gen_destroy_devinfo(&di->di_ofw); in lbc_attach()
645 fdt_lbc_fixup(child, sc, di); in lbc_attach()
651 di->di_ofw.obd_name); in lbc_attach()
652 resource_list_free(&di->di_res); in lbc_attach()
653 ofw_bus_gen_destroy_devinfo(&di->di_ofw); in lbc_attach()
657 debugf("added child name='%s', node=%x\n", di->di_ofw.obd_name, in lbc_attach()
665 lbc_banks_enable(sc); in lbc_attach()
673 bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_mrid, sc->sc_mres); in lbc_attach()
688 struct lbc_softc *sc; in lbc_get_rman() local
690 sc = device_get_softc(bus); in lbc_get_rman()
693 return (&sc->sc_rman); in lbc_get_rman()
699 static struct resource *
715 * Request for the default allocation with a given rid: use resource in lbc_alloc_resource()
728 rid = &di->di_bank; in lbc_alloc_resource()
730 rle = resource_list_find(&di->di_res, type, *rid); in lbc_alloc_resource()
736 start = rle->start; in lbc_alloc_resource()
737 count = rle->count; in lbc_alloc_resource()
738 end = start + count - 1; in lbc_alloc_resource()
752 rl = &di->di_res; in lbc_print_child()
764 lbc_adjust_resource(device_t dev, device_t child, struct resource *r, in lbc_adjust_resource()
779 lbc_release_resource(device_t dev, device_t child, struct resource *res) in lbc_release_resource()
792 lbc_activate_resource(device_t bus, device_t child, struct resource *r) in lbc_activate_resource()
805 lbc_deactivate_resource(device_t bus, device_t child, struct resource *r) in lbc_deactivate_resource()
818 lbc_map_resource(device_t bus, device_t child, struct resource *r, in lbc_map_resource()
843 map->r_bustag = &bs_be_tag; in lbc_map_resource()
844 map->r_bushandle = start; in lbc_map_resource()
845 map->r_size = length; in lbc_map_resource()
846 map->r_vaddr = NULL; in lbc_map_resource()
851 lbc_unmap_resource(device_t bus, device_t child, struct resource *r, in lbc_unmap_resource()
872 return (&di->di_ofw); in lbc_get_devinfo()
879 struct lbc_softc *sc; in lbc_write_reg() local
889 sc = device_get_softc(dev); in lbc_write_reg()
891 if (off == LBC85XX_LTESR && sc->sc_ltesr != ~0u) { in lbc_write_reg()
892 sc->sc_ltesr ^= (val & sc->sc_ltesr); in lbc_write_reg()
897 sc->sc_ltesr = ~0u; in lbc_write_reg()
898 bus_space_write_4(sc->sc_bst, sc->sc_bsh, off, val); in lbc_write_reg()
905 struct lbc_softc *sc; in lbc_read_reg() local
916 sc = device_get_softc(dev); in lbc_read_reg()
918 if (off == LBC85XX_LTESR && sc->sc_ltesr != ~0U) in lbc_read_reg()
919 val = sc->sc_ltesr; in lbc_read_reg()
921 val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, off); in lbc_read_reg()