[PATCH] drm/v3d: Enable V3D to use different PAGE_SIZE
Maíra Canal
mcanal at igalia.com
Fri Feb 23 20:03:47 UTC 2024
Hi Iago,
On 2/20/24 03:35, Iago Toral wrote:
> El lun, 19-02-2024 a las 10:00 -0300, Maíra Canal escribió:
>> 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 at igalia.com>
>>>> ---
>>>> 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
>> is in
>> the CPU.
>
> Ah, makes sense, thanks!
>
> Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Applied to drm-misc/drm-misc-next!
Best Regards,
- Maíra
>
>>
>> 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
>>>>
>>>>
>>>
>>
>
More information about the dri-devel
mailing list