Lines Matching +full:iommu +full:- +full:addresses
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
50 #include "ps3-hvcall.h"
128 /* IOMMU interface */
184 resource_list_init(&dinfo->resources); in ps3bus_resources_init()
187 thread = 32 - fls(mfctrl()); in ps3bus_resources_init()
204 lv1_connect_interrupt_event_receive_port(dinfo->bus, in ps3bus_resources_init()
205 dinfo->dev, outlet, irq); in ps3bus_resources_init()
215 irq_type, dinfo->bus, dinfo->dev); in ps3bus_resources_init()
219 resource_list_add(&dinfo->resources, SYS_RES_IRQ, i, in ps3bus_resources_init()
240 result = lv1_map_device_mmio_region(dinfo->bus, dinfo->dev, in ps3bus_resources_init()
245 "%d.%d (%ld.%ld): %d\n", dinfo->bus, dinfo->dev, in ps3bus_resources_init()
246 dinfo->bustype, dinfo->devtype, result); in ps3bus_resources_init()
250 rman_manage_region(rm, paddr, paddr + len - 1); in ps3bus_resources_init()
251 resource_list_add(&dinfo->resources, SYS_RES_MEMORY, i, in ps3bus_resources_init()
266 resource_list_init(&dinfo->resources); in ps3bus_resources_init_by_type()
269 thread = 32 - fls(mfctrl()); in ps3bus_resources_init_by_type()
287 resource_list_add(&dinfo->resources, SYS_RES_IRQ, i, in ps3bus_resources_init_by_type()
311 result = lv1_map_device_mmio_region(dinfo->bus, dinfo->dev, in ps3bus_resources_init_by_type()
316 "%d.%d (%ld.%ld): %d\n", dinfo->bus, dinfo->dev, in ps3bus_resources_init_by_type()
317 dinfo->bustype, dinfo->devtype, result); in ps3bus_resources_init_by_type()
321 rman_manage_region(rm, paddr, paddr + len - 1); in ps3bus_resources_init_by_type()
322 resource_list_add(&dinfo->resources, SYS_RES_MEMORY, i, in ps3bus_resources_init_by_type()
339 sc->sc_mem_rman.rm_type = RMAN_ARRAY; in ps3bus_attach()
340 sc->sc_mem_rman.rm_descr = "PS3Bus Memory Mapped I/O"; in ps3bus_attach()
341 sc->sc_intr_rman.rm_type = RMAN_ARRAY; in ps3bus_attach()
342 sc->sc_intr_rman.rm_descr = "PS3Bus Interrupts"; in ps3bus_attach()
343 rman_init(&sc->sc_mem_rman); in ps3bus_attach()
344 rman_init(&sc->sc_intr_rman); in ps3bus_attach()
345 rman_manage_region(&sc->sc_intr_rman, 0, ~0); in ps3bus_attach()
348 mem_regions(&sc->regions, &sc->rcount, NULL, NULL); in ps3bus_attach()
401 dinfo->bus = bus; in ps3bus_attach()
402 dinfo->dev = dev; in ps3bus_attach()
403 dinfo->bustype = bustype; in ps3bus_attach()
404 dinfo->devtype = devtype; in ps3bus_attach()
405 dinfo->busidx = bus_index; in ps3bus_attach()
406 dinfo->devidx = dev_index; in ps3bus_attach()
408 ps3bus_resources_init_by_type(&sc->sc_mem_rman, bus_index, in ps3bus_attach()
419 mtx_init(&dinfo->iommu_mtx, "iommu", NULL, MTX_DEF); in ps3bus_attach()
427 dinfo->bus = bus; in ps3bus_attach()
428 dinfo->dev = dev; in ps3bus_attach()
429 dinfo->bustype = bustype; in ps3bus_attach()
430 dinfo->devtype = devtype; in ps3bus_attach()
431 dinfo->busidx = bus_index; in ps3bus_attach()
432 dinfo->devidx = dev_index; in ps3bus_attach()
434 ps3bus_resources_init_by_type(&sc->sc_mem_rman, bus_index, in ps3bus_attach()
445 mtx_init(&dinfo->iommu_mtx, "iommu", NULL, MTX_DEF); in ps3bus_attach()
452 dinfo->bus = bus; in ps3bus_attach()
453 dinfo->dev = dev; in ps3bus_attach()
454 dinfo->bustype = bustype; in ps3bus_attach()
455 dinfo->devtype = devtype; in ps3bus_attach()
456 dinfo->busidx = bus_index; in ps3bus_attach()
457 dinfo->devidx = dev_index; in ps3bus_attach()
459 if (dinfo->bustype == PS3_BUSTYPE_SYSBUS || in ps3bus_attach()
460 dinfo->bustype == PS3_BUSTYPE_STORAGE) in ps3bus_attach()
463 ps3bus_resources_init(&sc->sc_mem_rman, bus_index, in ps3bus_attach()
474 mtx_init(&dinfo->iommu_mtx, "iommu", NULL, MTX_DEF); in ps3bus_attach()
493 retval += resource_list_print_type(&dinfo->resources, "mem", in ps3bus_print_child()
495 retval += resource_list_print_type(&dinfo->resources, "irq", in ps3bus_print_child()
510 *result = dinfo->bus; in ps3bus_read_ivar()
513 *result = dinfo->dev; in ps3bus_read_ivar()
516 *result = dinfo->bustype; in ps3bus_read_ivar()
519 *result = dinfo->devtype; in ps3bus_read_ivar()
522 *result = dinfo->busidx; in ps3bus_read_ivar()
525 *result = dinfo->devidx; in ps3bus_read_ivar()
542 return (&sc->sc_mem_rman); in ps3bus_get_rman()
544 return (&sc->sc_intr_rman); in ps3bus_get_rman()
562 rle = resource_list_find(&dinfo->resources, SYS_RES_MEMORY, in ps3bus_alloc_resource()
570 if (start < rle->start) in ps3bus_alloc_resource()
571 adjstart = rle->start; in ps3bus_alloc_resource()
572 else if (start > rle->end) in ps3bus_alloc_resource()
573 adjstart = rle->end; in ps3bus_alloc_resource()
577 if (end < rle->start) in ps3bus_alloc_resource()
578 adjend = rle->start; in ps3bus_alloc_resource()
579 else if (end > rle->end) in ps3bus_alloc_resource()
580 adjend = rle->end; in ps3bus_alloc_resource()
584 adjcount = adjend - adjstart; in ps3bus_alloc_resource()
587 rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, in ps3bus_alloc_resource()
589 adjstart = rle->start; in ps3bus_alloc_resource()
590 adjcount = ulmax(count, rle->count); in ps3bus_alloc_resource()
591 adjend = ulmax(rle->end, rle->start + adjcount - 1); in ps3bus_alloc_resource()
631 map->r_vaddr = pmap_mapdev_attr(start, length, args.memattr); in ps3bus_map_resource()
632 if (map->r_vaddr == NULL) in ps3bus_map_resource()
634 map->r_bustag = &bs_be_tag; in ps3bus_map_resource()
635 map->r_bushandle = (vm_offset_t)map->r_vaddr; in ps3bus_map_resource()
636 map->r_size = length; in ps3bus_map_resource()
647 pmap_unmapdev(map->r_vaddr, map->r_size); in ps3bus_unmap_resource()
661 if (dinfo->bustype != PS3_BUSTYPE_SYSBUS && in ps3bus_get_dma_tag()
662 dinfo->bustype != PS3_BUSTYPE_STORAGE) in ps3bus_get_dma_tag()
665 mtx_lock(&dinfo->iommu_mtx); in ps3bus_get_dma_tag()
666 if (dinfo->dma_tag != NULL) { in ps3bus_get_dma_tag()
667 mtx_unlock(&dinfo->iommu_mtx); in ps3bus_get_dma_tag()
668 return (dinfo->dma_tag); in ps3bus_get_dma_tag()
671 flags = 0; /* 32-bit mode */ in ps3bus_get_dma_tag()
672 if (dinfo->bustype == PS3_BUSTYPE_SYSBUS && in ps3bus_get_dma_tag()
673 dinfo->devtype == PS3_DEVTYPE_USB) in ps3bus_get_dma_tag()
674 flags = 2; /* 8-bit mode */ in ps3bus_get_dma_tag()
677 if (dinfo->bustype == PS3_BUSTYPE_STORAGE) in ps3bus_get_dma_tag()
680 for (i = 0; i < sc->rcount; i++) { in ps3bus_get_dma_tag()
681 err = lv1_allocate_device_dma_region(dinfo->bus, dinfo->dev, in ps3bus_get_dma_tag()
682 sc->regions[i].mr_size, pagesize, flags, in ps3bus_get_dma_tag()
683 &dinfo->dma_base[i]); in ps3bus_get_dma_tag()
690 err = lv1_map_device_dma_region(dinfo->bus, dinfo->dev, in ps3bus_get_dma_tag()
691 sc->regions[i].mr_start, dinfo->dma_base[i], in ps3bus_get_dma_tag()
692 sc->regions[i].mr_size, in ps3bus_get_dma_tag()
704 0, NULL, NULL, &dinfo->dma_tag); in ps3bus_get_dma_tag()
707 * Note: storage devices have IOMMU mappings set up by the hypervisor, in ps3bus_get_dma_tag()
708 * but use physical, non-translated addresses. The above IOMMU in ps3bus_get_dma_tag()
710 * the mappings, but actual DMA mappings should not use the IOMMU in ps3bus_get_dma_tag()
713 if (dinfo->bustype != PS3_BUSTYPE_STORAGE) in ps3bus_get_dma_tag()
714 bus_dma_tag_set_iommu(dinfo->dma_tag, dev, dinfo); in ps3bus_get_dma_tag()
717 mtx_unlock(&dinfo->iommu_mtx); in ps3bus_get_dma_tag()
722 return (dinfo->dma_tag); in ps3bus_get_dma_tag()
735 for (j = 0; j < sc->rcount; j++) { in ps3_iommu_map()
736 if (segs[i].ds_addr >= sc->regions[j].mr_start && in ps3_iommu_map()
737 segs[i].ds_addr < sc->regions[j].mr_start + in ps3_iommu_map()
738 sc->regions[j].mr_size) in ps3_iommu_map()
741 KASSERT(j < sc->rcount, in ps3_iommu_map()
745 segs[i].ds_addr = dinfo->dma_base[j] + in ps3_iommu_map()
746 (segs[i].ds_addr - sc->regions[j].mr_start); in ps3_iommu_map()
771 ts->tv_sec = rtc + Y2K; in ps3_gettime()
772 ts->tv_nsec = 0; in ps3_gettime()
779 return (-1); in ps3_settime()