Skip to content

Commit 356583b

Browse files
committed
Merge tag 'drm-misc-fixes-2020-11-05' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
Some patches for vc4 to fix some resources cleanup issues, two fixes for panfrost for madvise and the shrinker and a constification of fonts structure Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <maxime@cerno.tech> Link: https://patchwork.freedesktop.org/patch/msgid/20201105101354.socyu26jwyns7lfj@gilmour.lan
2 parents f56fb01 + 9522750 commit 356583b

24 files changed

Lines changed: 128 additions & 97 deletions

drivers/gpu/drm/panfrost/panfrost_drv.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@ static int panfrost_probe(struct platform_device *pdev)
626626
err_out1:
627627
pm_runtime_disable(pfdev->dev);
628628
panfrost_device_fini(pfdev);
629+
pm_runtime_set_suspended(pfdev->dev);
629630
err_out0:
630631
drm_dev_put(ddev);
631632
return err;
@@ -640,9 +641,9 @@ static int panfrost_remove(struct platform_device *pdev)
640641
panfrost_gem_shrinker_cleanup(ddev);
641642

642643
pm_runtime_get_sync(pfdev->dev);
643-
panfrost_device_fini(pfdev);
644-
pm_runtime_put_sync_suspend(pfdev->dev);
645644
pm_runtime_disable(pfdev->dev);
645+
panfrost_device_fini(pfdev);
646+
pm_runtime_set_suspended(pfdev->dev);
646647

647648
drm_dev_put(ddev);
648649
return 0;

drivers/gpu/drm/panfrost/panfrost_gem.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,12 @@ void panfrost_gem_mapping_put(struct panfrost_gem_mapping *mapping)
105105
kref_put(&mapping->refcount, panfrost_gem_mapping_release);
106106
}
107107

108-
void panfrost_gem_teardown_mappings(struct panfrost_gem_object *bo)
108+
void panfrost_gem_teardown_mappings_locked(struct panfrost_gem_object *bo)
109109
{
110110
struct panfrost_gem_mapping *mapping;
111111

112-
mutex_lock(&bo->mappings.lock);
113112
list_for_each_entry(mapping, &bo->mappings.list, node)
114113
panfrost_gem_teardown_mapping(mapping);
115-
mutex_unlock(&bo->mappings.lock);
116114
}
117115

118116
int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv)

drivers/gpu/drm/panfrost/panfrost_gem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ struct panfrost_gem_mapping *
8282
panfrost_gem_mapping_get(struct panfrost_gem_object *bo,
8383
struct panfrost_file_priv *priv);
8484
void panfrost_gem_mapping_put(struct panfrost_gem_mapping *mapping);
85-
void panfrost_gem_teardown_mappings(struct panfrost_gem_object *bo);
85+
void panfrost_gem_teardown_mappings_locked(struct panfrost_gem_object *bo);
8686

8787
void panfrost_gem_shrinker_init(struct drm_device *dev);
8888
void panfrost_gem_shrinker_cleanup(struct drm_device *dev);

drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,26 @@ static bool panfrost_gem_purge(struct drm_gem_object *obj)
4040
{
4141
struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
4242
struct panfrost_gem_object *bo = to_panfrost_bo(obj);
43+
bool ret = false;
4344

4445
if (atomic_read(&bo->gpu_usecount))
4546
return false;
4647

47-
if (!mutex_trylock(&shmem->pages_lock))
48+
if (!mutex_trylock(&bo->mappings.lock))
4849
return false;
4950

50-
panfrost_gem_teardown_mappings(bo);
51+
if (!mutex_trylock(&shmem->pages_lock))
52+
goto unlock_mappings;
53+
54+
panfrost_gem_teardown_mappings_locked(bo);
5155
drm_gem_shmem_purge_locked(obj);
56+
ret = true;
5257

5358
mutex_unlock(&shmem->pages_lock);
54-
return true;
59+
60+
unlock_mappings:
61+
mutex_unlock(&bo->mappings.lock);
62+
return ret;
5563
}
5664

5765
static unsigned long

drivers/gpu/drm/vc4/vc4_bo.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t unaligned_size,
449449
}
450450

451451
if (IS_ERR(cma_obj)) {
452-
struct drm_printer p = drm_info_printer(vc4->dev->dev);
452+
struct drm_printer p = drm_info_printer(vc4->base.dev);
453453
DRM_ERROR("Failed to allocate from CMA:\n");
454454
vc4_bo_stats_print(&p, vc4);
455455
return ERR_PTR(-ENOMEM);
@@ -590,7 +590,7 @@ static void vc4_bo_cache_time_work(struct work_struct *work)
590590
{
591591
struct vc4_dev *vc4 =
592592
container_of(work, struct vc4_dev, bo_cache.time_work);
593-
struct drm_device *dev = vc4->dev;
593+
struct drm_device *dev = &vc4->base;
594594

595595
mutex_lock(&vc4->bo_lock);
596596
vc4_bo_cache_free_old(dev);
@@ -1005,6 +1005,7 @@ int vc4_get_tiling_ioctl(struct drm_device *dev, void *data,
10051005
return 0;
10061006
}
10071007

1008+
static void vc4_bo_cache_destroy(struct drm_device *dev, void *unused);
10081009
int vc4_bo_cache_init(struct drm_device *dev)
10091010
{
10101011
struct vc4_dev *vc4 = to_vc4_dev(dev);
@@ -1033,10 +1034,10 @@ int vc4_bo_cache_init(struct drm_device *dev)
10331034
INIT_WORK(&vc4->bo_cache.time_work, vc4_bo_cache_time_work);
10341035
timer_setup(&vc4->bo_cache.time_timer, vc4_bo_cache_time_timer, 0);
10351036

1036-
return 0;
1037+
return drmm_add_action_or_reset(dev, vc4_bo_cache_destroy, NULL);
10371038
}
10381039

1039-
void vc4_bo_cache_destroy(struct drm_device *dev)
1040+
static void vc4_bo_cache_destroy(struct drm_device *dev, void *unused)
10401041
{
10411042
struct vc4_dev *vc4 = to_vc4_dev(dev);
10421043
int i;

drivers/gpu/drm/vc4/vc4_drv.c

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -257,37 +257,37 @@ static int vc4_drm_bind(struct device *dev)
257257

258258
dev->coherent_dma_mask = DMA_BIT_MASK(32);
259259

260-
vc4 = devm_kzalloc(dev, sizeof(*vc4), GFP_KERNEL);
261-
if (!vc4)
262-
return -ENOMEM;
263-
264260
/* If VC4 V3D is missing, don't advertise render nodes. */
265261
node = of_find_matching_node_and_match(NULL, vc4_v3d_dt_match, NULL);
266262
if (!node || !of_device_is_available(node))
267263
vc4_drm_driver.driver_features &= ~DRIVER_RENDER;
268264
of_node_put(node);
269265

270-
drm = drm_dev_alloc(&vc4_drm_driver, dev);
271-
if (IS_ERR(drm))
272-
return PTR_ERR(drm);
266+
vc4 = devm_drm_dev_alloc(dev, &vc4_drm_driver, struct vc4_dev, base);
267+
if (IS_ERR(vc4))
268+
return PTR_ERR(vc4);
269+
270+
drm = &vc4->base;
273271
platform_set_drvdata(pdev, drm);
274-
vc4->dev = drm;
275-
drm->dev_private = vc4;
276272
INIT_LIST_HEAD(&vc4->debugfs_list);
277273

278274
mutex_init(&vc4->bin_bo_lock);
279275

280276
ret = vc4_bo_cache_init(drm);
281277
if (ret)
282-
goto dev_put;
278+
return ret;
283279

284-
drm_mode_config_init(drm);
280+
ret = drmm_mode_config_init(drm);
281+
if (ret)
282+
return ret;
285283

286-
vc4_gem_init(drm);
284+
ret = vc4_gem_init(drm);
285+
if (ret)
286+
return ret;
287287

288288
ret = component_bind_all(dev, drm);
289289
if (ret)
290-
goto gem_destroy;
290+
return ret;
291291

292292
ret = vc4_plane_create_additional_planes(drm);
293293
if (ret)
@@ -312,30 +312,17 @@ static int vc4_drm_bind(struct device *dev)
312312

313313
unbind_all:
314314
component_unbind_all(dev, drm);
315-
gem_destroy:
316-
vc4_gem_destroy(drm);
317-
drm_mode_config_cleanup(drm);
318-
vc4_bo_cache_destroy(drm);
319-
dev_put:
320-
drm_dev_put(drm);
315+
321316
return ret;
322317
}
323318

324319
static void vc4_drm_unbind(struct device *dev)
325320
{
326321
struct drm_device *drm = dev_get_drvdata(dev);
327-
struct vc4_dev *vc4 = to_vc4_dev(drm);
328322

329323
drm_dev_unregister(drm);
330324

331325
drm_atomic_helper_shutdown(drm);
332-
333-
drm_mode_config_cleanup(drm);
334-
335-
drm_atomic_private_obj_fini(&vc4->load_tracker);
336-
drm_atomic_private_obj_fini(&vc4->ctm_manager);
337-
338-
drm_dev_put(drm);
339326
}
340327

341328
static const struct component_master_ops vc4_drm_ops = {

drivers/gpu/drm/vc4/vc4_drv.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <drm/drm_device.h>
1515
#include <drm/drm_encoder.h>
1616
#include <drm/drm_gem_cma_helper.h>
17+
#include <drm/drm_managed.h>
1718
#include <drm/drm_mm.h>
1819
#include <drm/drm_modeset_lock.h>
1920

@@ -71,7 +72,7 @@ struct vc4_perfmon {
7172
};
7273

7374
struct vc4_dev {
74-
struct drm_device *dev;
75+
struct drm_device base;
7576

7677
struct vc4_hvs *hvs;
7778
struct vc4_v3d *v3d;
@@ -234,7 +235,7 @@ struct vc4_dev {
234235
static inline struct vc4_dev *
235236
to_vc4_dev(struct drm_device *dev)
236237
{
237-
return (struct vc4_dev *)dev->dev_private;
238+
return container_of(dev, struct vc4_dev, base);
238239
}
239240

240241
struct vc4_bo {
@@ -809,7 +810,6 @@ struct drm_gem_object *vc4_prime_import_sg_table(struct drm_device *dev,
809810
struct sg_table *sgt);
810811
void *vc4_prime_vmap(struct drm_gem_object *obj);
811812
int vc4_bo_cache_init(struct drm_device *dev);
812-
void vc4_bo_cache_destroy(struct drm_device *dev);
813813
int vc4_bo_inc_usecnt(struct vc4_bo *bo);
814814
void vc4_bo_dec_usecnt(struct vc4_bo *bo);
815815
void vc4_bo_add_to_purgeable_pool(struct vc4_bo *bo);
@@ -874,8 +874,7 @@ extern struct platform_driver vc4_dsi_driver;
874874
extern const struct dma_fence_ops vc4_fence_ops;
875875

876876
/* vc4_gem.c */
877-
void vc4_gem_init(struct drm_device *dev);
878-
void vc4_gem_destroy(struct drm_device *dev);
877+
int vc4_gem_init(struct drm_device *dev);
879878
int vc4_submit_cl_ioctl(struct drm_device *dev, void *data,
880879
struct drm_file *file_priv);
881880
int vc4_wait_seqno_ioctl(struct drm_device *dev, void *data,

drivers/gpu/drm/vc4/vc4_gem.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -314,16 +314,16 @@ vc4_reset_work(struct work_struct *work)
314314
struct vc4_dev *vc4 =
315315
container_of(work, struct vc4_dev, hangcheck.reset_work);
316316

317-
vc4_save_hang_state(vc4->dev);
317+
vc4_save_hang_state(&vc4->base);
318318

319-
vc4_reset(vc4->dev);
319+
vc4_reset(&vc4->base);
320320
}
321321

322322
static void
323323
vc4_hangcheck_elapsed(struct timer_list *t)
324324
{
325325
struct vc4_dev *vc4 = from_timer(vc4, t, hangcheck.timer);
326-
struct drm_device *dev = vc4->dev;
326+
struct drm_device *dev = &vc4->base;
327327
uint32_t ct0ca, ct1ca;
328328
unsigned long irqflags;
329329
struct vc4_exec_info *bin_exec, *render_exec;
@@ -1000,7 +1000,7 @@ vc4_job_handle_completed(struct vc4_dev *vc4)
10001000
list_del(&exec->head);
10011001

10021002
spin_unlock_irqrestore(&vc4->job_lock, irqflags);
1003-
vc4_complete_exec(vc4->dev, exec);
1003+
vc4_complete_exec(&vc4->base, exec);
10041004
spin_lock_irqsave(&vc4->job_lock, irqflags);
10051005
}
10061006

@@ -1258,13 +1258,13 @@ vc4_submit_cl_ioctl(struct drm_device *dev, void *data,
12581258
return 0;
12591259

12601260
fail:
1261-
vc4_complete_exec(vc4->dev, exec);
1261+
vc4_complete_exec(&vc4->base, exec);
12621262

12631263
return ret;
12641264
}
12651265

1266-
void
1267-
vc4_gem_init(struct drm_device *dev)
1266+
static void vc4_gem_destroy(struct drm_device *dev, void *unused);
1267+
int vc4_gem_init(struct drm_device *dev)
12681268
{
12691269
struct vc4_dev *vc4 = to_vc4_dev(dev);
12701270

@@ -1285,10 +1285,11 @@ vc4_gem_init(struct drm_device *dev)
12851285

12861286
INIT_LIST_HEAD(&vc4->purgeable.list);
12871287
mutex_init(&vc4->purgeable.lock);
1288+
1289+
return drmm_add_action_or_reset(dev, vc4_gem_destroy, NULL);
12881290
}
12891291

1290-
void
1291-
vc4_gem_destroy(struct drm_device *dev)
1292+
static void vc4_gem_destroy(struct drm_device *dev, void *unused)
12921293
{
12931294
struct vc4_dev *vc4 = to_vc4_dev(dev);
12941295

drivers/gpu/drm/vc4/vc4_hvs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
560560
{
561561
struct platform_device *pdev = to_platform_device(dev);
562562
struct drm_device *drm = dev_get_drvdata(master);
563-
struct vc4_dev *vc4 = drm->dev_private;
563+
struct vc4_dev *vc4 = to_vc4_dev(drm);
564564
struct vc4_hvs *hvs = NULL;
565565
int ret;
566566
u32 dispctrl;
@@ -679,7 +679,7 @@ static void vc4_hvs_unbind(struct device *dev, struct device *master,
679679
void *data)
680680
{
681681
struct drm_device *drm = dev_get_drvdata(master);
682-
struct vc4_dev *vc4 = drm->dev_private;
682+
struct vc4_dev *vc4 = to_vc4_dev(drm);
683683
struct vc4_hvs *hvs = vc4->hvs;
684684

685685
if (drm_mm_node_allocated(&vc4->hvs->mitchell_netravali_filter))

0 commit comments

Comments
 (0)