drm/vc4: Allow using more than 256MB of CMA memory.
Until now, we've had to limit Raspberry Pi to 256MB of CMA memory to keep from triggering the hardware addressing bug between the tile binner and the tile alloc memory (where the top 4 bits come from the tile state data array's address). To work around that and allow more memory to be reserved for graphics, allocate a single BO to store tile state data arrays and tile alloc/overflow memory while the GPU is active, and make sure that that one BO doesn't happen to cross a 256MB boundary. With that in place, we can allocate textures and shaders anywhere in system memory (still contiguous, of course). Signed-off-by: Eric Anholt <eric@anholt.net> Link: http://patchwork.freedesktop.org/patch/msgid/20170327231025.19391-1-eric@anholt.net Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
This commit is contained in:
@@ -820,6 +820,7 @@ static void
|
||||
vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
|
||||
{
|
||||
struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
unsigned long irqflags;
|
||||
unsigned i;
|
||||
|
||||
/* If we got force-completed because of GPU reset rather than
|
||||
@@ -841,6 +842,11 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
|
||||
drm_gem_object_unreference_unlocked(&bo->base.base);
|
||||
}
|
||||
|
||||
/* Free up the allocation of any bin slots we used. */
|
||||
spin_lock_irqsave(&vc4->job_lock, irqflags);
|
||||
vc4->bin_alloc_used &= ~exec->bin_slots;
|
||||
spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
|
||||
mutex_lock(&vc4->power_lock);
|
||||
if (--vc4->power_refcount == 0) {
|
||||
pm_runtime_mark_last_busy(&vc4->v3d->pdev->dev);
|
||||
@@ -1101,9 +1107,9 @@ vc4_gem_destroy(struct drm_device *dev)
|
||||
/* V3D should already have disabled its interrupt and cleared
|
||||
* the overflow allocation registers. Now free the object.
|
||||
*/
|
||||
if (vc4->overflow_mem) {
|
||||
drm_gem_object_unreference_unlocked(&vc4->overflow_mem->base.base);
|
||||
vc4->overflow_mem = NULL;
|
||||
if (vc4->bin_bo) {
|
||||
drm_gem_object_put_unlocked(&vc4->bin_bo->base.base);
|
||||
vc4->bin_bo = NULL;
|
||||
}
|
||||
|
||||
if (vc4->hang_state)
|
||||
|
Reference in New Issue
Block a user