summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/vc4/vc4_bo.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/vc4/vc4_bo.c')
-rw-r--r--drivers/gpu/drm/vc4/vc4_bo.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
index ba91b7c17ab1..62e8a0c27a39 100644
--- a/drivers/gpu/drm/vc4/vc4_bo.c
+++ b/drivers/gpu/drm/vc4/vc4_bo.c
@@ -25,6 +25,23 @@ static struct {
u32 size_cached;
} bo_stats;
+static void
+vc4_bo_stats_dump(void)
+{
+ DRM_INFO("num bos allocated: %d\n",
+ bo_stats.num_allocated);
+ DRM_INFO("size bos allocated: %dkb\n",
+ bo_stats.size_allocated / 1024);
+ DRM_INFO("num bos used: %d\n",
+ bo_stats.num_allocated - bo_stats.num_cached);
+ DRM_INFO("size bos used: %dkb\n",
+ (bo_stats.size_allocated - bo_stats.size_cached) / 1024);
+ DRM_INFO("num bos cached: %d\n",
+ bo_stats.num_cached);
+ DRM_INFO("size bos cached: %dkb\n",
+ bo_stats.size_cached / 1024);
+}
+
static uint32_t
bo_page_index(size_t size)
{
@@ -88,7 +105,7 @@ vc4_get_cache_list_for_size(struct drm_device *dev, size_t size)
return &vc4->bo_cache.size_list[page_index];
}
-static void
+void
vc4_bo_cache_purge(struct drm_device *dev)
{
struct vc4_dev *vc4 = to_vc4_dev(dev);
@@ -273,6 +290,22 @@ vc4_bo_cache_init(struct drm_device *dev)
(unsigned long) dev);
}
+void
+vc4_bo_cache_destroy(struct drm_device *dev)
+{
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
+
+ del_timer(&vc4->bo_cache.time_timer);
+ cancel_work_sync(&vc4->bo_cache.time_work);
+
+ vc4_bo_cache_purge(dev);
+
+ if (bo_stats.num_allocated) {
+ DRM_ERROR("Destroying BO cache while BOs still allocated:\n");
+ vc4_bo_stats_dump();
+ }
+}
+
struct drm_gem_object *
vc4_prime_import(struct drm_device *dev, struct dma_buf *dma_buf)
{