drm/i915: Use struct resource for memory region IO as well
authorjsg <jsg@openbsd.org>
Mon, 12 Aug 2024 23:55:26 +0000 (23:55 +0000)
committerjsg <jsg@openbsd.org>
Mon, 12 Aug 2024 23:55:26 +0000 (23:55 +0000)
From Ville Syrjala
3c0fa9f4ec220d4a6fac1b80c231c38cf6d0934d in mainline linux

13 files changed:
sys/dev/pci/drm/i915/display/intel_fbdev.c
sys/dev/pci/drm/i915/gem/i915_gem_region.c
sys/dev/pci/drm/i915/gem/i915_gem_stolen.c
sys/dev/pci/drm/i915/gem/i915_gem_ttm.c
sys/dev/pci/drm/i915/gem/selftests/i915_gem_mman.c
sys/dev/pci/drm/i915/gt/intel_region_lmem.c
sys/dev/pci/drm/i915/gt/selftest_tlb.c
sys/dev/pci/drm/i915/i915_gpu_error.c
sys/dev/pci/drm/i915/i915_query.c
sys/dev/pci/drm/i915/intel_memory_region.c
sys/dev/pci/drm/i915/intel_memory_region.h
sys/dev/pci/drm/i915/intel_region_ttm.c
sys/dev/pci/drm/i915/selftests/intel_memory_region.c

index 1a499f2..63f6bba 100644 (file)
@@ -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 {
index a4fb577..b09b74a 100644 (file)
@@ -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);
 
index b02b902..e20f234 100644 (file)
@@ -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);
index fc99a31..289e834 100644 (file)
@@ -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;
index 4d18770..d6c520f 100644 (file)
@@ -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;
        }
index 6b6143e..2516626 100644 (file)
@@ -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",
index 7e41f69..69fdf9c 100644 (file)
@@ -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);
 }
index 387b9e7..64e4571 100644 (file)
@@ -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;
                        }
index e723aa8..3c05f1f 100644 (file)
@@ -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;
 
index 9c941bf..6adbbc1 100644 (file)
@@ -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;
index 935f299..f786141 100644 (file)
@@ -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;
 
index 08439a9..fb6e245 100644 (file)
@@ -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;
                }
        }
 
index 576f4a4..31899cd 100644 (file)
@@ -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;