diff mbox series

drm/v3d: Enable V3D to use different PAGE_SIZE

Message ID 20240214193503.164462-1-mcanal@igalia.com (mailing list archive)
State New, archived
Headers show
Series drm/v3d: Enable V3D to use different PAGE_SIZE | expand

Commit Message

Maíra Canal Feb. 14, 2024, 7:34 p.m. UTC
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>
---
 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(-)

--
2.43.0

Comments

Iago Toral Feb. 19, 2024, 12:56 p.m. UTC | #1
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@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?

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
> 
>
Maíra Canal Feb. 19, 2024, 1 p.m. UTC | #2
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@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 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
>>
>>
>
Iago Toral Feb. 20, 2024, 6:35 a.m. UTC | #3
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@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@igalia.com>

> 
> 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
> > > 
> > > 
> > 
>
Maíra Canal Feb. 23, 2024, 8:03 p.m. UTC | #4
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@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@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
>>>>
>>>>
>>>
>>
>
diff mbox series

Patch

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
@@ -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.
  */