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