drm/v3d: Enable V3D to use different PAGE_SIZE
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
This commit is contained in:
parent
155ad86b5e
commit
51b76c1f30
@ -40,7 +40,7 @@ void v3d_free_object(struct drm_gem_object *obj)
|
|||||||
|
|
||||||
mutex_lock(&v3d->bo_lock);
|
mutex_lock(&v3d->bo_lock);
|
||||||
v3d->bo_stats.num_allocated--;
|
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);
|
mutex_unlock(&v3d->bo_lock);
|
||||||
|
|
||||||
spin_lock(&v3d->mm_lock);
|
spin_lock(&v3d->mm_lock);
|
||||||
@ -109,8 +109,8 @@ v3d_bo_create_finish(struct drm_gem_object *obj)
|
|||||||
* lifetime of the BO.
|
* lifetime of the BO.
|
||||||
*/
|
*/
|
||||||
ret = drm_mm_insert_node_generic(&v3d->mm, &bo->node,
|
ret = drm_mm_insert_node_generic(&v3d->mm, &bo->node,
|
||||||
obj->size >> PAGE_SHIFT,
|
obj->size >> V3D_MMU_PAGE_SHIFT,
|
||||||
GMP_GRANULARITY >> PAGE_SHIFT, 0, 0);
|
GMP_GRANULARITY >> V3D_MMU_PAGE_SHIFT, 0, 0);
|
||||||
spin_unlock(&v3d->mm_lock);
|
spin_unlock(&v3d->mm_lock);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@ -118,7 +118,7 @@ v3d_bo_create_finish(struct drm_gem_object *obj)
|
|||||||
/* Track stats for /debug/dri/n/bo_stats. */
|
/* Track stats for /debug/dri/n/bo_stats. */
|
||||||
mutex_lock(&v3d->bo_lock);
|
mutex_lock(&v3d->bo_lock);
|
||||||
v3d->bo_stats.num_allocated++;
|
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);
|
mutex_unlock(&v3d->bo_lock);
|
||||||
|
|
||||||
v3d_mmu_insert_ptes(bo);
|
v3d_mmu_insert_ptes(bo);
|
||||||
@ -201,7 +201,7 @@ int v3d_create_bo_ioctl(struct drm_device *dev, void *data,
|
|||||||
if (IS_ERR(bo))
|
if (IS_ERR(bo))
|
||||||
return PTR_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);
|
ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
|
||||||
drm_gem_object_put(&bo->base.base);
|
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);
|
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);
|
drm_gem_object_put(gem_obj);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -219,7 +219,7 @@ static int v3d_debugfs_bo_stats(struct seq_file *m, void *unused)
|
|||||||
seq_printf(m, "allocated bos: %d\n",
|
seq_printf(m, "allocated bos: %d\n",
|
||||||
v3d->bo_stats.num_allocated);
|
v3d->bo_stats.num_allocated);
|
||||||
seq_printf(m, "allocated bo size (kb): %ld\n",
|
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);
|
mutex_unlock(&v3d->bo_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -19,6 +19,8 @@ struct reset_control;
|
|||||||
|
|
||||||
#define GMP_GRANULARITY (128 * 1024)
|
#define GMP_GRANULARITY (128 * 1024)
|
||||||
|
|
||||||
|
#define V3D_MMU_PAGE_SHIFT 12
|
||||||
|
|
||||||
#define V3D_MAX_QUEUES (V3D_CPU + 1)
|
#define V3D_MAX_QUEUES (V3D_CPU + 1)
|
||||||
|
|
||||||
static inline char *v3d_queue_to_string(enum v3d_queue queue)
|
static inline char *v3d_queue_to_string(enum v3d_queue queue)
|
||||||
|
@ -70,7 +70,7 @@ v3d_overflow_mem_work(struct work_struct *work)
|
|||||||
list_add_tail(&bo->unref_head, &v3d->bin_job->render->unref_list);
|
list_add_tail(&bo->unref_head, &v3d->bin_job->render->unref_list);
|
||||||
spin_unlock_irqrestore(&v3d->job_lock, irqflags);
|
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);
|
V3D_CORE_WRITE(0, V3D_PTB_BPOS, obj->size);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -21,8 +21,6 @@
|
|||||||
#include "v3d_drv.h"
|
#include "v3d_drv.h"
|
||||||
#include "v3d_regs.h"
|
#include "v3d_regs.h"
|
||||||
|
|
||||||
#define V3D_MMU_PAGE_SHIFT 12
|
|
||||||
|
|
||||||
/* Note: All PTEs for the 1MB superpage must be filled with the
|
/* Note: All PTEs for the 1MB superpage must be filled with the
|
||||||
* superpage bit set.
|
* superpage bit set.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user