From 525716872e740266939dcda4f97c5c6607b3cf8e Mon Sep 17 00:00:00 2001 From: jsg Date: Mon, 12 Aug 2024 23:55:26 +0000 Subject: [PATCH] drm/i915: Use struct resource for memory region IO as well From Ville Syrjala 3c0fa9f4ec220d4a6fac1b80c231c38cf6d0934d in mainline linux --- sys/dev/pci/drm/i915/display/intel_fbdev.c | 2 +- sys/dev/pci/drm/i915/gem/i915_gem_region.c | 2 +- sys/dev/pci/drm/i915/gem/i915_gem_stolen.c | 33 ++++++++++--------- sys/dev/pci/drm/i915/gem/i915_gem_ttm.c | 10 +++--- .../drm/i915/gem/selftests/i915_gem_mman.c | 18 +++++----- sys/dev/pci/drm/i915/gt/intel_region_lmem.c | 25 ++++++-------- sys/dev/pci/drm/i915/gt/selftest_tlb.c | 4 +-- sys/dev/pci/drm/i915/i915_gpu_error.c | 2 +- sys/dev/pci/drm/i915/i915_query.c | 2 +- sys/dev/pci/drm/i915/intel_memory_region.c | 15 ++++----- sys/dev/pci/drm/i915/intel_memory_region.h | 3 +- sys/dev/pci/drm/i915/intel_region_ttm.c | 8 ++--- .../drm/i915/selftests/intel_memory_region.c | 4 +-- 13 files changed, 61 insertions(+), 67 deletions(-) diff --git a/sys/dev/pci/drm/i915/display/intel_fbdev.c b/sys/dev/pci/drm/i915/display/intel_fbdev.c index 1a499f2c6cf..63f6bba7df8 100644 --- a/sys/dev/pci/drm/i915/display/intel_fbdev.c +++ b/sys/dev/pci/drm/i915/display/intel_fbdev.c @@ -294,7 +294,7 @@ static int intelfb_create(struct drm_fb_helper *helper, /* Use fbdev's framebuffer from lmem for discrete */ info->fix.smem_start = - (unsigned long)(mem->io_start + + (unsigned long)(mem->io.start + i915_gem_object_get_dma_address(obj, 0)); info->fix.smem_len = obj->base.size; } else { diff --git a/sys/dev/pci/drm/i915/gem/i915_gem_region.c b/sys/dev/pci/drm/i915/gem/i915_gem_region.c index a4fb577eceb..b09b74a2448 100644 --- a/sys/dev/pci/drm/i915/gem/i915_gem_region.c +++ b/sys/dev/pci/drm/i915/gem/i915_gem_region.c @@ -129,7 +129,7 @@ i915_gem_object_create_region_at(struct intel_memory_region *mem, return ERR_PTR(-EINVAL); if (!(flags & I915_BO_ALLOC_GPU_ONLY) && - offset + size > mem->io_size && + offset + size > resource_size(&mem->io) && !i915_ggtt_has_aperture(to_gt(mem->i915)->ggtt)) return ERR_PTR(-ENOSPC); diff --git a/sys/dev/pci/drm/i915/gem/i915_gem_stolen.c b/sys/dev/pci/drm/i915/gem/i915_gem_stolen.c index b02b9028c54..e20f2346871 100644 --- a/sys/dev/pci/drm/i915/gem/i915_gem_stolen.c +++ b/sys/dev/pci/drm/i915/gem/i915_gem_stolen.c @@ -545,7 +545,9 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem) /* Exclude the reserved region from driver use */ mem->region.end = i915->dsm.reserved.start - 1; - mem->io_size = min(mem->io_size, resource_size(&mem->region)); + mem->io = DEFINE_RES_MEM(mem->io.start, + min(resource_size(&mem->io), + resource_size(&mem->region))); i915->dsm.usable_size = resource_size(&mem->region); @@ -756,7 +758,7 @@ static int _i915_gem_object_stolen_init(struct intel_memory_region *mem, * With discrete devices, where we lack a mappable aperture there is no * possible way to ever access this memory on the CPU side. */ - if (mem->type == INTEL_MEMORY_STOLEN_LOCAL && !mem->io_size && + if (mem->type == INTEL_MEMORY_STOLEN_LOCAL && !resource_size(&mem->io) && !(flags & I915_BO_ALLOC_GPU_ONLY)) return -ENOSPC; @@ -843,37 +845,36 @@ static int init_stolen_lmem(struct intel_memory_region *mem) } #ifdef __linux__ - if (mem->io_size && - !io_mapping_init_wc(&mem->iomap, mem->io_start, mem->io_size)) + if (resource_size(&mem->io) && + !io_mapping_init_wc(&mem->iomap, mem->io.start, resource_size(&mem->io))) goto err_cleanup; #else - if (mem->io_size) { + if (resource_size(&mem->io)) { paddr_t start, end; struct vm_page *pgs; int i; bus_space_handle_t bsh; - start = atop(mem->io_start); - end = start + atop(mem->io_size); + start = atop(mem->io.start); + end = start + atop(resource_size(&mem->io)); uvm_page_physload(start, end, start, end, PHYSLOAD_DEVICE); - pgs = PHYS_TO_VM_PAGE(mem->io_start); - for (i = 0; i < atop(mem->io_size); i++) + pgs = PHYS_TO_VM_PAGE(mem->io.start); + for (i = 0; i < atop(resource_size(&mem->io)); i++) atomic_setbits_int(&(pgs[i].pg_flags), PG_PMAP_WC); - if (bus_space_map(i915->bst, mem->io_start, mem->io_size, + if (bus_space_map(i915->bst, mem->io.start, resource_size(&mem->io), BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE, &bsh)) panic("can't map stolen lmem"); - mem->iomap.base = mem->io_start; - mem->iomap.size = mem->io_size; + mem->iomap.base = mem->io.start; + mem->iomap.size = resource_size(&mem->io); mem->iomap.iomem = bus_space_vaddr(i915->bst, bsh); } #endif - drm_dbg(&i915->drm, "Stolen Local memory IO start: %pa\n", - &mem->io_start); - drm_dbg(&i915->drm, "Stolen Local DSM base: %pa\n", &mem->region.start); + drm_dbg(&i915->drm, "Stolen Local DSM: %pR\n", &mem->region); + drm_dbg(&i915->drm, "Stolen Local memory IO: %pR\n", &mem->io); return 0; #ifdef __linux__ @@ -887,7 +888,7 @@ static int release_stolen_lmem(struct intel_memory_region *mem) { STUB(); #ifdef notyet - if (mem->io_size) + if (resource_size(&mem->io)) io_mapping_fini(&mem->iomap); #endif i915_gem_cleanup_stolen(mem->i915); diff --git a/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c b/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c index fc99a31b461..289e834e6cf 100644 --- a/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c +++ b/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c @@ -144,13 +144,13 @@ i915_ttm_place_from_region(const struct intel_memory_region *mr, place->fpfn = offset >> PAGE_SHIFT; WARN_ON(overflows_type(place->fpfn + (size >> PAGE_SHIFT), place->lpfn)); place->lpfn = place->fpfn + (size >> PAGE_SHIFT); - } else if (mr->io_size && mr->io_size < mr->total) { + } else if (resource_size(&mr->io) && resource_size(&mr->io) < mr->total) { if (flags & I915_BO_ALLOC_GPU_ONLY) { place->flags |= TTM_PL_FLAG_TOPDOWN; } else { place->fpfn = 0; - WARN_ON(overflows_type(mr->io_size >> PAGE_SHIFT, place->lpfn)); - place->lpfn = mr->io_size >> PAGE_SHIFT; + WARN_ON(overflows_type(resource_size(&mr->io) >> PAGE_SHIFT, place->lpfn)); + place->lpfn = resource_size(&mr->io) >> PAGE_SHIFT; } } } @@ -1121,7 +1121,7 @@ static vm_fault_t vm_fault_ttm(struct vm_fault *vmf) struct intel_memory_region *mr = obj->mm.placements[i]; unsigned int flags; - if (!mr->io_size && mr->type != INTEL_MEMORY_SYSTEM) + if (!resource_size(&mr->io) && mr->type != INTEL_MEMORY_SYSTEM) continue; flags = obj->flags; @@ -1295,7 +1295,7 @@ vm_fault_ttm(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, struct intel_memory_region *mr = obj->mm.placements[i]; unsigned int flags; - if (!mr->io_size && mr->type != INTEL_MEMORY_SYSTEM) + if (!resource_size(&mr->io) && mr->type != INTEL_MEMORY_SYSTEM) continue; flags = obj->flags; diff --git a/sys/dev/pci/drm/i915/gem/selftests/i915_gem_mman.c b/sys/dev/pci/drm/i915/gem/selftests/i915_gem_mman.c index 4d187704ede..d6c520f24b6 100644 --- a/sys/dev/pci/drm/i915/gem/selftests/i915_gem_mman.c +++ b/sys/dev/pci/drm/i915/gem/selftests/i915_gem_mman.c @@ -1052,7 +1052,7 @@ static int igt_fill_mappable(struct intel_memory_region *mr, int err; total = 0; - size = mr->io_size; + size = resource_size(&mr->io); do { struct drm_i915_gem_object *obj; @@ -1313,28 +1313,28 @@ static int igt_mmap_migrate(void *arg) struct intel_memory_region *mixed[] = { mr, system }; struct intel_memory_region *single[] = { mr }; struct ttm_resource_manager *man = mr->region_private; - resource_size_t saved_io_size; + struct resource saved_io; int err; if (mr->private) continue; - if (!mr->io_size) + if (!resource_size(&mr->io)) continue; /* * For testing purposes let's force small BAR, if not already * present. */ - saved_io_size = mr->io_size; - if (mr->io_size == mr->total) { - resource_size_t io_size = mr->io_size; + saved_io = mr->io; + if (resource_size(&mr->io) == mr->total) { + resource_size_t io_size = resource_size(&mr->io); io_size = rounddown_pow_of_two(io_size >> 1); if (io_size < PAGE_SIZE) continue; - mr->io_size = io_size; + mr->io = DEFINE_RES_MEM(mr->io.start, io_size); i915_ttm_buddy_man_force_visible_size(man, io_size >> PAGE_SHIFT); } @@ -1394,9 +1394,9 @@ static int igt_mmap_migrate(void *arg) IGT_MMAP_MIGRATE_FAIL_GPU | IGT_MMAP_MIGRATE_UNFAULTABLE); out_io_size: - mr->io_size = saved_io_size; + mr->io = saved_io; i915_ttm_buddy_man_force_visible_size(man, - mr->io_size >> PAGE_SHIFT); + resource_size(&mr->io) >> PAGE_SHIFT); if (err) return err; } diff --git a/sys/dev/pci/drm/i915/gt/intel_region_lmem.c b/sys/dev/pci/drm/i915/gt/intel_region_lmem.c index 6b6143eeb5a..2516626adbf 100644 --- a/sys/dev/pci/drm/i915/gt/intel_region_lmem.c +++ b/sys/dev/pci/drm/i915/gt/intel_region_lmem.c @@ -157,8 +157,8 @@ region_lmem_init(struct intel_memory_region *mem) #ifdef __linux__ if (!io_mapping_init_wc(&mem->iomap, - mem->io_start, - mem->io_size)) + mem->io.start, + resource_size(&mem->io))) return -EIO; #else struct drm_i915_private *i915 = mem->i915; @@ -167,20 +167,20 @@ region_lmem_init(struct intel_memory_region *mem) int i; bus_space_handle_t bsh; - start = atop(mem->io_start); - end = start + atop(mem->io_size); + start = atop(mem->io.start); + end = start + atop(resource_size(&mem->io)); uvm_page_physload(start, end, start, end, PHYSLOAD_DEVICE); - pgs = PHYS_TO_VM_PAGE(mem->io_start); - for (i = 0; i < atop(mem->io_size); i++) + pgs = PHYS_TO_VM_PAGE(mem->io.start); + for (i = 0; i < atop(resource_size(&mem->io)); i++) atomic_setbits_int(&(pgs[i].pg_flags), PG_PMAP_WC); - if (bus_space_map(i915->bst, mem->io_start, mem->io_size, + if (bus_space_map(i915->bst, mem->io.start, resource_size(&mem->io), BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE, &bsh)) panic("can't map lmem"); - mem->iomap.base = mem->io_start; - mem->iomap.size = mem->io_size; + mem->iomap.base = mem->io.start; + mem->iomap.size = resource_size(&mem->io); mem->iomap.iomem = bus_space_vaddr(i915->bst, bsh); #endif @@ -327,12 +327,7 @@ static struct intel_memory_region *setup_lmem(struct intel_gt *gt) goto err_region_put; drm_dbg(&i915->drm, "Local memory: %pR\n", &mem->region); - drm_dbg(&i915->drm, "Local memory IO start: %pa\n", - &mem->io_start); - drm_info(&i915->drm, "Local memory IO size: %pa\n", - &mem->io_size); - drm_info(&i915->drm, "Local memory available: %pa\n", - &lmem_size); + drm_dbg(&i915->drm, "Local memory IO: %pR\n", &mem->io); if (io_size < lmem_size) drm_info(&i915->drm, "Using a reduced BAR size of %lluMiB. Consider enabling 'Resizable BAR' or similar, if available in the BIOS.\n", diff --git a/sys/dev/pci/drm/i915/gt/selftest_tlb.c b/sys/dev/pci/drm/i915/gt/selftest_tlb.c index 7e41f69fc81..69fdf9c5e33 100644 --- a/sys/dev/pci/drm/i915/gt/selftest_tlb.c +++ b/sys/dev/pci/drm/i915/gt/selftest_tlb.c @@ -199,8 +199,8 @@ static struct drm_i915_gem_object *create_lmem(struct intel_gt *gt) * of pages. To succeed with both allocations, especially in case of Small * BAR, try to allocate no more than quarter of mappable memory. */ - if (mr && size > mr->io_size / 4) - size = mr->io_size / 4; + if (mr && size > resource_size(&mr->io) / 4) + size = resource_size(&mr->io) / 4; return i915_gem_object_create_lmem(gt->i915, size, I915_BO_ALLOC_CONTIGUOUS); } diff --git a/sys/dev/pci/drm/i915/i915_gpu_error.c b/sys/dev/pci/drm/i915/i915_gpu_error.c index 387b9e778b6..64e4571e7d0 100644 --- a/sys/dev/pci/drm/i915/i915_gpu_error.c +++ b/sys/dev/pci/drm/i915/i915_gpu_error.c @@ -1206,7 +1206,7 @@ i915_vma_coredump_create(const struct intel_gt *gt, dma_addr_t offset = dma - mem->region.start; void __iomem *s; - if (offset + PAGE_SIZE > mem->io_size) { + if (offset + PAGE_SIZE > resource_size(&mem->io)) { ret = -EINVAL; break; } diff --git a/sys/dev/pci/drm/i915/i915_query.c b/sys/dev/pci/drm/i915/i915_query.c index e723aa85e3c..3c05f1ffcd4 100644 --- a/sys/dev/pci/drm/i915/i915_query.c +++ b/sys/dev/pci/drm/i915/i915_query.c @@ -513,7 +513,7 @@ static int query_memregion_info(struct drm_i915_private *i915, info.probed_size = mr->total; if (mr->type == INTEL_MEMORY_LOCAL) - info.probed_cpu_visible_size = mr->io_size; + info.probed_cpu_visible_size = resource_size(&mr->io); else info.probed_cpu_visible_size = mr->total; diff --git a/sys/dev/pci/drm/i915/intel_memory_region.c b/sys/dev/pci/drm/i915/intel_memory_region.c index 9c941bfe5eb..6adbbc15dc5 100644 --- a/sys/dev/pci/drm/i915/intel_memory_region.c +++ b/sys/dev/pci/drm/i915/intel_memory_region.c @@ -50,7 +50,7 @@ static int __iopagetest(struct intel_memory_region *mem, if (memchr_inv(result, value, sizeof(result))) { dev_err(mem->i915->drm.dev, "Failed to read back from memory region:%pR at [%pa + %pa] for %ps; wrote %x, read (%x, %x, %x)\n", - &mem->region, &mem->io_start, &offset, caller, + &mem->region, &mem->io.start, &offset, caller, value, result[0], result[1], result[2]); return -EINVAL; } @@ -70,11 +70,11 @@ static int iopagetest(struct intel_memory_region *mem, int err; int i; - va = ioremap_wc(mem->io_start + offset, PAGE_SIZE); + va = ioremap_wc(mem->io.start + offset, PAGE_SIZE); if (!va) { dev_err(mem->i915->drm.dev, "Failed to ioremap memory region [%pa + %pa] for %ps\n", - &mem->io_start, &offset, caller); + &mem->io.start, &offset, caller); return -EFAULT; } @@ -106,10 +106,10 @@ static int iomemtest(struct intel_memory_region *mem, resource_size_t last, page; int err; - if (mem->io_size < PAGE_SIZE) + if (resource_size(&mem->io) < PAGE_SIZE) return 0; - last = mem->io_size - PAGE_SIZE; + last = resource_size(&mem->io) - PAGE_SIZE; /* * Quick test to check read/write access to the iomap (backing store). @@ -211,7 +211,7 @@ static int intel_memory_region_memtest(struct intel_memory_region *mem, struct drm_i915_private *i915 = mem->i915; int err = 0; - if (!mem->io_start) + if (!mem->io.start) return 0; if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) || i915->params.memtest) @@ -240,8 +240,7 @@ intel_memory_region_create(struct drm_i915_private *i915, mem->i915 = i915; mem->region = DEFINE_RES_MEM(start, size); - mem->io_start = io_start; - mem->io_size = io_size; + mem->io = DEFINE_RES_MEM(io_start, io_size); mem->min_page_size = min_page_size; mem->ops = ops; mem->total = size; diff --git a/sys/dev/pci/drm/i915/intel_memory_region.h b/sys/dev/pci/drm/i915/intel_memory_region.h index 935f299db32..f7861414174 100644 --- a/sys/dev/pci/drm/i915/intel_memory_region.h +++ b/sys/dev/pci/drm/i915/intel_memory_region.h @@ -73,8 +73,7 @@ struct intel_memory_region { struct io_mapping iomap; struct resource region; - resource_size_t io_start; - resource_size_t io_size; + struct resource io; resource_size_t min_page_size; resource_size_t total; diff --git a/sys/dev/pci/drm/i915/intel_region_ttm.c b/sys/dev/pci/drm/i915/intel_region_ttm.c index 08439a9630a..fb6e245495f 100644 --- a/sys/dev/pci/drm/i915/intel_region_ttm.c +++ b/sys/dev/pci/drm/i915/intel_region_ttm.c @@ -93,7 +93,7 @@ int intel_region_ttm_init(struct intel_memory_region *mem) ret = i915_ttm_buddy_man_init(bdev, mem_type, false, resource_size(&mem->region), - mem->io_size, + resource_size(&mem->io), mem->min_page_size, PAGE_SIZE); if (ret) return ret; @@ -225,16 +225,16 @@ intel_region_ttm_resource_alloc(struct intel_memory_region *mem, goto out; } place.lpfn = place.fpfn + (size >> PAGE_SHIFT); - } else if (mem->io_size && mem->io_size < mem->total) { + } else if (resource_size(&mem->io) && resource_size(&mem->io) < mem->total) { if (flags & I915_BO_ALLOC_GPU_ONLY) { place.flags |= TTM_PL_FLAG_TOPDOWN; } else { place.fpfn = 0; - if (WARN_ON(overflows_type(mem->io_size >> PAGE_SHIFT, place.lpfn))) { + if (WARN_ON(overflows_type(resource_size(&mem->io) >> PAGE_SHIFT, place.lpfn))) { ret = -E2BIG; goto out; } - place.lpfn = mem->io_size >> PAGE_SHIFT; + place.lpfn = resource_size(&mem->io) >> PAGE_SHIFT; } } diff --git a/sys/dev/pci/drm/i915/selftests/intel_memory_region.c b/sys/dev/pci/drm/i915/selftests/intel_memory_region.c index 576f4a43a35..31899cd71e5 100644 --- a/sys/dev/pci/drm/i915/selftests/intel_memory_region.c +++ b/sys/dev/pci/drm/i915/selftests/intel_memory_region.c @@ -544,8 +544,8 @@ static u64 igt_object_mappable_total(struct drm_i915_gem_object *obj) u64 start = drm_buddy_block_offset(block); u64 end = start + drm_buddy_block_size(mm, block); - if (start < mr->io_size) - total += min_t(u64, end, mr->io_size) - start; + if (start < resource_size(&mr->io)) + total += min_t(u64, end, resource_size(&mr->io)) - start; } return total; -- 2.20.1