Commit 235582ca authored by Matthew Auld's avatar Matthew Auld

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: default avatarMatthew Auld <matthew.auld@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
Acked-by: default avatarNirmoy Das <nirmoy.das@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220225145502.331818-1-matthew.auld@intel.com
parent d2cc01e1
...@@ -265,7 +265,7 @@ static int intelfb_create(struct drm_fb_helper *helper, ...@@ -265,7 +265,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
struct intel_memory_region *mem = obj->mm.region; struct intel_memory_region *mem = obj->mm.region;
info->apertures->ranges[0].base = mem->io_start; info->apertures->ranges[0].base = mem->io_start;
info->apertures->ranges[0].size = mem->total; info->apertures->ranges[0].size = mem->io_size;
/* Use fbdev's framebuffer from lmem for discrete */ /* Use fbdev's framebuffer from lmem for discrete */
info->fix.smem_start = info->fix.smem_start =
......
...@@ -699,7 +699,7 @@ struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915, ...@@ -699,7 +699,7 @@ struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915,
{ {
return intel_memory_region_create(i915, 0, return intel_memory_region_create(i915, 0,
totalram_pages() << PAGE_SHIFT, totalram_pages() << PAGE_SHIFT,
PAGE_SIZE, 0, PAGE_SIZE, 0, 0,
type, instance, type, instance,
&shmem_region_ops); &shmem_region_ops);
} }
......
...@@ -492,6 +492,7 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem) ...@@ -492,6 +492,7 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem)
/* Exclude the reserved region from driver use */ /* Exclude the reserved region from driver use */
mem->region.end = reserved_base - 1; mem->region.end = reserved_base - 1;
mem->io_size = resource_size(&mem->region);
/* It is possible for the reserved area to end before the end of stolen /* It is possible for the reserved area to end before the end of stolen
* memory, so just consider the start. */ * memory, so just consider the start. */
...@@ -751,7 +752,7 @@ static int init_stolen_lmem(struct intel_memory_region *mem) ...@@ -751,7 +752,7 @@ static int init_stolen_lmem(struct intel_memory_region *mem)
if (!io_mapping_init_wc(&mem->iomap, if (!io_mapping_init_wc(&mem->iomap,
mem->io_start, mem->io_start,
resource_size(&mem->region))) mem->io_size))
return -EIO; return -EIO;
/* /*
...@@ -806,7 +807,8 @@ i915_gem_stolen_lmem_setup(struct drm_i915_private *i915, u16 type, ...@@ -806,7 +807,8 @@ i915_gem_stolen_lmem_setup(struct drm_i915_private *i915, u16 type,
I915_GTT_PAGE_SIZE_4K; I915_GTT_PAGE_SIZE_4K;
mem = intel_memory_region_create(i915, lmem_base, lmem_size, mem = intel_memory_region_create(i915, lmem_base, lmem_size,
min_page_size, io_start, min_page_size,
io_start, lmem_size,
type, instance, type, instance,
&i915_region_stolen_lmem_ops); &i915_region_stolen_lmem_ops);
if (IS_ERR(mem)) if (IS_ERR(mem))
...@@ -837,7 +839,7 @@ i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type, ...@@ -837,7 +839,7 @@ i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type,
mem = intel_memory_region_create(i915, mem = intel_memory_region_create(i915,
intel_graphics_stolen_res.start, intel_graphics_stolen_res.start,
resource_size(&intel_graphics_stolen_res), resource_size(&intel_graphics_stolen_res),
PAGE_SIZE, 0, type, instance, PAGE_SIZE, 0, 0, type, instance,
&i915_region_stolen_smem_ops); &i915_region_stolen_smem_ops);
if (IS_ERR(mem)) if (IS_ERR(mem))
return mem; return mem;
......
...@@ -1103,7 +1103,7 @@ i915_gem_ttm_system_setup(struct drm_i915_private *i915, ...@@ -1103,7 +1103,7 @@ i915_gem_ttm_system_setup(struct drm_i915_private *i915,
mr = intel_memory_region_create(i915, 0, mr = intel_memory_region_create(i915, 0,
totalram_pages() << PAGE_SHIFT, totalram_pages() << PAGE_SHIFT,
PAGE_SIZE, 0, PAGE_SIZE, 0, 0,
type, instance, type, instance,
&ttm_system_region_ops); &ttm_system_region_ops);
if (IS_ERR(mr)) if (IS_ERR(mr))
......
...@@ -500,7 +500,7 @@ static int igt_mock_memory_region_huge_pages(void *arg) ...@@ -500,7 +500,7 @@ static int igt_mock_memory_region_huge_pages(void *arg)
int bit; int bit;
int err = 0; int err = 0;
mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0); mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0, 0);
if (IS_ERR(mem)) { if (IS_ERR(mem)) {
pr_err("%s failed to create memory region\n", __func__); pr_err("%s failed to create memory region\n", __func__);
return PTR_ERR(mem); return PTR_ERR(mem);
......
...@@ -32,7 +32,7 @@ region_lmem_init(struct intel_memory_region *mem) ...@@ -32,7 +32,7 @@ region_lmem_init(struct intel_memory_region *mem)
if (!io_mapping_init_wc(&mem->iomap, if (!io_mapping_init_wc(&mem->iomap,
mem->io_start, mem->io_start,
resource_size(&mem->region))) mem->io_size))
return -EIO; return -EIO;
ret = intel_region_ttm_init(mem); ret = intel_region_ttm_init(mem);
...@@ -134,6 +134,7 @@ static struct intel_memory_region *setup_lmem(struct intel_gt *gt) ...@@ -134,6 +134,7 @@ static struct intel_memory_region *setup_lmem(struct intel_gt *gt)
lmem_size, lmem_size,
min_page_size, min_page_size,
io_start, io_start,
lmem_size,
INTEL_MEMORY_LOCAL, INTEL_MEMORY_LOCAL,
0, 0,
&intel_region_lmem_ops); &intel_region_lmem_ops);
...@@ -147,6 +148,8 @@ static struct intel_memory_region *setup_lmem(struct intel_gt *gt) ...@@ -147,6 +148,8 @@ static struct intel_memory_region *setup_lmem(struct intel_gt *gt)
drm_dbg(&i915->drm, "Local memory: %pR\n", &mem->region); drm_dbg(&i915->drm, "Local memory: %pR\n", &mem->region);
drm_dbg(&i915->drm, "Local memory IO start: %pa\n", drm_dbg(&i915->drm, "Local memory IO start: %pa\n",
&mem->io_start); &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", drm_info(&i915->drm, "Local memory available: %pa\n",
&lmem_size); &lmem_size);
......
...@@ -100,10 +100,10 @@ static int iomemtest(struct intel_memory_region *mem, ...@@ -100,10 +100,10 @@ static int iomemtest(struct intel_memory_region *mem,
resource_size_t last, page; resource_size_t last, page;
int err; int err;
if (resource_size(&mem->region) < PAGE_SIZE) if (mem->io_size < PAGE_SIZE)
return 0; return 0;
last = resource_size(&mem->region) - PAGE_SIZE; last = mem->io_size - PAGE_SIZE;
/* /*
* Quick test to check read/write access to the iomap (backing store). * Quick test to check read/write access to the iomap (backing store).
...@@ -221,6 +221,7 @@ intel_memory_region_create(struct drm_i915_private *i915, ...@@ -221,6 +221,7 @@ intel_memory_region_create(struct drm_i915_private *i915,
resource_size_t size, resource_size_t size,
resource_size_t min_page_size, resource_size_t min_page_size,
resource_size_t io_start, resource_size_t io_start,
resource_size_t io_size,
u16 type, u16 type,
u16 instance, u16 instance,
const struct intel_memory_region_ops *ops) const struct intel_memory_region_ops *ops)
...@@ -235,6 +236,7 @@ intel_memory_region_create(struct drm_i915_private *i915, ...@@ -235,6 +236,7 @@ intel_memory_region_create(struct drm_i915_private *i915,
mem->i915 = i915; mem->i915 = i915;
mem->region = (struct resource)DEFINE_RES_MEM(start, size); mem->region = (struct resource)DEFINE_RES_MEM(start, size);
mem->io_start = io_start; mem->io_start = io_start;
mem->io_size = io_size;
mem->min_page_size = min_page_size; mem->min_page_size = min_page_size;
mem->ops = ops; mem->ops = ops;
mem->total = size; mem->total = size;
......
...@@ -68,6 +68,7 @@ struct intel_memory_region { ...@@ -68,6 +68,7 @@ struct intel_memory_region {
struct resource region; struct resource region;
resource_size_t io_start; resource_size_t io_start;
resource_size_t io_size;
resource_size_t min_page_size; resource_size_t min_page_size;
resource_size_t total; resource_size_t total;
resource_size_t avail; resource_size_t avail;
...@@ -98,6 +99,7 @@ intel_memory_region_create(struct drm_i915_private *i915, ...@@ -98,6 +99,7 @@ intel_memory_region_create(struct drm_i915_private *i915,
resource_size_t size, resource_size_t size,
resource_size_t min_page_size, resource_size_t min_page_size,
resource_size_t io_start, resource_size_t io_start,
resource_size_t io_size,
u16 type, u16 type,
u16 instance, u16 instance,
const struct intel_memory_region_ops *ops); const struct intel_memory_region_ops *ops);
......
...@@ -170,7 +170,7 @@ static int igt_mock_reserve(void *arg) ...@@ -170,7 +170,7 @@ static int igt_mock_reserve(void *arg)
if (!order) if (!order)
return 0; return 0;
mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0); mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0, 0);
if (IS_ERR(mem)) { if (IS_ERR(mem)) {
pr_err("failed to create memory region\n"); pr_err("failed to create memory region\n");
err = PTR_ERR(mem); err = PTR_ERR(mem);
...@@ -383,7 +383,7 @@ static int igt_mock_splintered_region(void *arg) ...@@ -383,7 +383,7 @@ static int igt_mock_splintered_region(void *arg)
*/ */
size = (SZ_4G - 1) & PAGE_MASK; size = (SZ_4G - 1) & PAGE_MASK;
mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0); mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0, 0);
if (IS_ERR(mem)) if (IS_ERR(mem))
return PTR_ERR(mem); return PTR_ERR(mem);
...@@ -471,7 +471,7 @@ static int igt_mock_max_segment(void *arg) ...@@ -471,7 +471,7 @@ static int igt_mock_max_segment(void *arg)
*/ */
size = SZ_8G; size = SZ_8G;
mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0); mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0, 0);
if (IS_ERR(mem)) if (IS_ERR(mem))
return PTR_ERR(mem); return PTR_ERR(mem);
...@@ -1188,7 +1188,7 @@ int intel_memory_region_mock_selftests(void) ...@@ -1188,7 +1188,7 @@ int intel_memory_region_mock_selftests(void)
if (!i915) if (!i915)
return -ENOMEM; return -ENOMEM;
mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0); mem = mock_region_create(i915, 0, SZ_2G, I915_GTT_PAGE_SIZE_4K, 0, 0);
if (IS_ERR(mem)) { if (IS_ERR(mem)) {
pr_err("failed to create memory region\n"); pr_err("failed to create memory region\n");
err = PTR_ERR(mem); err = PTR_ERR(mem);
......
...@@ -107,7 +107,8 @@ mock_region_create(struct drm_i915_private *i915, ...@@ -107,7 +107,8 @@ mock_region_create(struct drm_i915_private *i915,
resource_size_t start, resource_size_t start,
resource_size_t size, resource_size_t size,
resource_size_t min_page_size, resource_size_t min_page_size,
resource_size_t io_start) resource_size_t io_start,
resource_size_t io_size)
{ {
int instance = ida_alloc_max(&i915->selftest.mock_region_instances, int instance = ida_alloc_max(&i915->selftest.mock_region_instances,
TTM_NUM_MEM_TYPES - TTM_PL_PRIV - 1, TTM_NUM_MEM_TYPES - TTM_PL_PRIV - 1,
...@@ -117,6 +118,7 @@ mock_region_create(struct drm_i915_private *i915, ...@@ -117,6 +118,7 @@ mock_region_create(struct drm_i915_private *i915,
return ERR_PTR(instance); return ERR_PTR(instance);
return intel_memory_region_create(i915, start, size, min_page_size, return intel_memory_region_create(i915, start, size, min_page_size,
io_start, INTEL_MEMORY_MOCK, instance, io_start, io_size,
INTEL_MEMORY_MOCK, instance,
&mock_region_ops); &mock_region_ops);
} }
...@@ -16,6 +16,7 @@ mock_region_create(struct drm_i915_private *i915, ...@@ -16,6 +16,7 @@ mock_region_create(struct drm_i915_private *i915,
resource_size_t start, resource_size_t start,
resource_size_t size, resource_size_t size,
resource_size_t min_page_size, resource_size_t min_page_size,
resource_size_t io_start); resource_size_t io_start,
resource_size_t io_size);
#endif /* !__MOCK_REGION_H */ #endif /* !__MOCK_REGION_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment