]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: add io_size plumbing
authorMatthew Auld <matthew.auld@intel.com>
Fri, 25 Feb 2022 14:54:56 +0000 (14:54 +0000)
committerMatthew Auld <matthew.auld@intel.com>
Mon, 28 Feb 2022 08:47:27 +0000 (08:47 +0000)
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
drivers/gpu/drm/i915/display/intel_fbdev.c
drivers/gpu/drm/i915/gem/i915_gem_shmem.c
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
drivers/gpu/drm/i915/gem/i915_gem_ttm.c
drivers/gpu/drm/i915/gem/selftests/huge_pages.c
drivers/gpu/drm/i915/gt/intel_region_lmem.c
drivers/gpu/drm/i915/intel_memory_region.c
drivers/gpu/drm/i915/intel_memory_region.h
drivers/gpu/drm/i915/selftests/intel_memory_region.c
drivers/gpu/drm/i915/selftests/mock_region.c
drivers/gpu/drm/i915/selftests/mock_region.h

index fd5bc7acf08d4844134003251073fb4d83956352..2cd62a187df337dccba1a771ac392b6294b10b81 100644 (file)
@@ -265,7 +265,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
                struct intel_memory_region *mem = obj->mm.region;
 
                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 */
                info->fix.smem_start =
index 4efa821f3cb19f2c6f311d39598de6ad2d37931e..3a1c782ed791afc8af99ef8de693f9cef2ad122b 100644 (file)
@@ -699,7 +699,7 @@ struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915,
 {
        return intel_memory_region_create(i915, 0,
                                          totalram_pages() << PAGE_SHIFT,
-                                         PAGE_SIZE, 0,
+                                         PAGE_SIZE, 0, 0,
                                          type, instance,
                                          &shmem_region_ops);
 }
index 636cdf8a73b0ad0f2d8173e32dc194e546d11be3..0bf8f61134af75a4d46f709725721813d7293829 100644 (file)
@@ -492,6 +492,7 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem)
 
        /* Exclude the reserved region from driver use */
        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
         * memory, so just consider the start. */
