Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: add io_size plumbing

With small LMEM-BAR we need to be able to differentiate between the
total size of LMEM, and how much of it is CPU mappable. The end goal is
to be able to utilize the entire range, even if part of is it not CPU
accessible.

v2: also update intelfb_create

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Acked-by: Nirmoy Das <nirmoy.das@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220225145502.331818-1-matthew.auld@intel.com

+29 -17
+1 -1
drivers/gpu/drm/i915/display/intel_fbdev.c
··· 265 265 struct intel_memory_region *mem = obj->mm.region; 266 266 267 267 info->apertures->ranges[0].base = mem->io_start; 268 - info->apertures->ranges[0].size = mem->total; 268 + info->apertures->ranges[0].size = mem->io_size; 269 269 270 270 /* Use fbdev's framebuffer from lmem for discrete */ 271 271 info->fix.smem_start =
+1 -1
drivers/gpu/drm/i915/gem/i915_gem_shmem.c
··· 699 699 { 700 700 return intel_memory_region_create(i915, 0, 701 701 totalram_pages() << PAGE_SHIFT, 702 - PAGE_SIZE, 0, 702 + PAGE_SIZE, 0, 0, 703 703 type, instance, 704 704 &shmem_region_ops); 705 705 }
+5 -3
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
··· 492 492 493 493 /* Exclude the reserved region from driver use */ 494 494 mem->region.end = reserved_base - 1; 495 + mem->io_size = resource_size(&mem->region); 495 496 496 497 /* It is possible for the reserved area to end before the end of stolen 497 498 * memory, so just consider the start. */ ··· 752 751 753 752 if (!io_mapping_init_wc(&mem->iomap, 754 753 mem->io_start, 755 - resource_size(&mem->region))) 754 + mem->io_size)) 756 755 return -EIO; 757 756 758 757 /* ··· 807 806 I915_GTT_PAGE_SIZE_4K; 808 807 809 808 mem = intel_memory_region_create(i915, lmem_base, lmem_size, 810 - min_page_size, io_start, 809 + min_page_size, 810 + io_start, lmem_size, 811 811 type, instance, 812 812 &i915_region_stolen_lmem_ops); 813 813 if (IS_ERR(mem)) ··· 839 837 mem = intel_memory_region_create(i915, 840 838 intel_graphics_stolen_res.start, 841 839 resource_size(&intel_graphics_stolen_res), 842 - PAGE_SIZE, 0, type, instance, 840 + PAGE_SIZE, 0, 0, type, instance, 843 841 &i915_region_stolen_smem_ops); 844 842 if (IS_ERR(mem)) 845 843 return mem;
+1 -1
drivers/gpu/drm/i915/gem/i915_gem_ttm.c
··· 1103 1103 1104 1104 mr = intel_memory_region_create(i915, 0, 1105 1105 totalram_pages() << PAGE_SHIFT, 1106 - PAGE_SIZE, 0, 1106 + PAGE_SIZE, 0, 0, 1107 1107 type, instance, 1108 1108 &ttm_system_region_ops); 1109 1109 if (IS_ERR(mr))
+1 -1
drivers/gpu/drm/i915/gem/selftests/huge_pages.c
··· 500 500 int bit; 501 501 int err = 0; 502 502 503 - mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0); 503 + mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0, 0); 504 504 if (IS_ERR(mem)) { 505 505 pr_err("%s failed to create memory region\n", __func__); 506 506 return PTR_ERR(mem);
+4 -1
drivers/gpu/drm/i915/gt/intel_region_lmem.c
··· 32 32 33 33 if (!io_mapping_init_wc(&mem->iomap, 34 34 mem->io_start, 35 - resource_size(&mem->region))) 35 + mem->io_size)) 36 36 return -EIO; 37 37 38 38 ret = intel_region_ttm_init(mem); ··· 134 134 lmem_size, 135 135 min_page_size, 136 136 io_start, 137 + lmem_size, 137 138 INTEL_MEMORY_LOCAL, 138 139 0, 139 140 &intel_region_lmem_ops); ··· 148 147 drm_dbg(&i915->drm, "Local memory: %pR\n", &mem->region); 149 148 drm_dbg(&i915->drm, "Local memory IO start: %pa\n", 150 149 &mem->io_start); 150 + drm_info(&i915->drm, "Local memory IO size: %pa\n", 151 + &mem->io_size); 151 152 drm_info(&i915->drm, "Local memory available: %pa\n", 152 153 &lmem_size); 153 154
+4 -2
drivers/gpu/drm/i915/intel_memory_region.c
··· 100 100 resource_size_t last, page; 101 101 int err; 102 102 103 - if (resource_size(&mem->region) < PAGE_SIZE) 103 + if (mem->io_size < PAGE_SIZE) 104 104 return 0; 105 105 106 - last = resource_size(&mem->region) - PAGE_SIZE; 106 + last = mem->io_size - PAGE_SIZE; 107 107 108 108 /* 109 109 * Quick test to check read/write access to the iomap (backing store). ··· 221 221 resource_size_t size, 222 222 resource_size_t min_page_size, 223 223 resource_size_t io_start, 224 + resource_size_t io_size, 224 225 u16 type, 225 226 u16 instance, 226 227 const struct intel_memory_region_ops *ops) ··· 236 235 mem->i915 = i915; 237 236 mem->region = (struct resource)DEFINE_RES_MEM(start, size); 238 237 mem->io_start = io_start; 238 + mem->io_size = io_size; 239 239 mem->min_page_size = min_page_size; 240 240 mem->ops = ops; 241 241 mem->total = size;
+2
drivers/gpu/drm/i915/intel_memory_region.h
··· 68 68 struct resource region; 69 69 70 70 resource_size_t io_start; 71 + resource_size_t io_size; 71 72 resource_size_t min_page_size; 72 73 resource_size_t total; 73 74 resource_size_t avail; ··· 99 98 resource_size_t size, 100 99 resource_size_t min_page_size, 101 100 resource_size_t io_start, 101 + resource_size_t io_size, 102 102 u16 type, 103 103 u16 instance, 104 104 const struct intel_memory_region_ops *ops);
+4 -4
drivers/gpu/drm/i915/selftests/intel_memory_region.c
··· 170 170 if (!order) 171 171 return 0; 172 172 173 - mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0); 173 + mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0, 0); 174 174 if (IS_ERR(mem)) { 175 175 pr_err("failed to create memory region\n"); 176 176 err = PTR_ERR(mem); ··· 383 383 */ 384 384 385 385 size = (SZ_4G - 1) & PAGE_MASK; 386 - mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0); 386 + mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0, 0); 387 387 if (IS_ERR(mem)) 388 388 return PTR_ERR(mem); 389 389 ··· 471 471 */ 472 472 473 473 size = SZ_8G; 474 - mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0); 474 + mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0, 0); 475 475 if (IS_ERR(mem)) 476 476 return PTR_ERR(mem); 477 477 ··· 1188 1188 if (!i915) 1189 1189 return -ENOMEM; 1190 1190 1191 - mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0); 1191 + mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0, 0); 1192 1192 if (IS_ERR(mem)) { 1193 1193 pr_err("failed to create memory region\n"); 1194 1194 err = PTR_ERR(mem);
+4 -2
drivers/gpu/drm/i915/selftests/mock_region.c
··· 107 107 resource_size_t start, 108 108 resource_size_t size, 109 109 resource_size_t min_page_size, 110 - resource_size_t io_start) 110 + resource_size_t io_start, 111 + resource_size_t io_size) 111 112 { 112 113 int instance = ida_alloc_max(&i915->selftest.mock_region_instances, 113 114 TTM_NUM_MEM_TYPES - TTM_PL_PRIV - 1, ··· 118 117 return ERR_PTR(instance); 119 118 120 119 return intel_memory_region_create(i915, start, size, min_page_size, 121 - io_start, INTEL_MEMORY_MOCK, instance, 120 + io_start, io_size, 121 + INTEL_MEMORY_MOCK, instance, 122 122 &mock_region_ops); 123 123 }
+2 -1
drivers/gpu/drm/i915/selftests/mock_region.h
··· 16 16 resource_size_t start, 17 17 resource_size_t size, 18 18 resource_size_t min_page_size, 19 - resource_size_t io_start); 19 + resource_size_t io_start, 20 + resource_size_t io_size); 20 21 21 22 #endif /* !__MOCK_REGION_H */