drm/v3d: Enable V3D to use different PAGE_SIZE
authorMaíra Canal <mcanal@igalia.com>
Wed, 14 Feb 2024 19:34:52 +0000 (16:34 -0300)
committerMaíra Canal <mcanal@igalia.com>
Fri, 23 Feb 2024 19:37:20 +0000 (16:37 -0300)
Currently, the V3D driver uses PAGE_SHIFT over the assumption that
PAGE_SHIFT = 12, as the PAGE_SIZE = 4KB. But, the RPi 5 is using
PAGE_SIZE = 16KB, so the MMU PAGE_SHIFT is different than the system's
PAGE_SHIFT.

Enable V3D to be used in system's with any PAGE_SIZE by making sure that
everything MMU-related uses the MMU page shift.

Signed-off-by: Maíra Canal <mcanal@igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240214193503.164462-1-mcanal@igalia.com
drivers/gpu/drm/v3d/v3d_bo.c
drivers/gpu/drm/v3d/v3d_debugfs.c
drivers/gpu/drm/v3d/v3d_drv.h
drivers/gpu/drm/v3d/v3d_irq.c
drivers/gpu/drm/v3d/v3d_mmu.c

index 1bdfac8beafdf9149512e1d2f0f5ff09f2f8480f..a07ede668cc1617c84fa956cfb78b5cab77af003 100644 (file)
@@ -40,7 +40,7 @@ void v3d_free_object(struct drm_gem_object *obj)
 
        mutex_lock(&v3d->bo_lock);
        v3d->bo_stats.num_allocated--;
-       v3d->bo_stats.pages_allocated -= obj->size >> PAGE_SHIFT;
+       v3d->bo_stats.pages_allocated -= obj->size >> V3D_MMU_PAGE_SHIFT;
        mutex_unlock(&v3d->bo_lock);
 
        spin_lock(&v3d->mm_lock);
@@ -109,8 +109,8 @@ v3d_bo_create_finish(struct drm_gem_object *obj)
         * lifetime of the BO.
         */
        ret = drm_mm_insert_node_generic(&v3d->mm, &bo->node,
-                                        obj->size >> PAGE_SHIFT,
-                                        GMP_GRANULARITY >> PAGE_SHIFT, 0, 0);
+                                        obj->size >> V3D_MMU_PAGE_SHIFT,
+                                        GMP_GRANULARITY >> V3D_MMU_PAGE_SHIFT, 0, 0);
        spin_unlock(&v3d->mm_lock);
        if (ret)
                return ret;
@@ -118,7 +118,7 @@ v3d_bo_create_finish(struct drm_gem_object *obj)
        /* Track stats for /debug/dri/n/bo_stats. */
        mutex_lock(&v3d->bo_lock);
        v3d->bo_stats.num_allocated++;
-       v3d->bo_stats.pages_allocated += obj->size >> PAGE_SHIFT;
+       v3d->bo_stats.pages_allocated += obj->size >> V3D_MMU_PAGE_SHIFT;
        mutex_unlock(&v3d->bo_lock);
 
        v3d_mmu_insert_ptes(bo);
@@ -201,7 +201,7 @@ int v3d_create_bo_ioctl(struct drm_device *dev, void *data,
        if (IS_ERR(bo))
                return PTR_ERR(bo);
 
-       args->offset = bo->node.start << PAGE_SHIFT;
+       args->offset = bo->node.start << V3D_MMU_PAGE_SHIFT;
 
        ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
        drm_gem_object_put(&bo->base.base);
@@ -246,7 +246,7 @@ int v3d_get_bo_offset_ioctl(struct drm_device *dev, void *data,
        }
        bo = to_v3d_bo(gem_obj);
 
-       args->offset = bo->node.start << PAGE_SHIFT;
+       args->offset = bo->node.start << V3D_MMU_PAGE_SHIFT;
 
        drm_gem_object_put(gem_obj);
        return 0;
index dc3cf708d02e05069eb38947ebe4f1cfe0f2d5d5..19e3ee7ac897feda1bb13b7f05bd1f219360b111 100644 (file)
@@ -219,7 +219,7 @@ static int v3d_debugfs_bo_stats(struct seq_file *m, void *unused)
        seq_printf(m, "allocated bos:          %d\n",
                   v3d->bo_stats.num_allocated);
        seq_printf(m, "allocated bo size (kb): %ld\n",
-                  (long)v3d->bo_stats.pages_allocated << (PAGE_SHIFT - 10));
+                  (long)v3d->bo_stats.pages_allocated << (V3D_MMU_PAGE_SHIFT - 10));
        mutex_unlock(&v3d->bo_lock);
 
        return 0;
index 3c7d588665704a0be2d18ac644f4a198b969873f..1950c723dde12a1981019a1e2d595a67724df202 100644 (file)
@@ -19,6 +19,8 @@ struct reset_control;
 
 #define GMP_GRANULARITY (128 * 1024)
 
+#define V3D_MMU_PAGE_SHIFT 12
+
 #define V3D_MAX_QUEUES (V3D_CPU + 1)
 
 static inline char *v3d_queue_to_string(enum v3d_queue queue)
index afc76390a197a03fcfdd7804241eb60c6de1c9e6..2e04f6cb661e4f42eeaaef3c5d7fcdaee501d457 100644 (file)
@@ -70,7 +70,7 @@ v3d_overflow_mem_work(struct work_struct *work)
        list_add_tail(&bo->unref_head, &v3d->bin_job->render->unref_list);
        spin_unlock_irqrestore(&v3d->job_lock, irqflags);
 
-       V3D_CORE_WRITE(0, V3D_PTB_BPOA, bo->node.start << PAGE_SHIFT);
+       V3D_CORE_WRITE(0, V3D_PTB_BPOA, bo->node.start << V3D_MMU_PAGE_SHIFT);
        V3D_CORE_WRITE(0, V3D_PTB_BPOS, obj->size);
 
 out:
index 5a453532901f15cf2cdddd79d5d5042236dff844..14f3af40d6f6d16ebd9863c12519959e88be17fd 100644 (file)
@@ -21,8 +21,6 @@
 #include "v3d_drv.h"
 #include "v3d_regs.h"
 
-#define V3D_MMU_PAGE_SHIFT 12
-
 /* Note: All PTEs for the 1MB superpage must be filled with the
  * superpage bit set.
  */