mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-07 09:55:19 +02:00
drm/msm/dpu: use drmm-managed allocation for dpu_encoder_phys
[ Upstream commit73169b45e1
] Change struct allocation of encoder's phys backend data to use drmm_kzalloc(). This removes the need to perform any actions on encoder destruction. Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/570051/ Link: https://lore.kernel.org/r/20231201211845.1026967-12-dmitry.baryshkov@linaro.org Stable-dep-of:aedf02e46e
("drm/msm/dpu: move dpu_encoder's connector assignment to atomic_enable()") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
4a2798cc24
commit
e86721b0d0
|
@ -2172,6 +2172,7 @@ static void dpu_encoder_early_unregister(struct drm_encoder *encoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dpu_encoder_virt_add_phys_encs(
|
static int dpu_encoder_virt_add_phys_encs(
|
||||||
|
struct drm_device *dev,
|
||||||
struct msm_display_info *disp_info,
|
struct msm_display_info *disp_info,
|
||||||
struct dpu_encoder_virt *dpu_enc,
|
struct dpu_encoder_virt *dpu_enc,
|
||||||
struct dpu_enc_phys_init_params *params)
|
struct dpu_enc_phys_init_params *params)
|
||||||
|
@ -2193,7 +2194,7 @@ static int dpu_encoder_virt_add_phys_encs(
|
||||||
|
|
||||||
|
|
||||||
if (disp_info->intf_type == INTF_WB) {
|
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)) {
|
if (IS_ERR(enc)) {
|
||||||
DPU_ERROR_ENC(dpu_enc, "failed to init wb enc: %ld\n",
|
DPU_ERROR_ENC(dpu_enc, "failed to init wb enc: %ld\n",
|
||||||
|
@ -2204,7 +2205,7 @@ static int dpu_encoder_virt_add_phys_encs(
|
||||||
dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
|
dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
|
||||||
++dpu_enc->num_phys_encs;
|
++dpu_enc->num_phys_encs;
|
||||||
} else if (disp_info->is_cmd_mode) {
|
} 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)) {
|
if (IS_ERR(enc)) {
|
||||||
DPU_ERROR_ENC(dpu_enc, "failed to init cmd enc: %ld\n",
|
DPU_ERROR_ENC(dpu_enc, "failed to init cmd enc: %ld\n",
|
||||||
|
@ -2215,7 +2216,7 @@ static int dpu_encoder_virt_add_phys_encs(
|
||||||
dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
|
dpu_enc->phys_encs[dpu_enc->num_phys_encs] = enc;
|
||||||
++dpu_enc->num_phys_encs;
|
++dpu_enc->num_phys_encs;
|
||||||
} else {
|
} else {
|
||||||
enc = dpu_encoder_phys_vid_init(params);
|
enc = dpu_encoder_phys_vid_init(dev, params);
|
||||||
|
|
||||||
if (IS_ERR(enc)) {
|
if (IS_ERR(enc)) {
|
||||||
DPU_ERROR_ENC(dpu_enc, "failed to init vid enc: %ld\n",
|
DPU_ERROR_ENC(dpu_enc, "failed to init vid enc: %ld\n",
|
||||||
|
@ -2304,7 +2305,7 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
|
||||||
break;
|
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);
|
dpu_enc, &phys_params);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DPU_ERROR_ENC(dpu_enc, "failed to add phys encs\n");
|
DPU_ERROR_ENC(dpu_enc, "failed to add phys encs\n");
|
||||||
|
|
|
@ -281,22 +281,24 @@ struct dpu_encoder_wait_info {
|
||||||
* @p: Pointer to init params structure
|
* @p: Pointer to init params structure
|
||||||
* Return: Error code or newly allocated encoder
|
* 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);
|
struct dpu_enc_phys_init_params *p);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dpu_encoder_phys_cmd_init - Construct a new command mode physical encoder
|
* dpu_encoder_phys_cmd_init - Construct a new command mode physical encoder
|
||||||
|
* @dev: Corresponding device for devres management
|
||||||
* @p: Pointer to init params structure
|
* @p: Pointer to init params structure
|
||||||
* Return: Error code or newly allocated encoder
|
* 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);
|
struct dpu_enc_phys_init_params *p);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dpu_encoder_phys_wb_init - initialize writeback encoder
|
* dpu_encoder_phys_wb_init - initialize writeback encoder
|
||||||
|
* @dev: Corresponding device for devres management
|
||||||
* @init: Pointer to init info structure with initialization params
|
* @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);
|
struct dpu_enc_phys_init_params *p);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
#include "dpu_trace.h"
|
#include "dpu_trace.h"
|
||||||
#include "disp/msm_disp_snapshot.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, \
|
#define DPU_DEBUG_CMDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
|
||||||
(e) && (e)->base.parent ? \
|
(e) && (e)->base.parent ? \
|
||||||
(e)->base.parent->base.id : -1, \
|
(e)->base.parent->base.id : -1, \
|
||||||
|
@ -564,14 +566,6 @@ static void dpu_encoder_phys_cmd_disable(struct dpu_encoder_phys *phys_enc)
|
||||||
phys_enc->enable_state = DPU_ENC_DISABLED;
|
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(
|
static void dpu_encoder_phys_cmd_prepare_for_kickoff(
|
||||||
struct dpu_encoder_phys *phys_enc)
|
struct dpu_encoder_phys *phys_enc)
|
||||||
{
|
{
|
||||||
|
@ -737,7 +731,6 @@ static void dpu_encoder_phys_cmd_init_ops(
|
||||||
ops->atomic_mode_set = dpu_encoder_phys_cmd_atomic_mode_set;
|
ops->atomic_mode_set = dpu_encoder_phys_cmd_atomic_mode_set;
|
||||||
ops->enable = dpu_encoder_phys_cmd_enable;
|
ops->enable = dpu_encoder_phys_cmd_enable;
|
||||||
ops->disable = dpu_encoder_phys_cmd_disable;
|
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->control_vblank_irq = dpu_encoder_phys_cmd_control_vblank_irq;
|
||||||
ops->wait_for_commit_done = dpu_encoder_phys_cmd_wait_for_commit_done;
|
ops->wait_for_commit_done = dpu_encoder_phys_cmd_wait_for_commit_done;
|
||||||
ops->prepare_for_kickoff = dpu_encoder_phys_cmd_prepare_for_kickoff;
|
ops->prepare_for_kickoff = dpu_encoder_phys_cmd_prepare_for_kickoff;
|
||||||
|
@ -752,7 +745,7 @@ static void dpu_encoder_phys_cmd_init_ops(
|
||||||
ops->get_line_count = dpu_encoder_phys_cmd_get_line_count;
|
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_enc_phys_init_params *p)
|
||||||
{
|
{
|
||||||
struct dpu_encoder_phys *phys_enc = NULL;
|
struct dpu_encoder_phys *phys_enc = NULL;
|
||||||
|
@ -760,7 +753,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
|
||||||
|
|
||||||
DPU_DEBUG("intf\n");
|
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) {
|
if (!cmd_enc) {
|
||||||
DPU_ERROR("failed to allocate\n");
|
DPU_ERROR("failed to allocate\n");
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
#include "dpu_trace.h"
|
#include "dpu_trace.h"
|
||||||
#include "disp/msm_disp_snapshot.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, \
|
#define DPU_DEBUG_VIDENC(e, fmt, ...) DPU_DEBUG("enc%d intf%d " fmt, \
|
||||||
(e) && (e)->parent ? \
|
(e) && (e)->parent ? \
|
||||||
(e)->parent->base.id : -1, \
|
(e)->parent->base.id : -1, \
|
||||||
|
@ -441,12 +443,6 @@ skip_flush:
|
||||||
phys_enc->enable_state = DPU_ENC_ENABLING;
|
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(
|
static int dpu_encoder_phys_vid_wait_for_vblank(
|
||||||
struct dpu_encoder_phys *phys_enc)
|
struct dpu_encoder_phys *phys_enc)
|
||||||
{
|
{
|
||||||
|
@ -684,7 +680,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->atomic_mode_set = dpu_encoder_phys_vid_atomic_mode_set;
|
||||||
ops->enable = dpu_encoder_phys_vid_enable;
|
ops->enable = dpu_encoder_phys_vid_enable;
|
||||||
ops->disable = dpu_encoder_phys_vid_disable;
|
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->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_commit_done = dpu_encoder_phys_vid_wait_for_commit_done;
|
||||||
ops->wait_for_vblank = dpu_encoder_phys_vid_wait_for_vblank;
|
ops->wait_for_vblank = dpu_encoder_phys_vid_wait_for_vblank;
|
||||||
|
@ -697,7 +692,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;
|
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_enc_phys_init_params *p)
|
||||||
{
|
{
|
||||||
struct dpu_encoder_phys *phys_enc = NULL;
|
struct dpu_encoder_phys *phys_enc = NULL;
|
||||||
|
@ -707,7 +702,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
|
||||||
return ERR_PTR(-EINVAL);
|
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) {
|
if (!phys_enc) {
|
||||||
DPU_ERROR("failed to create encoder due to memory allocation error\n");
|
DPU_ERROR("failed to create encoder due to memory allocation error\n");
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
|
|
||||||
#include <drm/drm_framebuffer.h>
|
#include <drm/drm_framebuffer.h>
|
||||||
|
#include <drm/drm_managed.h>
|
||||||
|
|
||||||
#include "dpu_encoder_phys.h"
|
#include "dpu_encoder_phys.h"
|
||||||
#include "dpu_formats.h"
|
#include "dpu_formats.h"
|
||||||
|
@ -546,20 +547,6 @@ static void dpu_encoder_phys_wb_disable(struct dpu_encoder_phys *phys_enc)
|
||||||
phys_enc->enable_state = DPU_ENC_DISABLED;
|
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,
|
static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc,
|
||||||
struct drm_writeback_job *job)
|
struct drm_writeback_job *job)
|
||||||
{
|
{
|
||||||
|
@ -655,7 +642,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->atomic_mode_set = dpu_encoder_phys_wb_atomic_mode_set;
|
||||||
ops->enable = dpu_encoder_phys_wb_enable;
|
ops->enable = dpu_encoder_phys_wb_enable;
|
||||||
ops->disable = dpu_encoder_phys_wb_disable;
|
ops->disable = dpu_encoder_phys_wb_disable;
|
||||||
ops->destroy = dpu_encoder_phys_wb_destroy;
|
|
||||||
ops->atomic_check = dpu_encoder_phys_wb_atomic_check;
|
ops->atomic_check = dpu_encoder_phys_wb_atomic_check;
|
||||||
ops->wait_for_commit_done = dpu_encoder_phys_wb_wait_for_commit_done;
|
ops->wait_for_commit_done = dpu_encoder_phys_wb_wait_for_commit_done;
|
||||||
ops->prepare_for_kickoff = dpu_encoder_phys_wb_prepare_for_kickoff;
|
ops->prepare_for_kickoff = dpu_encoder_phys_wb_prepare_for_kickoff;
|
||||||
|
@ -671,9 +657,10 @@ static void dpu_encoder_phys_wb_init_ops(struct dpu_encoder_phys_ops *ops)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dpu_encoder_phys_wb_init - initialize writeback encoder
|
* dpu_encoder_phys_wb_init - initialize writeback encoder
|
||||||
|
* @dev: Corresponding device for devres management
|
||||||
* @p: Pointer to init info structure with initialization params
|
* @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_enc_phys_init_params *p)
|
||||||
{
|
{
|
||||||
struct dpu_encoder_phys *phys_enc = NULL;
|
struct dpu_encoder_phys *phys_enc = NULL;
|
||||||
|
@ -686,7 +673,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
|
||||||
return ERR_PTR(-EINVAL);
|
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) {
|
if (!wb_enc) {
|
||||||
DPU_ERROR("failed to allocate wb phys_enc enc\n");
|
DPU_ERROR("failed to allocate wb phys_enc enc\n");
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user