@@ -751,7 +752,7 @@ static int init_stolen_lmem(struct intel_memory_region *mem)
 
        if (!io_mapping_init_wc(&mem->iomap,
                                mem->io_start,
-                               resource_size(&mem->region)))
+                               mem->io_size))
                return -EIO;
 
        /*
@@ -806,7 +807,8 @@ i915_gem_stolen_lmem_setup(struct drm_i915_private *i915, u16 type,
                                                I915_GTT_PAGE_SIZE_4K;
 
        mem = intel_memory_region_create(i915, lmem_base, lmem_size,
-                                        min_page_size, io_start,
+                                        min_page_size,
+                                        io_start, lmem_size,
                                         type, instance,
                                         &i915_region_stolen_lmem_ops);
        if (IS_ERR(mem))
@@ -837,7 +839,7 @@ i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type,
        mem = intel_memory_region_create(i915,
                                         intel_graphics_stolen_res.start,
                                         resource_size(&intel_graphics_stolen_res),
-                                        PAGE_SIZE, 0, type, instance,
+                                        PAGE_SIZE, 0, 0, type, instance,
                                         &i915_region_stolen_smem_ops);
        if (IS_ERR(mem))
                return mem;
index 8419096d40565e42d4a8cd68fdc500c1d4864be9..53c183f13a38c015be2207638959156978428c6f 100644 (file)
@@ -1103,7 +1103,7 @@ i915_gem_ttm_system_setup(struct drm_i915_private *i915,
 
        mr = intel_memory_region_create(i915, 0,
                                        totalram_pages() << PAGE_SHIFT,
-                                       PAGE_SIZE, 0,
+                                       PAGE_SIZE, 0, 0,
                                        type, instance,
                                        &ttm_system_region_ops);
        if (IS_ERR(mr))
index 0528fe1fc9b3d49129e8f3c8e8e036dc9fe52247..dbbae53f820a73aedf80f0621c4197ad7f1ca9af 100644 (file)
@@ -500,7 +500,7 @@ static int igt_mock_memory_region_huge_pages(void *arg)
        int bit;
        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)) {
                pr_err("%s failed to create memory region\n", __func__);
                return PTR_ERR(mem);
index fc00888ca4b2759c1c05811c96d36c9a380d8d1b..6cecfdae07ad1f6b65401458eb8f03800b377c6e 100644 (file)
@@ -32,7 +32,7 @@ region_lmem_init(struct intel_memory_region *mem)
 
        if (!io_mapping_init_wc(&mem->iomap,
                                mem->io_start,
-                               resource_size(&mem->region)))
+                               mem->io_size))
                return -EIO;
 
        ret = intel_region_ttm_init(mem);
@@ -134,6 +134,7 @@ static struct intel_memory_region *setup_lmem(struct intel_gt *gt)
                                         lmem_size,
                                         min_page_size,
                                         io_start,
+                                        lmem_size,
                                         INTEL_MEMORY_LOCAL,
                                         0,
                                         &intel_region_lmem_ops);
@@ -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 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);
 
index 16ab62d605b1aac9fd1cb9740a71e99fa4ce1b6d..1c841f68169a3df9a7cc1971ab4f2c4eb4904a4f 100644 (file)
@@ -100,10 +100,10 @@ static int iomemtest(struct intel_memory_region *mem,
        resource_size_t last, page;
        int err;
 
-       if (resource_size(&mem->region) < PAGE_SIZE)
+       if (mem->io_size < PAGE_SIZE)
                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).
@@ -221,6 +221,7 @@ intel_memory_region_create(struct drm_i915_private *i915,
                           resource_size_t size,
                           resource_size_t min_page_size,
                           resource_size_t io_start,
+                          resource_size_t io_size,
                           u16 type,
                           u16 instance,
                           const struct intel_memory_region_ops *ops)
@@ -235,6 +236,7 @@ intel_memory_region_create(struct drm_i915_private *i915,
        mem->i915 = i915;
        mem->region = (struct resource)DEFINE_RES_MEM(start, size);
        mem->io_start = io_start;
+       mem->io_size = io_size;
        mem->min_page_size = min_page_size;
        mem->ops = ops;
        mem->total = size;
index 06464b8865fce70a9ba0bdcfd765d15bb36d1f52..21dcbd6207589a9f539fb0d9d3b83b2b0392ba3f 100644 (file)
@@ -68,6 +68,7 @@ struct intel_memory_region {
        struct resource region;
 
        resource_size_t io_start;
+       resource_size_t io_size;
        resource_size_t min_page_size;
        resource_size_t total;
        resource_size_t avail;
@@ -98,6 +99,7 @@ intel_memory_region_create(struct drm_i915_private *i915,
                           resource_size_t size,
                           resource_size_t min_page_size,
                           resource_size_t io_start,
+                          resource_size_t io_size,
                           u16 type,
                           u16 instance,
                           const struct intel_memory_region_ops *ops);
index 7acba1d2135ecdbf13faa825b6d83f0ba639c6a1..247f65f02bbf9177995c840cc152f73390d29cb3 100644 (file)
@@ -170,7 +170,7 @@ static int igt_mock_reserve(void *arg)
        if (!order)
                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)) {
                pr_err("failed to create memory region\n");
                err = PTR_ERR(mem);
@@ -383,7 +383,7 @@ static int igt_mock_splintered_region(void *arg)
         */
 
        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))
                return PTR_ERR(mem);
 
@@ -471,7 +471,7 @@ static int igt_mock_max_segment(void *arg)
         */
 
        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))
                return PTR_ERR(mem);
 
@@ -1188,7 +1188,7 @@ int intel_memory_region_mock_selftests(void)
        if (!i915)
                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)) {
                pr_err("failed to create memory region\n");
                err = PTR_ERR(mem);
index 19bff8afcaaa88d0c7f4f6c5f4c03e6b2b5023b7..467eeae6d5f0b955cf4ea2d9538959f34ad37c5c 100644 (file)
@@ -107,7 +107,8 @@ mock_region_create(struct drm_i915_private *i915,
                   resource_size_t start,
                   resource_size_t 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,
                                     TTM_NUM_MEM_TYPES - TTM_PL_PRIV - 1,
@@ -117,6 +118,7 @@ mock_region_create(struct drm_i915_private *i915,
                return ERR_PTR(instance);
 
        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);
 }
index 329bf74dfaca71e93d37bc0ae56c3ea2834117b6..e36c3a43355133fc47f7d9d052e12f0d2f7a102d 100644 (file)
@@ -16,6 +16,7 @@ mock_region_create(struct drm_i915_private *i915,
                   resource_size_t start,
                   resource_size_t 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 */