* [PATCH v2 00/13] drm/msm/dpu: use managed memory allocations
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Please excuse me for sending v2 on the same day, it fixes erorr paths
for drmm allocation code.
In a lots of places in DPU driver memory is allocated by using the
kzalloc and then manually freed using kfree. However thes memory chunks
have a well-defined life cycle. They are either a part of the driver's
runtime and can be devm_kzalloc'ed or are exposed to userspace via the
DRM objects and thus can be drmm_alloc'ed. Implement corresponding
runtime resource manangement for the DPU driver.
Dependencies: [1].
[1] https://patchwork.freedesktop.org/series/118839/
Changes since v1:
- Fix error handling for some of drmm_foo_alloc() functions, which
return error pointer in case of an error rather than typical NULL.
Dmitry Baryshkov (13):
drm/msm/dpu: cleanup dpu_kms_hw_init error path
drm/msm/dpu: remove IS_ERR_OR_NULL for dpu_hw_intr_init() error
handling
drm/msm/dpu: use devres-managed allocation for interrupts data
drm/msm/dpu: use devres-managed allocation for VBIF data
drm/msm/dpu: use devres-managed allocation for MDP TOP
drm/msm/dpu: use devres-managed allocation for HW blocks
drm/msm/dpu: drop unused dpu_plane::lock
drm/msm/dpu: remove QoS teardown on plane destruction
drm/msm/dpu: use drmm-managed allocation for dpu_plane
drm/msm/dpu: use drmm-managed allocation for dpu_crtc
drm/msm/dpu: use drmm-managed allocation for dpu_encoder_phys
drm/msm/dpu: drop dpu_encoder_phys_ops::destroy
drm/msm/dpu: use drmm-managed allocation for dpu_encoder_virt
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 25 ++----
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 77 ++++------------
.../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 10 +--
.../drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 15 +---
.../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 13 +--
.../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 21 +----
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 19 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 16 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c | 12 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h | 10 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c | 7 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 16 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 12 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h | 11 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 15 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 12 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h | 13 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 13 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 15 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 7 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c | 17 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h | 8 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h | 8 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 51 ++++-------
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 59 +++---------
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 90 +++----------------
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 11 +--
36 files changed, 216 insertions(+), 476 deletions(-)
--
2.39.2
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v2 00/13] drm/msm/dpu: use managed memory allocations
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Please excuse me for sending v2 on the same day, it fixes erorr paths
for drmm allocation code.
In a lots of places in DPU driver memory is allocated by using the
kzalloc and then manually freed using kfree. However thes memory chunks
have a well-defined life cycle. They are either a part of the driver's
runtime and can be devm_kzalloc'ed or are exposed to userspace via the
DRM objects and thus can be drmm_alloc'ed. Implement corresponding
runtime resource manangement for the DPU driver.
Dependencies: [1].
[1] https://patchwork.freedesktop.org/series/118839/
Changes since v1:
- Fix error handling for some of drmm_foo_alloc() functions, which
return error pointer in case of an error rather than typical NULL.
Dmitry Baryshkov (13):
drm/msm/dpu: cleanup dpu_kms_hw_init error path
drm/msm/dpu: remove IS_ERR_OR_NULL for dpu_hw_intr_init() error
handling
drm/msm/dpu: use devres-managed allocation for interrupts data
drm/msm/dpu: use devres-managed allocation for VBIF data
drm/msm/dpu: use devres-managed allocation for MDP TOP
drm/msm/dpu: use devres-managed allocation for HW blocks
drm/msm/dpu: drop unused dpu_plane::lock
drm/msm/dpu: remove QoS teardown on plane destruction
drm/msm/dpu: use drmm-managed allocation for dpu_plane
drm/msm/dpu: use drmm-managed allocation for dpu_crtc
drm/msm/dpu: use drmm-managed allocation for dpu_encoder_phys
drm/msm/dpu: drop dpu_encoder_phys_ops::destroy
drm/msm/dpu: use drmm-managed allocation for dpu_encoder_virt
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 25 ++----
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 77 ++++------------
.../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 10 +--
.../drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 15 +---
.../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 13 +--
.../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 21 +----
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 19 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 16 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c | 12 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h | 10 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c | 7 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 16 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 12 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h | 11 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 15 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 12 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h | 13 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 13 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 15 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 7 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c | 17 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h | 8 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h | 8 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 51 ++++-------
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 59 +++---------
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 90 +++----------------
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 11 +--
36 files changed, 216 insertions(+), 476 deletions(-)
--
2.39.2
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v2 01/13] drm/msm/dpu: cleanup dpu_kms_hw_init error path
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno, Konrad Dybcio
It was noticed that dpu_kms_hw_init()'s error path contains several
labels which point to the same code path. Replace all of them with a
single label.
Suggested-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index c11b3ab572ab..e7ac02e92f42 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1037,7 +1037,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
if (!dpu_kms->catalog) {
DPU_ERROR("device config not known!\n");
rc = -EINVAL;
- goto power_error;
+ goto err_pm_put;
}
/*
@@ -1047,13 +1047,13 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = _dpu_kms_mmu_init(dpu_kms);
if (rc) {
DPU_ERROR("dpu_kms_mmu_init failed: %d\n", rc);
- goto power_error;
+ goto err_pm_put;
}
rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
if (rc) {
DPU_ERROR("rm init failed: %d\n", rc);
- goto power_error;
+ goto err_pm_put;
}
dpu_kms->rm_init = true;
@@ -1065,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = PTR_ERR(dpu_kms->hw_mdp);
DPU_ERROR("failed to get hw_mdp: %d\n", rc);
dpu_kms->hw_mdp = NULL;
- goto power_error;
+ goto err_pm_put;
}
for (i = 0; i < dpu_kms->catalog->vbif_count; i++) {
@@ -1076,7 +1076,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
- goto power_error;
+ goto err_pm_put;
}
dpu_kms->hw_vbif[vbif->id] = hw;
@@ -1092,7 +1092,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = dpu_core_perf_init(&dpu_kms->perf, dpu_kms->catalog->perf, max_core_clk_rate);
if (rc) {
DPU_ERROR("failed to init perf %d\n", rc);
- goto perf_err;
+ goto err_pm_put;
}
dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
@@ -1100,7 +1100,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = PTR_ERR(dpu_kms->hw_intr);
DPU_ERROR("hw_intr init failed: %d\n", rc);
dpu_kms->hw_intr = NULL;
- goto hw_intr_init_err;
+ goto err_pm_put;
}
dev->mode_config.min_width = 0;
@@ -1125,7 +1125,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = _dpu_kms_drm_obj_init(dpu_kms);
if (rc) {
DPU_ERROR("modeset init failed: %d\n", rc);
- goto drm_obj_init_err;
+ goto err_pm_put;
}
dpu_vbif_init_memtypes(dpu_kms);
@@ -1134,10 +1134,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
return 0;
-drm_obj_init_err:
-hw_intr_init_err:
-perf_err:
-power_error:
+err_pm_put:
pm_runtime_put_sync(&dpu_kms->pdev->dev);
error:
_dpu_kms_hw_destroy(dpu_kms);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 01/13] drm/msm/dpu: cleanup dpu_kms_hw_init error path
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel,
Stephen Boyd, Konrad Dybcio
It was noticed that dpu_kms_hw_init()'s error path contains several
labels which point to the same code path. Replace all of them with a
single label.
Suggested-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index c11b3ab572ab..e7ac02e92f42 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1037,7 +1037,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
if (!dpu_kms->catalog) {
DPU_ERROR("device config not known!\n");
rc = -EINVAL;
- goto power_error;
+ goto err_pm_put;
}
/*
@@ -1047,13 +1047,13 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = _dpu_kms_mmu_init(dpu_kms);
if (rc) {
DPU_ERROR("dpu_kms_mmu_init failed: %d\n", rc);
- goto power_error;
+ goto err_pm_put;
}
rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
if (rc) {
DPU_ERROR("rm init failed: %d\n", rc);
- goto power_error;
+ goto err_pm_put;
}
dpu_kms->rm_init = true;
@@ -1065,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = PTR_ERR(dpu_kms->hw_mdp);
DPU_ERROR("failed to get hw_mdp: %d\n", rc);
dpu_kms->hw_mdp = NULL;
- goto power_error;
+ goto err_pm_put;
}
for (i = 0; i < dpu_kms->catalog->vbif_count; i++) {
@@ -1076,7 +1076,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
- goto power_error;
+ goto err_pm_put;
}
dpu_kms->hw_vbif[vbif->id] = hw;
@@ -1092,7 +1092,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = dpu_core_perf_init(&dpu_kms->perf, dpu_kms->catalog->perf, max_core_clk_rate);
if (rc) {
DPU_ERROR("failed to init perf %d\n", rc);
- goto perf_err;
+ goto err_pm_put;
}
dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
@@ -1100,7 +1100,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = PTR_ERR(dpu_kms->hw_intr);
DPU_ERROR("hw_intr init failed: %d\n", rc);
dpu_kms->hw_intr = NULL;
- goto hw_intr_init_err;
+ goto err_pm_put;
}
dev->mode_config.min_width = 0;
@@ -1125,7 +1125,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
rc = _dpu_kms_drm_obj_init(dpu_kms);
if (rc) {
DPU_ERROR("modeset init failed: %d\n", rc);
- goto drm_obj_init_err;
+ goto err_pm_put;
}
dpu_vbif_init_memtypes(dpu_kms);
@@ -1134,10 +1134,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
return 0;
-drm_obj_init_err:
-hw_intr_init_err:
-perf_err:
-power_error:
+err_pm_put:
pm_runtime_put_sync(&dpu_kms->pdev->dev);
error:
_dpu_kms_hw_destroy(dpu_kms);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 02/13] drm/msm/dpu: remove IS_ERR_OR_NULL for dpu_hw_intr_init() error handling
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Using IS_ERR_OR_NULL() together with PTR_ERR() is a typical mistake. If
the value is NULL, then the function will return 0 instead of a proper
return code. Replace IS_ERR_OR_NULL() with IS_ERR() in the
dpu_hw_intr_init() error check.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index e7ac02e92f42..85b8c9cc99ef 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1096,7 +1096,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
}
dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
- if (IS_ERR_OR_NULL(dpu_kms->hw_intr)) {
+ if (IS_ERR(dpu_kms->hw_intr)) {
rc = PTR_ERR(dpu_kms->hw_intr);
DPU_ERROR("hw_intr init failed: %d\n", rc);
dpu_kms->hw_intr = NULL;
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 02/13] drm/msm/dpu: remove IS_ERR_OR_NULL for dpu_hw_intr_init() error handling
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Using IS_ERR_OR_NULL() together with PTR_ERR() is a typical mistake. If
the value is NULL, then the function will return 0 instead of a proper
return code. Replace IS_ERR_OR_NULL() with IS_ERR() in the
dpu_hw_intr_init() error check.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index e7ac02e92f42..85b8c9cc99ef 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1096,7 +1096,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
}
dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
- if (IS_ERR_OR_NULL(dpu_kms->hw_intr)) {
+ if (IS_ERR(dpu_kms->hw_intr)) {
rc = PTR_ERR(dpu_kms->hw_intr);
DPU_ERROR("hw_intr init failed: %d\n", rc);
dpu_kms->hw_intr = NULL;
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 03/13] drm/msm/dpu: use devres-managed allocation for interrupts data
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Use devm_kzalloc to create interrupts data structure. This allows us to
remove corresponding kfree and drop dpu_hw_intr_destroy() function.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 14 ++++++--------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h | 11 ++++-------
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 4 +---
3 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
index 5e2d68ebb113..945f34736206 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
@@ -6,6 +6,8 @@
#include <linux/debugfs.h>
#include <linux/slab.h>
+#include <drm/drm_managed.h>
+
#include "dpu_core_irq.h"
#include "dpu_kms.h"
#include "dpu_hw_interrupts.h"
@@ -441,8 +443,9 @@ static void __intr_offset(const struct dpu_mdss_cfg *m,
hw->blk_addr = addr + m->mdp[0].base;
}
-struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
- const struct dpu_mdss_cfg *m)
+struct dpu_hw_intr *dpu_hw_intr_init(struct drm_device *dev,
+ void __iomem *addr,
+ const struct dpu_mdss_cfg *m)
{
struct dpu_hw_intr *intr;
int nirq = MDP_INTR_MAX * 32;
@@ -450,7 +453,7 @@ struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
if (!addr || !m)
return ERR_PTR(-EINVAL);
- intr = kzalloc(struct_size(intr, irq_tbl, nirq), GFP_KERNEL);
+ intr = drmm_kzalloc(dev, struct_size(intr, irq_tbl, nirq), GFP_KERNEL);
if (!intr)
return ERR_PTR(-ENOMEM);
@@ -465,11 +468,6 @@ struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
return intr;
}
-void dpu_hw_intr_destroy(struct dpu_hw_intr *intr)
-{
- kfree(intr);
-}
-
int dpu_core_irq_register_callback(struct dpu_kms *dpu_kms, int irq_idx,
void (*irq_cb)(void *arg, int irq_idx),
void *irq_arg)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
index 1f2dabc54c22..b0d7bb073203 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
@@ -70,15 +70,12 @@ struct dpu_hw_intr {
/**
* dpu_hw_intr_init(): Initializes the interrupts hw object
+ * @dev: Corresponding device for devres management
* @addr: mapped register io address of MDP
* @m: pointer to MDSS catalog data
*/
-struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
- const struct dpu_mdss_cfg *m);
+struct dpu_hw_intr *dpu_hw_intr_init(struct drm_device *dev,
+ void __iomem *addr,
+ const struct dpu_mdss_cfg *m);
-/**
- * dpu_hw_intr_destroy(): Cleanup interrutps hw object
- * @intr: pointer to interrupts hw object
- */
-void dpu_hw_intr_destroy(struct dpu_hw_intr *intr);
#endif
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 85b8c9cc99ef..ef232dc838c7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -807,8 +807,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
{
int i;
- if (dpu_kms->hw_intr)
- dpu_hw_intr_destroy(dpu_kms->hw_intr);
dpu_kms->hw_intr = NULL;
/* safe to call these more than once during shutdown */
@@ -1095,7 +1093,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
goto err_pm_put;
}
- dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
+ dpu_kms->hw_intr = dpu_hw_intr_init(dev, dpu_kms->mmio, dpu_kms->catalog);
if (IS_ERR(dpu_kms->hw_intr)) {
rc = PTR_ERR(dpu_kms->hw_intr);
DPU_ERROR("hw_intr init failed: %d\n", rc);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 03/13] drm/msm/dpu: use devres-managed allocation for interrupts data
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Use devm_kzalloc to create interrupts data structure. This allows us to
remove corresponding kfree and drop dpu_hw_intr_destroy() function.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 14 ++++++--------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h | 11 ++++-------
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 4 +---
3 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
index 5e2d68ebb113..945f34736206 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
@@ -6,6 +6,8 @@
#include <linux/debugfs.h>
#include <linux/slab.h>
+#include <drm/drm_managed.h>
+
#include "dpu_core_irq.h"
#include "dpu_kms.h"
#include "dpu_hw_interrupts.h"
@@ -441,8 +443,9 @@ static void __intr_offset(const struct dpu_mdss_cfg *m,
hw->blk_addr = addr + m->mdp[0].base;
}
-struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
- const struct dpu_mdss_cfg *m)
+struct dpu_hw_intr *dpu_hw_intr_init(struct drm_device *dev,
+ void __iomem *addr,
+ const struct dpu_mdss_cfg *m)
{
struct dpu_hw_intr *intr;
int nirq = MDP_INTR_MAX * 32;
@@ -450,7 +453,7 @@ struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
if (!addr || !m)
return ERR_PTR(-EINVAL);
- intr = kzalloc(struct_size(intr, irq_tbl, nirq), GFP_KERNEL);
+ intr = drmm_kzalloc(dev, struct_size(intr, irq_tbl, nirq), GFP_KERNEL);
if (!intr)
return ERR_PTR(-ENOMEM);
@@ -465,11 +468,6 @@ struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
return intr;
}
-void dpu_hw_intr_destroy(struct dpu_hw_intr *intr)
-{
- kfree(intr);
-}
-
int dpu_core_irq_register_callback(struct dpu_kms *dpu_kms, int irq_idx,
void (*irq_cb)(void *arg, int irq_idx),
void *irq_arg)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
index 1f2dabc54c22..b0d7bb073203 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
@@ -70,15 +70,12 @@ struct dpu_hw_intr {
/**
* dpu_hw_intr_init(): Initializes the interrupts hw object
+ * @dev: Corresponding device for devres management
* @addr: mapped register io address of MDP
* @m: pointer to MDSS catalog data
*/
-struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
- const struct dpu_mdss_cfg *m);
+struct dpu_hw_intr *dpu_hw_intr_init(struct drm_device *dev,
+ void __iomem *addr,
+ const struct dpu_mdss_cfg *m);
-/**
- * dpu_hw_intr_destroy(): Cleanup interrutps hw object
- * @intr: pointer to interrupts hw object
- */
-void dpu_hw_intr_destroy(struct dpu_hw_intr *intr);
#endif
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 85b8c9cc99ef..ef232dc838c7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -807,8 +807,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
{
int i;
- if (dpu_kms->hw_intr)
- dpu_hw_intr_destroy(dpu_kms->hw_intr);
dpu_kms->hw_intr = NULL;
/* safe to call these more than once during shutdown */
@@ -1095,7 +1093,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
goto err_pm_put;
}
- dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
+ dpu_kms->hw_intr = dpu_hw_intr_init(dev, dpu_kms->mmio, dpu_kms->catalog);
if (IS_ERR(dpu_kms->hw_intr)) {
rc = PTR_ERR(dpu_kms->hw_intr);
DPU_ERROR("hw_intr init failed: %d\n", rc);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 04/13] drm/msm/dpu: use devres-managed allocation for VBIF data
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Use devm_kzalloc to create VBIF data structure. This allows us to
remove corresponding kfree and drop dpu_hw_intr_destroy() function.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c | 14 ++++++--------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h | 8 ++++----
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 11 +++--------
3 files changed, 13 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
index a5121a50b2bb..98e34afde2d2 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
@@ -2,6 +2,8 @@
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
*/
+#include <drm/drm_managed.h>
+
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
#include "dpu_hw_vbif.h"
@@ -211,12 +213,13 @@ static void _setup_vbif_ops(struct dpu_hw_vbif_ops *ops,
ops->set_write_gather_en = dpu_hw_set_write_gather_en;
}
-struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_vbif *dpu_hw_vbif_init(struct drm_device *dev,
+ const struct dpu_vbif_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_vbif *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -234,8 +237,3 @@ struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
return c;
}
-
-void dpu_hw_vbif_destroy(struct dpu_hw_vbif *vbif)
-{
- kfree(vbif);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
index 7e10d2a172b4..e2b4307500e4 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
@@ -108,12 +108,12 @@ struct dpu_hw_vbif {
/**
* dpu_hw_vbif_init() - Initializes the VBIF driver for the passed
* VBIF catalog entry.
+ * @dev: Corresponding device for devres management
* @cfg: VBIF catalog entry for which driver object is required
* @addr: Mapped register io address of MDSS
*/
-struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
- void __iomem *addr);
-
-void dpu_hw_vbif_destroy(struct dpu_hw_vbif *vbif);
+struct dpu_hw_vbif *dpu_hw_vbif_init(struct drm_device *dev,
+ const struct dpu_vbif_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_VBIF_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index ef232dc838c7..f7723f89cbbc 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -812,13 +812,8 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
/* safe to call these more than once during shutdown */
_dpu_kms_mmu_destroy(dpu_kms);
- if (dpu_kms->catalog) {
- for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) {
- if (dpu_kms->hw_vbif[i]) {
- dpu_hw_vbif_destroy(dpu_kms->hw_vbif[i]);
- dpu_kms->hw_vbif[i] = NULL;
- }
- }
+ for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) {
+ dpu_kms->hw_vbif[i] = NULL;
}
if (dpu_kms->rm_init)
@@ -1070,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
struct dpu_hw_vbif *hw;
const struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i];
- hw = dpu_hw_vbif_init(vbif, dpu_kms->vbif[vbif->id]);
+ hw = dpu_hw_vbif_init(dev, vbif, dpu_kms->vbif[vbif->id]);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 04/13] drm/msm/dpu: use devres-managed allocation for VBIF data
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Use devm_kzalloc to create VBIF data structure. This allows us to
remove corresponding kfree and drop dpu_hw_intr_destroy() function.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c | 14 ++++++--------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h | 8 ++++----
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 11 +++--------
3 files changed, 13 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
index a5121a50b2bb..98e34afde2d2 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
@@ -2,6 +2,8 @@
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
*/
+#include <drm/drm_managed.h>
+
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
#include "dpu_hw_vbif.h"
@@ -211,12 +213,13 @@ static void _setup_vbif_ops(struct dpu_hw_vbif_ops *ops,
ops->set_write_gather_en = dpu_hw_set_write_gather_en;
}
-struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_vbif *dpu_hw_vbif_init(struct drm_device *dev,
+ const struct dpu_vbif_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_vbif *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -234,8 +237,3 @@ struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
return c;
}
-
-void dpu_hw_vbif_destroy(struct dpu_hw_vbif *vbif)
-{
- kfree(vbif);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
index 7e10d2a172b4..e2b4307500e4 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
@@ -108,12 +108,12 @@ struct dpu_hw_vbif {
/**
* dpu_hw_vbif_init() - Initializes the VBIF driver for the passed
* VBIF catalog entry.
+ * @dev: Corresponding device for devres management
* @cfg: VBIF catalog entry for which driver object is required
* @addr: Mapped register io address of MDSS
*/
-struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
- void __iomem *addr);
-
-void dpu_hw_vbif_destroy(struct dpu_hw_vbif *vbif);
+struct dpu_hw_vbif *dpu_hw_vbif_init(struct drm_device *dev,
+ const struct dpu_vbif_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_VBIF_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index ef232dc838c7..f7723f89cbbc 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -812,13 +812,8 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
/* safe to call these more than once during shutdown */
_dpu_kms_mmu_destroy(dpu_kms);
- if (dpu_kms->catalog) {
- for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) {
- if (dpu_kms->hw_vbif[i]) {
- dpu_hw_vbif_destroy(dpu_kms->hw_vbif[i]);
- dpu_kms->hw_vbif[i] = NULL;
- }
- }
+ for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) {
+ dpu_kms->hw_vbif[i] = NULL;
}
if (dpu_kms->rm_init)
@@ -1070,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
struct dpu_hw_vbif *hw;
const struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i];
- hw = dpu_hw_vbif_init(vbif, dpu_kms->vbif[vbif->id]);
+ hw = dpu_hw_vbif_init(dev, vbif, dpu_kms->vbif[vbif->id]);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 05/13] drm/msm/dpu: use devres-managed allocation for MDP TOP
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Use devm_kzalloc to create MDP TOP structure. This allows us to remove
corresponding kfree and drop dpu_hw_mdp_destroy() function.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c | 17 +++++++----------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h | 8 +++++---
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 5 ++---
3 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
index cff48763ce25..481b373d9ccb 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
@@ -2,6 +2,8 @@
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
*/
+#include <drm/drm_managed.h>
+
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
#include "dpu_hw_top.h"
@@ -268,16 +270,17 @@ static void _setup_mdp_ops(struct dpu_hw_mdp_ops *ops,
ops->intf_audio_select = dpu_hw_intf_audio_select;
}
-struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
- void __iomem *addr,
- const struct dpu_mdss_cfg *m)
+struct dpu_hw_mdp *dpu_hw_mdptop_init(struct drm_device *dev,
+ const struct dpu_mdp_cfg *cfg,
+ void __iomem *addr,
+ const struct dpu_mdss_cfg *m)
{
struct dpu_hw_mdp *mdp;
if (!addr)
return ERR_PTR(-EINVAL);
- mdp = kzalloc(sizeof(*mdp), GFP_KERNEL);
+ mdp = drmm_kzalloc(dev, sizeof(*mdp), GFP_KERNEL);
if (!mdp)
return ERR_PTR(-ENOMEM);
@@ -292,9 +295,3 @@ struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
return mdp;
}
-
-void dpu_hw_mdp_destroy(struct dpu_hw_mdp *mdp)
-{
- kfree(mdp);
-}
-
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
index 8b1463d2b2f0..6f3dc98087df 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
@@ -145,13 +145,15 @@ struct dpu_hw_mdp {
/**
* dpu_hw_mdptop_init - initializes the top driver for the passed config
+ * @dev: Corresponding device for devres management
* @cfg: MDP TOP configuration from catalog
* @addr: Mapped register io address of MDP
* @m: Pointer to mdss catalog data
*/
-struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
- void __iomem *addr,
- const struct dpu_mdss_cfg *m);
+struct dpu_hw_mdp *dpu_hw_mdptop_init(struct drm_device *dev,
+ const struct dpu_mdp_cfg *cfg,
+ void __iomem *addr,
+ const struct dpu_mdss_cfg *m);
void dpu_hw_mdp_destroy(struct dpu_hw_mdp *mdp);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index f7723f89cbbc..48c3f8b6b88f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -822,8 +822,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
dpu_kms->catalog = NULL;
- if (dpu_kms->hw_mdp)
- dpu_hw_mdp_destroy(dpu_kms->hw_mdp);
dpu_kms->hw_mdp = NULL;
}
@@ -1051,7 +1049,8 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
dpu_kms->rm_init = true;
- dpu_kms->hw_mdp = dpu_hw_mdptop_init(dpu_kms->catalog->mdp,
+ dpu_kms->hw_mdp = dpu_hw_mdptop_init(dev,
+ dpu_kms->catalog->mdp,
dpu_kms->mmio,
dpu_kms->catalog);
if (IS_ERR(dpu_kms->hw_mdp)) {
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 05/13] drm/msm/dpu: use devres-managed allocation for MDP TOP
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Use devm_kzalloc to create MDP TOP structure. This allows us to remove
corresponding kfree and drop dpu_hw_mdp_destroy() function.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c | 17 +++++++----------
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h | 8 +++++---
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 5 ++---
3 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
index cff48763ce25..481b373d9ccb 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
@@ -2,6 +2,8 @@
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
*/
+#include <drm/drm_managed.h>
+
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
#include "dpu_hw_top.h"
@@ -268,16 +270,17 @@ static void _setup_mdp_ops(struct dpu_hw_mdp_ops *ops,
ops->intf_audio_select = dpu_hw_intf_audio_select;
}
-struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
- void __iomem *addr,
- const struct dpu_mdss_cfg *m)
+struct dpu_hw_mdp *dpu_hw_mdptop_init(struct drm_device *dev,
+ const struct dpu_mdp_cfg *cfg,
+ void __iomem *addr,
+ const struct dpu_mdss_cfg *m)
{
struct dpu_hw_mdp *mdp;
if (!addr)
return ERR_PTR(-EINVAL);
- mdp = kzalloc(sizeof(*mdp), GFP_KERNEL);
+ mdp = drmm_kzalloc(dev, sizeof(*mdp), GFP_KERNEL);
if (!mdp)
return ERR_PTR(-ENOMEM);
@@ -292,9 +295,3 @@ struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
return mdp;
}
-
-void dpu_hw_mdp_destroy(struct dpu_hw_mdp *mdp)
-{
- kfree(mdp);
-}
-
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
index 8b1463d2b2f0..6f3dc98087df 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
@@ -145,13 +145,15 @@ struct dpu_hw_mdp {
/**
* dpu_hw_mdptop_init - initializes the top driver for the passed config
+ * @dev: Corresponding device for devres management
* @cfg: MDP TOP configuration from catalog
* @addr: Mapped register io address of MDP
* @m: Pointer to mdss catalog data
*/
-struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
- void __iomem *addr,
- const struct dpu_mdss_cfg *m);
+struct dpu_hw_mdp *dpu_hw_mdptop_init(struct drm_device *dev,
+ const struct dpu_mdp_cfg *cfg,
+ void __iomem *addr,
+ const struct dpu_mdss_cfg *m);
void dpu_hw_mdp_destroy(struct dpu_hw_mdp *mdp);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index f7723f89cbbc..48c3f8b6b88f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -822,8 +822,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
dpu_kms->catalog = NULL;
- if (dpu_kms->hw_mdp)
- dpu_hw_mdp_destroy(dpu_kms->hw_mdp);
dpu_kms->hw_mdp = NULL;
}
@@ -1051,7 +1049,8 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
dpu_kms->rm_init = true;
- dpu_kms->hw_mdp = dpu_hw_mdptop_init(dpu_kms->catalog->mdp,
+ dpu_kms->hw_mdp = dpu_hw_mdptop_init(dev,
+ dpu_kms->catalog->mdp,
dpu_kms->mmio,
dpu_kms->catalog);
if (IS_ERR(dpu_kms->hw_mdp)) {
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 06/13] drm/msm/dpu: use devres-managed allocation for HW blocks
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Use devm_kzalloc to create HW block structure. This allows us to remove
corresponding kfree and drop all dpu_hw_*_destroy() functions as well as
dpu_rm_destroy(), which becomes empty afterwards.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 19 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 16 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c | 12 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h | 10 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c | 7 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 16 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 15 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 12 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h | 13 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 13 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 15 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 7 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 8 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 90 +++----------------
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 11 +--
23 files changed, 119 insertions(+), 238 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
index c278fb9d2b5b..d22e3f11ae34 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
@@ -4,6 +4,9 @@
*/
#include <linux/delay.h>
+
+#include <drm/drm_managed.h>
+
#include "dpu_hwio.h"
#include "dpu_hw_ctl.h"
#include "dpu_kms.h"
@@ -674,14 +677,15 @@ static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
ops->set_active_pipes = dpu_hw_ctl_set_fetch_pipe_active;
};
-struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
- void __iomem *addr,
- u32 mixer_count,
- const struct dpu_lm_cfg *mixer)
+struct dpu_hw_ctl *dpu_hw_ctl_init(struct drm_device *dev,
+ const struct dpu_ctl_cfg *cfg,
+ void __iomem *addr,
+ u32 mixer_count,
+ const struct dpu_lm_cfg *mixer)
{
struct dpu_hw_ctl *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -696,8 +700,3 @@ struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
return c;
}
-
-void dpu_hw_ctl_destroy(struct dpu_hw_ctl *ctx)
-{
- kfree(ctx);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
index 1c242298ff2e..279ebd8dfbff 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
@@ -274,20 +274,16 @@ static inline struct dpu_hw_ctl *to_dpu_hw_ctl(struct dpu_hw_blk *hw)
/**
* dpu_hw_ctl_init() - Initializes the ctl_path hw driver object.
* Should be called before accessing any ctl_path register.
+ * @dev: Corresponding device for devres management
* @cfg: ctl_path catalog entry for which driver object is required
* @addr: mapped register io address of MDP
* @mixer_count: Number of mixers in @mixer
* @mixer: Pointer to an array of Layer Mixers defined in the catalog
*/
-struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
- void __iomem *addr,
- u32 mixer_count,
- const struct dpu_lm_cfg *mixer);
-
-/**
- * dpu_hw_ctl_destroy(): Destroys ctl driver context
- * should be called to free the context
- */
-void dpu_hw_ctl_destroy(struct dpu_hw_ctl *ctx);
+struct dpu_hw_ctl *dpu_hw_ctl_init(struct drm_device *dev,
+ const struct dpu_ctl_cfg *cfg,
+ void __iomem *addr,
+ u32 mixer_count,
+ const struct dpu_lm_cfg *mixer);
#endif /*_DPU_HW_CTL_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
index 509dbaa51d87..5e9aad1b2aa2 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
@@ -3,6 +3,8 @@
* Copyright (c) 2020-2022, Linaro Limited
*/
+#include <drm/drm_managed.h>
+
#include <drm/display/drm_dsc_helper.h>
#include "dpu_kms.h"
@@ -188,12 +190,13 @@ static void _setup_dsc_ops(struct dpu_hw_dsc_ops *ops,
ops->dsc_bind_pingpong_blk = dpu_hw_dsc_bind_pingpong_blk;
};
-struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
+struct dpu_hw_dsc *dpu_hw_dsc_init(struct drm_device *dev,
+ const struct dpu_dsc_cfg *cfg,
void __iomem *addr)
{
struct dpu_hw_dsc *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -206,8 +209,3 @@ struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
return c;
}
-
-void dpu_hw_dsc_destroy(struct dpu_hw_dsc *dsc)
-{
- kfree(dsc);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
index d5b597ab8c5c..989c88d2449b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
@@ -64,20 +64,24 @@ struct dpu_hw_dsc {
/**
* dpu_hw_dsc_init() - Initializes the DSC hw driver object.
+ * @dev: Corresponding device for devres management
* @cfg: DSC catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Return: Error code or allocated dpu_hw_dsc context
*/
-struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
- void __iomem *addr);
+struct dpu_hw_dsc *dpu_hw_dsc_init(struct drm_device *dev,
+ const struct dpu_dsc_cfg *cfg,
+ void __iomem *addr);
/**
* dpu_hw_dsc_init_1_2() - initializes the v1.2 DSC hw driver object
+ * @dev: Corresponding device for devres management
* @cfg: DSC catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Returns: Error code or allocated dpu_hw_dsc context
*/
-struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(const struct dpu_dsc_cfg *cfg,
+struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(struct drm_device *dev,
+ const struct dpu_dsc_cfg *cfg,
void __iomem *addr);
/**
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
index 24fe1d98eb86..ba193b0376fe 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
@@ -4,6 +4,8 @@
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved
*/
+#include <drm/drm_managed.h>
+
#include <drm/display/drm_dsc_helper.h>
#include "dpu_kms.h"
@@ -367,12 +369,13 @@ static void _setup_dcs_ops_1_2(struct dpu_hw_dsc_ops *ops,
ops->dsc_bind_pingpong_blk = dpu_hw_dsc_bind_pingpong_blk_1_2;
}
-struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(const struct dpu_dsc_cfg *cfg,
+struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(struct drm_device *dev,
+ const struct dpu_dsc_cfg *cfg,
void __iomem *addr)
{
struct dpu_hw_dsc *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
index 9419b2209af8..b1da88e2935f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
@@ -2,6 +2,8 @@
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
*/
+#include <drm/drm_managed.h>
+
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
#include "dpu_hw_lm.h"
@@ -68,15 +70,16 @@ static void _setup_dspp_ops(struct dpu_hw_dspp *c,
c->ops.setup_pcc = dpu_setup_dspp_pcc;
}
-struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_dspp *dpu_hw_dspp_init(struct drm_device *dev,
+ const struct dpu_dspp_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_dspp *c;
if (!addr)
return ERR_PTR(-EINVAL);
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -90,10 +93,3 @@ struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
return c;
}
-
-void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp)
-{
- kfree(dspp);
-}
-
-
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
index bea965681330..3b435690b6cc 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
@@ -81,18 +81,14 @@ static inline struct dpu_hw_dspp *to_dpu_hw_dspp(struct dpu_hw_blk *hw)
/**
* dpu_hw_dspp_init() - Initializes the DSPP hw driver object.
* should be called once before accessing every DSPP.
+ * @dev: Corresponding device for devres management
* @cfg: DSPP catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Return: pointer to structure or ERR_PTR
*/
-struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_dspp_destroy(): Destroys DSPP driver context
- * @dspp: Pointer to DSPP driver context
- */
-void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp);
+struct dpu_hw_dspp *dpu_hw_dspp_init(struct drm_device *dev,
+ const struct dpu_dspp_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_DSPP_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
index 5b0f6627e29b..08304fc3d1d6 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
@@ -12,6 +12,8 @@
#include <linux/iopoll.h>
+#include <drm/drm_managed.h>
+
#define INTF_TIMING_ENGINE_EN 0x000
#define INTF_CONFIG 0x004
#define INTF_HSYNC_CTL 0x008
@@ -547,8 +549,9 @@ static void _setup_intf_ops(struct dpu_hw_intf_ops *ops,
ops->enable_compression = dpu_hw_intf_enable_compression;
}
-struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_intf *dpu_hw_intf_init(struct drm_device *dev,
+ const struct dpu_intf_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_intf *c;
@@ -557,7 +560,7 @@ struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
return NULL;
}
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -573,9 +576,3 @@ struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
return c;
}
-
-void dpu_hw_intf_destroy(struct dpu_hw_intf *intf)
-{
- kfree(intf);
-}
-
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
index 99e21c4137f9..79240fbeeb53 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
@@ -125,16 +125,12 @@ struct dpu_hw_intf {
/**
* dpu_hw_intf_init() - Initializes the INTF driver for the passed
* interface catalog entry.
+ * @dev: Corresponding device for devres management
* @cfg: interface catalog entry for which driver object is required
* @addr: mapped register io address of MDP
*/
-struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_intf_destroy(): Destroys INTF driver context
- * @intf: Pointer to INTF driver context
- */
-void dpu_hw_intf_destroy(struct dpu_hw_intf *intf);
+struct dpu_hw_intf *dpu_hw_intf_init(struct drm_device *dev,
+ const struct dpu_intf_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_INTF_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
index d1c3bd8379ea..25af52ab602f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
@@ -4,6 +4,8 @@
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
*/
+#include <drm/drm_managed.h>
+
#include "dpu_kms.h"
#include "dpu_hw_catalog.h"
#include "dpu_hwio.h"
@@ -156,8 +158,9 @@ static void _setup_mixer_ops(struct dpu_hw_lm_ops *ops,
ops->collect_misr = dpu_hw_lm_collect_misr;
}
-struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_mixer *dpu_hw_lm_init(struct drm_device *dev,
+ const struct dpu_lm_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_mixer *c;
@@ -166,7 +169,7 @@ struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
return NULL;
}
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -180,8 +183,3 @@ struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
return c;
}
-
-void dpu_hw_lm_destroy(struct dpu_hw_mixer *lm)
-{
- kfree(lm);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
index 36992d046a53..8835fd106413 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
@@ -95,16 +95,12 @@ static inline struct dpu_hw_mixer *to_dpu_hw_mixer(struct dpu_hw_blk *hw)
/**
* dpu_hw_lm_init() - Initializes the mixer hw driver object.
* should be called once before accessing every mixer.
+ * @dev: Corresponding device for devres management
* @cfg: mixer catalog entry for which driver object is required
* @addr: mapped register io address of MDP
*/
-struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_lm_destroy(): Destroys layer mixer driver context
- * @lm: Pointer to LM driver context
- */
-void dpu_hw_lm_destroy(struct dpu_hw_mixer *lm);
+struct dpu_hw_mixer *dpu_hw_lm_init(struct drm_device *dev,
+ const struct dpu_lm_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_LM_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
index 90e0e05eff8d..ddfa40a959cb 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
@@ -4,6 +4,8 @@
#include <linux/iopoll.h>
+#include <drm/drm_managed.h>
+
#include "dpu_hw_mdss.h"
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
@@ -37,12 +39,13 @@ static void _setup_merge_3d_ops(struct dpu_hw_merge_3d *c,
c->ops.setup_3d_mode = dpu_hw_merge_3d_setup_3d_mode;
};
-struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(struct drm_device *dev,
+ const struct dpu_merge_3d_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_merge_3d *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -55,8 +58,3 @@ struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
return c;
}
-
-void dpu_hw_merge_3d_destroy(struct dpu_hw_merge_3d *hw)
-{
- kfree(hw);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
index 19cec5e88722..c192f02ec1ab 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
@@ -48,18 +48,13 @@ static inline struct dpu_hw_merge_3d *to_dpu_hw_merge_3d(struct dpu_hw_blk *hw)
/**
* dpu_hw_merge_3d_init() - Initializes the merge_3d driver for the passed
* merge3d catalog entry.
+ * @dev: Corresponding device for devres management
* @cfg: Pingpong catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Return: Error code or allocated dpu_hw_merge_3d context
*/
-struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_merge_3d_destroy - destroys merge_3d driver context
- * should be called to free the context
- * @pp: Pointer to PP driver context returned by dpu_hw_merge_3d_init
- */
-void dpu_hw_merge_3d_destroy(struct dpu_hw_merge_3d *pp);
+struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(struct drm_device *dev,
+ const struct dpu_merge_3d_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_MERGE3D_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
index 437d9e62a841..72292af91a18 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
@@ -4,6 +4,8 @@
#include <linux/iopoll.h>
+#include <drm/drm_managed.h>
+
#include "dpu_hw_mdss.h"
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
@@ -302,12 +304,13 @@ static void _setup_pingpong_ops(struct dpu_hw_pingpong *c,
c->ops.setup_dither = dpu_hw_pp_setup_dither;
};
-struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_pingpong *dpu_hw_pingpong_init(struct drm_device *dev,
+ const struct dpu_pingpong_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_pingpong *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -320,8 +323,3 @@ struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
return c;
}
-
-void dpu_hw_pingpong_destroy(struct dpu_hw_pingpong *pp)
-{
- kfree(pp);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
index d3246a9a5808..96eb2b87e7ef 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
@@ -121,18 +121,13 @@ static inline struct dpu_hw_pingpong *to_dpu_hw_pingpong(struct dpu_hw_blk *hw)
/**
* dpu_hw_pingpong_init() - initializes the pingpong driver for the passed
* pingpong catalog entry.
+ * @dev: Corresponding device for devres management
* @cfg: Pingpong catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Return: Error code or allocated dpu_hw_pingpong context
*/
-struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_pingpong_destroy - destroys pingpong driver context
- * should be called to free the context
- * @pp: Pointer to PP driver context returned by dpu_hw_pingpong_init
- */
-void dpu_hw_pingpong_destroy(struct dpu_hw_pingpong *pp);
+struct dpu_hw_pingpong *dpu_hw_pingpong_init(struct drm_device *dev,
+ const struct dpu_pingpong_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_PINGPONG_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
index b364cf75bb3f..fb8ecfb9b922 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
@@ -9,6 +9,7 @@
#include "dpu_kms.h"
#include <drm/drm_file.h>
+#include <drm/drm_managed.h>
#define DPU_FETCH_CONFIG_RESET_VALUE 0x00000087
@@ -669,15 +670,17 @@ int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms,
}
#endif
-struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
- void __iomem *addr, const struct dpu_ubwc_cfg *ubwc)
+struct dpu_hw_sspp *dpu_hw_sspp_init(struct drm_device *dev,
+ const struct dpu_sspp_cfg *cfg,
+ void __iomem *addr,
+ const struct dpu_ubwc_cfg *ubwc)
{
struct dpu_hw_sspp *hw_pipe;
if (!addr || !ubwc)
return ERR_PTR(-EINVAL);
- hw_pipe = kzalloc(sizeof(*hw_pipe), GFP_KERNEL);
+ hw_pipe = drmm_kzalloc(dev, sizeof(*hw_pipe), GFP_KERNEL);
if (!hw_pipe)
return ERR_PTR(-ENOMEM);
@@ -692,9 +695,3 @@ struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
return hw_pipe;
}
-
-void dpu_hw_sspp_destroy(struct dpu_hw_sspp *ctx)
-{
- kfree(ctx);
-}
-
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
index 085f34bc6b88..5dd4f78d424c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
@@ -331,12 +331,15 @@ struct dpu_kms;
/**
* dpu_hw_sspp_init() - Initializes the sspp hw driver object.
* Should be called once before accessing every pipe.
+ * @dev: Corresponding device for devres management
* @cfg: Pipe catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* @ubwc: UBWC configuration data
*/
-struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
- void __iomem *addr, const struct dpu_ubwc_cfg *ubwc);
+struct dpu_hw_sspp *dpu_hw_sspp_init(struct drm_device *dev,
+ const struct dpu_sspp_cfg *cfg,
+ void __iomem *addr,
+ const struct dpu_ubwc_cfg *ubwc);
/**
* dpu_hw_sspp_destroy(): Destroys SSPP driver context
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
index ebc416400382..106540eee5f7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
@@ -3,6 +3,8 @@
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved
*/
+#include <drm/drm_managed.h>
+
#include "dpu_hw_mdss.h"
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
@@ -194,15 +196,16 @@ static void _setup_wb_ops(struct dpu_hw_wb_ops *ops,
ops->bind_pingpong_blk = dpu_hw_wb_bind_pingpong_blk;
}
-struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_wb *dpu_hw_wb_init(struct drm_device *dev,
+ const struct dpu_wb_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_wb *c;
if (!addr)
return ERR_PTR(-EINVAL);
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -216,8 +219,3 @@ struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
return c;
}
-
-void dpu_hw_wb_destroy(struct dpu_hw_wb *hw_wb)
-{
- kfree(hw_wb);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
index 2d7db2efa3d0..98d1129238cc 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
@@ -72,17 +72,13 @@ struct dpu_hw_wb {
/**
* dpu_hw_wb_init() - Initializes the writeback hw driver object.
+ * @dev: Corresponding device for devres management
* @cfg: wb_path catalog entry for which driver object is required
* @addr: mapped register io address of MDP
* Return: Error code or allocated dpu_hw_wb context
*/
-struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_wb_destroy(): Destroy writeback hw driver object.
- * @hw_wb: Pointer to writeback hw driver object
- */
-void dpu_hw_wb_destroy(struct dpu_hw_wb *hw_wb);
+struct dpu_hw_wb *dpu_hw_wb_init(struct drm_device *dev,
+ const struct dpu_wb_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_WB_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 48c3f8b6b88f..1e29de32b7c0 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -816,10 +816,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
dpu_kms->hw_vbif[i] = NULL;
}
- if (dpu_kms->rm_init)
- dpu_rm_destroy(&dpu_kms->rm);
- dpu_kms->rm_init = false;
-
dpu_kms->catalog = NULL;
dpu_kms->hw_mdp = NULL;
@@ -1041,14 +1037,12 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
goto err_pm_put;
}
- rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
+ rc = dpu_rm_init(dev, &dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
if (rc) {
DPU_ERROR("rm init failed: %d\n", rc);
goto err_pm_put;
}
- dpu_kms->rm_init = true;
-
dpu_kms->hw_mdp = dpu_hw_mdptop_init(dev,
dpu_kms->catalog->mdp,
dpu_kms->mmio,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
index f3bdd4f11108..2af1767ada9d 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
@@ -87,7 +87,6 @@ struct dpu_kms {
struct drm_private_obj global_state;
struct dpu_rm rm;
- bool rm_init;
struct dpu_hw_vbif *hw_vbif[VBIF_MAX];
struct dpu_hw_mdp *hw_mdp;
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
index e333f4eeafc1..d10025b8f659 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
@@ -34,72 +34,8 @@ struct dpu_rm_requirements {
struct msm_display_topology topology;
};
-int dpu_rm_destroy(struct dpu_rm *rm)
-{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(rm->dspp_blks); i++) {
- struct dpu_hw_dspp *hw;
-
- if (rm->dspp_blks[i]) {
- hw = to_dpu_hw_dspp(rm->dspp_blks[i]);
- dpu_hw_dspp_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->pingpong_blks); i++) {
- struct dpu_hw_pingpong *hw;
-
- if (rm->pingpong_blks[i]) {
- hw = to_dpu_hw_pingpong(rm->pingpong_blks[i]);
- dpu_hw_pingpong_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->merge_3d_blks); i++) {
- struct dpu_hw_merge_3d *hw;
-
- if (rm->merge_3d_blks[i]) {
- hw = to_dpu_hw_merge_3d(rm->merge_3d_blks[i]);
- dpu_hw_merge_3d_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->mixer_blks); i++) {
- struct dpu_hw_mixer *hw;
-
- if (rm->mixer_blks[i]) {
- hw = to_dpu_hw_mixer(rm->mixer_blks[i]);
- dpu_hw_lm_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->ctl_blks); i++) {
- struct dpu_hw_ctl *hw;
-
- if (rm->ctl_blks[i]) {
- hw = to_dpu_hw_ctl(rm->ctl_blks[i]);
- dpu_hw_ctl_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->hw_intf); i++)
- dpu_hw_intf_destroy(rm->hw_intf[i]);
-
- for (i = 0; i < ARRAY_SIZE(rm->dsc_blks); i++) {
- struct dpu_hw_dsc *hw;
-
- if (rm->dsc_blks[i]) {
- hw = to_dpu_hw_dsc(rm->dsc_blks[i]);
- dpu_hw_dsc_destroy(hw);
- }
- }
-
- for (i = 0; i < ARRAY_SIZE(rm->hw_wb); i++)
- dpu_hw_wb_destroy(rm->hw_wb[i]);
-
- for (i = 0; i < ARRAY_SIZE(rm->hw_sspp); i++)
- dpu_hw_sspp_destroy(rm->hw_sspp[i]);
-
- return 0;
-}
-
-int dpu_rm_init(struct dpu_rm *rm,
+int dpu_rm_init(struct drm_device *dev,
+ struct dpu_rm *rm,
const struct dpu_mdss_cfg *cat,
void __iomem *mmio)
{
@@ -118,7 +54,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_mixer *hw;
const struct dpu_lm_cfg *lm = &cat->mixer[i];
- hw = dpu_hw_lm_init(lm, mmio);
+ hw = dpu_hw_lm_init(dev, lm, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed lm object creation: err %d\n", rc);
@@ -131,7 +67,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_merge_3d *hw;
const struct dpu_merge_3d_cfg *merge_3d = &cat->merge_3d[i];
- hw = dpu_hw_merge_3d_init(merge_3d, mmio);
+ hw = dpu_hw_merge_3d_init(dev, merge_3d, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed merge_3d object creation: err %d\n",
@@ -145,7 +81,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_pingpong *hw;
const struct dpu_pingpong_cfg *pp = &cat->pingpong[i];
- hw = dpu_hw_pingpong_init(pp, mmio);
+ hw = dpu_hw_pingpong_init(dev, pp, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed pingpong object creation: err %d\n",
@@ -161,7 +97,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_intf *hw;
const struct dpu_intf_cfg *intf = &cat->intf[i];
- hw = dpu_hw_intf_init(intf, mmio);
+ hw = dpu_hw_intf_init(dev, intf, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed intf object creation: err %d\n", rc);
@@ -174,7 +110,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_wb *hw;
const struct dpu_wb_cfg *wb = &cat->wb[i];
- hw = dpu_hw_wb_init(wb, mmio);
+ hw = dpu_hw_wb_init(dev, wb, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed wb object creation: err %d\n", rc);
@@ -187,7 +123,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_ctl *hw;
const struct dpu_ctl_cfg *ctl = &cat->ctl[i];
- hw = dpu_hw_ctl_init(ctl, mmio, cat->mixer_count, cat->mixer);
+ hw = dpu_hw_ctl_init(dev, ctl, mmio, cat->mixer_count, cat->mixer);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed ctl object creation: err %d\n", rc);
@@ -200,7 +136,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_dspp *hw;
const struct dpu_dspp_cfg *dspp = &cat->dspp[i];
- hw = dpu_hw_dspp_init(dspp, mmio);
+ hw = dpu_hw_dspp_init(dev, dspp, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed dspp object creation: err %d\n", rc);
@@ -214,9 +150,9 @@ int dpu_rm_init(struct dpu_rm *rm,
const struct dpu_dsc_cfg *dsc = &cat->dsc[i];
if (test_bit(DPU_DSC_HW_REV_1_2, &dsc->features))
- hw = dpu_hw_dsc_init_1_2(dsc, mmio);
+ hw = dpu_hw_dsc_init_1_2(dev, dsc, mmio);
else
- hw = dpu_hw_dsc_init(dsc, mmio);
+ hw = dpu_hw_dsc_init(dev, dsc, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
@@ -230,7 +166,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_sspp *hw;
const struct dpu_sspp_cfg *sspp = &cat->sspp[i];
- hw = dpu_hw_sspp_init(sspp, mmio, cat->ubwc);
+ hw = dpu_hw_sspp_init(dev, sspp, mmio, cat->ubwc);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed sspp object creation: err %d\n", rc);
@@ -242,8 +178,6 @@ int dpu_rm_init(struct dpu_rm *rm,
return 0;
fail:
- dpu_rm_destroy(rm);
-
return rc ? rc : -EFAULT;
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
index d62c2edb2460..7199a09f3ce3 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
@@ -38,22 +38,17 @@ struct dpu_rm {
/**
* dpu_rm_init - Read hardware catalog and create reservation tracking objects
* for all HW blocks.
+ * @dev: Corresponding device for devres management
* @rm: DPU Resource Manager handle
* @cat: Pointer to hardware catalog
* @mmio: mapped register io address of MDP
* @Return: 0 on Success otherwise -ERROR
*/
-int dpu_rm_init(struct dpu_rm *rm,
+int dpu_rm_init(struct drm_device *dev,
+ struct dpu_rm *rm,
const struct dpu_mdss_cfg *cat,
void __iomem *mmio);
-/**
- * dpu_rm_destroy - Free all memory allocated by dpu_rm_init
- * @rm: DPU Resource Manager handle
- * @Return: 0 on Success otherwise -ERROR
- */
-int dpu_rm_destroy(struct dpu_rm *rm);
-
/**
* dpu_rm_reserve - Given a CRTC->Encoder->Connector display chain, analyze
* the use connections and user requirements, specified through related
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 06/13] drm/msm/dpu: use devres-managed allocation for HW blocks
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Use devm_kzalloc to create HW block structure. This allows us to remove
corresponding kfree and drop all dpu_hw_*_destroy() functions as well as
dpu_rm_destroy(), which becomes empty afterwards.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 19 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 16 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c | 12 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h | 10 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c | 7 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 16 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 15 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 12 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h | 13 +--
.../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 14 ++-
.../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 13 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 15 ++--
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 7 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 14 ++-
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h | 12 +--
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 8 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 -
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 90 +++----------------
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 11 +--
23 files changed, 119 insertions(+), 238 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
index c278fb9d2b5b..d22e3f11ae34 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
@@ -4,6 +4,9 @@
*/
#include <linux/delay.h>
+
+#include <drm/drm_managed.h>
+
#include "dpu_hwio.h"
#include "dpu_hw_ctl.h"
#include "dpu_kms.h"
@@ -674,14 +677,15 @@ static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
ops->set_active_pipes = dpu_hw_ctl_set_fetch_pipe_active;
};
-struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
- void __iomem *addr,
- u32 mixer_count,
- const struct dpu_lm_cfg *mixer)
+struct dpu_hw_ctl *dpu_hw_ctl_init(struct drm_device *dev,
+ const struct dpu_ctl_cfg *cfg,
+ void __iomem *addr,
+ u32 mixer_count,
+ const struct dpu_lm_cfg *mixer)
{
struct dpu_hw_ctl *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -696,8 +700,3 @@ struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
return c;
}
-
-void dpu_hw_ctl_destroy(struct dpu_hw_ctl *ctx)
-{
- kfree(ctx);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
index 1c242298ff2e..279ebd8dfbff 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
@@ -274,20 +274,16 @@ static inline struct dpu_hw_ctl *to_dpu_hw_ctl(struct dpu_hw_blk *hw)
/**
* dpu_hw_ctl_init() - Initializes the ctl_path hw driver object.
* Should be called before accessing any ctl_path register.
+ * @dev: Corresponding device for devres management
* @cfg: ctl_path catalog entry for which driver object is required
* @addr: mapped register io address of MDP
* @mixer_count: Number of mixers in @mixer
* @mixer: Pointer to an array of Layer Mixers defined in the catalog
*/
-struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
- void __iomem *addr,
- u32 mixer_count,
- const struct dpu_lm_cfg *mixer);
-
-/**
- * dpu_hw_ctl_destroy(): Destroys ctl driver context
- * should be called to free the context
- */
-void dpu_hw_ctl_destroy(struct dpu_hw_ctl *ctx);
+struct dpu_hw_ctl *dpu_hw_ctl_init(struct drm_device *dev,
+ const struct dpu_ctl_cfg *cfg,
+ void __iomem *addr,
+ u32 mixer_count,
+ const struct dpu_lm_cfg *mixer);
#endif /*_DPU_HW_CTL_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
index 509dbaa51d87..5e9aad1b2aa2 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
@@ -3,6 +3,8 @@
* Copyright (c) 2020-2022, Linaro Limited
*/
+#include <drm/drm_managed.h>
+
#include <drm/display/drm_dsc_helper.h>
#include "dpu_kms.h"
@@ -188,12 +190,13 @@ static void _setup_dsc_ops(struct dpu_hw_dsc_ops *ops,
ops->dsc_bind_pingpong_blk = dpu_hw_dsc_bind_pingpong_blk;
};
-struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
+struct dpu_hw_dsc *dpu_hw_dsc_init(struct drm_device *dev,
+ const struct dpu_dsc_cfg *cfg,
void __iomem *addr)
{
struct dpu_hw_dsc *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -206,8 +209,3 @@ struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
return c;
}
-
-void dpu_hw_dsc_destroy(struct dpu_hw_dsc *dsc)
-{
- kfree(dsc);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
index d5b597ab8c5c..989c88d2449b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
@@ -64,20 +64,24 @@ struct dpu_hw_dsc {
/**
* dpu_hw_dsc_init() - Initializes the DSC hw driver object.
+ * @dev: Corresponding device for devres management
* @cfg: DSC catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Return: Error code or allocated dpu_hw_dsc context
*/
-struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
- void __iomem *addr);
+struct dpu_hw_dsc *dpu_hw_dsc_init(struct drm_device *dev,
+ const struct dpu_dsc_cfg *cfg,
+ void __iomem *addr);
/**
* dpu_hw_dsc_init_1_2() - initializes the v1.2 DSC hw driver object
+ * @dev: Corresponding device for devres management
* @cfg: DSC catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Returns: Error code or allocated dpu_hw_dsc context
*/
-struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(const struct dpu_dsc_cfg *cfg,
+struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(struct drm_device *dev,
+ const struct dpu_dsc_cfg *cfg,
void __iomem *addr);
/**
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
index 24fe1d98eb86..ba193b0376fe 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
@@ -4,6 +4,8 @@
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved
*/
+#include <drm/drm_managed.h>
+
#include <drm/display/drm_dsc_helper.h>
#include "dpu_kms.h"
@@ -367,12 +369,13 @@ static void _setup_dcs_ops_1_2(struct dpu_hw_dsc_ops *ops,
ops->dsc_bind_pingpong_blk = dpu_hw_dsc_bind_pingpong_blk_1_2;
}
-struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(const struct dpu_dsc_cfg *cfg,
+struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(struct drm_device *dev,
+ const struct dpu_dsc_cfg *cfg,
void __iomem *addr)
{
struct dpu_hw_dsc *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
index 9419b2209af8..b1da88e2935f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
@@ -2,6 +2,8 @@
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
*/
+#include <drm/drm_managed.h>
+
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
#include "dpu_hw_lm.h"
@@ -68,15 +70,16 @@ static void _setup_dspp_ops(struct dpu_hw_dspp *c,
c->ops.setup_pcc = dpu_setup_dspp_pcc;
}
-struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_dspp *dpu_hw_dspp_init(struct drm_device *dev,
+ const struct dpu_dspp_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_dspp *c;
if (!addr)
return ERR_PTR(-EINVAL);
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -90,10 +93,3 @@ struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
return c;
}
-
-void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp)
-{
- kfree(dspp);
-}
-
-
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
index bea965681330..3b435690b6cc 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
@@ -81,18 +81,14 @@ static inline struct dpu_hw_dspp *to_dpu_hw_dspp(struct dpu_hw_blk *hw)
/**
* dpu_hw_dspp_init() - Initializes the DSPP hw driver object.
* should be called once before accessing every DSPP.
+ * @dev: Corresponding device for devres management
* @cfg: DSPP catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Return: pointer to structure or ERR_PTR
*/
-struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_dspp_destroy(): Destroys DSPP driver context
- * @dspp: Pointer to DSPP driver context
- */
-void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp);
+struct dpu_hw_dspp *dpu_hw_dspp_init(struct drm_device *dev,
+ const struct dpu_dspp_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_DSPP_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
index 5b0f6627e29b..08304fc3d1d6 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
@@ -12,6 +12,8 @@
#include <linux/iopoll.h>
+#include <drm/drm_managed.h>
+
#define INTF_TIMING_ENGINE_EN 0x000
#define INTF_CONFIG 0x004
#define INTF_HSYNC_CTL 0x008
@@ -547,8 +549,9 @@ static void _setup_intf_ops(struct dpu_hw_intf_ops *ops,
ops->enable_compression = dpu_hw_intf_enable_compression;
}
-struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_intf *dpu_hw_intf_init(struct drm_device *dev,
+ const struct dpu_intf_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_intf *c;
@@ -557,7 +560,7 @@ struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
return NULL;
}
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -573,9 +576,3 @@ struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
return c;
}
-
-void dpu_hw_intf_destroy(struct dpu_hw_intf *intf)
-{
- kfree(intf);
-}
-
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
index 99e21c4137f9..79240fbeeb53 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
@@ -125,16 +125,12 @@ struct dpu_hw_intf {
/**
* dpu_hw_intf_init() - Initializes the INTF driver for the passed
* interface catalog entry.
+ * @dev: Corresponding device for devres management
* @cfg: interface catalog entry for which driver object is required
* @addr: mapped register io address of MDP
*/
-struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_intf_destroy(): Destroys INTF driver context
- * @intf: Pointer to INTF driver context
- */
-void dpu_hw_intf_destroy(struct dpu_hw_intf *intf);
+struct dpu_hw_intf *dpu_hw_intf_init(struct drm_device *dev,
+ const struct dpu_intf_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_INTF_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
index d1c3bd8379ea..25af52ab602f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
@@ -4,6 +4,8 @@
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
*/
+#include <drm/drm_managed.h>
+
#include "dpu_kms.h"
#include "dpu_hw_catalog.h"
#include "dpu_hwio.h"
@@ -156,8 +158,9 @@ static void _setup_mixer_ops(struct dpu_hw_lm_ops *ops,
ops->collect_misr = dpu_hw_lm_collect_misr;
}
-struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_mixer *dpu_hw_lm_init(struct drm_device *dev,
+ const struct dpu_lm_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_mixer *c;
@@ -166,7 +169,7 @@ struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
return NULL;
}
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -180,8 +183,3 @@ struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
return c;
}
-
-void dpu_hw_lm_destroy(struct dpu_hw_mixer *lm)
-{
- kfree(lm);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
index 36992d046a53..8835fd106413 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
@@ -95,16 +95,12 @@ static inline struct dpu_hw_mixer *to_dpu_hw_mixer(struct dpu_hw_blk *hw)
/**
* dpu_hw_lm_init() - Initializes the mixer hw driver object.
* should be called once before accessing every mixer.
+ * @dev: Corresponding device for devres management
* @cfg: mixer catalog entry for which driver object is required
* @addr: mapped register io address of MDP
*/
-struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_lm_destroy(): Destroys layer mixer driver context
- * @lm: Pointer to LM driver context
- */
-void dpu_hw_lm_destroy(struct dpu_hw_mixer *lm);
+struct dpu_hw_mixer *dpu_hw_lm_init(struct drm_device *dev,
+ const struct dpu_lm_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_LM_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
index 90e0e05eff8d..ddfa40a959cb 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
@@ -4,6 +4,8 @@
#include <linux/iopoll.h>
+#include <drm/drm_managed.h>
+
#include "dpu_hw_mdss.h"
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
@@ -37,12 +39,13 @@ static void _setup_merge_3d_ops(struct dpu_hw_merge_3d *c,
c->ops.setup_3d_mode = dpu_hw_merge_3d_setup_3d_mode;
};
-struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(struct drm_device *dev,
+ const struct dpu_merge_3d_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_merge_3d *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -55,8 +58,3 @@ struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
return c;
}
-
-void dpu_hw_merge_3d_destroy(struct dpu_hw_merge_3d *hw)
-{
- kfree(hw);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
index 19cec5e88722..c192f02ec1ab 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
@@ -48,18 +48,13 @@ static inline struct dpu_hw_merge_3d *to_dpu_hw_merge_3d(struct dpu_hw_blk *hw)
/**
* dpu_hw_merge_3d_init() - Initializes the merge_3d driver for the passed
* merge3d catalog entry.
+ * @dev: Corresponding device for devres management
* @cfg: Pingpong catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Return: Error code or allocated dpu_hw_merge_3d context
*/
-struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_merge_3d_destroy - destroys merge_3d driver context
- * should be called to free the context
- * @pp: Pointer to PP driver context returned by dpu_hw_merge_3d_init
- */
-void dpu_hw_merge_3d_destroy(struct dpu_hw_merge_3d *pp);
+struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(struct drm_device *dev,
+ const struct dpu_merge_3d_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_MERGE3D_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
index 437d9e62a841..72292af91a18 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
@@ -4,6 +4,8 @@
#include <linux/iopoll.h>
+#include <drm/drm_managed.h>
+
#include "dpu_hw_mdss.h"
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
@@ -302,12 +304,13 @@ static void _setup_pingpong_ops(struct dpu_hw_pingpong *c,
c->ops.setup_dither = dpu_hw_pp_setup_dither;
};
-struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_pingpong *dpu_hw_pingpong_init(struct drm_device *dev,
+ const struct dpu_pingpong_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_pingpong *c;
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -320,8 +323,3 @@ struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
return c;
}
-
-void dpu_hw_pingpong_destroy(struct dpu_hw_pingpong *pp)
-{
- kfree(pp);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
index d3246a9a5808..96eb2b87e7ef 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
@@ -121,18 +121,13 @@ static inline struct dpu_hw_pingpong *to_dpu_hw_pingpong(struct dpu_hw_blk *hw)
/**
* dpu_hw_pingpong_init() - initializes the pingpong driver for the passed
* pingpong catalog entry.
+ * @dev: Corresponding device for devres management
* @cfg: Pingpong catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* Return: Error code or allocated dpu_hw_pingpong context
*/
-struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_pingpong_destroy - destroys pingpong driver context
- * should be called to free the context
- * @pp: Pointer to PP driver context returned by dpu_hw_pingpong_init
- */
-void dpu_hw_pingpong_destroy(struct dpu_hw_pingpong *pp);
+struct dpu_hw_pingpong *dpu_hw_pingpong_init(struct drm_device *dev,
+ const struct dpu_pingpong_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_PINGPONG_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
index b364cf75bb3f..fb8ecfb9b922 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
@@ -9,6 +9,7 @@
#include "dpu_kms.h"
#include <drm/drm_file.h>
+#include <drm/drm_managed.h>
#define DPU_FETCH_CONFIG_RESET_VALUE 0x00000087
@@ -669,15 +670,17 @@ int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms,
}
#endif
-struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
- void __iomem *addr, const struct dpu_ubwc_cfg *ubwc)
+struct dpu_hw_sspp *dpu_hw_sspp_init(struct drm_device *dev,
+ const struct dpu_sspp_cfg *cfg,
+ void __iomem *addr,
+ const struct dpu_ubwc_cfg *ubwc)
{
struct dpu_hw_sspp *hw_pipe;
if (!addr || !ubwc)
return ERR_PTR(-EINVAL);
- hw_pipe = kzalloc(sizeof(*hw_pipe), GFP_KERNEL);
+ hw_pipe = drmm_kzalloc(dev, sizeof(*hw_pipe), GFP_KERNEL);
if (!hw_pipe)
return ERR_PTR(-ENOMEM);
@@ -692,9 +695,3 @@ struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
return hw_pipe;
}
-
-void dpu_hw_sspp_destroy(struct dpu_hw_sspp *ctx)
-{
- kfree(ctx);
-}
-
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
index 085f34bc6b88..5dd4f78d424c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
@@ -331,12 +331,15 @@ struct dpu_kms;
/**
* dpu_hw_sspp_init() - Initializes the sspp hw driver object.
* Should be called once before accessing every pipe.
+ * @dev: Corresponding device for devres management
* @cfg: Pipe catalog entry for which driver object is required
* @addr: Mapped register io address of MDP
* @ubwc: UBWC configuration data
*/
-struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
- void __iomem *addr, const struct dpu_ubwc_cfg *ubwc);
+struct dpu_hw_sspp *dpu_hw_sspp_init(struct drm_device *dev,
+ const struct dpu_sspp_cfg *cfg,
+ void __iomem *addr,
+ const struct dpu_ubwc_cfg *ubwc);
/**
* dpu_hw_sspp_destroy(): Destroys SSPP driver context
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
index ebc416400382..106540eee5f7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
@@ -3,6 +3,8 @@
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved
*/
+#include <drm/drm_managed.h>
+
#include "dpu_hw_mdss.h"
#include "dpu_hwio.h"
#include "dpu_hw_catalog.h"
@@ -194,15 +196,16 @@ static void _setup_wb_ops(struct dpu_hw_wb_ops *ops,
ops->bind_pingpong_blk = dpu_hw_wb_bind_pingpong_blk;
}
-struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
- void __iomem *addr)
+struct dpu_hw_wb *dpu_hw_wb_init(struct drm_device *dev,
+ const struct dpu_wb_cfg *cfg,
+ void __iomem *addr)
{
struct dpu_hw_wb *c;
if (!addr)
return ERR_PTR(-EINVAL);
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
if (!c)
return ERR_PTR(-ENOMEM);
@@ -216,8 +219,3 @@ struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
return c;
}
-
-void dpu_hw_wb_destroy(struct dpu_hw_wb *hw_wb)
-{
- kfree(hw_wb);
-}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
index 2d7db2efa3d0..98d1129238cc 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
@@ -72,17 +72,13 @@ struct dpu_hw_wb {
/**
* dpu_hw_wb_init() - Initializes the writeback hw driver object.
+ * @dev: Corresponding device for devres management
* @cfg: wb_path catalog entry for which driver object is required
* @addr: mapped register io address of MDP
* Return: Error code or allocated dpu_hw_wb context
*/
-struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
- void __iomem *addr);
-
-/**
- * dpu_hw_wb_destroy(): Destroy writeback hw driver object.
- * @hw_wb: Pointer to writeback hw driver object
- */
-void dpu_hw_wb_destroy(struct dpu_hw_wb *hw_wb);
+struct dpu_hw_wb *dpu_hw_wb_init(struct drm_device *dev,
+ const struct dpu_wb_cfg *cfg,
+ void __iomem *addr);
#endif /*_DPU_HW_WB_H */
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 48c3f8b6b88f..1e29de32b7c0 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -816,10 +816,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
dpu_kms->hw_vbif[i] = NULL;
}
- if (dpu_kms->rm_init)
- dpu_rm_destroy(&dpu_kms->rm);
- dpu_kms->rm_init = false;
-
dpu_kms->catalog = NULL;
dpu_kms->hw_mdp = NULL;
@@ -1041,14 +1037,12 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
goto err_pm_put;
}
- rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
+ rc = dpu_rm_init(dev, &dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
if (rc) {
DPU_ERROR("rm init failed: %d\n", rc);
goto err_pm_put;
}
- dpu_kms->rm_init = true;
-
dpu_kms->hw_mdp = dpu_hw_mdptop_init(dev,
dpu_kms->catalog->mdp,
dpu_kms->mmio,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
index f3bdd4f11108..2af1767ada9d 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
@@ -87,7 +87,6 @@ struct dpu_kms {
struct drm_private_obj global_state;
struct dpu_rm rm;
- bool rm_init;
struct dpu_hw_vbif *hw_vbif[VBIF_MAX];
struct dpu_hw_mdp *hw_mdp;
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
index e333f4eeafc1..d10025b8f659 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
@@ -34,72 +34,8 @@ struct dpu_rm_requirements {
struct msm_display_topology topology;
};
-int dpu_rm_destroy(struct dpu_rm *rm)
-{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(rm->dspp_blks); i++) {
- struct dpu_hw_dspp *hw;
-
- if (rm->dspp_blks[i]) {
- hw = to_dpu_hw_dspp(rm->dspp_blks[i]);
- dpu_hw_dspp_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->pingpong_blks); i++) {
- struct dpu_hw_pingpong *hw;
-
- if (rm->pingpong_blks[i]) {
- hw = to_dpu_hw_pingpong(rm->pingpong_blks[i]);
- dpu_hw_pingpong_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->merge_3d_blks); i++) {
- struct dpu_hw_merge_3d *hw;
-
- if (rm->merge_3d_blks[i]) {
- hw = to_dpu_hw_merge_3d(rm->merge_3d_blks[i]);
- dpu_hw_merge_3d_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->mixer_blks); i++) {
- struct dpu_hw_mixer *hw;
-
- if (rm->mixer_blks[i]) {
- hw = to_dpu_hw_mixer(rm->mixer_blks[i]);
- dpu_hw_lm_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->ctl_blks); i++) {
- struct dpu_hw_ctl *hw;
-
- if (rm->ctl_blks[i]) {
- hw = to_dpu_hw_ctl(rm->ctl_blks[i]);
- dpu_hw_ctl_destroy(hw);
- }
- }
- for (i = 0; i < ARRAY_SIZE(rm->hw_intf); i++)
- dpu_hw_intf_destroy(rm->hw_intf[i]);
-
- for (i = 0; i < ARRAY_SIZE(rm->dsc_blks); i++) {
- struct dpu_hw_dsc *hw;
-
- if (rm->dsc_blks[i]) {
- hw = to_dpu_hw_dsc(rm->dsc_blks[i]);
- dpu_hw_dsc_destroy(hw);
- }
- }
-
- for (i = 0; i < ARRAY_SIZE(rm->hw_wb); i++)
- dpu_hw_wb_destroy(rm->hw_wb[i]);
-
- for (i = 0; i < ARRAY_SIZE(rm->hw_sspp); i++)
- dpu_hw_sspp_destroy(rm->hw_sspp[i]);
-
- return 0;
-}
-
-int dpu_rm_init(struct dpu_rm *rm,
+int dpu_rm_init(struct drm_device *dev,
+ struct dpu_rm *rm,
const struct dpu_mdss_cfg *cat,
void __iomem *mmio)
{
@@ -118,7 +54,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_mixer *hw;
const struct dpu_lm_cfg *lm = &cat->mixer[i];
- hw = dpu_hw_lm_init(lm, mmio);
+ hw = dpu_hw_lm_init(dev, lm, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed lm object creation: err %d\n", rc);
@@ -131,7 +67,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_merge_3d *hw;
const struct dpu_merge_3d_cfg *merge_3d = &cat->merge_3d[i];
- hw = dpu_hw_merge_3d_init(merge_3d, mmio);
+ hw = dpu_hw_merge_3d_init(dev, merge_3d, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed merge_3d object creation: err %d\n",
@@ -145,7 +81,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_pingpong *hw;
const struct dpu_pingpong_cfg *pp = &cat->pingpong[i];
- hw = dpu_hw_pingpong_init(pp, mmio);
+ hw = dpu_hw_pingpong_init(dev, pp, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed pingpong object creation: err %d\n",
@@ -161,7 +97,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_intf *hw;
const struct dpu_intf_cfg *intf = &cat->intf[i];
- hw = dpu_hw_intf_init(intf, mmio);
+ hw = dpu_hw_intf_init(dev, intf, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed intf object creation: err %d\n", rc);
@@ -174,7 +110,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_wb *hw;
const struct dpu_wb_cfg *wb = &cat->wb[i];
- hw = dpu_hw_wb_init(wb, mmio);
+ hw = dpu_hw_wb_init(dev, wb, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed wb object creation: err %d\n", rc);
@@ -187,7 +123,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_ctl *hw;
const struct dpu_ctl_cfg *ctl = &cat->ctl[i];
- hw = dpu_hw_ctl_init(ctl, mmio, cat->mixer_count, cat->mixer);
+ hw = dpu_hw_ctl_init(dev, ctl, mmio, cat->mixer_count, cat->mixer);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed ctl object creation: err %d\n", rc);
@@ -200,7 +136,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_dspp *hw;
const struct dpu_dspp_cfg *dspp = &cat->dspp[i];
- hw = dpu_hw_dspp_init(dspp, mmio);
+ hw = dpu_hw_dspp_init(dev, dspp, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed dspp object creation: err %d\n", rc);
@@ -214,9 +150,9 @@ int dpu_rm_init(struct dpu_rm *rm,
const struct dpu_dsc_cfg *dsc = &cat->dsc[i];
if (test_bit(DPU_DSC_HW_REV_1_2, &dsc->features))
- hw = dpu_hw_dsc_init_1_2(dsc, mmio);
+ hw = dpu_hw_dsc_init_1_2(dev, dsc, mmio);
else
- hw = dpu_hw_dsc_init(dsc, mmio);
+ hw = dpu_hw_dsc_init(dev, dsc, mmio);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
@@ -230,7 +166,7 @@ int dpu_rm_init(struct dpu_rm *rm,
struct dpu_hw_sspp *hw;
const struct dpu_sspp_cfg *sspp = &cat->sspp[i];
- hw = dpu_hw_sspp_init(sspp, mmio, cat->ubwc);
+ hw = dpu_hw_sspp_init(dev, sspp, mmio, cat->ubwc);
if (IS_ERR(hw)) {
rc = PTR_ERR(hw);
DPU_ERROR("failed sspp object creation: err %d\n", rc);
@@ -242,8 +178,6 @@ int dpu_rm_init(struct dpu_rm *rm,
return 0;
fail:
- dpu_rm_destroy(rm);
-
return rc ? rc : -EFAULT;
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
index d62c2edb2460..7199a09f3ce3 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
@@ -38,22 +38,17 @@ struct dpu_rm {
/**
* dpu_rm_init - Read hardware catalog and create reservation tracking objects
* for all HW blocks.
+ * @dev: Corresponding device for devres management
* @rm: DPU Resource Manager handle
* @cat: Pointer to hardware catalog
* @mmio: mapped register io address of MDP
* @Return: 0 on Success otherwise -ERROR
*/
-int dpu_rm_init(struct dpu_rm *rm,
+int dpu_rm_init(struct drm_device *dev,
+ struct dpu_rm *rm,
const struct dpu_mdss_cfg *cat,
void __iomem *mmio);
-/**
- * dpu_rm_destroy - Free all memory allocated by dpu_rm_init
- * @rm: DPU Resource Manager handle
- * @Return: 0 on Success otherwise -ERROR
- */
-int dpu_rm_destroy(struct dpu_rm *rm);
-
/**
* dpu_rm_reserve - Given a CRTC->Encoder->Connector display chain, analyze
* the use connections and user requirements, specified through related
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 07/13] drm/msm/dpu: drop unused dpu_plane::lock
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
The field dpu_plane::lock was never used for protecting any kind of
data. Drop it now.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index c2aaaded07ed..aba5185e1d66 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -78,8 +78,6 @@ static const uint32_t qcom_compressed_supported_formats[] = {
struct dpu_plane {
struct drm_plane base;
- struct mutex lock;
-
enum dpu_sspp pipe;
uint32_t color_fill;
@@ -1186,8 +1184,6 @@ static void dpu_plane_destroy(struct drm_plane *plane)
if (pstate->r_pipe.sspp)
_dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false);
- mutex_destroy(&pdpu->lock);
-
/* this will destroy the states as well */
drm_plane_cleanup(plane);
@@ -1447,8 +1443,6 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
/* success! finalize initialization */
drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
- mutex_init(&pdpu->lock);
-
DPU_DEBUG("%s created for pipe:%u id:%u\n", plane->name,
pipe, plane->base.id);
return plane;
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 07/13] drm/msm/dpu: drop unused dpu_plane::lock
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
The field dpu_plane::lock was never used for protecting any kind of
data. Drop it now.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index c2aaaded07ed..aba5185e1d66 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -78,8 +78,6 @@ static const uint32_t qcom_compressed_supported_formats[] = {
struct dpu_plane {
struct drm_plane base;
- struct mutex lock;
-
enum dpu_sspp pipe;
uint32_t color_fill;
@@ -1186,8 +1184,6 @@ static void dpu_plane_destroy(struct drm_plane *plane)
if (pstate->r_pipe.sspp)
_dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false);
- mutex_destroy(&pdpu->lock);
-
/* this will destroy the states as well */
drm_plane_cleanup(plane);
@@ -1447,8 +1443,6 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
/* success! finalize initialization */
drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
- mutex_init(&pdpu->lock);
-
DPU_DEBUG("%s created for pipe:%u id:%u\n", plane->name,
pipe, plane->base.id);
return plane;
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 08/13] drm/msm/dpu: remove QoS teardown on plane destruction
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
There is little point in disabling QoS on plane destruction: it happens
during DPU device destruction process, after which there will be no
running planes.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index aba5185e1d66..f114efee1b57 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -1173,17 +1173,10 @@ static void dpu_plane_atomic_update(struct drm_plane *plane,
static void dpu_plane_destroy(struct drm_plane *plane)
{
struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
- struct dpu_plane_state *pstate;
DPU_DEBUG_PLANE(pdpu, "\n");
if (pdpu) {
- pstate = to_dpu_plane_state(plane->state);
- _dpu_plane_set_qos_ctrl(plane, &pstate->pipe, false);
-
- if (pstate->r_pipe.sspp)
- _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false);
-
/* this will destroy the states as well */
drm_plane_cleanup(plane);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 08/13] drm/msm/dpu: remove QoS teardown on plane destruction
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
There is little point in disabling QoS on plane destruction: it happens
during DPU device destruction process, after which there will be no
running planes.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index aba5185e1d66..f114efee1b57 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -1173,17 +1173,10 @@ static void dpu_plane_atomic_update(struct drm_plane *plane,
static void dpu_plane_destroy(struct drm_plane *plane)
{
struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
- struct dpu_plane_state *pstate;
DPU_DEBUG_PLANE(pdpu, "\n");
if (pdpu) {
- pstate = to_dpu_plane_state(plane->state);
- _dpu_plane_set_qos_ctrl(plane, &pstate->pipe, false);
-
- if (pstate->r_pipe.sspp)
- _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false);
-
/* this will destroy the states as well */
drm_plane_cleanup(plane);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 09/13] drm/msm/dpu: use drmm-managed allocation for dpu_plane
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Change struct dpu_plane allocation to use drmm_universal_plane_alloc().
This removes the need to perform any actions on plane destruction.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 46 +++++------------------
1 file changed, 10 insertions(+), 36 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index f114efee1b57..9d9e1cbf0dd7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -1170,20 +1170,6 @@ static void dpu_plane_atomic_update(struct drm_plane *plane,
}
}
-static void dpu_plane_destroy(struct drm_plane *plane)
-{
- struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
-
- DPU_DEBUG_PLANE(pdpu, "\n");
-
- if (pdpu) {
- /* this will destroy the states as well */
- drm_plane_cleanup(plane);
-
- kfree(pdpu);
- }
-}
-
static void dpu_plane_destroy_state(struct drm_plane *plane,
struct drm_plane_state *state)
{
@@ -1353,7 +1339,6 @@ static bool dpu_plane_format_mod_supported(struct drm_plane *plane,
static const struct drm_plane_funcs dpu_plane_funcs = {
.update_plane = drm_atomic_helper_update_plane,
.disable_plane = drm_atomic_helper_disable_plane,
- .destroy = dpu_plane_destroy,
.reset = dpu_plane_reset,
.atomic_duplicate_state = dpu_plane_duplicate_state,
.atomic_destroy_state = dpu_plane_destroy_state,
@@ -1381,35 +1366,28 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
struct dpu_hw_sspp *pipe_hw;
uint32_t num_formats;
uint32_t supported_rotations;
- int ret = -EINVAL;
-
- /* create and zero local structure */
- pdpu = kzalloc(sizeof(*pdpu), GFP_KERNEL);
- if (!pdpu) {
- DPU_ERROR("[%u]failed to allocate local plane struct\n", pipe);
- ret = -ENOMEM;
- return ERR_PTR(ret);
- }
-
- /* cache local stuff for later */
- plane = &pdpu->base;
- pdpu->pipe = pipe;
+ int ret;
/* initialize underlying h/w driver */
pipe_hw = dpu_rm_get_sspp(&kms->rm, pipe);
if (!pipe_hw || !pipe_hw->cap || !pipe_hw->cap->sblk) {
DPU_ERROR("[%u]SSPP is invalid\n", pipe);
- goto clean_plane;
+ return ERR_PTR(-EINVAL);
}
format_list = pipe_hw->cap->sblk->format_list;
num_formats = pipe_hw->cap->sblk->num_formats;
- ret = drm_universal_plane_init(dev, plane, 0xff, &dpu_plane_funcs,
+ pdpu = drmm_universal_plane_alloc(dev, struct dpu_plane, base,
+ 0xff, &dpu_plane_funcs,
format_list, num_formats,
supported_format_modifiers, type, NULL);
- if (ret)
- goto clean_plane;
+ if (IS_ERR(pdpu))
+ return ERR_CAST(pdpu);
+
+ /* cache local stuff for later */
+ plane = &pdpu->base;
+ pdpu->pipe = pipe;
pdpu->catalog = kms->catalog;
@@ -1439,8 +1417,4 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
DPU_DEBUG("%s created for pipe:%u id:%u\n", plane->name,
pipe, plane->base.id);
return plane;
-
-clean_plane:
- kfree(pdpu);
- return ERR_PTR(ret);
}
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 09/13] drm/msm/dpu: use drmm-managed allocation for dpu_plane
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Change struct dpu_plane allocation to use drmm_universal_plane_alloc().
This removes the need to perform any actions on plane destruction.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 46 +++++------------------
1 file changed, 10 insertions(+), 36 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index f114efee1b57..9d9e1cbf0dd7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -1170,20 +1170,6 @@ static void dpu_plane_atomic_update(struct drm_plane *plane,
}
}
-static void dpu_plane_destroy(struct drm_plane *plane)
-{
- struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
-
- DPU_DEBUG_PLANE(pdpu, "\n");
-
- if (pdpu) {
- /* this will destroy the states as well */
- drm_plane_cleanup(plane);
-
- kfree(pdpu);
- }
-}
-
static void dpu_plane_destroy_state(struct drm_plane *plane,
struct drm_plane_state *state)
{
@@ -1353,7 +1339,6 @@ static bool dpu_plane_format_mod_supported(struct drm_plane *plane,
static const struct drm_plane_funcs dpu_plane_funcs = {
.update_plane = drm_atomic_helper_update_plane,
.disable_plane = drm_atomic_helper_disable_plane,
- .destroy = dpu_plane_destroy,
.reset = dpu_plane_reset,
.atomic_duplicate_state = dpu_plane_duplicate_state,
.atomic_destroy_state = dpu_plane_destroy_state,
@@ -1381,35 +1366,28 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
struct dpu_hw_sspp *pipe_hw;
uint32_t num_formats;
uint32_t supported_rotations;
- int ret = -EINVAL;
-
- /* create and zero local structure */
- pdpu = kzalloc(sizeof(*pdpu), GFP_KERNEL);
- if (!pdpu) {
- DPU_ERROR("[%u]failed to allocate local plane struct\n", pipe);
- ret = -ENOMEM;
- return ERR_PTR(ret);
- }
-
- /* cache local stuff for later */
- plane = &pdpu->base;
- pdpu->pipe = pipe;
+ int ret;
/* initialize underlying h/w driver */
pipe_hw = dpu_rm_get_sspp(&kms->rm, pipe);
if (!pipe_hw || !pipe_hw->cap || !pipe_hw->cap->sblk) {
DPU_ERROR("[%u]SSPP is invalid\n", pipe);
- goto clean_plane;
+ return ERR_PTR(-EINVAL);
}
format_list = pipe_hw->cap->sblk->format_list;
num_formats = pipe_hw->cap->sblk->num_formats;
- ret = drm_universal_plane_init(dev, plane, 0xff, &dpu_plane_funcs,
+ pdpu = drmm_universal_plane_alloc(dev, struct dpu_plane, base,
+ 0xff, &dpu_plane_funcs,
format_list, num_formats,
supported_format_modifiers, type, NULL);
- if (ret)
- goto clean_plane;
+ if (IS_ERR(pdpu))
+ return ERR_CAST(pdpu);
+
+ /* cache local stuff for later */
+ plane = &pdpu->base;
+ pdpu->pipe = pipe;
pdpu->catalog = kms->catalog;
@@ -1439,8 +1417,4 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
DPU_DEBUG("%s created for pipe:%u id:%u\n", plane->name,
pipe, plane->base.id);
return plane;
-
-clean_plane:
- kfree(pdpu);
- return ERR_PTR(ret);
}
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 10/13] drm/msm/dpu: use drmm-managed allocation for dpu_crtc
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Change struct dpu_crtc allocation to use drmm_crtc_alloc_with_planes().
This removes the need to perform any actions on CRTC destruction.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 25 +++++++-----------------
1 file changed, 7 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 214229d11e3e..a1fcb690c687 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -51,17 +51,6 @@ static struct dpu_kms *_dpu_crtc_get_kms(struct drm_crtc *crtc)
return to_dpu_kms(priv->kms);
}
-static void dpu_crtc_destroy(struct drm_crtc *crtc)
-{
- struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
-
- if (!crtc)
- return;
-
- drm_crtc_cleanup(crtc);
- kfree(dpu_crtc);
-}
-
static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
@@ -1433,7 +1422,6 @@ static int dpu_crtc_late_register(struct drm_crtc *crtc)
static const struct drm_crtc_funcs dpu_crtc_funcs = {
.set_config = drm_atomic_helper_set_config,
- .destroy = dpu_crtc_destroy,
.page_flip = drm_atomic_helper_page_flip,
.reset = dpu_crtc_reset,
.atomic_duplicate_state = dpu_crtc_duplicate_state,
@@ -1467,9 +1455,13 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
struct dpu_crtc *dpu_crtc = NULL;
int i, ret;
- dpu_crtc = kzalloc(sizeof(*dpu_crtc), GFP_KERNEL);
- if (!dpu_crtc)
- return ERR_PTR(-ENOMEM);
+ dpu_crtc = drmm_crtc_alloc_with_planes(dev, struct dpu_crtc, base,
+ plane, cursor,
+ &dpu_crtc_funcs,
+ NULL);
+
+ if (IS_ERR(dpu_crtc))
+ return ERR_CAST(dpu_crtc);
crtc = &dpu_crtc->base;
crtc->dev = dev;
@@ -1489,9 +1481,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
dpu_crtc_frame_event_work);
}
- drm_crtc_init_with_planes(dev, crtc, plane, cursor, &dpu_crtc_funcs,
- NULL);
-
drm_crtc_helper_add(crtc, &dpu_crtc_helper_funcs);
if (dpu_kms->catalog->dspp_count)
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 10/13] drm/msm/dpu: use drmm-managed allocation for dpu_crtc
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Change struct dpu_crtc allocation to use drmm_crtc_alloc_with_planes().
This removes the need to perform any actions on CRTC destruction.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 25 +++++++-----------------
1 file changed, 7 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 214229d11e3e..a1fcb690c687 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -51,17 +51,6 @@ static struct dpu_kms *_dpu_crtc_get_kms(struct drm_crtc *crtc)
return to_dpu_kms(priv->kms);
}
-static void dpu_crtc_destroy(struct drm_crtc *crtc)
-{
- struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
-
- if (!crtc)
- return;
-
- drm_crtc_cleanup(crtc);
- kfree(dpu_crtc);
-}
-
static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
@@ -1433,7 +1422,6 @@ static int dpu_crtc_late_register(struct drm_crtc *crtc)
static const struct drm_crtc_funcs dpu_crtc_funcs = {
.set_config = drm_atomic_helper_set_config,
- .destroy = dpu_crtc_destroy,
.page_flip = drm_atomic_helper_page_flip,
.reset = dpu_crtc_reset,
.atomic_duplicate_state = dpu_crtc_duplicate_state,
@@ -1467,9 +1455,13 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
struct dpu_crtc *dpu_crtc = NULL;
int i, ret;
- dpu_crtc = kzalloc(sizeof(*dpu_crtc), GFP_KERNEL);
- if (!dpu_crtc)
- return ERR_PTR(-ENOMEM);
+ dpu_crtc = drmm_crtc_alloc_with_planes(dev, struct dpu_crtc, base,
+ plane, cursor,
+ &dpu_crtc_funcs,
+ NULL);
+
+ if (IS_ERR(dpu_crtc))
+ return ERR_CAST(dpu_crtc);
crtc = &dpu_crtc->base;
crtc->dev = dev;
@@ -1489,9 +1481,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
dpu_crtc_frame_event_work);
}
- drm_crtc_init_with_planes(dev, crtc, plane, cursor, &dpu_crtc_funcs,
- NULL);
-
drm_crtc_helper_add(crtc, &dpu_crtc_helper_funcs);
if (dpu_kms->catalog->dspp_count)
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 11/13] drm/msm/dpu: use drmm-managed allocation for dpu_encoder_phys
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Change struct allocation of encoder's phys backend data to use
drmm_kzalloc(). This removes the need to perform any actions on encoder
destruction.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 9 ++++----
.../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 8 ++++---
.../drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 15 ++++---------
.../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 13 ++++--------
.../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 21 ++++---------------
5 files changed, 22 insertions(+), 44 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 493905a5b63a..7c2cd9ce8acd 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -2199,6 +2199,7 @@ static void dpu_encoder_early_unregister(struct drm_encoder *encoder)
}
static int dpu_encoder_virt_add_phys_encs(
+ struct drm_device *dev,
struct msm_display_info *disp_info,
struct dpu_encoder_virt *dpu_enc,
struct dpu_enc_phys_init_params *params)
@@ -2220,7 +2221,7 @@ static int dpu_encoder_virt_add_phys_encs(
if (disp_info->intf_type == INTF_WB) {
- enc = dpu_encoder_phys_wb_init(params);
+ enc = dpu_encoder_phys_wb_init(dev, params);
if (IS_ERR(enc)) {
DPU_ERROR_ENC(dpu_enc, "failed to init wb enc: %ld\n",
@@ -2231,7 +2232,7 @@ static int dpu_encoder_virt_add_phys_encs(
dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
++dpu_enc->num_phys_encs;
} else if (disp_info->is_cmd_mode) {
- enc = dpu_encoder_phys_cmd_init(params);
+ enc = dpu_encoder_phys_cmd_init(dev, params);
if (IS_ERR(enc)) {
DPU_ERROR_ENC(dpu_enc, "failed to init cmd enc: %ld\n",
@@ -2242,7 +2243,7 @@ static int dpu_encoder_virt_add_phys_encs(
dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
++dpu_enc->num_phys_encs;
} else {
- enc = dpu_encoder_phys_vid_init(params);
+ enc = dpu_encoder_phys_vid_init(dev, params);
if (IS_ERR(enc)) {
DPU_ERROR_ENC(dpu_enc, "failed to init vid enc: %ld\n",
@@ -2333,7 +2334,7 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
break;
}
- ret = dpu_encoder_virt_add_phys_encs(disp_info,
+ ret = dpu_encoder_virt_add_phys_encs(dpu_kms->dev, disp_info,
dpu_enc, &phys_params);
if (ret) {
DPU_ERROR_ENC(dpu_enc, "failed to add phys encs\n");
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
index d48558ede488..4fb0d95f3061 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
@@ -281,22 +281,24 @@ struct dpu_encoder_wait_info {
* @p: Pointer to init params structure
* Return: Error code or newly allocated encoder
*/
-struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
+struct dpu_encoder_phys *dpu_encoder_phys_vid_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p);
/**
* dpu_encoder_phys_cmd_init - Construct a new command mode physical encoder
+ * @dev: Corresponding device for devres management
* @p: Pointer to init params structure
* Return: Error code or newly allocated encoder
*/
-struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
+struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p);
/**
* dpu_encoder_phys_wb_init - initialize writeback encoder
+ * @dev: Corresponding device for devres management
* @init: Pointer to init info structure with initialization params
*/
-struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
+struct dpu_encoder_phys *dpu_encoder_phys_wb_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p);
/**
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
index b856c6286c85..2958b64e6e5e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
@@ -13,6 +13,8 @@
#include "dpu_trace.h"
#include "disp/msm_disp_snapshot.h"
+#include <drm/drm_managed.h>
+
#define DPU_DEBUG_CMDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
(e) && (e)->base.parent ? \
(e)->base.parent->base.id : -1, \
@@ -563,14 +565,6 @@ static void dpu_encoder_phys_cmd_disable(struct dpu_encoder_phys *phys_enc)
phys_enc->enable_state = DPU_ENC_DISABLED;
}
-static void dpu_encoder_phys_cmd_destroy(struct dpu_encoder_phys *phys_enc)
-{
- struct dpu_encoder_phys_cmd *cmd_enc =
- to_dpu_encoder_phys_cmd(phys_enc);
-
- kfree(cmd_enc);
-}
-
static void dpu_encoder_phys_cmd_prepare_for_kickoff(
struct dpu_encoder_phys *phys_enc)
{
@@ -736,7 +730,6 @@ static void dpu_encoder_phys_cmd_init_ops(
ops->atomic_mode_set = dpu_encoder_phys_cmd_atomic_mode_set;
ops->enable = dpu_encoder_phys_cmd_enable;
ops->disable = dpu_encoder_phys_cmd_disable;
- ops->destroy = dpu_encoder_phys_cmd_destroy;
ops->control_vblank_irq = dpu_encoder_phys_cmd_control_vblank_irq;
ops->wait_for_commit_done = dpu_encoder_phys_cmd_wait_for_commit_done;
ops->prepare_for_kickoff = dpu_encoder_phys_cmd_prepare_for_kickoff;
@@ -751,7 +744,7 @@ static void dpu_encoder_phys_cmd_init_ops(
ops->get_line_count = dpu_encoder_phys_cmd_get_line_count;
}
-struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
+struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p)
{
struct dpu_encoder_phys *phys_enc = NULL;
@@ -759,7 +752,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
DPU_DEBUG("intf\n");
- cmd_enc = kzalloc(sizeof(*cmd_enc), GFP_KERNEL);
+ cmd_enc = drmm_kzalloc(dev, sizeof(*cmd_enc), GFP_KERNEL);
if (!cmd_enc) {
DPU_ERROR("failed to allocate\n");
return ERR_PTR(-ENOMEM);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
index 662d74ded1b9..bdfce4ccc0a7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
@@ -11,6 +11,8 @@
#include "dpu_trace.h"
#include "disp/msm_disp_snapshot.h"
+#include <drm/drm_managed.h>
+
#define DPU_DEBUG_VIDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
(e) && (e)->parent ? \
(e)->parent->base.id : -1, \
@@ -438,12 +440,6 @@ static void dpu_encoder_phys_vid_enable(struct dpu_encoder_phys *phys_enc)
phys_enc->enable_state = DPU_ENC_ENABLING;
}
-static void dpu_encoder_phys_vid_destroy(struct dpu_encoder_phys *phys_enc)
-{
- DPU_DEBUG_VIDENC(phys_enc, "\n");
- kfree(phys_enc);
-}
-
static int dpu_encoder_phys_vid_wait_for_vblank(
struct dpu_encoder_phys *phys_enc)
{
@@ -681,7 +677,6 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
ops->atomic_mode_set = dpu_encoder_phys_vid_atomic_mode_set;
ops->enable = dpu_encoder_phys_vid_enable;
ops->disable = dpu_encoder_phys_vid_disable;
- ops->destroy = dpu_encoder_phys_vid_destroy;
ops->control_vblank_irq = dpu_encoder_phys_vid_control_vblank_irq;
ops->wait_for_commit_done = dpu_encoder_phys_vid_wait_for_commit_done;
ops->wait_for_vblank = dpu_encoder_phys_vid_wait_for_vblank;
@@ -694,7 +689,7 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
ops->get_frame_count = dpu_encoder_phys_vid_get_frame_count;
}
-struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
+struct dpu_encoder_phys *dpu_encoder_phys_vid_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p)
{
struct dpu_encoder_phys *phys_enc = NULL;
@@ -704,7 +699,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
return ERR_PTR(-EINVAL);
}
- phys_enc = kzalloc(sizeof(*phys_enc), GFP_KERNEL);
+ phys_enc = drmm_kzalloc(dev, sizeof(*phys_enc), GFP_KERNEL);
if (!phys_enc) {
DPU_ERROR("failed to create encoder due to memory allocation error\n");
return ERR_PTR(-ENOMEM);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
index a466ff70a4d6..9a44a1575682 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
@@ -8,6 +8,7 @@
#include <linux/debugfs.h>
#include <drm/drm_framebuffer.h>
+#include <drm/drm_managed.h>
#include "dpu_encoder_phys.h"
#include "dpu_formats.h"
@@ -552,20 +553,6 @@ static void dpu_encoder_phys_wb_disable(struct dpu_encoder_phys *phys_enc)
phys_enc->enable_state = DPU_ENC_DISABLED;
}
-/**
- * dpu_encoder_phys_wb_destroy - destroy writeback encoder
- * @phys_enc: Pointer to physical encoder
- */
-static void dpu_encoder_phys_wb_destroy(struct dpu_encoder_phys *phys_enc)
-{
- if (!phys_enc)
- return;
-
- DPU_DEBUG("[wb:%d]\n", phys_enc->hw_wb->idx - WB_0);
-
- kfree(phys_enc);
-}
-
static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc,
struct drm_writeback_job *job)
{
@@ -661,7 +648,6 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
ops->atomic_mode_set = dpu_encoder_phys_wb_atomic_mode_set;
ops->enable = dpu_encoder_phys_wb_enable;
ops->disable = dpu_encoder_phys_wb_disable;
- ops->destroy = dpu_encoder_phys_wb_destroy;
ops->atomic_check = dpu_encoder_phys_wb_atomic_check;
ops->wait_for_commit_done = dpu_encoder_phys_wb_wait_for_commit_done;
ops->prepare_for_kickoff = dpu_encoder_phys_wb_prepare_for_kickoff;
@@ -677,9 +663,10 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
/**
* dpu_encoder_phys_wb_init - initialize writeback encoder
+ * @dev: Corresponding device for devres management
* @p: Pointer to init info structure with initialization params
*/
-struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
+struct dpu_encoder_phys *dpu_encoder_phys_wb_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p)
{
struct dpu_encoder_phys *phys_enc = NULL;
@@ -692,7 +679,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
return ERR_PTR(-EINVAL);
}
- wb_enc = kzalloc(sizeof(*wb_enc), GFP_KERNEL);
+ wb_enc = drmm_kzalloc(dev, sizeof(*wb_enc), GFP_KERNEL);
if (!wb_enc) {
DPU_ERROR("failed to allocate wb phys_enc enc\n");
return ERR_PTR(-ENOMEM);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 11/13] drm/msm/dpu: use drmm-managed allocation for dpu_encoder_phys
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Change struct allocation of encoder's phys backend data to use
drmm_kzalloc(). This removes the need to perform any actions on encoder
destruction.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 9 ++++----
.../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 8 ++++---
.../drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 15 ++++---------
.../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 13 ++++--------
.../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 21 ++++---------------
5 files changed, 22 insertions(+), 44 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 493905a5b63a..7c2cd9ce8acd 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -2199,6 +2199,7 @@ static void dpu_encoder_early_unregister(struct drm_encoder *encoder)
}
static int dpu_encoder_virt_add_phys_encs(
+ struct drm_device *dev,
struct msm_display_info *disp_info,
struct dpu_encoder_virt *dpu_enc,
struct dpu_enc_phys_init_params *params)
@@ -2220,7 +2221,7 @@ static int dpu_encoder_virt_add_phys_encs(
if (disp_info->intf_type == INTF_WB) {
- enc = dpu_encoder_phys_wb_init(params);
+ enc = dpu_encoder_phys_wb_init(dev, params);
if (IS_ERR(enc)) {
DPU_ERROR_ENC(dpu_enc, "failed to init wb enc: %ld\n",
@@ -2231,7 +2232,7 @@ static int dpu_encoder_virt_add_phys_encs(
dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
++dpu_enc->num_phys_encs;
} else if (disp_info->is_cmd_mode) {
- enc = dpu_encoder_phys_cmd_init(params);
+ enc = dpu_encoder_phys_cmd_init(dev, params);
if (IS_ERR(enc)) {
DPU_ERROR_ENC(dpu_enc, "failed to init cmd enc: %ld\n",
@@ -2242,7 +2243,7 @@ static int dpu_encoder_virt_add_phys_encs(
dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
++dpu_enc->num_phys_encs;
} else {
- enc = dpu_encoder_phys_vid_init(params);
+ enc = dpu_encoder_phys_vid_init(dev, params);
if (IS_ERR(enc)) {
DPU_ERROR_ENC(dpu_enc, "failed to init vid enc: %ld\n",
@@ -2333,7 +2334,7 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
break;
}
- ret = dpu_encoder_virt_add_phys_encs(disp_info,
+ ret = dpu_encoder_virt_add_phys_encs(dpu_kms->dev, disp_info,
dpu_enc, &phys_params);
if (ret) {
DPU_ERROR_ENC(dpu_enc, "failed to add phys encs\n");
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
index d48558ede488..4fb0d95f3061 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
@@ -281,22 +281,24 @@ struct dpu_encoder_wait_info {
* @p: Pointer to init params structure
* Return: Error code or newly allocated encoder
*/
-struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
+struct dpu_encoder_phys *dpu_encoder_phys_vid_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p);
/**
* dpu_encoder_phys_cmd_init - Construct a new command mode physical encoder
+ * @dev: Corresponding device for devres management
* @p: Pointer to init params structure
* Return: Error code or newly allocated encoder
*/
-struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
+struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p);
/**
* dpu_encoder_phys_wb_init - initialize writeback encoder
+ * @dev: Corresponding device for devres management
* @init: Pointer to init info structure with initialization params
*/
-struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
+struct dpu_encoder_phys *dpu_encoder_phys_wb_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p);
/**
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
index b856c6286c85..2958b64e6e5e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
@@ -13,6 +13,8 @@
#include "dpu_trace.h"
#include "disp/msm_disp_snapshot.h"
+#include <drm/drm_managed.h>
+
#define DPU_DEBUG_CMDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
(e) && (e)->base.parent ? \
(e)->base.parent->base.id : -1, \
@@ -563,14 +565,6 @@ static void dpu_encoder_phys_cmd_disable(struct dpu_encoder_phys *phys_enc)
phys_enc->enable_state = DPU_ENC_DISABLED;
}
-static void dpu_encoder_phys_cmd_destroy(struct dpu_encoder_phys *phys_enc)
-{
- struct dpu_encoder_phys_cmd *cmd_enc =
- to_dpu_encoder_phys_cmd(phys_enc);
-
- kfree(cmd_enc);
-}
-
static void dpu_encoder_phys_cmd_prepare_for_kickoff(
struct dpu_encoder_phys *phys_enc)
{
@@ -736,7 +730,6 @@ static void dpu_encoder_phys_cmd_init_ops(
ops->atomic_mode_set = dpu_encoder_phys_cmd_atomic_mode_set;
ops->enable = dpu_encoder_phys_cmd_enable;
ops->disable = dpu_encoder_phys_cmd_disable;
- ops->destroy = dpu_encoder_phys_cmd_destroy;
ops->control_vblank_irq = dpu_encoder_phys_cmd_control_vblank_irq;
ops->wait_for_commit_done = dpu_encoder_phys_cmd_wait_for_commit_done;
ops->prepare_for_kickoff = dpu_encoder_phys_cmd_prepare_for_kickoff;
@@ -751,7 +744,7 @@ static void dpu_encoder_phys_cmd_init_ops(
ops->get_line_count = dpu_encoder_phys_cmd_get_line_count;
}
-struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
+struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p)
{
struct dpu_encoder_phys *phys_enc = NULL;
@@ -759,7 +752,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
DPU_DEBUG("intf\n");
- cmd_enc = kzalloc(sizeof(*cmd_enc), GFP_KERNEL);
+ cmd_enc = drmm_kzalloc(dev, sizeof(*cmd_enc), GFP_KERNEL);
if (!cmd_enc) {
DPU_ERROR("failed to allocate\n");
return ERR_PTR(-ENOMEM);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
index 662d74ded1b9..bdfce4ccc0a7 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
@@ -11,6 +11,8 @@
#include "dpu_trace.h"
#include "disp/msm_disp_snapshot.h"
+#include <drm/drm_managed.h>
+
#define DPU_DEBUG_VIDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
(e) && (e)->parent ? \
(e)->parent->base.id : -1, \
@@ -438,12 +440,6 @@ static void dpu_encoder_phys_vid_enable(struct dpu_encoder_phys *phys_enc)
phys_enc->enable_state = DPU_ENC_ENABLING;
}
-static void dpu_encoder_phys_vid_destroy(struct dpu_encoder_phys *phys_enc)
-{
- DPU_DEBUG_VIDENC(phys_enc, "\n");
- kfree(phys_enc);
-}
-
static int dpu_encoder_phys_vid_wait_for_vblank(
struct dpu_encoder_phys *phys_enc)
{
@@ -681,7 +677,6 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
ops->atomic_mode_set = dpu_encoder_phys_vid_atomic_mode_set;
ops->enable = dpu_encoder_phys_vid_enable;
ops->disable = dpu_encoder_phys_vid_disable;
- ops->destroy = dpu_encoder_phys_vid_destroy;
ops->control_vblank_irq = dpu_encoder_phys_vid_control_vblank_irq;
ops->wait_for_commit_done = dpu_encoder_phys_vid_wait_for_commit_done;
ops->wait_for_vblank = dpu_encoder_phys_vid_wait_for_vblank;
@@ -694,7 +689,7 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
ops->get_frame_count = dpu_encoder_phys_vid_get_frame_count;
}
-struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
+struct dpu_encoder_phys *dpu_encoder_phys_vid_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p)
{
struct dpu_encoder_phys *phys_enc = NULL;
@@ -704,7 +699,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
return ERR_PTR(-EINVAL);
}
- phys_enc = kzalloc(sizeof(*phys_enc), GFP_KERNEL);
+ phys_enc = drmm_kzalloc(dev, sizeof(*phys_enc), GFP_KERNEL);
if (!phys_enc) {
DPU_ERROR("failed to create encoder due to memory allocation error\n");
return ERR_PTR(-ENOMEM);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
index a466ff70a4d6..9a44a1575682 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
@@ -8,6 +8,7 @@
#include <linux/debugfs.h>
#include <drm/drm_framebuffer.h>
+#include <drm/drm_managed.h>
#include "dpu_encoder_phys.h"
#include "dpu_formats.h"
@@ -552,20 +553,6 @@ static void dpu_encoder_phys_wb_disable(struct dpu_encoder_phys *phys_enc)
phys_enc->enable_state = DPU_ENC_DISABLED;
}
-/**
- * dpu_encoder_phys_wb_destroy - destroy writeback encoder
- * @phys_enc: Pointer to physical encoder
- */
-static void dpu_encoder_phys_wb_destroy(struct dpu_encoder_phys *phys_enc)
-{
- if (!phys_enc)
- return;
-
- DPU_DEBUG("[wb:%d]\n", phys_enc->hw_wb->idx - WB_0);
-
- kfree(phys_enc);
-}
-
static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc,
struct drm_writeback_job *job)
{
@@ -661,7 +648,6 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
ops->atomic_mode_set = dpu_encoder_phys_wb_atomic_mode_set;
ops->enable = dpu_encoder_phys_wb_enable;
ops->disable = dpu_encoder_phys_wb_disable;
- ops->destroy = dpu_encoder_phys_wb_destroy;
ops->atomic_check = dpu_encoder_phys_wb_atomic_check;
ops->wait_for_commit_done = dpu_encoder_phys_wb_wait_for_commit_done;
ops->prepare_for_kickoff = dpu_encoder_phys_wb_prepare_for_kickoff;
@@ -677,9 +663,10 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
/**
* dpu_encoder_phys_wb_init - initialize writeback encoder
+ * @dev: Corresponding device for devres management
* @p: Pointer to init info structure with initialization params
*/
-struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
+struct dpu_encoder_phys *dpu_encoder_phys_wb_init(struct drm_device *dev,
struct dpu_enc_phys_init_params *p)
{
struct dpu_encoder_phys *phys_enc = NULL;
@@ -692,7 +679,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
return ERR_PTR(-EINVAL);
}
- wb_enc = kzalloc(sizeof(*wb_enc), GFP_KERNEL);
+ wb_enc = drmm_kzalloc(dev, sizeof(*wb_enc), GFP_KERNEL);
if (!wb_enc) {
DPU_ERROR("failed to allocate wb phys_enc enc\n");
return ERR_PTR(-ENOMEM);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 12/13] drm/msm/dpu: drop dpu_encoder_phys_ops::destroy
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
Drop the dpu_encoder_phys_ops' destroy() callback. No phys backend
implements it anymore, so it is useless.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 18 ------------------
.../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 2 --
2 files changed, 20 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 7c2cd9ce8acd..b42176ce4a3a 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -456,24 +456,6 @@ static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
dpu_enc = to_dpu_encoder_virt(drm_enc);
DPU_DEBUG_ENC(dpu_enc, "\n");
- mutex_lock(&dpu_enc->enc_lock);
-
- for (i = 0; i < dpu_enc->num_phys_encs; i++) {
- struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
-
- if (phys->ops.destroy) {
- phys->ops.destroy(phys);
- --dpu_enc->num_phys_encs;
- dpu_enc->phys_encs[i] = NULL;
- }
- }
-
- if (dpu_enc->num_phys_encs)
- DPU_ERROR_ENC(dpu_enc, "expected 0 num_phys_encs not %d\n",
- dpu_enc->num_phys_encs);
- dpu_enc->num_phys_encs = 0;
- mutex_unlock(&dpu_enc->enc_lock);
-
drm_encoder_cleanup(drm_enc);
mutex_destroy(&dpu_enc->enc_lock);
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
index 4fb0d95f3061..757ce58f958b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
@@ -72,7 +72,6 @@ struct dpu_encoder_phys;
* @enable: DRM Call. Enable a DRM mode.
* @disable: DRM Call. Disable mode.
* @atomic_check: DRM Call. Atomic check new DRM state.
- * @destroy: DRM Call. Destroy and release resources.
* @control_vblank_irq Register/Deregister for VBLANK IRQ
* @wait_for_commit_done: Wait for hardware to have flushed the
* current pending frames to hardware
@@ -102,7 +101,6 @@ struct dpu_encoder_phys_ops {
int (*atomic_check)(struct dpu_encoder_phys *encoder,
struct drm_crtc_state *crtc_state,
struct drm_connector_state *conn_state);
- void (*destroy)(struct dpu_encoder_phys *encoder);
int (*control_vblank_irq)(struct dpu_encoder_phys *enc, bool enable);
int (*wait_for_commit_done)(struct dpu_encoder_phys *phys_enc);
int (*wait_for_tx_complete)(struct dpu_encoder_phys *phys_enc);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 12/13] drm/msm/dpu: drop dpu_encoder_phys_ops::destroy
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
Drop the dpu_encoder_phys_ops' destroy() callback. No phys backend
implements it anymore, so it is useless.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 18 ------------------
.../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 2 --
2 files changed, 20 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 7c2cd9ce8acd..b42176ce4a3a 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -456,24 +456,6 @@ static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
dpu_enc = to_dpu_encoder_virt(drm_enc);
DPU_DEBUG_ENC(dpu_enc, "\n");
- mutex_lock(&dpu_enc->enc_lock);
-
- for (i = 0; i < dpu_enc->num_phys_encs; i++) {
- struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
-
- if (phys->ops.destroy) {
- phys->ops.destroy(phys);
- --dpu_enc->num_phys_encs;
- dpu_enc->phys_encs[i] = NULL;
- }
- }
-
- if (dpu_enc->num_phys_encs)
- DPU_ERROR_ENC(dpu_enc, "expected 0 num_phys_encs not %d\n",
- dpu_enc->num_phys_encs);
- dpu_enc->num_phys_encs = 0;
- mutex_unlock(&dpu_enc->enc_lock);
-
drm_encoder_cleanup(drm_enc);
mutex_destroy(&dpu_enc->enc_lock);
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
index 4fb0d95f3061..757ce58f958b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
@@ -72,7 +72,6 @@ struct dpu_encoder_phys;
* @enable: DRM Call. Enable a DRM mode.
* @disable: DRM Call. Disable mode.
* @atomic_check: DRM Call. Atomic check new DRM state.
- * @destroy: DRM Call. Destroy and release resources.
* @control_vblank_irq Register/Deregister for VBLANK IRQ
* @wait_for_commit_done: Wait for hardware to have flushed the
* current pending frames to hardware
@@ -102,7 +101,6 @@ struct dpu_encoder_phys_ops {
int (*atomic_check)(struct dpu_encoder_phys *encoder,
struct drm_crtc_state *crtc_state,
struct drm_connector_state *conn_state);
- void (*destroy)(struct dpu_encoder_phys *encoder);
int (*control_vblank_irq)(struct dpu_encoder_phys *enc, bool enable);
int (*wait_for_commit_done)(struct dpu_encoder_phys *phys_enc);
int (*wait_for_tx_complete)(struct dpu_encoder_phys *phys_enc);
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 13/13] drm/msm/dpu: use drmm-managed allocation for dpu_encoder_virt
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-07 23:12 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
It is incorrect to use devm-managed memory allocations for DRM data
structures exposed to userspace. They should use drmm_ allocations.
Change struct dpu_encoder allocation to use drmm_encoder_alloc(). This
removes the need to perform any actions on encoder destruction.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 50 +++++----------------
1 file changed, 10 insertions(+), 40 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index b42176ce4a3a..65c6c863f7c6 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -443,23 +443,6 @@ int dpu_encoder_get_linecount(struct drm_encoder *drm_enc)
return linecount;
}
-static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
-{
- struct dpu_encoder_virt *dpu_enc = NULL;
- int i = 0;
-
- if (!drm_enc) {
- DPU_ERROR("invalid encoder\n");
- return;
- }
-
- dpu_enc = to_dpu_encoder_virt(drm_enc);
- DPU_DEBUG_ENC(dpu_enc, "\n");
-
- drm_encoder_cleanup(drm_enc);
- mutex_destroy(&dpu_enc->enc_lock);
-}
-
void dpu_encoder_helper_split_config(
struct dpu_encoder_phys *phys_enc,
enum dpu_intf interface)
@@ -2365,7 +2348,6 @@ static const struct drm_encoder_helper_funcs dpu_encoder_helper_funcs = {
};
static const struct drm_encoder_funcs dpu_encoder_funcs = {
- .destroy = dpu_encoder_destroy,
.late_register = dpu_encoder_late_register,
.early_unregister = dpu_encoder_early_unregister,
};
@@ -2376,20 +2358,13 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
{
struct msm_drm_private *priv = dev->dev_private;
struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
- struct drm_encoder *drm_enc = NULL;
- struct dpu_encoder_virt *dpu_enc = NULL;
- int ret = 0;
+ struct dpu_encoder_virt *dpu_enc;
+ int ret;
- dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
- if (!dpu_enc)
- return ERR_PTR(-ENOMEM);
-
- ret = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
- drm_enc_mode, NULL);
- if (ret) {
- devm_kfree(dev->dev, dpu_enc);
- return ERR_PTR(ret);
- }
+ dpu_enc = drmm_encoder_alloc(dev, struct dpu_encoder_virt, base,
+ &dpu_encoder_funcs, drm_enc_mode, NULL);
+ if (IS_ERR(dpu_enc))
+ return ERR_CAST(dpu_enc);
drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);
@@ -2399,8 +2374,10 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
mutex_init(&dpu_enc->rc_lock);
ret = dpu_encoder_setup_display(dpu_enc, dpu_kms, disp_info);
- if (ret)
- goto fail;
+ if (ret) {
+ DPU_ERROR("failed to setup encoder\n");
+ return ERR_PTR(-ENOMEM);
+ }
atomic_set(&dpu_enc->frame_done_timeout_ms, 0);
timer_setup(&dpu_enc->frame_done_timer,
@@ -2426,13 +2403,6 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
DPU_DEBUG_ENC(dpu_enc, "created\n");
return &dpu_enc->base;
-
-fail:
- DPU_ERROR("failed to create encoder\n");
- if (drm_enc)
- dpu_encoder_destroy(drm_enc);
-
- return ERR_PTR(ret);
}
int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 13/13] drm/msm/dpu: use drmm-managed allocation for dpu_encoder_virt
@ 2023-07-07 23:12 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-07 23:12 UTC (permalink / raw)
To: Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
It is incorrect to use devm-managed memory allocations for DRM data
structures exposed to userspace. They should use drmm_ allocations.
Change struct dpu_encoder allocation to use drmm_encoder_alloc(). This
removes the need to perform any actions on encoder destruction.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 50 +++++----------------
1 file changed, 10 insertions(+), 40 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index b42176ce4a3a..65c6c863f7c6 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -443,23 +443,6 @@ int dpu_encoder_get_linecount(struct drm_encoder *drm_enc)
return linecount;
}
-static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
-{
- struct dpu_encoder_virt *dpu_enc = NULL;
- int i = 0;
-
- if (!drm_enc) {
- DPU_ERROR("invalid encoder\n");
- return;
- }
-
- dpu_enc = to_dpu_encoder_virt(drm_enc);
- DPU_DEBUG_ENC(dpu_enc, "\n");
-
- drm_encoder_cleanup(drm_enc);
- mutex_destroy(&dpu_enc->enc_lock);
-}
-
void dpu_encoder_helper_split_config(
struct dpu_encoder_phys *phys_enc,
enum dpu_intf interface)
@@ -2365,7 +2348,6 @@ static const struct drm_encoder_helper_funcs dpu_encoder_helper_funcs = {
};
static const struct drm_encoder_funcs dpu_encoder_funcs = {
- .destroy = dpu_encoder_destroy,
.late_register = dpu_encoder_late_register,
.early_unregister = dpu_encoder_early_unregister,
};
@@ -2376,20 +2358,13 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
{
struct msm_drm_private *priv = dev->dev_private;
struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
- struct drm_encoder *drm_enc = NULL;
- struct dpu_encoder_virt *dpu_enc = NULL;
- int ret = 0;
+ struct dpu_encoder_virt *dpu_enc;
+ int ret;
- dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
- if (!dpu_enc)
- return ERR_PTR(-ENOMEM);
-
- ret = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
- drm_enc_mode, NULL);
- if (ret) {
- devm_kfree(dev->dev, dpu_enc);
- return ERR_PTR(ret);
- }
+ dpu_enc = drmm_encoder_alloc(dev, struct dpu_encoder_virt, base,
+ &dpu_encoder_funcs, drm_enc_mode, NULL);
+ if (IS_ERR(dpu_enc))
+ return ERR_CAST(dpu_enc);
drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);
@@ -2399,8 +2374,10 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
mutex_init(&dpu_enc->rc_lock);
ret = dpu_encoder_setup_display(dpu_enc, dpu_kms, disp_info);
- if (ret)
- goto fail;
+ if (ret) {
+ DPU_ERROR("failed to setup encoder\n");
+ return ERR_PTR(-ENOMEM);
+ }
atomic_set(&dpu_enc->frame_done_timeout_ms, 0);
timer_setup(&dpu_enc->frame_done_timer,
@@ -2426,13 +2403,6 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
DPU_DEBUG_ENC(dpu_enc, "created\n");
return &dpu_enc->base;
-
-fail:
- DPU_ERROR("failed to create encoder\n");
- if (drm_enc)
- dpu_encoder_destroy(drm_enc);
-
- return ERR_PTR(ret);
}
int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
--
2.39.2
^ permalink raw reply related [flat|nested] 52+ messages in thread
* Re: [PATCH v2 01/13] drm/msm/dpu: cleanup dpu_kms_hw_init error path
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-14 21:43 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-14 21:43 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno, Konrad Dybcio
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> It was noticed that dpu_kms_hw_init()'s error path contains several
> labels which point to the same code path. Replace all of them with a
> single label.
>
> Suggested-by: Konrad Dybcio <konrad.dybcio@linaro.org>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 21 +++++++++------------
> 1 file changed, 9 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index c11b3ab572ab..e7ac02e92f42 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -1037,7 +1037,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> if (!dpu_kms->catalog) {
> DPU_ERROR("device config not known!\n");
> rc = -EINVAL;
> - goto power_error;
> + goto err_pm_put;
> }
>
> /*
> @@ -1047,13 +1047,13 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = _dpu_kms_mmu_init(dpu_kms);
> if (rc) {
> DPU_ERROR("dpu_kms_mmu_init failed: %d\n", rc);
> - goto power_error;
> + goto err_pm_put;
> }
>
> rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
> if (rc) {
> DPU_ERROR("rm init failed: %d\n", rc);
> - goto power_error;
> + goto err_pm_put;
> }
>
> dpu_kms->rm_init = true;
> @@ -1065,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = PTR_ERR(dpu_kms->hw_mdp);
> DPU_ERROR("failed to get hw_mdp: %d\n", rc);
> dpu_kms->hw_mdp = NULL;
> - goto power_error;
> + goto err_pm_put;
> }
>
> for (i = 0; i < dpu_kms->catalog->vbif_count; i++) {
> @@ -1076,7 +1076,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
> - goto power_error;
> + goto err_pm_put;
> }
>
> dpu_kms->hw_vbif[vbif->id] = hw;
> @@ -1092,7 +1092,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = dpu_core_perf_init(&dpu_kms->perf, dpu_kms->catalog->perf, max_core_clk_rate);
> if (rc) {
> DPU_ERROR("failed to init perf %d\n", rc);
> - goto perf_err;
> + goto err_pm_put;
> }
>
> dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
> @@ -1100,7 +1100,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = PTR_ERR(dpu_kms->hw_intr);
> DPU_ERROR("hw_intr init failed: %d\n", rc);
> dpu_kms->hw_intr = NULL;
> - goto hw_intr_init_err;
> + goto err_pm_put;
> }
>
> dev->mode_config.min_width = 0;
> @@ -1125,7 +1125,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = _dpu_kms_drm_obj_init(dpu_kms);
> if (rc) {
> DPU_ERROR("modeset init failed: %d\n", rc);
> - goto drm_obj_init_err;
> + goto err_pm_put;
> }
>
> dpu_vbif_init_memtypes(dpu_kms);
> @@ -1134,10 +1134,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>
> return 0;
>
> -drm_obj_init_err:
Hey Dmitry,
The change itself LGTM -- however, it seems that there's a dependency on
the core perf cleanup series that wasn't listed in the cover letter.
Thanks,
Jessica Zhang
> -hw_intr_init_err:
> -perf_err:
> -power_error:
> +err_pm_put:
> pm_runtime_put_sync(&dpu_kms->pdev->dev);
> error:
> _dpu_kms_hw_destroy(dpu_kms);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 01/13] drm/msm/dpu: cleanup dpu_kms_hw_init error path
@ 2023-07-14 21:43 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-14 21:43 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel,
Stephen Boyd, Konrad Dybcio
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> It was noticed that dpu_kms_hw_init()'s error path contains several
> labels which point to the same code path. Replace all of them with a
> single label.
>
> Suggested-by: Konrad Dybcio <konrad.dybcio@linaro.org>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 21 +++++++++------------
> 1 file changed, 9 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index c11b3ab572ab..e7ac02e92f42 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -1037,7 +1037,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> if (!dpu_kms->catalog) {
> DPU_ERROR("device config not known!\n");
> rc = -EINVAL;
> - goto power_error;
> + goto err_pm_put;
> }
>
> /*
> @@ -1047,13 +1047,13 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = _dpu_kms_mmu_init(dpu_kms);
> if (rc) {
> DPU_ERROR("dpu_kms_mmu_init failed: %d\n", rc);
> - goto power_error;
> + goto err_pm_put;
> }
>
> rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
> if (rc) {
> DPU_ERROR("rm init failed: %d\n", rc);
> - goto power_error;
> + goto err_pm_put;
> }
>
> dpu_kms->rm_init = true;
> @@ -1065,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = PTR_ERR(dpu_kms->hw_mdp);
> DPU_ERROR("failed to get hw_mdp: %d\n", rc);
> dpu_kms->hw_mdp = NULL;
> - goto power_error;
> + goto err_pm_put;
> }
>
> for (i = 0; i < dpu_kms->catalog->vbif_count; i++) {
> @@ -1076,7 +1076,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
> - goto power_error;
> + goto err_pm_put;
> }
>
> dpu_kms->hw_vbif[vbif->id] = hw;
> @@ -1092,7 +1092,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = dpu_core_perf_init(&dpu_kms->perf, dpu_kms->catalog->perf, max_core_clk_rate);
> if (rc) {
> DPU_ERROR("failed to init perf %d\n", rc);
> - goto perf_err;
> + goto err_pm_put;
> }
>
> dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
> @@ -1100,7 +1100,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = PTR_ERR(dpu_kms->hw_intr);
> DPU_ERROR("hw_intr init failed: %d\n", rc);
> dpu_kms->hw_intr = NULL;
> - goto hw_intr_init_err;
> + goto err_pm_put;
> }
>
> dev->mode_config.min_width = 0;
> @@ -1125,7 +1125,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> rc = _dpu_kms_drm_obj_init(dpu_kms);
> if (rc) {
> DPU_ERROR("modeset init failed: %d\n", rc);
> - goto drm_obj_init_err;
> + goto err_pm_put;
> }
>
> dpu_vbif_init_memtypes(dpu_kms);
> @@ -1134,10 +1134,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>
> return 0;
>
> -drm_obj_init_err:
Hey Dmitry,
The change itself LGTM -- however, it seems that there's a dependency on
the core perf cleanup series that wasn't listed in the cover letter.
Thanks,
Jessica Zhang
> -hw_intr_init_err:
> -perf_err:
> -power_error:
> +err_pm_put:
> pm_runtime_put_sync(&dpu_kms->pdev->dev);
> error:
> _dpu_kms_hw_destroy(dpu_kms);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 05/13] drm/msm/dpu: use devres-managed allocation for MDP TOP
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-15 0:55 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-15 0:55 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Use devm_kzalloc to create MDP TOP structure. This allows us to remove
> corresponding kfree and drop dpu_hw_mdp_destroy() function.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c | 17 +++++++----------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h | 8 +++++---
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 5 ++---
> 3 files changed, 14 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
> index cff48763ce25..481b373d9ccb 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
> @@ -2,6 +2,8 @@
> /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> #include "dpu_hw_top.h"
> @@ -268,16 +270,17 @@ static void _setup_mdp_ops(struct dpu_hw_mdp_ops *ops,
> ops->intf_audio_select = dpu_hw_intf_audio_select;
> }
>
> -struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
> - void __iomem *addr,
> - const struct dpu_mdss_cfg *m)
> +struct dpu_hw_mdp *dpu_hw_mdptop_init(struct drm_device *dev,
> + const struct dpu_mdp_cfg *cfg,
> + void __iomem *addr,
> + const struct dpu_mdss_cfg *m)
> {
> struct dpu_hw_mdp *mdp;
>
> if (!addr)
> return ERR_PTR(-EINVAL);
>
> - mdp = kzalloc(sizeof(*mdp), GFP_KERNEL);
> + mdp = drmm_kzalloc(dev, sizeof(*mdp), GFP_KERNEL);
> if (!mdp)
> return ERR_PTR(-ENOMEM);
>
> @@ -292,9 +295,3 @@ struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
>
> return mdp;
> }
> -
> -void dpu_hw_mdp_destroy(struct dpu_hw_mdp *mdp)
> -{
> - kfree(mdp);
> -}
> -
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
> index 8b1463d2b2f0..6f3dc98087df 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
> @@ -145,13 +145,15 @@ struct dpu_hw_mdp {
>
> /**
> * dpu_hw_mdptop_init - initializes the top driver for the passed config
> + * @dev: Corresponding device for devres management
> * @cfg: MDP TOP configuration from catalog
> * @addr: Mapped register io address of MDP
> * @m: Pointer to mdss catalog data
> */
> -struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
> - void __iomem *addr,
> - const struct dpu_mdss_cfg *m);
> +struct dpu_hw_mdp *dpu_hw_mdptop_init(struct drm_device *dev,
> + const struct dpu_mdp_cfg *cfg,
> + void __iomem *addr,
> + const struct dpu_mdss_cfg *m);
>
> void dpu_hw_mdp_destroy(struct dpu_hw_mdp *mdp);
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index f7723f89cbbc..48c3f8b6b88f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -822,8 +822,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
>
> dpu_kms->catalog = NULL;
>
> - if (dpu_kms->hw_mdp)
> - dpu_hw_mdp_destroy(dpu_kms->hw_mdp);
Hi Dmitry,
This section is causing a merge conflict for me. Seems that your working
branch is missing a section of code [1]:
```
...
if (dpu_kms->vbif[VBIF_NRT])
devm_iounmap(&dpu_kms->pdev->dev, dpu_kms->vbif[VBIF_NRT]);
dpu_kms->vbif[VBIF_NRT] = NULL;
if (dpu_kms->vbif[VBIF_RT])
devm_iounmap(&dpu_kms->pdev->dev, dpu_kms->vbif[VBIF_RT]);
dpu_kms->vbif[VBIF_RT] = NULL;
...
```
Unfortunately, I'm unable to find which series removed it. Can you list
the relevant series as a dependency?
Thanks,
Jessica Zhang
[1]
https://elixir.bootlin.com/linux/latest/source/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c#L812
> dpu_kms->hw_mdp = NULL;
> }
>
> @@ -1051,7 +1049,8 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>
> dpu_kms->rm_init = true;
>
> - dpu_kms->hw_mdp = dpu_hw_mdptop_init(dpu_kms->catalog->mdp,
> + dpu_kms->hw_mdp = dpu_hw_mdptop_init(dev,
> + dpu_kms->catalog->mdp,
> dpu_kms->mmio,
> dpu_kms->catalog);
> if (IS_ERR(dpu_kms->hw_mdp)) {
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 05/13] drm/msm/dpu: use devres-managed allocation for MDP TOP
@ 2023-07-15 0:55 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-15 0:55 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Use devm_kzalloc to create MDP TOP structure. This allows us to remove
> corresponding kfree and drop dpu_hw_mdp_destroy() function.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c | 17 +++++++----------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h | 8 +++++---
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 5 ++---
> 3 files changed, 14 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
> index cff48763ce25..481b373d9ccb 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c
> @@ -2,6 +2,8 @@
> /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> #include "dpu_hw_top.h"
> @@ -268,16 +270,17 @@ static void _setup_mdp_ops(struct dpu_hw_mdp_ops *ops,
> ops->intf_audio_select = dpu_hw_intf_audio_select;
> }
>
> -struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
> - void __iomem *addr,
> - const struct dpu_mdss_cfg *m)
> +struct dpu_hw_mdp *dpu_hw_mdptop_init(struct drm_device *dev,
> + const struct dpu_mdp_cfg *cfg,
> + void __iomem *addr,
> + const struct dpu_mdss_cfg *m)
> {
> struct dpu_hw_mdp *mdp;
>
> if (!addr)
> return ERR_PTR(-EINVAL);
>
> - mdp = kzalloc(sizeof(*mdp), GFP_KERNEL);
> + mdp = drmm_kzalloc(dev, sizeof(*mdp), GFP_KERNEL);
> if (!mdp)
> return ERR_PTR(-ENOMEM);
>
> @@ -292,9 +295,3 @@ struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
>
> return mdp;
> }
> -
> -void dpu_hw_mdp_destroy(struct dpu_hw_mdp *mdp)
> -{
> - kfree(mdp);
> -}
> -
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
> index 8b1463d2b2f0..6f3dc98087df 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h
> @@ -145,13 +145,15 @@ struct dpu_hw_mdp {
>
> /**
> * dpu_hw_mdptop_init - initializes the top driver for the passed config
> + * @dev: Corresponding device for devres management
> * @cfg: MDP TOP configuration from catalog
> * @addr: Mapped register io address of MDP
> * @m: Pointer to mdss catalog data
> */
> -struct dpu_hw_mdp *dpu_hw_mdptop_init(const struct dpu_mdp_cfg *cfg,
> - void __iomem *addr,
> - const struct dpu_mdss_cfg *m);
> +struct dpu_hw_mdp *dpu_hw_mdptop_init(struct drm_device *dev,
> + const struct dpu_mdp_cfg *cfg,
> + void __iomem *addr,
> + const struct dpu_mdss_cfg *m);
>
> void dpu_hw_mdp_destroy(struct dpu_hw_mdp *mdp);
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index f7723f89cbbc..48c3f8b6b88f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -822,8 +822,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
>
> dpu_kms->catalog = NULL;
>
> - if (dpu_kms->hw_mdp)
> - dpu_hw_mdp_destroy(dpu_kms->hw_mdp);
Hi Dmitry,
This section is causing a merge conflict for me. Seems that your working
branch is missing a section of code [1]:
```
...
if (dpu_kms->vbif[VBIF_NRT])
devm_iounmap(&dpu_kms->pdev->dev, dpu_kms->vbif[VBIF_NRT]);
dpu_kms->vbif[VBIF_NRT] = NULL;
if (dpu_kms->vbif[VBIF_RT])
devm_iounmap(&dpu_kms->pdev->dev, dpu_kms->vbif[VBIF_RT]);
dpu_kms->vbif[VBIF_RT] = NULL;
...
```
Unfortunately, I'm unable to find which series removed it. Can you list
the relevant series as a dependency?
Thanks,
Jessica Zhang
[1]
https://elixir.bootlin.com/linux/latest/source/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c#L812
> dpu_kms->hw_mdp = NULL;
> }
>
> @@ -1051,7 +1049,8 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>
> dpu_kms->rm_init = true;
>
> - dpu_kms->hw_mdp = dpu_hw_mdptop_init(dpu_kms->catalog->mdp,
> + dpu_kms->hw_mdp = dpu_hw_mdptop_init(dev,
> + dpu_kms->catalog->mdp,
> dpu_kms->mmio,
> dpu_kms->catalog);
> if (IS_ERR(dpu_kms->hw_mdp)) {
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 02/13] drm/msm/dpu: remove IS_ERR_OR_NULL for dpu_hw_intr_init() error handling
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-18 22:00 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-18 22:00 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Using IS_ERR_OR_NULL() together with PTR_ERR() is a typical mistake. If
> the value is NULL, then the function will return 0 instead of a proper
> return code. Replace IS_ERR_OR_NULL() with IS_ERR() in the
> dpu_hw_intr_init() error check.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Hi Dmitry,
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
Thanks,
Jessica Zhang
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index e7ac02e92f42..85b8c9cc99ef 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -1096,7 +1096,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> }
>
> dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
> - if (IS_ERR_OR_NULL(dpu_kms->hw_intr)) {
> + if (IS_ERR(dpu_kms->hw_intr)) {
> rc = PTR_ERR(dpu_kms->hw_intr);
> DPU_ERROR("hw_intr init failed: %d\n", rc);
> dpu_kms->hw_intr = NULL;
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 02/13] drm/msm/dpu: remove IS_ERR_OR_NULL for dpu_hw_intr_init() error handling
@ 2023-07-18 22:00 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-18 22:00 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Using IS_ERR_OR_NULL() together with PTR_ERR() is a typical mistake. If
> the value is NULL, then the function will return 0 instead of a proper
> return code. Replace IS_ERR_OR_NULL() with IS_ERR() in the
> dpu_hw_intr_init() error check.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Hi Dmitry,
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
Thanks,
Jessica Zhang
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index e7ac02e92f42..85b8c9cc99ef 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -1096,7 +1096,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> }
>
> dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
> - if (IS_ERR_OR_NULL(dpu_kms->hw_intr)) {
> + if (IS_ERR(dpu_kms->hw_intr)) {
> rc = PTR_ERR(dpu_kms->hw_intr);
> DPU_ERROR("hw_intr init failed: %d\n", rc);
> dpu_kms->hw_intr = NULL;
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 03/13] drm/msm/dpu: use devres-managed allocation for interrupts data
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-19 0:26 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-19 0:26 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Use devm_kzalloc to create interrupts data structure. This allows us to
> remove corresponding kfree and drop dpu_hw_intr_destroy() function.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 14 ++++++--------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h | 11 ++++-------
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 4 +---
> 3 files changed, 11 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
> index 5e2d68ebb113..945f34736206 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
> @@ -6,6 +6,8 @@
> #include <linux/debugfs.h>
> #include <linux/slab.h>
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_core_irq.h"
> #include "dpu_kms.h"
> #include "dpu_hw_interrupts.h"
> @@ -441,8 +443,9 @@ static void __intr_offset(const struct dpu_mdss_cfg *m,
> hw->blk_addr = addr + m->mdp[0].base;
> }
>
> -struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
> - const struct dpu_mdss_cfg *m)
> +struct dpu_hw_intr *dpu_hw_intr_init(struct drm_device *dev,
> + void __iomem *addr,
> + const struct dpu_mdss_cfg *m)
> {
> struct dpu_hw_intr *intr;
> int nirq = MDP_INTR_MAX * 32;
> @@ -450,7 +453,7 @@ struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
> if (!addr || !m)
> return ERR_PTR(-EINVAL);
>
> - intr = kzalloc(struct_size(intr, irq_tbl, nirq), GFP_KERNEL);
> + intr = drmm_kzalloc(dev, struct_size(intr, irq_tbl, nirq), GFP_KERNEL);
> if (!intr)
> return ERR_PTR(-ENOMEM);
>
> @@ -465,11 +468,6 @@ struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
> return intr;
> }
>
> -void dpu_hw_intr_destroy(struct dpu_hw_intr *intr)
> -{
> - kfree(intr);
> -}
> -
> int dpu_core_irq_register_callback(struct dpu_kms *dpu_kms, int irq_idx,
> void (*irq_cb)(void *arg, int irq_idx),
> void *irq_arg)
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
> index 1f2dabc54c22..b0d7bb073203 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
> @@ -70,15 +70,12 @@ struct dpu_hw_intr {
>
> /**
> * dpu_hw_intr_init(): Initializes the interrupts hw object
> + * @dev: Corresponding device for devres management
> * @addr: mapped register io address of MDP
> * @m: pointer to MDSS catalog data
> */
> -struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
> - const struct dpu_mdss_cfg *m);
> +struct dpu_hw_intr *dpu_hw_intr_init(struct drm_device *dev,
> + void __iomem *addr,
> + const struct dpu_mdss_cfg *m);
>
> -/**
> - * dpu_hw_intr_destroy(): Cleanup interrutps hw object
> - * @intr: pointer to interrupts hw object
> - */
> -void dpu_hw_intr_destroy(struct dpu_hw_intr *intr);
> #endif
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 85b8c9cc99ef..ef232dc838c7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -807,8 +807,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
> {
> int i;
>
> - if (dpu_kms->hw_intr)
> - dpu_hw_intr_destroy(dpu_kms->hw_intr);
> dpu_kms->hw_intr = NULL;
>
> /* safe to call these more than once during shutdown */
> @@ -1095,7 +1093,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> goto err_pm_put;
> }
>
> - dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
> + dpu_kms->hw_intr = dpu_hw_intr_init(dev, dpu_kms->mmio, dpu_kms->catalog);
> if (IS_ERR(dpu_kms->hw_intr)) {
> rc = PTR_ERR(dpu_kms->hw_intr);
> DPU_ERROR("hw_intr init failed: %d\n", rc);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 03/13] drm/msm/dpu: use devres-managed allocation for interrupts data
@ 2023-07-19 0:26 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-19 0:26 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Use devm_kzalloc to create interrupts data structure. This allows us to
> remove corresponding kfree and drop dpu_hw_intr_destroy() function.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 14 ++++++--------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h | 11 ++++-------
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 4 +---
> 3 files changed, 11 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
> index 5e2d68ebb113..945f34736206 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
> @@ -6,6 +6,8 @@
> #include <linux/debugfs.h>
> #include <linux/slab.h>
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_core_irq.h"
> #include "dpu_kms.h"
> #include "dpu_hw_interrupts.h"
> @@ -441,8 +443,9 @@ static void __intr_offset(const struct dpu_mdss_cfg *m,
> hw->blk_addr = addr + m->mdp[0].base;
> }
>
> -struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
> - const struct dpu_mdss_cfg *m)
> +struct dpu_hw_intr *dpu_hw_intr_init(struct drm_device *dev,
> + void __iomem *addr,
> + const struct dpu_mdss_cfg *m)
> {
> struct dpu_hw_intr *intr;
> int nirq = MDP_INTR_MAX * 32;
> @@ -450,7 +453,7 @@ struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
> if (!addr || !m)
> return ERR_PTR(-EINVAL);
>
> - intr = kzalloc(struct_size(intr, irq_tbl, nirq), GFP_KERNEL);
> + intr = drmm_kzalloc(dev, struct_size(intr, irq_tbl, nirq), GFP_KERNEL);
> if (!intr)
> return ERR_PTR(-ENOMEM);
>
> @@ -465,11 +468,6 @@ struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
> return intr;
> }
>
> -void dpu_hw_intr_destroy(struct dpu_hw_intr *intr)
> -{
> - kfree(intr);
> -}
> -
> int dpu_core_irq_register_callback(struct dpu_kms *dpu_kms, int irq_idx,
> void (*irq_cb)(void *arg, int irq_idx),
> void *irq_arg)
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
> index 1f2dabc54c22..b0d7bb073203 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h
> @@ -70,15 +70,12 @@ struct dpu_hw_intr {
>
> /**
> * dpu_hw_intr_init(): Initializes the interrupts hw object
> + * @dev: Corresponding device for devres management
> * @addr: mapped register io address of MDP
> * @m: pointer to MDSS catalog data
> */
> -struct dpu_hw_intr *dpu_hw_intr_init(void __iomem *addr,
> - const struct dpu_mdss_cfg *m);
> +struct dpu_hw_intr *dpu_hw_intr_init(struct drm_device *dev,
> + void __iomem *addr,
> + const struct dpu_mdss_cfg *m);
>
> -/**
> - * dpu_hw_intr_destroy(): Cleanup interrutps hw object
> - * @intr: pointer to interrupts hw object
> - */
> -void dpu_hw_intr_destroy(struct dpu_hw_intr *intr);
> #endif
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 85b8c9cc99ef..ef232dc838c7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -807,8 +807,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
> {
> int i;
>
> - if (dpu_kms->hw_intr)
> - dpu_hw_intr_destroy(dpu_kms->hw_intr);
> dpu_kms->hw_intr = NULL;
>
> /* safe to call these more than once during shutdown */
> @@ -1095,7 +1093,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> goto err_pm_put;
> }
>
> - dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio, dpu_kms->catalog);
> + dpu_kms->hw_intr = dpu_hw_intr_init(dev, dpu_kms->mmio, dpu_kms->catalog);
> if (IS_ERR(dpu_kms->hw_intr)) {
> rc = PTR_ERR(dpu_kms->hw_intr);
> DPU_ERROR("hw_intr init failed: %d\n", rc);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 04/13] drm/msm/dpu: use devres-managed allocation for VBIF data
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-19 1:03 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-19 1:03 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Use devm_kzalloc to create VBIF data structure. This allows us to
> remove corresponding kfree and drop dpu_hw_intr_destroy() function.
Hi Dmitry,
Nit: I think you mean dpu_hw_vbif_destroy() here.
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
Thanks,
Jessica Zhang
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c | 14 ++++++--------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h | 8 ++++----
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 11 +++--------
> 3 files changed, 13 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
> index a5121a50b2bb..98e34afde2d2 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
> @@ -2,6 +2,8 @@
> /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> #include "dpu_hw_vbif.h"
> @@ -211,12 +213,13 @@ static void _setup_vbif_ops(struct dpu_hw_vbif_ops *ops,
> ops->set_write_gather_en = dpu_hw_set_write_gather_en;
> }
>
> -struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_vbif *dpu_hw_vbif_init(struct drm_device *dev,
> + const struct dpu_vbif_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_vbif *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -234,8 +237,3 @@ struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_vbif_destroy(struct dpu_hw_vbif *vbif)
> -{
> - kfree(vbif);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
> index 7e10d2a172b4..e2b4307500e4 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
> @@ -108,12 +108,12 @@ struct dpu_hw_vbif {
> /**
> * dpu_hw_vbif_init() - Initializes the VBIF driver for the passed
> * VBIF catalog entry.
> + * @dev: Corresponding device for devres management
> * @cfg: VBIF catalog entry for which driver object is required
> * @addr: Mapped register io address of MDSS
> */
> -struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
> - void __iomem *addr);
> -
> -void dpu_hw_vbif_destroy(struct dpu_hw_vbif *vbif);
> +struct dpu_hw_vbif *dpu_hw_vbif_init(struct drm_device *dev,
> + const struct dpu_vbif_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_VBIF_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index ef232dc838c7..f7723f89cbbc 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -812,13 +812,8 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
> /* safe to call these more than once during shutdown */
> _dpu_kms_mmu_destroy(dpu_kms);
>
> - if (dpu_kms->catalog) {
> - for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) {
> - if (dpu_kms->hw_vbif[i]) {
> - dpu_hw_vbif_destroy(dpu_kms->hw_vbif[i]);
> - dpu_kms->hw_vbif[i] = NULL;
> - }
> - }
> + for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) {
> + dpu_kms->hw_vbif[i] = NULL;
> }
>
> if (dpu_kms->rm_init)
> @@ -1070,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> struct dpu_hw_vbif *hw;
> const struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i];
>
> - hw = dpu_hw_vbif_init(vbif, dpu_kms->vbif[vbif->id]);
> + hw = dpu_hw_vbif_init(dev, vbif, dpu_kms->vbif[vbif->id]);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 04/13] drm/msm/dpu: use devres-managed allocation for VBIF data
@ 2023-07-19 1:03 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-19 1:03 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Use devm_kzalloc to create VBIF data structure. This allows us to
> remove corresponding kfree and drop dpu_hw_intr_destroy() function.
Hi Dmitry,
Nit: I think you mean dpu_hw_vbif_destroy() here.
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
Thanks,
Jessica Zhang
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c | 14 ++++++--------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h | 8 ++++----
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 11 +++--------
> 3 files changed, 13 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
> index a5121a50b2bb..98e34afde2d2 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c
> @@ -2,6 +2,8 @@
> /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> #include "dpu_hw_vbif.h"
> @@ -211,12 +213,13 @@ static void _setup_vbif_ops(struct dpu_hw_vbif_ops *ops,
> ops->set_write_gather_en = dpu_hw_set_write_gather_en;
> }
>
> -struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_vbif *dpu_hw_vbif_init(struct drm_device *dev,
> + const struct dpu_vbif_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_vbif *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -234,8 +237,3 @@ struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_vbif_destroy(struct dpu_hw_vbif *vbif)
> -{
> - kfree(vbif);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
> index 7e10d2a172b4..e2b4307500e4 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h
> @@ -108,12 +108,12 @@ struct dpu_hw_vbif {
> /**
> * dpu_hw_vbif_init() - Initializes the VBIF driver for the passed
> * VBIF catalog entry.
> + * @dev: Corresponding device for devres management
> * @cfg: VBIF catalog entry for which driver object is required
> * @addr: Mapped register io address of MDSS
> */
> -struct dpu_hw_vbif *dpu_hw_vbif_init(const struct dpu_vbif_cfg *cfg,
> - void __iomem *addr);
> -
> -void dpu_hw_vbif_destroy(struct dpu_hw_vbif *vbif);
> +struct dpu_hw_vbif *dpu_hw_vbif_init(struct drm_device *dev,
> + const struct dpu_vbif_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_VBIF_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index ef232dc838c7..f7723f89cbbc 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -812,13 +812,8 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
> /* safe to call these more than once during shutdown */
> _dpu_kms_mmu_destroy(dpu_kms);
>
> - if (dpu_kms->catalog) {
> - for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) {
> - if (dpu_kms->hw_vbif[i]) {
> - dpu_hw_vbif_destroy(dpu_kms->hw_vbif[i]);
> - dpu_kms->hw_vbif[i] = NULL;
> - }
> - }
> + for (i = 0; i < ARRAY_SIZE(dpu_kms->hw_vbif); i++) {
> + dpu_kms->hw_vbif[i] = NULL;
> }
>
> if (dpu_kms->rm_init)
> @@ -1070,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> struct dpu_hw_vbif *hw;
> const struct dpu_vbif_cfg *vbif = &dpu_kms->catalog->vbif[i];
>
> - hw = dpu_hw_vbif_init(vbif, dpu_kms->vbif[vbif->id]);
> + hw = dpu_hw_vbif_init(dev, vbif, dpu_kms->vbif[vbif->id]);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 06/13] drm/msm/dpu: use devres-managed allocation for HW blocks
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-29 0:28 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 0:28 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Use devm_kzalloc to create HW block structure. This allows us to remove
> corresponding kfree and drop all dpu_hw_*_destroy() functions as well as
> dpu_rm_destroy(), which becomes empty afterwards.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 19 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 16 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c | 12 ++-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h | 10 ++-
> .../gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c | 7 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 16 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 12 +--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 15 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 12 +--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 14 ++-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 12 +--
> .../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c | 14 ++-
> .../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h | 13 +--
> .../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 14 ++-
> .../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 13 +--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 15 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 7 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 14 ++-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h | 12 +--
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 8 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 90 +++----------------
> drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 11 +--
> 23 files changed, 119 insertions(+), 238 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
> index c278fb9d2b5b..d22e3f11ae34 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
> @@ -4,6 +4,9 @@
> */
>
> #include <linux/delay.h>
> +
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hwio.h"
> #include "dpu_hw_ctl.h"
> #include "dpu_kms.h"
> @@ -674,14 +677,15 @@ static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
> ops->set_active_pipes = dpu_hw_ctl_set_fetch_pipe_active;
> };
>
> -struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
> - void __iomem *addr,
> - u32 mixer_count,
> - const struct dpu_lm_cfg *mixer)
> +struct dpu_hw_ctl *dpu_hw_ctl_init(struct drm_device *dev,
> + const struct dpu_ctl_cfg *cfg,
> + void __iomem *addr,
> + u32 mixer_count,
> + const struct dpu_lm_cfg *mixer)
> {
> struct dpu_hw_ctl *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -696,8 +700,3 @@ struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_ctl_destroy(struct dpu_hw_ctl *ctx)
> -{
> - kfree(ctx);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
> index 1c242298ff2e..279ebd8dfbff 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
> @@ -274,20 +274,16 @@ static inline struct dpu_hw_ctl *to_dpu_hw_ctl(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_ctl_init() - Initializes the ctl_path hw driver object.
> * Should be called before accessing any ctl_path register.
> + * @dev: Corresponding device for devres management
> * @cfg: ctl_path catalog entry for which driver object is required
> * @addr: mapped register io address of MDP
> * @mixer_count: Number of mixers in @mixer
> * @mixer: Pointer to an array of Layer Mixers defined in the catalog
> */
> -struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
> - void __iomem *addr,
> - u32 mixer_count,
> - const struct dpu_lm_cfg *mixer);
> -
> -/**
> - * dpu_hw_ctl_destroy(): Destroys ctl driver context
> - * should be called to free the context
> - */
> -void dpu_hw_ctl_destroy(struct dpu_hw_ctl *ctx);
> +struct dpu_hw_ctl *dpu_hw_ctl_init(struct drm_device *dev,
> + const struct dpu_ctl_cfg *cfg,
> + void __iomem *addr,
> + u32 mixer_count,
> + const struct dpu_lm_cfg *mixer);
>
> #endif /*_DPU_HW_CTL_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
> index 509dbaa51d87..5e9aad1b2aa2 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
> @@ -3,6 +3,8 @@
> * Copyright (c) 2020-2022, Linaro Limited
> */
>
> +#include <drm/drm_managed.h>
> +
> #include <drm/display/drm_dsc_helper.h>
>
> #include "dpu_kms.h"
> @@ -188,12 +190,13 @@ static void _setup_dsc_ops(struct dpu_hw_dsc_ops *ops,
> ops->dsc_bind_pingpong_blk = dpu_hw_dsc_bind_pingpong_blk;
> };
>
> -struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
> +struct dpu_hw_dsc *dpu_hw_dsc_init(struct drm_device *dev,
> + const struct dpu_dsc_cfg *cfg,
> void __iomem *addr)
> {
> struct dpu_hw_dsc *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -206,8 +209,3 @@ struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_dsc_destroy(struct dpu_hw_dsc *dsc)
> -{
> - kfree(dsc);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
> index d5b597ab8c5c..989c88d2449b 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
> @@ -64,20 +64,24 @@ struct dpu_hw_dsc {
>
> /**
> * dpu_hw_dsc_init() - Initializes the DSC hw driver object.
> + * @dev: Corresponding device for devres management
> * @cfg: DSC catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Return: Error code or allocated dpu_hw_dsc context
> */
> -struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
> - void __iomem *addr);
> +struct dpu_hw_dsc *dpu_hw_dsc_init(struct drm_device *dev,
> + const struct dpu_dsc_cfg *cfg,
> + void __iomem *addr);
>
> /**
> * dpu_hw_dsc_init_1_2() - initializes the v1.2 DSC hw driver object
> + * @dev: Corresponding device for devres management
> * @cfg: DSC catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Returns: Error code or allocated dpu_hw_dsc context
> */
> -struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(const struct dpu_dsc_cfg *cfg,
> +struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(struct drm_device *dev,
> + const struct dpu_dsc_cfg *cfg,
> void __iomem *addr);
>
> /**
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
> index 24fe1d98eb86..ba193b0376fe 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
> @@ -4,6 +4,8 @@
> * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved
> */
>
> +#include <drm/drm_managed.h>
> +
> #include <drm/display/drm_dsc_helper.h>
>
> #include "dpu_kms.h"
> @@ -367,12 +369,13 @@ static void _setup_dcs_ops_1_2(struct dpu_hw_dsc_ops *ops,
> ops->dsc_bind_pingpong_blk = dpu_hw_dsc_bind_pingpong_blk_1_2;
> }
>
> -struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(const struct dpu_dsc_cfg *cfg,
> +struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(struct drm_device *dev,
> + const struct dpu_dsc_cfg *cfg,
> void __iomem *addr)
> {
> struct dpu_hw_dsc *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
> index 9419b2209af8..b1da88e2935f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
> @@ -2,6 +2,8 @@
> /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> #include "dpu_hw_lm.h"
> @@ -68,15 +70,16 @@ static void _setup_dspp_ops(struct dpu_hw_dspp *c,
> c->ops.setup_pcc = dpu_setup_dspp_pcc;
> }
>
> -struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_dspp *dpu_hw_dspp_init(struct drm_device *dev,
> + const struct dpu_dspp_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_dspp *c;
>
> if (!addr)
> return ERR_PTR(-EINVAL);
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -90,10 +93,3 @@ struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp)
> -{
> - kfree(dspp);
> -}
> -
> -
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
> index bea965681330..3b435690b6cc 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
> @@ -81,18 +81,14 @@ static inline struct dpu_hw_dspp *to_dpu_hw_dspp(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_dspp_init() - Initializes the DSPP hw driver object.
> * should be called once before accessing every DSPP.
> + * @dev: Corresponding device for devres management
> * @cfg: DSPP catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Return: pointer to structure or ERR_PTR
> */
> -struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_dspp_destroy(): Destroys DSPP driver context
> - * @dspp: Pointer to DSPP driver context
> - */
> -void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp);
> +struct dpu_hw_dspp *dpu_hw_dspp_init(struct drm_device *dev,
> + const struct dpu_dspp_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_DSPP_H */
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
> index 5b0f6627e29b..08304fc3d1d6 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
> @@ -12,6 +12,8 @@
>
> #include <linux/iopoll.h>
>
> +#include <drm/drm_managed.h>
> +
> #define INTF_TIMING_ENGINE_EN 0x000
> #define INTF_CONFIG 0x004
> #define INTF_HSYNC_CTL 0x008
> @@ -547,8 +549,9 @@ static void _setup_intf_ops(struct dpu_hw_intf_ops *ops,
> ops->enable_compression = dpu_hw_intf_enable_compression;
> }
>
> -struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_intf *dpu_hw_intf_init(struct drm_device *dev,
> + const struct dpu_intf_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_intf *c;
>
> @@ -557,7 +560,7 @@ struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
> return NULL;
> }
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -573,9 +576,3 @@ struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_intf_destroy(struct dpu_hw_intf *intf)
> -{
> - kfree(intf);
> -}
> -
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
> index 99e21c4137f9..79240fbeeb53 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
> @@ -125,16 +125,12 @@ struct dpu_hw_intf {
> /**
> * dpu_hw_intf_init() - Initializes the INTF driver for the passed
> * interface catalog entry.
> + * @dev: Corresponding device for devres management
> * @cfg: interface catalog entry for which driver object is required
> * @addr: mapped register io address of MDP
> */
> -struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_intf_destroy(): Destroys INTF driver context
> - * @intf: Pointer to INTF driver context
> - */
> -void dpu_hw_intf_destroy(struct dpu_hw_intf *intf);
> +struct dpu_hw_intf *dpu_hw_intf_init(struct drm_device *dev,
> + const struct dpu_intf_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_INTF_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
> index d1c3bd8379ea..25af52ab602f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
> @@ -4,6 +4,8 @@
> * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_kms.h"
> #include "dpu_hw_catalog.h"
> #include "dpu_hwio.h"
> @@ -156,8 +158,9 @@ static void _setup_mixer_ops(struct dpu_hw_lm_ops *ops,
> ops->collect_misr = dpu_hw_lm_collect_misr;
> }
>
> -struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_mixer *dpu_hw_lm_init(struct drm_device *dev,
> + const struct dpu_lm_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_mixer *c;
>
> @@ -166,7 +169,7 @@ struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
> return NULL;
> }
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -180,8 +183,3 @@ struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_lm_destroy(struct dpu_hw_mixer *lm)
> -{
> - kfree(lm);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
> index 36992d046a53..8835fd106413 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
> @@ -95,16 +95,12 @@ static inline struct dpu_hw_mixer *to_dpu_hw_mixer(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_lm_init() - Initializes the mixer hw driver object.
> * should be called once before accessing every mixer.
> + * @dev: Corresponding device for devres management
> * @cfg: mixer catalog entry for which driver object is required
> * @addr: mapped register io address of MDP
> */
> -struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_lm_destroy(): Destroys layer mixer driver context
> - * @lm: Pointer to LM driver context
> - */
> -void dpu_hw_lm_destroy(struct dpu_hw_mixer *lm);
> +struct dpu_hw_mixer *dpu_hw_lm_init(struct drm_device *dev,
> + const struct dpu_lm_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_LM_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
> index 90e0e05eff8d..ddfa40a959cb 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
> @@ -4,6 +4,8 @@
>
> #include <linux/iopoll.h>
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hw_mdss.h"
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> @@ -37,12 +39,13 @@ static void _setup_merge_3d_ops(struct dpu_hw_merge_3d *c,
> c->ops.setup_3d_mode = dpu_hw_merge_3d_setup_3d_mode;
> };
>
> -struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(struct drm_device *dev,
> + const struct dpu_merge_3d_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_merge_3d *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -55,8 +58,3 @@ struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_merge_3d_destroy(struct dpu_hw_merge_3d *hw)
> -{
> - kfree(hw);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
> index 19cec5e88722..c192f02ec1ab 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
> @@ -48,18 +48,13 @@ static inline struct dpu_hw_merge_3d *to_dpu_hw_merge_3d(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_merge_3d_init() - Initializes the merge_3d driver for the passed
> * merge3d catalog entry.
> + * @dev: Corresponding device for devres management
> * @cfg: Pingpong catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Return: Error code or allocated dpu_hw_merge_3d context
> */
> -struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_merge_3d_destroy - destroys merge_3d driver context
> - * should be called to free the context
> - * @pp: Pointer to PP driver context returned by dpu_hw_merge_3d_init
> - */
> -void dpu_hw_merge_3d_destroy(struct dpu_hw_merge_3d *pp);
> +struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(struct drm_device *dev,
> + const struct dpu_merge_3d_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_MERGE3D_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
> index 437d9e62a841..72292af91a18 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
> @@ -4,6 +4,8 @@
>
> #include <linux/iopoll.h>
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hw_mdss.h"
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> @@ -302,12 +304,13 @@ static void _setup_pingpong_ops(struct dpu_hw_pingpong *c,
> c->ops.setup_dither = dpu_hw_pp_setup_dither;
> };
>
> -struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_pingpong *dpu_hw_pingpong_init(struct drm_device *dev,
> + const struct dpu_pingpong_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_pingpong *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -320,8 +323,3 @@ struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_pingpong_destroy(struct dpu_hw_pingpong *pp)
> -{
> - kfree(pp);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
> index d3246a9a5808..96eb2b87e7ef 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
> @@ -121,18 +121,13 @@ static inline struct dpu_hw_pingpong *to_dpu_hw_pingpong(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_pingpong_init() - initializes the pingpong driver for the passed
> * pingpong catalog entry.
> + * @dev: Corresponding device for devres management
> * @cfg: Pingpong catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Return: Error code or allocated dpu_hw_pingpong context
> */
> -struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_pingpong_destroy - destroys pingpong driver context
> - * should be called to free the context
> - * @pp: Pointer to PP driver context returned by dpu_hw_pingpong_init
> - */
> -void dpu_hw_pingpong_destroy(struct dpu_hw_pingpong *pp);
> +struct dpu_hw_pingpong *dpu_hw_pingpong_init(struct drm_device *dev,
> + const struct dpu_pingpong_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_PINGPONG_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
> index b364cf75bb3f..fb8ecfb9b922 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
> @@ -9,6 +9,7 @@
> #include "dpu_kms.h"
>
> #include <drm/drm_file.h>
> +#include <drm/drm_managed.h>
>
> #define DPU_FETCH_CONFIG_RESET_VALUE 0x00000087
>
> @@ -669,15 +670,17 @@ int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms,
> }
> #endif
>
> -struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
> - void __iomem *addr, const struct dpu_ubwc_cfg *ubwc)
> +struct dpu_hw_sspp *dpu_hw_sspp_init(struct drm_device *dev,
> + const struct dpu_sspp_cfg *cfg,
> + void __iomem *addr,
> + const struct dpu_ubwc_cfg *ubwc)
> {
> struct dpu_hw_sspp *hw_pipe;
>
> if (!addr || !ubwc)
> return ERR_PTR(-EINVAL);
>
> - hw_pipe = kzalloc(sizeof(*hw_pipe), GFP_KERNEL);
> + hw_pipe = drmm_kzalloc(dev, sizeof(*hw_pipe), GFP_KERNEL);
> if (!hw_pipe)
> return ERR_PTR(-ENOMEM);
>
> @@ -692,9 +695,3 @@ struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
>
> return hw_pipe;
> }
> -
> -void dpu_hw_sspp_destroy(struct dpu_hw_sspp *ctx)
> -{
> - kfree(ctx);
> -}
> -
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
> index 085f34bc6b88..5dd4f78d424c 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
> @@ -331,12 +331,15 @@ struct dpu_kms;
> /**
> * dpu_hw_sspp_init() - Initializes the sspp hw driver object.
> * Should be called once before accessing every pipe.
> + * @dev: Corresponding device for devres management
> * @cfg: Pipe catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * @ubwc: UBWC configuration data
> */
> -struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
> - void __iomem *addr, const struct dpu_ubwc_cfg *ubwc);
> +struct dpu_hw_sspp *dpu_hw_sspp_init(struct drm_device *dev,
> + const struct dpu_sspp_cfg *cfg,
> + void __iomem *addr,
> + const struct dpu_ubwc_cfg *ubwc);
>
> /**
> * dpu_hw_sspp_destroy(): Destroys SSPP driver context
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
> index ebc416400382..106540eee5f7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
> @@ -3,6 +3,8 @@
> * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hw_mdss.h"
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> @@ -194,15 +196,16 @@ static void _setup_wb_ops(struct dpu_hw_wb_ops *ops,
> ops->bind_pingpong_blk = dpu_hw_wb_bind_pingpong_blk;
> }
>
> -struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_wb *dpu_hw_wb_init(struct drm_device *dev,
> + const struct dpu_wb_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_wb *c;
>
> if (!addr)
> return ERR_PTR(-EINVAL);
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -216,8 +219,3 @@ struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_wb_destroy(struct dpu_hw_wb *hw_wb)
> -{
> - kfree(hw_wb);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
> index 2d7db2efa3d0..98d1129238cc 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
> @@ -72,17 +72,13 @@ struct dpu_hw_wb {
>
> /**
> * dpu_hw_wb_init() - Initializes the writeback hw driver object.
> + * @dev: Corresponding device for devres management
> * @cfg: wb_path catalog entry for which driver object is required
> * @addr: mapped register io address of MDP
> * Return: Error code or allocated dpu_hw_wb context
> */
> -struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_wb_destroy(): Destroy writeback hw driver object.
> - * @hw_wb: Pointer to writeback hw driver object
> - */
> -void dpu_hw_wb_destroy(struct dpu_hw_wb *hw_wb);
> +struct dpu_hw_wb *dpu_hw_wb_init(struct drm_device *dev,
> + const struct dpu_wb_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_WB_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 48c3f8b6b88f..1e29de32b7c0 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -816,10 +816,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
> dpu_kms->hw_vbif[i] = NULL;
> }
>
> - if (dpu_kms->rm_init)
> - dpu_rm_destroy(&dpu_kms->rm);
> - dpu_kms->rm_init = false;
> -
> dpu_kms->catalog = NULL;
>
> dpu_kms->hw_mdp = NULL;
> @@ -1041,14 +1037,12 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> goto err_pm_put;
> }
>
> - rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
> + rc = dpu_rm_init(dev, &dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
> if (rc) {
> DPU_ERROR("rm init failed: %d\n", rc);
> goto err_pm_put;
> }
>
> - dpu_kms->rm_init = true;
> -
> dpu_kms->hw_mdp = dpu_hw_mdptop_init(dev,
> dpu_kms->catalog->mdp,
> dpu_kms->mmio,
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> index f3bdd4f11108..2af1767ada9d 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> @@ -87,7 +87,6 @@ struct dpu_kms {
> struct drm_private_obj global_state;
>
> struct dpu_rm rm;
> - bool rm_init;
>
> struct dpu_hw_vbif *hw_vbif[VBIF_MAX];
> struct dpu_hw_mdp *hw_mdp;
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> index e333f4eeafc1..d10025b8f659 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> @@ -34,72 +34,8 @@ struct dpu_rm_requirements {
> struct msm_display_topology topology;
> };
>
> -int dpu_rm_destroy(struct dpu_rm *rm)
> -{
> - int i;
> -
> - for (i = 0; i < ARRAY_SIZE(rm->dspp_blks); i++) {
> - struct dpu_hw_dspp *hw;
> -
> - if (rm->dspp_blks[i]) {
> - hw = to_dpu_hw_dspp(rm->dspp_blks[i]);
> - dpu_hw_dspp_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->pingpong_blks); i++) {
> - struct dpu_hw_pingpong *hw;
> -
> - if (rm->pingpong_blks[i]) {
> - hw = to_dpu_hw_pingpong(rm->pingpong_blks[i]);
> - dpu_hw_pingpong_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->merge_3d_blks); i++) {
> - struct dpu_hw_merge_3d *hw;
> -
> - if (rm->merge_3d_blks[i]) {
> - hw = to_dpu_hw_merge_3d(rm->merge_3d_blks[i]);
> - dpu_hw_merge_3d_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->mixer_blks); i++) {
> - struct dpu_hw_mixer *hw;
> -
> - if (rm->mixer_blks[i]) {
> - hw = to_dpu_hw_mixer(rm->mixer_blks[i]);
> - dpu_hw_lm_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->ctl_blks); i++) {
> - struct dpu_hw_ctl *hw;
> -
> - if (rm->ctl_blks[i]) {
> - hw = to_dpu_hw_ctl(rm->ctl_blks[i]);
> - dpu_hw_ctl_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->hw_intf); i++)
> - dpu_hw_intf_destroy(rm->hw_intf[i]);
> -
> - for (i = 0; i < ARRAY_SIZE(rm->dsc_blks); i++) {
> - struct dpu_hw_dsc *hw;
> -
> - if (rm->dsc_blks[i]) {
> - hw = to_dpu_hw_dsc(rm->dsc_blks[i]);
> - dpu_hw_dsc_destroy(hw);
> - }
> - }
> -
> - for (i = 0; i < ARRAY_SIZE(rm->hw_wb); i++)
> - dpu_hw_wb_destroy(rm->hw_wb[i]);
> -
> - for (i = 0; i < ARRAY_SIZE(rm->hw_sspp); i++)
> - dpu_hw_sspp_destroy(rm->hw_sspp[i]);
> -
> - return 0;
> -}
> -
> -int dpu_rm_init(struct dpu_rm *rm,
> +int dpu_rm_init(struct drm_device *dev,
> + struct dpu_rm *rm,
> const struct dpu_mdss_cfg *cat,
> void __iomem *mmio)
> {
> @@ -118,7 +54,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_mixer *hw;
> const struct dpu_lm_cfg *lm = &cat->mixer[i];
>
> - hw = dpu_hw_lm_init(lm, mmio);
> + hw = dpu_hw_lm_init(dev, lm, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed lm object creation: err %d\n", rc);
> @@ -131,7 +67,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_merge_3d *hw;
> const struct dpu_merge_3d_cfg *merge_3d = &cat->merge_3d[i];
>
> - hw = dpu_hw_merge_3d_init(merge_3d, mmio);
> + hw = dpu_hw_merge_3d_init(dev, merge_3d, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed merge_3d object creation: err %d\n",
> @@ -145,7 +81,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_pingpong *hw;
> const struct dpu_pingpong_cfg *pp = &cat->pingpong[i];
>
> - hw = dpu_hw_pingpong_init(pp, mmio);
> + hw = dpu_hw_pingpong_init(dev, pp, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed pingpong object creation: err %d\n",
> @@ -161,7 +97,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_intf *hw;
> const struct dpu_intf_cfg *intf = &cat->intf[i];
>
> - hw = dpu_hw_intf_init(intf, mmio);
> + hw = dpu_hw_intf_init(dev, intf, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed intf object creation: err %d\n", rc);
> @@ -174,7 +110,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_wb *hw;
> const struct dpu_wb_cfg *wb = &cat->wb[i];
>
> - hw = dpu_hw_wb_init(wb, mmio);
> + hw = dpu_hw_wb_init(dev, wb, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed wb object creation: err %d\n", rc);
> @@ -187,7 +123,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_ctl *hw;
> const struct dpu_ctl_cfg *ctl = &cat->ctl[i];
>
> - hw = dpu_hw_ctl_init(ctl, mmio, cat->mixer_count, cat->mixer);
> + hw = dpu_hw_ctl_init(dev, ctl, mmio, cat->mixer_count, cat->mixer);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed ctl object creation: err %d\n", rc);
> @@ -200,7 +136,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_dspp *hw;
> const struct dpu_dspp_cfg *dspp = &cat->dspp[i];
>
> - hw = dpu_hw_dspp_init(dspp, mmio);
> + hw = dpu_hw_dspp_init(dev, dspp, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed dspp object creation: err %d\n", rc);
> @@ -214,9 +150,9 @@ int dpu_rm_init(struct dpu_rm *rm,
> const struct dpu_dsc_cfg *dsc = &cat->dsc[i];
>
> if (test_bit(DPU_DSC_HW_REV_1_2, &dsc->features))
> - hw = dpu_hw_dsc_init_1_2(dsc, mmio);
> + hw = dpu_hw_dsc_init_1_2(dev, dsc, mmio);
> else
> - hw = dpu_hw_dsc_init(dsc, mmio);
> + hw = dpu_hw_dsc_init(dev, dsc, mmio);
>
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> @@ -230,7 +166,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_sspp *hw;
> const struct dpu_sspp_cfg *sspp = &cat->sspp[i];
>
> - hw = dpu_hw_sspp_init(sspp, mmio, cat->ubwc);
> + hw = dpu_hw_sspp_init(dev, sspp, mmio, cat->ubwc);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed sspp object creation: err %d\n", rc);
> @@ -242,8 +178,6 @@ int dpu_rm_init(struct dpu_rm *rm,
> return 0;
>
> fail:
> - dpu_rm_destroy(rm);
> -
> return rc ? rc : -EFAULT;
> }
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
> index d62c2edb2460..7199a09f3ce3 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
> @@ -38,22 +38,17 @@ struct dpu_rm {
> /**
> * dpu_rm_init - Read hardware catalog and create reservation tracking objects
> * for all HW blocks.
> + * @dev: Corresponding device for devres management
> * @rm: DPU Resource Manager handle
> * @cat: Pointer to hardware catalog
> * @mmio: mapped register io address of MDP
> * @Return: 0 on Success otherwise -ERROR
> */
> -int dpu_rm_init(struct dpu_rm *rm,
> +int dpu_rm_init(struct drm_device *dev,
> + struct dpu_rm *rm,
> const struct dpu_mdss_cfg *cat,
> void __iomem *mmio);
>
> -/**
> - * dpu_rm_destroy - Free all memory allocated by dpu_rm_init
> - * @rm: DPU Resource Manager handle
> - * @Return: 0 on Success otherwise -ERROR
> - */
> -int dpu_rm_destroy(struct dpu_rm *rm);
> -
> /**
> * dpu_rm_reserve - Given a CRTC->Encoder->Connector display chain, analyze
> * the use connections and user requirements, specified through related
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 06/13] drm/msm/dpu: use devres-managed allocation for HW blocks
@ 2023-07-29 0:28 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 0:28 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Use devm_kzalloc to create HW block structure. This allows us to remove
> corresponding kfree and drop all dpu_hw_*_destroy() functions as well as
> dpu_rm_destroy(), which becomes empty afterwards.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 19 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 16 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c | 12 ++-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h | 10 ++-
> .../gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c | 7 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 16 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 12 +--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 15 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 12 +--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 14 ++-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 12 +--
> .../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c | 14 ++-
> .../gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h | 13 +--
> .../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 14 ++-
> .../gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 13 +--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 15 ++--
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 7 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 14 ++-
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h | 12 +--
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 8 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 90 +++----------------
> drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 11 +--
> 23 files changed, 119 insertions(+), 238 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
> index c278fb9d2b5b..d22e3f11ae34 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
> @@ -4,6 +4,9 @@
> */
>
> #include <linux/delay.h>
> +
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hwio.h"
> #include "dpu_hw_ctl.h"
> #include "dpu_kms.h"
> @@ -674,14 +677,15 @@ static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,
> ops->set_active_pipes = dpu_hw_ctl_set_fetch_pipe_active;
> };
>
> -struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
> - void __iomem *addr,
> - u32 mixer_count,
> - const struct dpu_lm_cfg *mixer)
> +struct dpu_hw_ctl *dpu_hw_ctl_init(struct drm_device *dev,
> + const struct dpu_ctl_cfg *cfg,
> + void __iomem *addr,
> + u32 mixer_count,
> + const struct dpu_lm_cfg *mixer)
> {
> struct dpu_hw_ctl *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -696,8 +700,3 @@ struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_ctl_destroy(struct dpu_hw_ctl *ctx)
> -{
> - kfree(ctx);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
> index 1c242298ff2e..279ebd8dfbff 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h
> @@ -274,20 +274,16 @@ static inline struct dpu_hw_ctl *to_dpu_hw_ctl(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_ctl_init() - Initializes the ctl_path hw driver object.
> * Should be called before accessing any ctl_path register.
> + * @dev: Corresponding device for devres management
> * @cfg: ctl_path catalog entry for which driver object is required
> * @addr: mapped register io address of MDP
> * @mixer_count: Number of mixers in @mixer
> * @mixer: Pointer to an array of Layer Mixers defined in the catalog
> */
> -struct dpu_hw_ctl *dpu_hw_ctl_init(const struct dpu_ctl_cfg *cfg,
> - void __iomem *addr,
> - u32 mixer_count,
> - const struct dpu_lm_cfg *mixer);
> -
> -/**
> - * dpu_hw_ctl_destroy(): Destroys ctl driver context
> - * should be called to free the context
> - */
> -void dpu_hw_ctl_destroy(struct dpu_hw_ctl *ctx);
> +struct dpu_hw_ctl *dpu_hw_ctl_init(struct drm_device *dev,
> + const struct dpu_ctl_cfg *cfg,
> + void __iomem *addr,
> + u32 mixer_count,
> + const struct dpu_lm_cfg *mixer);
>
> #endif /*_DPU_HW_CTL_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
> index 509dbaa51d87..5e9aad1b2aa2 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c
> @@ -3,6 +3,8 @@
> * Copyright (c) 2020-2022, Linaro Limited
> */
>
> +#include <drm/drm_managed.h>
> +
> #include <drm/display/drm_dsc_helper.h>
>
> #include "dpu_kms.h"
> @@ -188,12 +190,13 @@ static void _setup_dsc_ops(struct dpu_hw_dsc_ops *ops,
> ops->dsc_bind_pingpong_blk = dpu_hw_dsc_bind_pingpong_blk;
> };
>
> -struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
> +struct dpu_hw_dsc *dpu_hw_dsc_init(struct drm_device *dev,
> + const struct dpu_dsc_cfg *cfg,
> void __iomem *addr)
> {
> struct dpu_hw_dsc *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -206,8 +209,3 @@ struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_dsc_destroy(struct dpu_hw_dsc *dsc)
> -{
> - kfree(dsc);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
> index d5b597ab8c5c..989c88d2449b 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h
> @@ -64,20 +64,24 @@ struct dpu_hw_dsc {
>
> /**
> * dpu_hw_dsc_init() - Initializes the DSC hw driver object.
> + * @dev: Corresponding device for devres management
> * @cfg: DSC catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Return: Error code or allocated dpu_hw_dsc context
> */
> -struct dpu_hw_dsc *dpu_hw_dsc_init(const struct dpu_dsc_cfg *cfg,
> - void __iomem *addr);
> +struct dpu_hw_dsc *dpu_hw_dsc_init(struct drm_device *dev,
> + const struct dpu_dsc_cfg *cfg,
> + void __iomem *addr);
>
> /**
> * dpu_hw_dsc_init_1_2() - initializes the v1.2 DSC hw driver object
> + * @dev: Corresponding device for devres management
> * @cfg: DSC catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Returns: Error code or allocated dpu_hw_dsc context
> */
> -struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(const struct dpu_dsc_cfg *cfg,
> +struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(struct drm_device *dev,
> + const struct dpu_dsc_cfg *cfg,
> void __iomem *addr);
>
> /**
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
> index 24fe1d98eb86..ba193b0376fe 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c
> @@ -4,6 +4,8 @@
> * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved
> */
>
> +#include <drm/drm_managed.h>
> +
> #include <drm/display/drm_dsc_helper.h>
>
> #include "dpu_kms.h"
> @@ -367,12 +369,13 @@ static void _setup_dcs_ops_1_2(struct dpu_hw_dsc_ops *ops,
> ops->dsc_bind_pingpong_blk = dpu_hw_dsc_bind_pingpong_blk_1_2;
> }
>
> -struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(const struct dpu_dsc_cfg *cfg,
> +struct dpu_hw_dsc *dpu_hw_dsc_init_1_2(struct drm_device *dev,
> + const struct dpu_dsc_cfg *cfg,
> void __iomem *addr)
> {
> struct dpu_hw_dsc *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
> index 9419b2209af8..b1da88e2935f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
> @@ -2,6 +2,8 @@
> /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> #include "dpu_hw_lm.h"
> @@ -68,15 +70,16 @@ static void _setup_dspp_ops(struct dpu_hw_dspp *c,
> c->ops.setup_pcc = dpu_setup_dspp_pcc;
> }
>
> -struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_dspp *dpu_hw_dspp_init(struct drm_device *dev,
> + const struct dpu_dspp_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_dspp *c;
>
> if (!addr)
> return ERR_PTR(-EINVAL);
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -90,10 +93,3 @@ struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp)
> -{
> - kfree(dspp);
> -}
> -
> -
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
> index bea965681330..3b435690b6cc 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h
> @@ -81,18 +81,14 @@ static inline struct dpu_hw_dspp *to_dpu_hw_dspp(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_dspp_init() - Initializes the DSPP hw driver object.
> * should be called once before accessing every DSPP.
> + * @dev: Corresponding device for devres management
> * @cfg: DSPP catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Return: pointer to structure or ERR_PTR
> */
> -struct dpu_hw_dspp *dpu_hw_dspp_init(const struct dpu_dspp_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_dspp_destroy(): Destroys DSPP driver context
> - * @dspp: Pointer to DSPP driver context
> - */
> -void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp);
> +struct dpu_hw_dspp *dpu_hw_dspp_init(struct drm_device *dev,
> + const struct dpu_dspp_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_DSPP_H */
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
> index 5b0f6627e29b..08304fc3d1d6 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
> @@ -12,6 +12,8 @@
>
> #include <linux/iopoll.h>
>
> +#include <drm/drm_managed.h>
> +
> #define INTF_TIMING_ENGINE_EN 0x000
> #define INTF_CONFIG 0x004
> #define INTF_HSYNC_CTL 0x008
> @@ -547,8 +549,9 @@ static void _setup_intf_ops(struct dpu_hw_intf_ops *ops,
> ops->enable_compression = dpu_hw_intf_enable_compression;
> }
>
> -struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_intf *dpu_hw_intf_init(struct drm_device *dev,
> + const struct dpu_intf_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_intf *c;
>
> @@ -557,7 +560,7 @@ struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
> return NULL;
> }
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -573,9 +576,3 @@ struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_intf_destroy(struct dpu_hw_intf *intf)
> -{
> - kfree(intf);
> -}
> -
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
> index 99e21c4137f9..79240fbeeb53 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h
> @@ -125,16 +125,12 @@ struct dpu_hw_intf {
> /**
> * dpu_hw_intf_init() - Initializes the INTF driver for the passed
> * interface catalog entry.
> + * @dev: Corresponding device for devres management
> * @cfg: interface catalog entry for which driver object is required
> * @addr: mapped register io address of MDP
> */
> -struct dpu_hw_intf *dpu_hw_intf_init(const struct dpu_intf_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_intf_destroy(): Destroys INTF driver context
> - * @intf: Pointer to INTF driver context
> - */
> -void dpu_hw_intf_destroy(struct dpu_hw_intf *intf);
> +struct dpu_hw_intf *dpu_hw_intf_init(struct drm_device *dev,
> + const struct dpu_intf_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_INTF_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
> index d1c3bd8379ea..25af52ab602f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c
> @@ -4,6 +4,8 @@
> * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_kms.h"
> #include "dpu_hw_catalog.h"
> #include "dpu_hwio.h"
> @@ -156,8 +158,9 @@ static void _setup_mixer_ops(struct dpu_hw_lm_ops *ops,
> ops->collect_misr = dpu_hw_lm_collect_misr;
> }
>
> -struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_mixer *dpu_hw_lm_init(struct drm_device *dev,
> + const struct dpu_lm_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_mixer *c;
>
> @@ -166,7 +169,7 @@ struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
> return NULL;
> }
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -180,8 +183,3 @@ struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_lm_destroy(struct dpu_hw_mixer *lm)
> -{
> - kfree(lm);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
> index 36992d046a53..8835fd106413 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h
> @@ -95,16 +95,12 @@ static inline struct dpu_hw_mixer *to_dpu_hw_mixer(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_lm_init() - Initializes the mixer hw driver object.
> * should be called once before accessing every mixer.
> + * @dev: Corresponding device for devres management
> * @cfg: mixer catalog entry for which driver object is required
> * @addr: mapped register io address of MDP
> */
> -struct dpu_hw_mixer *dpu_hw_lm_init(const struct dpu_lm_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_lm_destroy(): Destroys layer mixer driver context
> - * @lm: Pointer to LM driver context
> - */
> -void dpu_hw_lm_destroy(struct dpu_hw_mixer *lm);
> +struct dpu_hw_mixer *dpu_hw_lm_init(struct drm_device *dev,
> + const struct dpu_lm_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_LM_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
> index 90e0e05eff8d..ddfa40a959cb 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c
> @@ -4,6 +4,8 @@
>
> #include <linux/iopoll.h>
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hw_mdss.h"
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> @@ -37,12 +39,13 @@ static void _setup_merge_3d_ops(struct dpu_hw_merge_3d *c,
> c->ops.setup_3d_mode = dpu_hw_merge_3d_setup_3d_mode;
> };
>
> -struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(struct drm_device *dev,
> + const struct dpu_merge_3d_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_merge_3d *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -55,8 +58,3 @@ struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_merge_3d_destroy(struct dpu_hw_merge_3d *hw)
> -{
> - kfree(hw);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
> index 19cec5e88722..c192f02ec1ab 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h
> @@ -48,18 +48,13 @@ static inline struct dpu_hw_merge_3d *to_dpu_hw_merge_3d(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_merge_3d_init() - Initializes the merge_3d driver for the passed
> * merge3d catalog entry.
> + * @dev: Corresponding device for devres management
> * @cfg: Pingpong catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Return: Error code or allocated dpu_hw_merge_3d context
> */
> -struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_merge_3d_destroy - destroys merge_3d driver context
> - * should be called to free the context
> - * @pp: Pointer to PP driver context returned by dpu_hw_merge_3d_init
> - */
> -void dpu_hw_merge_3d_destroy(struct dpu_hw_merge_3d *pp);
> +struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(struct drm_device *dev,
> + const struct dpu_merge_3d_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_MERGE3D_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
> index 437d9e62a841..72292af91a18 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
> @@ -4,6 +4,8 @@
>
> #include <linux/iopoll.h>
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hw_mdss.h"
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> @@ -302,12 +304,13 @@ static void _setup_pingpong_ops(struct dpu_hw_pingpong *c,
> c->ops.setup_dither = dpu_hw_pp_setup_dither;
> };
>
> -struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_pingpong *dpu_hw_pingpong_init(struct drm_device *dev,
> + const struct dpu_pingpong_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_pingpong *c;
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -320,8 +323,3 @@ struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_pingpong_destroy(struct dpu_hw_pingpong *pp)
> -{
> - kfree(pp);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
> index d3246a9a5808..96eb2b87e7ef 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
> @@ -121,18 +121,13 @@ static inline struct dpu_hw_pingpong *to_dpu_hw_pingpong(struct dpu_hw_blk *hw)
> /**
> * dpu_hw_pingpong_init() - initializes the pingpong driver for the passed
> * pingpong catalog entry.
> + * @dev: Corresponding device for devres management
> * @cfg: Pingpong catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * Return: Error code or allocated dpu_hw_pingpong context
> */
> -struct dpu_hw_pingpong *dpu_hw_pingpong_init(const struct dpu_pingpong_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_pingpong_destroy - destroys pingpong driver context
> - * should be called to free the context
> - * @pp: Pointer to PP driver context returned by dpu_hw_pingpong_init
> - */
> -void dpu_hw_pingpong_destroy(struct dpu_hw_pingpong *pp);
> +struct dpu_hw_pingpong *dpu_hw_pingpong_init(struct drm_device *dev,
> + const struct dpu_pingpong_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_PINGPONG_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
> index b364cf75bb3f..fb8ecfb9b922 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
> @@ -9,6 +9,7 @@
> #include "dpu_kms.h"
>
> #include <drm/drm_file.h>
> +#include <drm/drm_managed.h>
>
> #define DPU_FETCH_CONFIG_RESET_VALUE 0x00000087
>
> @@ -669,15 +670,17 @@ int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms,
> }
> #endif
>
> -struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
> - void __iomem *addr, const struct dpu_ubwc_cfg *ubwc)
> +struct dpu_hw_sspp *dpu_hw_sspp_init(struct drm_device *dev,
> + const struct dpu_sspp_cfg *cfg,
> + void __iomem *addr,
> + const struct dpu_ubwc_cfg *ubwc)
> {
> struct dpu_hw_sspp *hw_pipe;
>
> if (!addr || !ubwc)
> return ERR_PTR(-EINVAL);
>
> - hw_pipe = kzalloc(sizeof(*hw_pipe), GFP_KERNEL);
> + hw_pipe = drmm_kzalloc(dev, sizeof(*hw_pipe), GFP_KERNEL);
> if (!hw_pipe)
> return ERR_PTR(-ENOMEM);
>
> @@ -692,9 +695,3 @@ struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
>
> return hw_pipe;
> }
> -
> -void dpu_hw_sspp_destroy(struct dpu_hw_sspp *ctx)
> -{
> - kfree(ctx);
> -}
> -
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
> index 085f34bc6b88..5dd4f78d424c 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h
> @@ -331,12 +331,15 @@ struct dpu_kms;
> /**
> * dpu_hw_sspp_init() - Initializes the sspp hw driver object.
> * Should be called once before accessing every pipe.
> + * @dev: Corresponding device for devres management
> * @cfg: Pipe catalog entry for which driver object is required
> * @addr: Mapped register io address of MDP
> * @ubwc: UBWC configuration data
> */
> -struct dpu_hw_sspp *dpu_hw_sspp_init(const struct dpu_sspp_cfg *cfg,
> - void __iomem *addr, const struct dpu_ubwc_cfg *ubwc);
> +struct dpu_hw_sspp *dpu_hw_sspp_init(struct drm_device *dev,
> + const struct dpu_sspp_cfg *cfg,
> + void __iomem *addr,
> + const struct dpu_ubwc_cfg *ubwc);
>
> /**
> * dpu_hw_sspp_destroy(): Destroys SSPP driver context
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
> index ebc416400382..106540eee5f7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
> @@ -3,6 +3,8 @@
> * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved
> */
>
> +#include <drm/drm_managed.h>
> +
> #include "dpu_hw_mdss.h"
> #include "dpu_hwio.h"
> #include "dpu_hw_catalog.h"
> @@ -194,15 +196,16 @@ static void _setup_wb_ops(struct dpu_hw_wb_ops *ops,
> ops->bind_pingpong_blk = dpu_hw_wb_bind_pingpong_blk;
> }
>
> -struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
> - void __iomem *addr)
> +struct dpu_hw_wb *dpu_hw_wb_init(struct drm_device *dev,
> + const struct dpu_wb_cfg *cfg,
> + void __iomem *addr)
> {
> struct dpu_hw_wb *c;
>
> if (!addr)
> return ERR_PTR(-EINVAL);
>
> - c = kzalloc(sizeof(*c), GFP_KERNEL);
> + c = drmm_kzalloc(dev, sizeof(*c), GFP_KERNEL);
> if (!c)
> return ERR_PTR(-ENOMEM);
>
> @@ -216,8 +219,3 @@ struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
>
> return c;
> }
> -
> -void dpu_hw_wb_destroy(struct dpu_hw_wb *hw_wb)
> -{
> - kfree(hw_wb);
> -}
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
> index 2d7db2efa3d0..98d1129238cc 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h
> @@ -72,17 +72,13 @@ struct dpu_hw_wb {
>
> /**
> * dpu_hw_wb_init() - Initializes the writeback hw driver object.
> + * @dev: Corresponding device for devres management
> * @cfg: wb_path catalog entry for which driver object is required
> * @addr: mapped register io address of MDP
> * Return: Error code or allocated dpu_hw_wb context
> */
> -struct dpu_hw_wb *dpu_hw_wb_init(const struct dpu_wb_cfg *cfg,
> - void __iomem *addr);
> -
> -/**
> - * dpu_hw_wb_destroy(): Destroy writeback hw driver object.
> - * @hw_wb: Pointer to writeback hw driver object
> - */
> -void dpu_hw_wb_destroy(struct dpu_hw_wb *hw_wb);
> +struct dpu_hw_wb *dpu_hw_wb_init(struct drm_device *dev,
> + const struct dpu_wb_cfg *cfg,
> + void __iomem *addr);
>
> #endif /*_DPU_HW_WB_H */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index 48c3f8b6b88f..1e29de32b7c0 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -816,10 +816,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)
> dpu_kms->hw_vbif[i] = NULL;
> }
>
> - if (dpu_kms->rm_init)
> - dpu_rm_destroy(&dpu_kms->rm);
> - dpu_kms->rm_init = false;
> -
> dpu_kms->catalog = NULL;
>
> dpu_kms->hw_mdp = NULL;
> @@ -1041,14 +1037,12 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
> goto err_pm_put;
> }
>
> - rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
> + rc = dpu_rm_init(dev, &dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
> if (rc) {
> DPU_ERROR("rm init failed: %d\n", rc);
> goto err_pm_put;
> }
>
> - dpu_kms->rm_init = true;
> -
> dpu_kms->hw_mdp = dpu_hw_mdptop_init(dev,
> dpu_kms->catalog->mdp,
> dpu_kms->mmio,
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> index f3bdd4f11108..2af1767ada9d 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> @@ -87,7 +87,6 @@ struct dpu_kms {
> struct drm_private_obj global_state;
>
> struct dpu_rm rm;
> - bool rm_init;
>
> struct dpu_hw_vbif *hw_vbif[VBIF_MAX];
> struct dpu_hw_mdp *hw_mdp;
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> index e333f4eeafc1..d10025b8f659 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> @@ -34,72 +34,8 @@ struct dpu_rm_requirements {
> struct msm_display_topology topology;
> };
>
> -int dpu_rm_destroy(struct dpu_rm *rm)
> -{
> - int i;
> -
> - for (i = 0; i < ARRAY_SIZE(rm->dspp_blks); i++) {
> - struct dpu_hw_dspp *hw;
> -
> - if (rm->dspp_blks[i]) {
> - hw = to_dpu_hw_dspp(rm->dspp_blks[i]);
> - dpu_hw_dspp_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->pingpong_blks); i++) {
> - struct dpu_hw_pingpong *hw;
> -
> - if (rm->pingpong_blks[i]) {
> - hw = to_dpu_hw_pingpong(rm->pingpong_blks[i]);
> - dpu_hw_pingpong_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->merge_3d_blks); i++) {
> - struct dpu_hw_merge_3d *hw;
> -
> - if (rm->merge_3d_blks[i]) {
> - hw = to_dpu_hw_merge_3d(rm->merge_3d_blks[i]);
> - dpu_hw_merge_3d_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->mixer_blks); i++) {
> - struct dpu_hw_mixer *hw;
> -
> - if (rm->mixer_blks[i]) {
> - hw = to_dpu_hw_mixer(rm->mixer_blks[i]);
> - dpu_hw_lm_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->ctl_blks); i++) {
> - struct dpu_hw_ctl *hw;
> -
> - if (rm->ctl_blks[i]) {
> - hw = to_dpu_hw_ctl(rm->ctl_blks[i]);
> - dpu_hw_ctl_destroy(hw);
> - }
> - }
> - for (i = 0; i < ARRAY_SIZE(rm->hw_intf); i++)
> - dpu_hw_intf_destroy(rm->hw_intf[i]);
> -
> - for (i = 0; i < ARRAY_SIZE(rm->dsc_blks); i++) {
> - struct dpu_hw_dsc *hw;
> -
> - if (rm->dsc_blks[i]) {
> - hw = to_dpu_hw_dsc(rm->dsc_blks[i]);
> - dpu_hw_dsc_destroy(hw);
> - }
> - }
> -
> - for (i = 0; i < ARRAY_SIZE(rm->hw_wb); i++)
> - dpu_hw_wb_destroy(rm->hw_wb[i]);
> -
> - for (i = 0; i < ARRAY_SIZE(rm->hw_sspp); i++)
> - dpu_hw_sspp_destroy(rm->hw_sspp[i]);
> -
> - return 0;
> -}
> -
> -int dpu_rm_init(struct dpu_rm *rm,
> +int dpu_rm_init(struct drm_device *dev,
> + struct dpu_rm *rm,
> const struct dpu_mdss_cfg *cat,
> void __iomem *mmio)
> {
> @@ -118,7 +54,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_mixer *hw;
> const struct dpu_lm_cfg *lm = &cat->mixer[i];
>
> - hw = dpu_hw_lm_init(lm, mmio);
> + hw = dpu_hw_lm_init(dev, lm, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed lm object creation: err %d\n", rc);
> @@ -131,7 +67,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_merge_3d *hw;
> const struct dpu_merge_3d_cfg *merge_3d = &cat->merge_3d[i];
>
> - hw = dpu_hw_merge_3d_init(merge_3d, mmio);
> + hw = dpu_hw_merge_3d_init(dev, merge_3d, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed merge_3d object creation: err %d\n",
> @@ -145,7 +81,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_pingpong *hw;
> const struct dpu_pingpong_cfg *pp = &cat->pingpong[i];
>
> - hw = dpu_hw_pingpong_init(pp, mmio);
> + hw = dpu_hw_pingpong_init(dev, pp, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed pingpong object creation: err %d\n",
> @@ -161,7 +97,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_intf *hw;
> const struct dpu_intf_cfg *intf = &cat->intf[i];
>
> - hw = dpu_hw_intf_init(intf, mmio);
> + hw = dpu_hw_intf_init(dev, intf, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed intf object creation: err %d\n", rc);
> @@ -174,7 +110,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_wb *hw;
> const struct dpu_wb_cfg *wb = &cat->wb[i];
>
> - hw = dpu_hw_wb_init(wb, mmio);
> + hw = dpu_hw_wb_init(dev, wb, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed wb object creation: err %d\n", rc);
> @@ -187,7 +123,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_ctl *hw;
> const struct dpu_ctl_cfg *ctl = &cat->ctl[i];
>
> - hw = dpu_hw_ctl_init(ctl, mmio, cat->mixer_count, cat->mixer);
> + hw = dpu_hw_ctl_init(dev, ctl, mmio, cat->mixer_count, cat->mixer);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed ctl object creation: err %d\n", rc);
> @@ -200,7 +136,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_dspp *hw;
> const struct dpu_dspp_cfg *dspp = &cat->dspp[i];
>
> - hw = dpu_hw_dspp_init(dspp, mmio);
> + hw = dpu_hw_dspp_init(dev, dspp, mmio);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed dspp object creation: err %d\n", rc);
> @@ -214,9 +150,9 @@ int dpu_rm_init(struct dpu_rm *rm,
> const struct dpu_dsc_cfg *dsc = &cat->dsc[i];
>
> if (test_bit(DPU_DSC_HW_REV_1_2, &dsc->features))
> - hw = dpu_hw_dsc_init_1_2(dsc, mmio);
> + hw = dpu_hw_dsc_init_1_2(dev, dsc, mmio);
> else
> - hw = dpu_hw_dsc_init(dsc, mmio);
> + hw = dpu_hw_dsc_init(dev, dsc, mmio);
>
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> @@ -230,7 +166,7 @@ int dpu_rm_init(struct dpu_rm *rm,
> struct dpu_hw_sspp *hw;
> const struct dpu_sspp_cfg *sspp = &cat->sspp[i];
>
> - hw = dpu_hw_sspp_init(sspp, mmio, cat->ubwc);
> + hw = dpu_hw_sspp_init(dev, sspp, mmio, cat->ubwc);
> if (IS_ERR(hw)) {
> rc = PTR_ERR(hw);
> DPU_ERROR("failed sspp object creation: err %d\n", rc);
> @@ -242,8 +178,6 @@ int dpu_rm_init(struct dpu_rm *rm,
> return 0;
>
> fail:
> - dpu_rm_destroy(rm);
> -
> return rc ? rc : -EFAULT;
> }
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
> index d62c2edb2460..7199a09f3ce3 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
> @@ -38,22 +38,17 @@ struct dpu_rm {
> /**
> * dpu_rm_init - Read hardware catalog and create reservation tracking objects
> * for all HW blocks.
> + * @dev: Corresponding device for devres management
> * @rm: DPU Resource Manager handle
> * @cat: Pointer to hardware catalog
> * @mmio: mapped register io address of MDP
> * @Return: 0 on Success otherwise -ERROR
> */
> -int dpu_rm_init(struct dpu_rm *rm,
> +int dpu_rm_init(struct drm_device *dev,
> + struct dpu_rm *rm,
> const struct dpu_mdss_cfg *cat,
> void __iomem *mmio);
>
> -/**
> - * dpu_rm_destroy - Free all memory allocated by dpu_rm_init
> - * @rm: DPU Resource Manager handle
> - * @Return: 0 on Success otherwise -ERROR
> - */
> -int dpu_rm_destroy(struct dpu_rm *rm);
> -
> /**
> * dpu_rm_reserve - Given a CRTC->Encoder->Connector display chain, analyze
> * the use connections and user requirements, specified through related
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 09/13] drm/msm/dpu: use drmm-managed allocation for dpu_plane
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-29 0:49 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 0:49 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Change struct dpu_plane allocation to use drmm_universal_plane_alloc().
> This removes the need to perform any actions on plane destruction.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 46 +++++------------------
> 1 file changed, 10 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index f114efee1b57..9d9e1cbf0dd7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -1170,20 +1170,6 @@ static void dpu_plane_atomic_update(struct drm_plane *plane,
> }
> }
>
> -static void dpu_plane_destroy(struct drm_plane *plane)
> -{
> - struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
> -
> - DPU_DEBUG_PLANE(pdpu, "\n");
> -
> - if (pdpu) {
> - /* this will destroy the states as well */
> - drm_plane_cleanup(plane);
> -
> - kfree(pdpu);
> - }
> -}
> -
> static void dpu_plane_destroy_state(struct drm_plane *plane,
> struct drm_plane_state *state)
> {
> @@ -1353,7 +1339,6 @@ static bool dpu_plane_format_mod_supported(struct drm_plane *plane,
> static const struct drm_plane_funcs dpu_plane_funcs = {
> .update_plane = drm_atomic_helper_update_plane,
> .disable_plane = drm_atomic_helper_disable_plane,
> - .destroy = dpu_plane_destroy,
> .reset = dpu_plane_reset,
> .atomic_duplicate_state = dpu_plane_duplicate_state,
> .atomic_destroy_state = dpu_plane_destroy_state,
> @@ -1381,35 +1366,28 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> struct dpu_hw_sspp *pipe_hw;
> uint32_t num_formats;
> uint32_t supported_rotations;
> - int ret = -EINVAL;
> -
> - /* create and zero local structure */
> - pdpu = kzalloc(sizeof(*pdpu), GFP_KERNEL);
> - if (!pdpu) {
> - DPU_ERROR("[%u]failed to allocate local plane struct\n", pipe);
> - ret = -ENOMEM;
> - return ERR_PTR(ret);
> - }
> -
> - /* cache local stuff for later */
> - plane = &pdpu->base;
> - pdpu->pipe = pipe;
> + int ret;
>
> /* initialize underlying h/w driver */
> pipe_hw = dpu_rm_get_sspp(&kms->rm, pipe);
> if (!pipe_hw || !pipe_hw->cap || !pipe_hw->cap->sblk) {
> DPU_ERROR("[%u]SSPP is invalid\n", pipe);
> - goto clean_plane;
> + return ERR_PTR(-EINVAL);
> }
>
> format_list = pipe_hw->cap->sblk->format_list;
> num_formats = pipe_hw->cap->sblk->num_formats;
>
> - ret = drm_universal_plane_init(dev, plane, 0xff, &dpu_plane_funcs,
> + pdpu = drmm_universal_plane_alloc(dev, struct dpu_plane, base,
> + 0xff, &dpu_plane_funcs,
> format_list, num_formats,
> supported_format_modifiers, type, NULL);
> - if (ret)
> - goto clean_plane;
> + if (IS_ERR(pdpu))
> + return ERR_CAST(pdpu);
> +
> + /* cache local stuff for later */
> + plane = &pdpu->base;
> + pdpu->pipe = pipe;
>
> pdpu->catalog = kms->catalog;
>
> @@ -1439,8 +1417,4 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> DPU_DEBUG("%s created for pipe:%u id:%u\n", plane->name,
> pipe, plane->base.id);
> return plane;
> -
> -clean_plane:
> - kfree(pdpu);
> - return ERR_PTR(ret);
> }
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 09/13] drm/msm/dpu: use drmm-managed allocation for dpu_plane
@ 2023-07-29 0:49 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 0:49 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Change struct dpu_plane allocation to use drmm_universal_plane_alloc().
> This removes the need to perform any actions on plane destruction.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 46 +++++------------------
> 1 file changed, 10 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index f114efee1b57..9d9e1cbf0dd7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -1170,20 +1170,6 @@ static void dpu_plane_atomic_update(struct drm_plane *plane,
> }
> }
>
> -static void dpu_plane_destroy(struct drm_plane *plane)
> -{
> - struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
> -
> - DPU_DEBUG_PLANE(pdpu, "\n");
> -
> - if (pdpu) {
> - /* this will destroy the states as well */
> - drm_plane_cleanup(plane);
> -
> - kfree(pdpu);
> - }
> -}
> -
> static void dpu_plane_destroy_state(struct drm_plane *plane,
> struct drm_plane_state *state)
> {
> @@ -1353,7 +1339,6 @@ static bool dpu_plane_format_mod_supported(struct drm_plane *plane,
> static const struct drm_plane_funcs dpu_plane_funcs = {
> .update_plane = drm_atomic_helper_update_plane,
> .disable_plane = drm_atomic_helper_disable_plane,
> - .destroy = dpu_plane_destroy,
> .reset = dpu_plane_reset,
> .atomic_duplicate_state = dpu_plane_duplicate_state,
> .atomic_destroy_state = dpu_plane_destroy_state,
> @@ -1381,35 +1366,28 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> struct dpu_hw_sspp *pipe_hw;
> uint32_t num_formats;
> uint32_t supported_rotations;
> - int ret = -EINVAL;
> -
> - /* create and zero local structure */
> - pdpu = kzalloc(sizeof(*pdpu), GFP_KERNEL);
> - if (!pdpu) {
> - DPU_ERROR("[%u]failed to allocate local plane struct\n", pipe);
> - ret = -ENOMEM;
> - return ERR_PTR(ret);
> - }
> -
> - /* cache local stuff for later */
> - plane = &pdpu->base;
> - pdpu->pipe = pipe;
> + int ret;
>
> /* initialize underlying h/w driver */
> pipe_hw = dpu_rm_get_sspp(&kms->rm, pipe);
> if (!pipe_hw || !pipe_hw->cap || !pipe_hw->cap->sblk) {
> DPU_ERROR("[%u]SSPP is invalid\n", pipe);
> - goto clean_plane;
> + return ERR_PTR(-EINVAL);
> }
>
> format_list = pipe_hw->cap->sblk->format_list;
> num_formats = pipe_hw->cap->sblk->num_formats;
>
> - ret = drm_universal_plane_init(dev, plane, 0xff, &dpu_plane_funcs,
> + pdpu = drmm_universal_plane_alloc(dev, struct dpu_plane, base,
> + 0xff, &dpu_plane_funcs,
> format_list, num_formats,
> supported_format_modifiers, type, NULL);
> - if (ret)
> - goto clean_plane;
> + if (IS_ERR(pdpu))
> + return ERR_CAST(pdpu);
> +
> + /* cache local stuff for later */
> + plane = &pdpu->base;
> + pdpu->pipe = pipe;
>
> pdpu->catalog = kms->catalog;
>
> @@ -1439,8 +1417,4 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> DPU_DEBUG("%s created for pipe:%u id:%u\n", plane->name,
> pipe, plane->base.id);
> return plane;
> -
> -clean_plane:
> - kfree(pdpu);
> - return ERR_PTR(ret);
> }
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 10/13] drm/msm/dpu: use drmm-managed allocation for dpu_crtc
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-29 0:55 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 0:55 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Change struct dpu_crtc allocation to use drmm_crtc_alloc_with_planes().
> This removes the need to perform any actions on CRTC destruction.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 25 +++++++-----------------
> 1 file changed, 7 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index 214229d11e3e..a1fcb690c687 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -51,17 +51,6 @@ static struct dpu_kms *_dpu_crtc_get_kms(struct drm_crtc *crtc)
> return to_dpu_kms(priv->kms);
> }
>
> -static void dpu_crtc_destroy(struct drm_crtc *crtc)
> -{
> - struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
> -
> - if (!crtc)
> - return;
> -
> - drm_crtc_cleanup(crtc);
> - kfree(dpu_crtc);
> -}
> -
> static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc)
> {
> struct drm_device *dev = crtc->dev;
> @@ -1433,7 +1422,6 @@ static int dpu_crtc_late_register(struct drm_crtc *crtc)
>
> static const struct drm_crtc_funcs dpu_crtc_funcs = {
> .set_config = drm_atomic_helper_set_config,
> - .destroy = dpu_crtc_destroy,
> .page_flip = drm_atomic_helper_page_flip,
> .reset = dpu_crtc_reset,
> .atomic_duplicate_state = dpu_crtc_duplicate_state,
> @@ -1467,9 +1455,13 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
> struct dpu_crtc *dpu_crtc = NULL;
> int i, ret;
>
> - dpu_crtc = kzalloc(sizeof(*dpu_crtc), GFP_KERNEL);
> - if (!dpu_crtc)
> - return ERR_PTR(-ENOMEM);
> + dpu_crtc = drmm_crtc_alloc_with_planes(dev, struct dpu_crtc, base,
> + plane, cursor,
> + &dpu_crtc_funcs,
> + NULL);
> +
> + if (IS_ERR(dpu_crtc))
> + return ERR_CAST(dpu_crtc);
>
> crtc = &dpu_crtc->base;
> crtc->dev = dev;
> @@ -1489,9 +1481,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
> dpu_crtc_frame_event_work);
> }
>
> - drm_crtc_init_with_planes(dev, crtc, plane, cursor, &dpu_crtc_funcs,
> - NULL);
> -
> drm_crtc_helper_add(crtc, &dpu_crtc_helper_funcs);
>
> if (dpu_kms->catalog->dspp_count)
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 10/13] drm/msm/dpu: use drmm-managed allocation for dpu_crtc
@ 2023-07-29 0:55 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 0:55 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Change struct dpu_crtc allocation to use drmm_crtc_alloc_with_planes().
> This removes the need to perform any actions on CRTC destruction.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 25 +++++++-----------------
> 1 file changed, 7 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index 214229d11e3e..a1fcb690c687 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -51,17 +51,6 @@ static struct dpu_kms *_dpu_crtc_get_kms(struct drm_crtc *crtc)
> return to_dpu_kms(priv->kms);
> }
>
> -static void dpu_crtc_destroy(struct drm_crtc *crtc)
> -{
> - struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
> -
> - if (!crtc)
> - return;
> -
> - drm_crtc_cleanup(crtc);
> - kfree(dpu_crtc);
> -}
> -
> static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc)
> {
> struct drm_device *dev = crtc->dev;
> @@ -1433,7 +1422,6 @@ static int dpu_crtc_late_register(struct drm_crtc *crtc)
>
> static const struct drm_crtc_funcs dpu_crtc_funcs = {
> .set_config = drm_atomic_helper_set_config,
> - .destroy = dpu_crtc_destroy,
> .page_flip = drm_atomic_helper_page_flip,
> .reset = dpu_crtc_reset,
> .atomic_duplicate_state = dpu_crtc_duplicate_state,
> @@ -1467,9 +1455,13 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
> struct dpu_crtc *dpu_crtc = NULL;
> int i, ret;
>
> - dpu_crtc = kzalloc(sizeof(*dpu_crtc), GFP_KERNEL);
> - if (!dpu_crtc)
> - return ERR_PTR(-ENOMEM);
> + dpu_crtc = drmm_crtc_alloc_with_planes(dev, struct dpu_crtc, base,
> + plane, cursor,
> + &dpu_crtc_funcs,
> + NULL);
> +
> + if (IS_ERR(dpu_crtc))
> + return ERR_CAST(dpu_crtc);
>
> crtc = &dpu_crtc->base;
> crtc->dev = dev;
> @@ -1489,9 +1481,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
> dpu_crtc_frame_event_work);
> }
>
> - drm_crtc_init_with_planes(dev, crtc, plane, cursor, &dpu_crtc_funcs,
> - NULL);
> -
> drm_crtc_helper_add(crtc, &dpu_crtc_helper_funcs);
>
> if (dpu_kms->catalog->dspp_count)
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 11/13] drm/msm/dpu: use drmm-managed allocation for dpu_encoder_phys
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-29 1:08 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 1:08 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Change struct allocation of encoder's phys backend data to use
> drmm_kzalloc(). This removes the need to perform any actions on encoder
> destruction.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 9 ++++----
> .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 8 ++++---
> .../drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 15 ++++---------
> .../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 13 ++++--------
> .../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 21 ++++---------------
> 5 files changed, 22 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 493905a5b63a..7c2cd9ce8acd 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -2199,6 +2199,7 @@ static void dpu_encoder_early_unregister(struct drm_encoder *encoder)
> }
>
> static int dpu_encoder_virt_add_phys_encs(
> + struct drm_device *dev,
> struct msm_display_info *disp_info,
> struct dpu_encoder_virt *dpu_enc,
> struct dpu_enc_phys_init_params *params)
> @@ -2220,7 +2221,7 @@ static int dpu_encoder_virt_add_phys_encs(
>
>
> if (disp_info->intf_type == INTF_WB) {
> - enc = dpu_encoder_phys_wb_init(params);
> + enc = dpu_encoder_phys_wb_init(dev, params);
>
> if (IS_ERR(enc)) {
> DPU_ERROR_ENC(dpu_enc, "failed to init wb enc: %ld\n",
> @@ -2231,7 +2232,7 @@ static int dpu_encoder_virt_add_phys_encs(
> dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
> ++dpu_enc->num_phys_encs;
> } else if (disp_info->is_cmd_mode) {
> - enc = dpu_encoder_phys_cmd_init(params);
> + enc = dpu_encoder_phys_cmd_init(dev, params);
>
> if (IS_ERR(enc)) {
> DPU_ERROR_ENC(dpu_enc, "failed to init cmd enc: %ld\n",
> @@ -2242,7 +2243,7 @@ static int dpu_encoder_virt_add_phys_encs(
> dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
> ++dpu_enc->num_phys_encs;
> } else {
> - enc = dpu_encoder_phys_vid_init(params);
> + enc = dpu_encoder_phys_vid_init(dev, params);
>
> if (IS_ERR(enc)) {
> DPU_ERROR_ENC(dpu_enc, "failed to init vid enc: %ld\n",
> @@ -2333,7 +2334,7 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
> break;
> }
>
> - ret = dpu_encoder_virt_add_phys_encs(disp_info,
> + ret = dpu_encoder_virt_add_phys_encs(dpu_kms->dev, disp_info,
> dpu_enc, &phys_params);
> if (ret) {
> DPU_ERROR_ENC(dpu_enc, "failed to add phys encs\n");
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> index d48558ede488..4fb0d95f3061 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> @@ -281,22 +281,24 @@ struct dpu_encoder_wait_info {
> * @p: Pointer to init params structure
> * Return: Error code or newly allocated encoder
> */
> -struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_vid_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p);
>
> /**
> * dpu_encoder_phys_cmd_init - Construct a new command mode physical encoder
> + * @dev: Corresponding device for devres management
> * @p: Pointer to init params structure
> * Return: Error code or newly allocated encoder
> */
> -struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p);
>
> /**
> * dpu_encoder_phys_wb_init - initialize writeback encoder
> + * @dev: Corresponding device for devres management
> * @init: Pointer to init info structure with initialization params
> */
> -struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_wb_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p);
>
> /**
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> index b856c6286c85..2958b64e6e5e 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> @@ -13,6 +13,8 @@
> #include "dpu_trace.h"
> #include "disp/msm_disp_snapshot.h"
>
> +#include <drm/drm_managed.h>
> +
> #define DPU_DEBUG_CMDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
> (e) && (e)->base.parent ? \
> (e)->base.parent->base.id : -1, \
> @@ -563,14 +565,6 @@ static void dpu_encoder_phys_cmd_disable(struct dpu_encoder_phys *phys_enc)
> phys_enc->enable_state = DPU_ENC_DISABLED;
> }
>
> -static void dpu_encoder_phys_cmd_destroy(struct dpu_encoder_phys *phys_enc)
> -{
> - struct dpu_encoder_phys_cmd *cmd_enc =
> - to_dpu_encoder_phys_cmd(phys_enc);
> -
> - kfree(cmd_enc);
> -}
> -
> static void dpu_encoder_phys_cmd_prepare_for_kickoff(
> struct dpu_encoder_phys *phys_enc)
> {
> @@ -736,7 +730,6 @@ static void dpu_encoder_phys_cmd_init_ops(
> ops->atomic_mode_set = dpu_encoder_phys_cmd_atomic_mode_set;
> ops->enable = dpu_encoder_phys_cmd_enable;
> ops->disable = dpu_encoder_phys_cmd_disable;
> - ops->destroy = dpu_encoder_phys_cmd_destroy;
> ops->control_vblank_irq = dpu_encoder_phys_cmd_control_vblank_irq;
> ops->wait_for_commit_done = dpu_encoder_phys_cmd_wait_for_commit_done;
> ops->prepare_for_kickoff = dpu_encoder_phys_cmd_prepare_for_kickoff;
> @@ -751,7 +744,7 @@ static void dpu_encoder_phys_cmd_init_ops(
> ops->get_line_count = dpu_encoder_phys_cmd_get_line_count;
> }
>
> -struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p)
> {
> struct dpu_encoder_phys *phys_enc = NULL;
> @@ -759,7 +752,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
>
> DPU_DEBUG("intf\n");
>
> - cmd_enc = kzalloc(sizeof(*cmd_enc), GFP_KERNEL);
> + cmd_enc = drmm_kzalloc(dev, sizeof(*cmd_enc), GFP_KERNEL);
> if (!cmd_enc) {
> DPU_ERROR("failed to allocate\n");
> return ERR_PTR(-ENOMEM);
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> index 662d74ded1b9..bdfce4ccc0a7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> @@ -11,6 +11,8 @@
> #include "dpu_trace.h"
> #include "disp/msm_disp_snapshot.h"
>
> +#include <drm/drm_managed.h>
> +
> #define DPU_DEBUG_VIDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
> (e) && (e)->parent ? \
> (e)->parent->base.id : -1, \
> @@ -438,12 +440,6 @@ static void dpu_encoder_phys_vid_enable(struct dpu_encoder_phys *phys_enc)
> phys_enc->enable_state = DPU_ENC_ENABLING;
> }
>
> -static void dpu_encoder_phys_vid_destroy(struct dpu_encoder_phys *phys_enc)
> -{
> - DPU_DEBUG_VIDENC(phys_enc, "\n");
> - kfree(phys_enc);
> -}
> -
> static int dpu_encoder_phys_vid_wait_for_vblank(
> struct dpu_encoder_phys *phys_enc)
> {
> @@ -681,7 +677,6 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
> ops->atomic_mode_set = dpu_encoder_phys_vid_atomic_mode_set;
> ops->enable = dpu_encoder_phys_vid_enable;
> ops->disable = dpu_encoder_phys_vid_disable;
> - ops->destroy = dpu_encoder_phys_vid_destroy;
> ops->control_vblank_irq = dpu_encoder_phys_vid_control_vblank_irq;
> ops->wait_for_commit_done = dpu_encoder_phys_vid_wait_for_commit_done;
> ops->wait_for_vblank = dpu_encoder_phys_vid_wait_for_vblank;
> @@ -694,7 +689,7 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
> ops->get_frame_count = dpu_encoder_phys_vid_get_frame_count;
> }
>
> -struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_vid_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p)
> {
> struct dpu_encoder_phys *phys_enc = NULL;
> @@ -704,7 +699,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
> return ERR_PTR(-EINVAL);
> }
>
> - phys_enc = kzalloc(sizeof(*phys_enc), GFP_KERNEL);
> + phys_enc = drmm_kzalloc(dev, sizeof(*phys_enc), GFP_KERNEL);
> if (!phys_enc) {
> DPU_ERROR("failed to create encoder due to memory allocation error\n");
> return ERR_PTR(-ENOMEM);
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> index a466ff70a4d6..9a44a1575682 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> @@ -8,6 +8,7 @@
> #include <linux/debugfs.h>
>
> #include <drm/drm_framebuffer.h>
> +#include <drm/drm_managed.h>
>
> #include "dpu_encoder_phys.h"
> #include "dpu_formats.h"
> @@ -552,20 +553,6 @@ static void dpu_encoder_phys_wb_disable(struct dpu_encoder_phys *phys_enc)
> phys_enc->enable_state = DPU_ENC_DISABLED;
> }
>
> -/**
> - * dpu_encoder_phys_wb_destroy - destroy writeback encoder
> - * @phys_enc: Pointer to physical encoder
> - */
> -static void dpu_encoder_phys_wb_destroy(struct dpu_encoder_phys *phys_enc)
> -{
> - if (!phys_enc)
> - return;
> -
> - DPU_DEBUG("[wb:%d]\n", phys_enc->hw_wb->idx - WB_0);
> -
> - kfree(phys_enc);
> -}
> -
> static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc,
> struct drm_writeback_job *job)
> {
> @@ -661,7 +648,6 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
> ops->atomic_mode_set = dpu_encoder_phys_wb_atomic_mode_set;
> ops->enable = dpu_encoder_phys_wb_enable;
> ops->disable = dpu_encoder_phys_wb_disable;
> - ops->destroy = dpu_encoder_phys_wb_destroy;
> ops->atomic_check = dpu_encoder_phys_wb_atomic_check;
> ops->wait_for_commit_done = dpu_encoder_phys_wb_wait_for_commit_done;
> ops->prepare_for_kickoff = dpu_encoder_phys_wb_prepare_for_kickoff;
> @@ -677,9 +663,10 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
>
> /**
> * dpu_encoder_phys_wb_init - initialize writeback encoder
> + * @dev: Corresponding device for devres management
> * @p: Pointer to init info structure with initialization params
> */
> -struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_wb_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p)
> {
> struct dpu_encoder_phys *phys_enc = NULL;
> @@ -692,7 +679,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
> return ERR_PTR(-EINVAL);
> }
>
> - wb_enc = kzalloc(sizeof(*wb_enc), GFP_KERNEL);
> + wb_enc = drmm_kzalloc(dev, sizeof(*wb_enc), GFP_KERNEL);
> if (!wb_enc) {
> DPU_ERROR("failed to allocate wb phys_enc enc\n");
> return ERR_PTR(-ENOMEM);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 11/13] drm/msm/dpu: use drmm-managed allocation for dpu_encoder_phys
@ 2023-07-29 1:08 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 1:08 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Change struct allocation of encoder's phys backend data to use
> drmm_kzalloc(). This removes the need to perform any actions on encoder
> destruction.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 9 ++++----
> .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 8 ++++---
> .../drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 15 ++++---------
> .../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 13 ++++--------
> .../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 21 ++++---------------
> 5 files changed, 22 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 493905a5b63a..7c2cd9ce8acd 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -2199,6 +2199,7 @@ static void dpu_encoder_early_unregister(struct drm_encoder *encoder)
> }
>
> static int dpu_encoder_virt_add_phys_encs(
> + struct drm_device *dev,
> struct msm_display_info *disp_info,
> struct dpu_encoder_virt *dpu_enc,
> struct dpu_enc_phys_init_params *params)
> @@ -2220,7 +2221,7 @@ static int dpu_encoder_virt_add_phys_encs(
>
>
> if (disp_info->intf_type == INTF_WB) {
> - enc = dpu_encoder_phys_wb_init(params);
> + enc = dpu_encoder_phys_wb_init(dev, params);
>
> if (IS_ERR(enc)) {
> DPU_ERROR_ENC(dpu_enc, "failed to init wb enc: %ld\n",
> @@ -2231,7 +2232,7 @@ static int dpu_encoder_virt_add_phys_encs(
> dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
> ++dpu_enc->num_phys_encs;
> } else if (disp_info->is_cmd_mode) {
> - enc = dpu_encoder_phys_cmd_init(params);
> + enc = dpu_encoder_phys_cmd_init(dev, params);
>
> if (IS_ERR(enc)) {
> DPU_ERROR_ENC(dpu_enc, "failed to init cmd enc: %ld\n",
> @@ -2242,7 +2243,7 @@ static int dpu_encoder_virt_add_phys_encs(
> dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
> ++dpu_enc->num_phys_encs;
> } else {
> - enc = dpu_encoder_phys_vid_init(params);
> + enc = dpu_encoder_phys_vid_init(dev, params);
>
> if (IS_ERR(enc)) {
> DPU_ERROR_ENC(dpu_enc, "failed to init vid enc: %ld\n",
> @@ -2333,7 +2334,7 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
> break;
> }
>
> - ret = dpu_encoder_virt_add_phys_encs(disp_info,
> + ret = dpu_encoder_virt_add_phys_encs(dpu_kms->dev, disp_info,
> dpu_enc, &phys_params);
> if (ret) {
> DPU_ERROR_ENC(dpu_enc, "failed to add phys encs\n");
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> index d48558ede488..4fb0d95f3061 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> @@ -281,22 +281,24 @@ struct dpu_encoder_wait_info {
> * @p: Pointer to init params structure
> * Return: Error code or newly allocated encoder
> */
> -struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_vid_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p);
>
> /**
> * dpu_encoder_phys_cmd_init - Construct a new command mode physical encoder
> + * @dev: Corresponding device for devres management
> * @p: Pointer to init params structure
> * Return: Error code or newly allocated encoder
> */
> -struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p);
>
> /**
> * dpu_encoder_phys_wb_init - initialize writeback encoder
> + * @dev: Corresponding device for devres management
> * @init: Pointer to init info structure with initialization params
> */
> -struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_wb_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p);
>
> /**
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> index b856c6286c85..2958b64e6e5e 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
> @@ -13,6 +13,8 @@
> #include "dpu_trace.h"
> #include "disp/msm_disp_snapshot.h"
>
> +#include <drm/drm_managed.h>
> +
> #define DPU_DEBUG_CMDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
> (e) && (e)->base.parent ? \
> (e)->base.parent->base.id : -1, \
> @@ -563,14 +565,6 @@ static void dpu_encoder_phys_cmd_disable(struct dpu_encoder_phys *phys_enc)
> phys_enc->enable_state = DPU_ENC_DISABLED;
> }
>
> -static void dpu_encoder_phys_cmd_destroy(struct dpu_encoder_phys *phys_enc)
> -{
> - struct dpu_encoder_phys_cmd *cmd_enc =
> - to_dpu_encoder_phys_cmd(phys_enc);
> -
> - kfree(cmd_enc);
> -}
> -
> static void dpu_encoder_phys_cmd_prepare_for_kickoff(
> struct dpu_encoder_phys *phys_enc)
> {
> @@ -736,7 +730,6 @@ static void dpu_encoder_phys_cmd_init_ops(
> ops->atomic_mode_set = dpu_encoder_phys_cmd_atomic_mode_set;
> ops->enable = dpu_encoder_phys_cmd_enable;
> ops->disable = dpu_encoder_phys_cmd_disable;
> - ops->destroy = dpu_encoder_phys_cmd_destroy;
> ops->control_vblank_irq = dpu_encoder_phys_cmd_control_vblank_irq;
> ops->wait_for_commit_done = dpu_encoder_phys_cmd_wait_for_commit_done;
> ops->prepare_for_kickoff = dpu_encoder_phys_cmd_prepare_for_kickoff;
> @@ -751,7 +744,7 @@ static void dpu_encoder_phys_cmd_init_ops(
> ops->get_line_count = dpu_encoder_phys_cmd_get_line_count;
> }
>
> -struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p)
> {
> struct dpu_encoder_phys *phys_enc = NULL;
> @@ -759,7 +752,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
>
> DPU_DEBUG("intf\n");
>
> - cmd_enc = kzalloc(sizeof(*cmd_enc), GFP_KERNEL);
> + cmd_enc = drmm_kzalloc(dev, sizeof(*cmd_enc), GFP_KERNEL);
> if (!cmd_enc) {
> DPU_ERROR("failed to allocate\n");
> return ERR_PTR(-ENOMEM);
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> index 662d74ded1b9..bdfce4ccc0a7 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
> @@ -11,6 +11,8 @@
> #include "dpu_trace.h"
> #include "disp/msm_disp_snapshot.h"
>
> +#include <drm/drm_managed.h>
> +
> #define DPU_DEBUG_VIDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
> (e) && (e)->parent ? \
> (e)->parent->base.id : -1, \
> @@ -438,12 +440,6 @@ static void dpu_encoder_phys_vid_enable(struct dpu_encoder_phys *phys_enc)
> phys_enc->enable_state = DPU_ENC_ENABLING;
> }
>
> -static void dpu_encoder_phys_vid_destroy(struct dpu_encoder_phys *phys_enc)
> -{
> - DPU_DEBUG_VIDENC(phys_enc, "\n");
> - kfree(phys_enc);
> -}
> -
> static int dpu_encoder_phys_vid_wait_for_vblank(
> struct dpu_encoder_phys *phys_enc)
> {
> @@ -681,7 +677,6 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
> ops->atomic_mode_set = dpu_encoder_phys_vid_atomic_mode_set;
> ops->enable = dpu_encoder_phys_vid_enable;
> ops->disable = dpu_encoder_phys_vid_disable;
> - ops->destroy = dpu_encoder_phys_vid_destroy;
> ops->control_vblank_irq = dpu_encoder_phys_vid_control_vblank_irq;
> ops->wait_for_commit_done = dpu_encoder_phys_vid_wait_for_commit_done;
> ops->wait_for_vblank = dpu_encoder_phys_vid_wait_for_vblank;
> @@ -694,7 +689,7 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
> ops->get_frame_count = dpu_encoder_phys_vid_get_frame_count;
> }
>
> -struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_vid_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p)
> {
> struct dpu_encoder_phys *phys_enc = NULL;
> @@ -704,7 +699,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
> return ERR_PTR(-EINVAL);
> }
>
> - phys_enc = kzalloc(sizeof(*phys_enc), GFP_KERNEL);
> + phys_enc = drmm_kzalloc(dev, sizeof(*phys_enc), GFP_KERNEL);
> if (!phys_enc) {
> DPU_ERROR("failed to create encoder due to memory allocation error\n");
> return ERR_PTR(-ENOMEM);
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> index a466ff70a4d6..9a44a1575682 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> @@ -8,6 +8,7 @@
> #include <linux/debugfs.h>
>
> #include <drm/drm_framebuffer.h>
> +#include <drm/drm_managed.h>
>
> #include "dpu_encoder_phys.h"
> #include "dpu_formats.h"
> @@ -552,20 +553,6 @@ static void dpu_encoder_phys_wb_disable(struct dpu_encoder_phys *phys_enc)
> phys_enc->enable_state = DPU_ENC_DISABLED;
> }
>
> -/**
> - * dpu_encoder_phys_wb_destroy - destroy writeback encoder
> - * @phys_enc: Pointer to physical encoder
> - */
> -static void dpu_encoder_phys_wb_destroy(struct dpu_encoder_phys *phys_enc)
> -{
> - if (!phys_enc)
> - return;
> -
> - DPU_DEBUG("[wb:%d]\n", phys_enc->hw_wb->idx - WB_0);
> -
> - kfree(phys_enc);
> -}
> -
> static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc,
> struct drm_writeback_job *job)
> {
> @@ -661,7 +648,6 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
> ops->atomic_mode_set = dpu_encoder_phys_wb_atomic_mode_set;
> ops->enable = dpu_encoder_phys_wb_enable;
> ops->disable = dpu_encoder_phys_wb_disable;
> - ops->destroy = dpu_encoder_phys_wb_destroy;
> ops->atomic_check = dpu_encoder_phys_wb_atomic_check;
> ops->wait_for_commit_done = dpu_encoder_phys_wb_wait_for_commit_done;
> ops->prepare_for_kickoff = dpu_encoder_phys_wb_prepare_for_kickoff;
> @@ -677,9 +663,10 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
>
> /**
> * dpu_encoder_phys_wb_init - initialize writeback encoder
> + * @dev: Corresponding device for devres management
> * @p: Pointer to init info structure with initialization params
> */
> -struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
> +struct dpu_encoder_phys *dpu_encoder_phys_wb_init(struct drm_device *dev,
> struct dpu_enc_phys_init_params *p)
> {
> struct dpu_encoder_phys *phys_enc = NULL;
> @@ -692,7 +679,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
> return ERR_PTR(-EINVAL);
> }
>
> - wb_enc = kzalloc(sizeof(*wb_enc), GFP_KERNEL);
> + wb_enc = drmm_kzalloc(dev, sizeof(*wb_enc), GFP_KERNEL);
> if (!wb_enc) {
> DPU_ERROR("failed to allocate wb phys_enc enc\n");
> return ERR_PTR(-ENOMEM);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 07/13] drm/msm/dpu: drop unused dpu_plane::lock
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-29 1:10 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 1:10 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> The field dpu_plane::lock was never used for protecting any kind of
> data. Drop it now.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 6 ------
> 1 file changed, 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index c2aaaded07ed..aba5185e1d66 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -78,8 +78,6 @@ static const uint32_t qcom_compressed_supported_formats[] = {
> struct dpu_plane {
> struct drm_plane base;
>
> - struct mutex lock;
> -
> enum dpu_sspp pipe;
>
> uint32_t color_fill;
> @@ -1186,8 +1184,6 @@ static void dpu_plane_destroy(struct drm_plane *plane)
> if (pstate->r_pipe.sspp)
> _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false);
>
> - mutex_destroy(&pdpu->lock);
> -
> /* this will destroy the states as well */
> drm_plane_cleanup(plane);
>
> @@ -1447,8 +1443,6 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> /* success! finalize initialization */
> drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
>
> - mutex_init(&pdpu->lock);
> -
> DPU_DEBUG("%s created for pipe:%u id:%u\n", plane->name,
> pipe, plane->base.id);
> return plane;
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 07/13] drm/msm/dpu: drop unused dpu_plane::lock
@ 2023-07-29 1:10 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 1:10 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> The field dpu_plane::lock was never used for protecting any kind of
> data. Drop it now.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 6 ------
> 1 file changed, 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index c2aaaded07ed..aba5185e1d66 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -78,8 +78,6 @@ static const uint32_t qcom_compressed_supported_formats[] = {
> struct dpu_plane {
> struct drm_plane base;
>
> - struct mutex lock;
> -
> enum dpu_sspp pipe;
>
> uint32_t color_fill;
> @@ -1186,8 +1184,6 @@ static void dpu_plane_destroy(struct drm_plane *plane)
> if (pstate->r_pipe.sspp)
> _dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false);
>
> - mutex_destroy(&pdpu->lock);
> -
> /* this will destroy the states as well */
> drm_plane_cleanup(plane);
>
> @@ -1447,8 +1443,6 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
> /* success! finalize initialization */
> drm_plane_helper_add(plane, &dpu_plane_helper_funcs);
>
> - mutex_init(&pdpu->lock);
> -
> DPU_DEBUG("%s created for pipe:%u id:%u\n", plane->name,
> pipe, plane->base.id);
> return plane;
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 12/13] drm/msm/dpu: drop dpu_encoder_phys_ops::destroy
2023-07-07 23:12 ` Dmitry Baryshkov
@ 2023-07-29 1:11 ` Jessica Zhang
-1 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 1:11 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Drop the dpu_encoder_phys_ops' destroy() callback. No phys backend
> implements it anymore, so it is useless.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 18 ------------------
> .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 2 --
> 2 files changed, 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 7c2cd9ce8acd..b42176ce4a3a 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -456,24 +456,6 @@ static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
> dpu_enc = to_dpu_encoder_virt(drm_enc);
> DPU_DEBUG_ENC(dpu_enc, "\n");
>
> - mutex_lock(&dpu_enc->enc_lock);
> -
> - for (i = 0; i < dpu_enc->num_phys_encs; i++) {
> - struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
> -
> - if (phys->ops.destroy) {
> - phys->ops.destroy(phys);
> - --dpu_enc->num_phys_encs;
> - dpu_enc->phys_encs[i] = NULL;
> - }
> - }
> -
> - if (dpu_enc->num_phys_encs)
> - DPU_ERROR_ENC(dpu_enc, "expected 0 num_phys_encs not %d\n",
> - dpu_enc->num_phys_encs);
> - dpu_enc->num_phys_encs = 0;
> - mutex_unlock(&dpu_enc->enc_lock);
> -
> drm_encoder_cleanup(drm_enc);
> mutex_destroy(&dpu_enc->enc_lock);
> }
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> index 4fb0d95f3061..757ce58f958b 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> @@ -72,7 +72,6 @@ struct dpu_encoder_phys;
> * @enable: DRM Call. Enable a DRM mode.
> * @disable: DRM Call. Disable mode.
> * @atomic_check: DRM Call. Atomic check new DRM state.
> - * @destroy: DRM Call. Destroy and release resources.
> * @control_vblank_irq Register/Deregister for VBLANK IRQ
> * @wait_for_commit_done: Wait for hardware to have flushed the
> * current pending frames to hardware
> @@ -102,7 +101,6 @@ struct dpu_encoder_phys_ops {
> int (*atomic_check)(struct dpu_encoder_phys *encoder,
> struct drm_crtc_state *crtc_state,
> struct drm_connector_state *conn_state);
> - void (*destroy)(struct dpu_encoder_phys *encoder);
> int (*control_vblank_irq)(struct dpu_encoder_phys *enc, bool enable);
> int (*wait_for_commit_done)(struct dpu_encoder_phys *phys_enc);
> int (*wait_for_tx_complete)(struct dpu_encoder_phys *phys_enc);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 12/13] drm/msm/dpu: drop dpu_encoder_phys_ops::destroy
@ 2023-07-29 1:11 ` Jessica Zhang
0 siblings, 0 replies; 52+ messages in thread
From: Jessica Zhang @ 2023-07-29 1:11 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel, Stephen Boyd
On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
> Drop the dpu_encoder_phys_ops' destroy() callback. No phys backend
> implements it anymore, so it is useless.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 18 ------------------
> .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 2 --
> 2 files changed, 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 7c2cd9ce8acd..b42176ce4a3a 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -456,24 +456,6 @@ static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
> dpu_enc = to_dpu_encoder_virt(drm_enc);
> DPU_DEBUG_ENC(dpu_enc, "\n");
>
> - mutex_lock(&dpu_enc->enc_lock);
> -
> - for (i = 0; i < dpu_enc->num_phys_encs; i++) {
> - struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
> -
> - if (phys->ops.destroy) {
> - phys->ops.destroy(phys);
> - --dpu_enc->num_phys_encs;
> - dpu_enc->phys_encs[i] = NULL;
> - }
> - }
> -
> - if (dpu_enc->num_phys_encs)
> - DPU_ERROR_ENC(dpu_enc, "expected 0 num_phys_encs not %d\n",
> - dpu_enc->num_phys_encs);
> - dpu_enc->num_phys_encs = 0;
> - mutex_unlock(&dpu_enc->enc_lock);
> -
> drm_encoder_cleanup(drm_enc);
> mutex_destroy(&dpu_enc->enc_lock);
> }
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> index 4fb0d95f3061..757ce58f958b 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> @@ -72,7 +72,6 @@ struct dpu_encoder_phys;
> * @enable: DRM Call. Enable a DRM mode.
> * @disable: DRM Call. Disable mode.
> * @atomic_check: DRM Call. Atomic check new DRM state.
> - * @destroy: DRM Call. Destroy and release resources.
> * @control_vblank_irq Register/Deregister for VBLANK IRQ
> * @wait_for_commit_done: Wait for hardware to have flushed the
> * current pending frames to hardware
> @@ -102,7 +101,6 @@ struct dpu_encoder_phys_ops {
> int (*atomic_check)(struct dpu_encoder_phys *encoder,
> struct drm_crtc_state *crtc_state,
> struct drm_connector_state *conn_state);
> - void (*destroy)(struct dpu_encoder_phys *encoder);
> int (*control_vblank_irq)(struct dpu_encoder_phys *enc, bool enable);
> int (*wait_for_commit_done)(struct dpu_encoder_phys *phys_enc);
> int (*wait_for_tx_complete)(struct dpu_encoder_phys *phys_enc);
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 01/13] drm/msm/dpu: cleanup dpu_kms_hw_init error path
2023-07-14 21:43 ` Jessica Zhang
@ 2023-07-30 1:15 ` Dmitry Baryshkov
-1 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-30 1:15 UTC (permalink / raw)
To: Jessica Zhang, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: Stephen Boyd, David Airlie, Daniel Vetter, Bjorn Andersson,
linux-arm-msm, dri-devel, freedreno, Konrad Dybcio
On 15/07/2023 00:43, Jessica Zhang wrote:
>
>
> On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
>> It was noticed that dpu_kms_hw_init()'s error path contains several
>> labels which point to the same code path. Replace all of them with a
>> single label.
>>
>> Suggested-by: Konrad Dybcio <konrad.dybcio@linaro.org>
>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>> ---
>> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 21 +++++++++------------
>> 1 file changed, 9 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> index c11b3ab572ab..e7ac02e92f42 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> @@ -1037,7 +1037,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> if (!dpu_kms->catalog) {
>> DPU_ERROR("device config not known!\n");
>> rc = -EINVAL;
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> /*
>> @@ -1047,13 +1047,13 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = _dpu_kms_mmu_init(dpu_kms);
>> if (rc) {
>> DPU_ERROR("dpu_kms_mmu_init failed: %d\n", rc);
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
>> if (rc) {
>> DPU_ERROR("rm init failed: %d\n", rc);
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> dpu_kms->rm_init = true;
>> @@ -1065,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = PTR_ERR(dpu_kms->hw_mdp);
>> DPU_ERROR("failed to get hw_mdp: %d\n", rc);
>> dpu_kms->hw_mdp = NULL;
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> for (i = 0; i < dpu_kms->catalog->vbif_count; i++) {
>> @@ -1076,7 +1076,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> if (IS_ERR(hw)) {
>> rc = PTR_ERR(hw);
>> DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> dpu_kms->hw_vbif[vbif->id] = hw;
>> @@ -1092,7 +1092,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = dpu_core_perf_init(&dpu_kms->perf, dpu_kms->catalog->perf,
>> max_core_clk_rate);
>> if (rc) {
>> DPU_ERROR("failed to init perf %d\n", rc);
>> - goto perf_err;
>> + goto err_pm_put;
>> }
>> dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio,
>> dpu_kms->catalog);
>> @@ -1100,7 +1100,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = PTR_ERR(dpu_kms->hw_intr);
>> DPU_ERROR("hw_intr init failed: %d\n", rc);
>> dpu_kms->hw_intr = NULL;
>> - goto hw_intr_init_err;
>> + goto err_pm_put;
>> }
>> dev->mode_config.min_width = 0;
>> @@ -1125,7 +1125,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = _dpu_kms_drm_obj_init(dpu_kms);
>> if (rc) {
>> DPU_ERROR("modeset init failed: %d\n", rc);
>> - goto drm_obj_init_err;
>> + goto err_pm_put;
>> }
>> dpu_vbif_init_memtypes(dpu_kms);
>> @@ -1134,10 +1134,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> return 0;
>> -drm_obj_init_err:
>
> Hey Dmitry,
>
> The change itself LGTM -- however, it seems that there's a dependency on
> the core perf cleanup series that wasn't listed in the cover letter.
Yes. And unfortunately a dependency on
https://patchwork.freedesktop.org/series/105392/
>
> Thanks,
>
> Jessica Zhang
>
>> -hw_intr_init_err:
>> -perf_err:
>> -power_error:
>> +err_pm_put:
>> pm_runtime_put_sync(&dpu_kms->pdev->dev);
>> error:
>> _dpu_kms_hw_destroy(dpu_kms);
>> --
>> 2.39.2
>>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 01/13] drm/msm/dpu: cleanup dpu_kms_hw_init error path
@ 2023-07-30 1:15 ` Dmitry Baryshkov
0 siblings, 0 replies; 52+ messages in thread
From: Dmitry Baryshkov @ 2023-07-30 1:15 UTC (permalink / raw)
To: Jessica Zhang, Rob Clark, Sean Paul, Abhinav Kumar, Marijn Suijten
Cc: freedreno, linux-arm-msm, Bjorn Andersson, dri-devel,
Stephen Boyd, Konrad Dybcio
On 15/07/2023 00:43, Jessica Zhang wrote:
>
>
> On 7/7/2023 4:12 PM, Dmitry Baryshkov wrote:
>> It was noticed that dpu_kms_hw_init()'s error path contains several
>> labels which point to the same code path. Replace all of them with a
>> single label.
>>
>> Suggested-by: Konrad Dybcio <konrad.dybcio@linaro.org>
>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>> ---
>> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 21 +++++++++------------
>> 1 file changed, 9 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> index c11b3ab572ab..e7ac02e92f42 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> @@ -1037,7 +1037,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> if (!dpu_kms->catalog) {
>> DPU_ERROR("device config not known!\n");
>> rc = -EINVAL;
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> /*
>> @@ -1047,13 +1047,13 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = _dpu_kms_mmu_init(dpu_kms);
>> if (rc) {
>> DPU_ERROR("dpu_kms_mmu_init failed: %d\n", rc);
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> rc = dpu_rm_init(&dpu_kms->rm, dpu_kms->catalog, dpu_kms->mmio);
>> if (rc) {
>> DPU_ERROR("rm init failed: %d\n", rc);
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> dpu_kms->rm_init = true;
>> @@ -1065,7 +1065,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = PTR_ERR(dpu_kms->hw_mdp);
>> DPU_ERROR("failed to get hw_mdp: %d\n", rc);
>> dpu_kms->hw_mdp = NULL;
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> for (i = 0; i < dpu_kms->catalog->vbif_count; i++) {
>> @@ -1076,7 +1076,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> if (IS_ERR(hw)) {
>> rc = PTR_ERR(hw);
>> DPU_ERROR("failed to init vbif %d: %d\n", vbif->id, rc);
>> - goto power_error;
>> + goto err_pm_put;
>> }
>> dpu_kms->hw_vbif[vbif->id] = hw;
>> @@ -1092,7 +1092,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = dpu_core_perf_init(&dpu_kms->perf, dpu_kms->catalog->perf,
>> max_core_clk_rate);
>> if (rc) {
>> DPU_ERROR("failed to init perf %d\n", rc);
>> - goto perf_err;
>> + goto err_pm_put;
>> }
>> dpu_kms->hw_intr = dpu_hw_intr_init(dpu_kms->mmio,
>> dpu_kms->catalog);
>> @@ -1100,7 +1100,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = PTR_ERR(dpu_kms->hw_intr);
>> DPU_ERROR("hw_intr init failed: %d\n", rc);
>> dpu_kms->hw_intr = NULL;
>> - goto hw_intr_init_err;
>> + goto err_pm_put;
>> }
>> dev->mode_config.min_width = 0;
>> @@ -1125,7 +1125,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> rc = _dpu_kms_drm_obj_init(dpu_kms);
>> if (rc) {
>> DPU_ERROR("modeset init failed: %d\n", rc);
>> - goto drm_obj_init_err;
>> + goto err_pm_put;
>> }
>> dpu_vbif_init_memtypes(dpu_kms);
>> @@ -1134,10 +1134,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>> return 0;
>> -drm_obj_init_err:
>
> Hey Dmitry,
>
> The change itself LGTM -- however, it seems that there's a dependency on
> the core perf cleanup series that wasn't listed in the cover letter.
Yes. And unfortunately a dependency on
https://patchwork.freedesktop.org/series/105392/
>
> Thanks,
>
> Jessica Zhang
>
>> -hw_intr_init_err:
>> -perf_err:
>> -power_error:
>> +err_pm_put:
>> pm_runtime_put_sync(&dpu_kms->pdev->dev);
>> error:
>> _dpu_kms_hw_destroy(dpu_kms);
>> --
>> 2.39.2
>>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 52+ messages in thread
end of thread, other threads:[~2023-07-30 1:15 UTC | newest]
Thread overview: 52+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-07 23:12 [PATCH v2 00/13] drm/msm/dpu: use managed memory allocations Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-07 23:12 ` [PATCH v2 01/13] drm/msm/dpu: cleanup dpu_kms_hw_init error path Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-14 21:43 ` Jessica Zhang
2023-07-14 21:43 ` Jessica Zhang
2023-07-30 1:15 ` Dmitry Baryshkov
2023-07-30 1:15 ` Dmitry Baryshkov
2023-07-07 23:12 ` [PATCH v2 02/13] drm/msm/dpu: remove IS_ERR_OR_NULL for dpu_hw_intr_init() error handling Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-18 22:00 ` Jessica Zhang
2023-07-18 22:00 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 03/13] drm/msm/dpu: use devres-managed allocation for interrupts data Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-19 0:26 ` Jessica Zhang
2023-07-19 0:26 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 04/13] drm/msm/dpu: use devres-managed allocation for VBIF data Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-19 1:03 ` Jessica Zhang
2023-07-19 1:03 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 05/13] drm/msm/dpu: use devres-managed allocation for MDP TOP Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-15 0:55 ` Jessica Zhang
2023-07-15 0:55 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 06/13] drm/msm/dpu: use devres-managed allocation for HW blocks Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-29 0:28 ` Jessica Zhang
2023-07-29 0:28 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 07/13] drm/msm/dpu: drop unused dpu_plane::lock Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-29 1:10 ` Jessica Zhang
2023-07-29 1:10 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 08/13] drm/msm/dpu: remove QoS teardown on plane destruction Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-07 23:12 ` [PATCH v2 09/13] drm/msm/dpu: use drmm-managed allocation for dpu_plane Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-29 0:49 ` Jessica Zhang
2023-07-29 0:49 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 10/13] drm/msm/dpu: use drmm-managed allocation for dpu_crtc Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-29 0:55 ` Jessica Zhang
2023-07-29 0:55 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 11/13] drm/msm/dpu: use drmm-managed allocation for dpu_encoder_phys Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-29 1:08 ` Jessica Zhang
2023-07-29 1:08 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 12/13] drm/msm/dpu: drop dpu_encoder_phys_ops::destroy Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
2023-07-29 1:11 ` Jessica Zhang
2023-07-29 1:11 ` Jessica Zhang
2023-07-07 23:12 ` [PATCH v2 13/13] drm/msm/dpu: use drmm-managed allocation for dpu_encoder_virt Dmitry Baryshkov
2023-07-07 23:12 ` Dmitry Baryshkov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.