Re: [PATCH] drm/v3d: Enable V3D to use different PAGE_SIZE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Iago,

On 2/19/24 09:56, Iago Toral wrote:
Hi Maíra,

El mié, 14-02-2024 a las 16:34 -0300, Maíra Canal escribió:
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@xxxxxxxxxx>
---
  drivers/gpu/drm/v3d/v3d_bo.c      | 12 ++++++------
  drivers/gpu/drm/v3d/v3d_debugfs.c |  2 +-
  drivers/gpu/drm/v3d/v3d_drv.h     |  2 ++
  drivers/gpu/drm/v3d/v3d_irq.c     |  2 +-
  drivers/gpu/drm/v3d/v3d_mmu.c     |  2 --
  5 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/v3d/v3d_bo.c
b/drivers/gpu/drm/v3d/v3d_bo.c
index 1bdfac8beafd..a07ede668cc1 100644
--- a/drivers/gpu/drm/v3d/v3d_bo.c
+++ b/drivers/gpu/drm/v3d/v3d_bo.c

I think we need the same change in v3d_get_bo_vaddr, no?

No, that one uses the PAGE_SHIFT of the CPU, because obj->pages is in
the CPU.

Best Regards,
- Maíra


Iago

@@ -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;
diff --git a/drivers/gpu/drm/v3d/v3d_debugfs.c
b/drivers/gpu/drm/v3d/v3d_debugfs.c
index dc3cf708d02e..19e3ee7ac897 100644
--- a/drivers/gpu/drm/v3d/v3d_debugfs.c
+++ b/drivers/gpu/drm/v3d/v3d_debugfs.c
@@ -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;
diff --git a/drivers/gpu/drm/v3d/v3d_drv.h
b/drivers/gpu/drm/v3d/v3d_drv.h
index 3c7d58866570..1950c723dde1 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
@@ -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)
diff --git a/drivers/gpu/drm/v3d/v3d_irq.c
b/drivers/gpu/drm/v3d/v3d_irq.c
index afc76390a197..2e04f6cb661e 100644
--- a/drivers/gpu/drm/v3d/v3d_irq.c
+++ b/drivers/gpu/drm/v3d/v3d_irq.c
@@ -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:
diff --git a/drivers/gpu/drm/v3d/v3d_mmu.c
b/drivers/gpu/drm/v3d/v3d_mmu.c
index 5a453532901f..14f3af40d6f6 100644
--- a/drivers/gpu/drm/v3d/v3d_mmu.c
+++ b/drivers/gpu/drm/v3d/v3d_mmu.c
@@ -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.
   */
--
2.43.0






[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux