msm: vidc: enabling dynamic session context for different targets

Adding support to enable dynamic maximum no of instances for
video sessions based on the different platforms.

Change-Id: I16b92cc8cc740809042947590dcd73dcf4801f96
Signed-off-by: Sayantan Majumder <smajumde@codeaurora.org>
This commit is contained in:
Sayantan Majumder 2021-06-17 00:52:55 +05:30 • committed by Gerrit - the friendly Code Review server
commit 6ac9be10aa
7 changed files with 51 additions and 34 deletions

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*/
#include <linux/module.h>
@ -492,6 +492,12 @@ static int msm_vidc_probe_vidc_device(struct platform_device *pdev)
core->id = MSM_VIDC_CORE_VENUS;
vidc_driver->ctxt = kcalloc(core->platform_data->max_inst_count,
sizeof(*vidc_driver->ctxt), GFP_KERNEL);
if (!vidc_driver->ctxt)
goto err_vidc_context;
vidc_driver->num_ctxt = core->platform_data->max_inst_count;
rc = v4l2_device_register(&pdev->dev, &core->v4l2_dev);
if (rc) {
d_vpr_e("Failed to register v4l2 device\n");
@ -588,6 +594,8 @@ err_enc:
err_dec:
v4l2_device_unregister(&core->v4l2_dev);
err_v4l2_register:
kfree(vidc_driver->ctxt);
err_vidc_context:
sysfs_remove_group(&pdev->dev.kobj, &msm_vidc_core_attr_group);
err_core_init:
dev_set_drvdata(&pdev->dev, NULL);
@ -660,6 +668,7 @@ static int msm_vidc_remove(struct platform_device *pdev)
mutex_destroy(&core->resources.cb_lock);
mutex_destroy(&core->lock);
kfree(core);
kfree(vidc_driver->ctxt);
return rc;
}

View file

@ -3014,7 +3014,6 @@ static int msm_comm_init_core(struct msm_vidc_inst *inst)
core->state = VIDC_CORE_INIT;
core->smmu_fault_handled = false;
core->trigger_ssr = false;
core->resources.max_inst_count = MAX_SUPPORTED_INSTANCES;
core->resources.max_secure_inst_count =
core->resources.max_secure_inst_count ?
core->resources.max_secure_inst_count :

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*/
#define CREATE_TRACE_POINTS
@ -31,8 +31,6 @@ int msm_vidc_vpp_delay;
atomic_read(&__binfo->ref_count) >= 2 ? "video driver" : "firmware";\
})
struct log_cookie ctxt[MAX_SUPPORTED_INSTANCES];
struct core_inst_pair {
struct msm_vidc_core *core;
struct msm_vidc_inst *inst;
@ -614,16 +612,16 @@ int get_sid(u32 *sid, u32 session_type)
{
int i;
for (i = 0; i < MAX_SUPPORTED_INSTANCES; i++) {
if (!ctxt[i].used) {
ctxt[i].used = 1;
for (i = 0; i < vidc_driver->num_ctxt; i++) {
if (!vidc_driver->ctxt[i].used) {
vidc_driver->ctxt[i].used = 1;
*sid = i+1;
update_log_ctxt(*sid, session_type, 0);
break;
}
}
return (i == MAX_SUPPORTED_INSTANCES);
return (i == vidc_driver->num_ctxt);
}
inline void update_log_ctxt(u32 sid, u32 session_type, u32 fourcc)
@ -632,7 +630,7 @@ inline void update_log_ctxt(u32 sid, u32 session_type, u32 fourcc)
char type;
u32 s_type = 0;
if (!sid || sid > MAX_SUPPORTED_INSTANCES) {
if (!sid || sid > vidc_driver->num_ctxt) {
d_vpr_e("%s: invalid sid %#x\n",
__func__, sid);
}
@ -679,11 +677,11 @@ inline void update_log_ctxt(u32 sid, u32 session_type, u32 fourcc)
break;
}
ctxt[sid-1].session_type = s_type;
ctxt[sid-1].codec_type = fourcc;
memcpy(&ctxt[sid-1].name, codec, 4);
ctxt[sid-1].name[4] = type;
ctxt[sid-1].name[5] = '\0';
vidc_driver->ctxt[sid-1].session_type = s_type;
vidc_driver->ctxt[sid-1].codec_type = fourcc;
memcpy(&vidc_driver->ctxt[sid-1].name, codec, 4);
vidc_driver->ctxt[sid-1].name[4] = type;
vidc_driver->ctxt[sid-1].name[5] = '\0';
}
/* Mock all the missing parts for successful compilation starts here */

View file

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*/
#ifndef __MSM_VIDC_DEBUG__
@ -92,13 +92,6 @@ enum vidc_err_recovery_disable {
VIDC_DISABLE_NON_NOC_ERR_RECOV = 0x0002
};
struct log_cookie {
u32 used;
u32 session_type;
u32 codec_type;
char name[20];
};
extern int msm_vidc_debug;
extern int msm_vidc_fw_debug_mode;
extern bool msm_vidc_fw_coverage;
@ -109,7 +102,6 @@ extern bool msm_vidc_lossless_encode;
extern bool msm_vidc_cvp_usage;
extern int msm_vidc_err_recovery_disable;
extern int msm_vidc_vpp_delay;
extern struct log_cookie ctxt[MAX_SUPPORTED_INSTANCES];
#define dprintk(__level, sid, __fmt, ...) \
do { \
@ -237,10 +229,10 @@ static inline bool is_print_allowed(u32 sid, u32 level)
if (!((msm_vidc_debug >> 8) & 0xF))
return true;
if (!sid || sid > MAX_SUPPORTED_INSTANCES)
if (!sid || sid > vidc_driver->num_ctxt)
return true;
if (ctxt[sid-1].session_type & msm_vidc_debug)
if (vidc_driver->ctxt[sid-1].session_type & msm_vidc_debug)
return true;
return false;
@ -248,21 +240,21 @@ static inline bool is_print_allowed(u32 sid, u32 level)
static inline char *get_codec_name(u32 sid)
{
if (!sid || sid > MAX_SUPPORTED_INSTANCES)
if (!sid || sid > vidc_driver->num_ctxt)
return ".....";
return ctxt[sid-1].name;
return vidc_driver->ctxt[sid-1].name;
}
static inline void put_sid(u32 sid)
{
if (!sid || sid > MAX_SUPPORTED_INSTANCES) {
if (!sid || sid > vidc_driver->num_ctxt) {
d_vpr_e("%s: invalid sid %#x\n",
__func__, sid);
return;
}
if (ctxt[sid-1].used)
ctxt[sid-1].used = 0;
if (vidc_driver->ctxt[sid-1].used)
vidc_driver->ctxt[sid-1].used = 0;
}
static inline void tic(struct msm_vidc_inst *i, enum profiling_points p,

View file

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*/
#ifndef _MSM_VIDC_INTERNAL_H_
@ -39,6 +39,7 @@
#define MAX_NUM_OUTPUT_BUFFERS VIDEO_MAX_FRAME // same as VB2_MAX_FRAME
#define MAX_SUPPORTED_INSTANCES 16
#define MAX_SUPPORTED_INSTANCES_24 24
#define MAX_BSE_VPP_DELAY 6
#define DEFAULT_BSE_VPP_DELAY 2
@ -310,6 +311,7 @@ struct msm_vidc_platform_data {
uint32_t vpu_ver;
uint32_t num_vpp_pipes;
struct msm_vidc_ubwc_config_data *ubwc_config;
uint32_t max_inst_count;
};
struct msm_vidc_format_desc {
@ -336,6 +338,13 @@ struct msm_vidc_format_constraint {
u32 uv_buffer_alignment;
};
struct log_cookie {
u32 used;
u32 session_type;
u32 codec_type;
char name[20];
};
struct msm_vidc_drv {
struct mutex lock;
struct list_head cores;
@ -343,6 +352,8 @@ struct msm_vidc_drv {
struct dentry *debugfs_root;
int thermal_level;
u32 sku_version;
struct log_cookie *ctxt;
u32 num_ctxt;
};
struct msm_video_device {

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
*/
#include <linux/module.h>
@ -2012,6 +2012,7 @@ static struct msm_vidc_platform_data default_data = {
.vpu_ver = VPU_VERSION_IRIS2,
.num_vpp_pipes = 0x4,
.ubwc_config = 0x0,
.max_inst_count = MAX_SUPPORTED_INSTANCES,
};
static struct msm_vidc_platform_data lahaina_data = {
@ -2036,6 +2037,7 @@ static struct msm_vidc_platform_data lahaina_data = {
.codec_caps_count = ARRAY_SIZE(lahaina_capabilities),
.vpss_caps = vpss_capabilities,
.vpss_caps_count = ARRAY_SIZE(vpss_capabilities),
.max_inst_count = MAX_SUPPORTED_INSTANCES,
};
static struct msm_vidc_platform_data yupik_data = {
@ -2060,6 +2062,7 @@ static struct msm_vidc_platform_data yupik_data = {
.codec_caps_count = ARRAY_SIZE(yupik_capabilities_v0),
.vpss_caps = vpss_capabilities,
.vpss_caps_count = ARRAY_SIZE(vpss_capabilities),
.max_inst_count = MAX_SUPPORTED_INSTANCES,
};
static struct msm_vidc_platform_data bengal_data = {
@ -2084,6 +2087,7 @@ static struct msm_vidc_platform_data bengal_data = {
.codec_caps_count = ARRAY_SIZE(bengal_capabilities_v0),
.vpss_caps = NULL,
.vpss_caps_count = 0,
.max_inst_count = MAX_SUPPORTED_INSTANCES,
};
static struct msm_vidc_platform_data shima_data = {
@ -2108,6 +2112,7 @@ static struct msm_vidc_platform_data shima_data = {
.codec_caps_count = ARRAY_SIZE(shima_capabilities_v0),
.vpss_caps = vpss_capabilities,
.vpss_caps_count = ARRAY_SIZE(vpss_capabilities),
.max_inst_count = MAX_SUPPORTED_INSTANCES,
};
static struct msm_vidc_platform_data holi_data = {
@ -2132,6 +2137,7 @@ static struct msm_vidc_platform_data holi_data = {
.codec_caps_count = ARRAY_SIZE(holi_capabilities),
.vpss_caps = NULL,
.vpss_caps_count = 0,
.max_inst_count = MAX_SUPPORTED_INSTANCES,
};
static const struct of_device_id msm_vidc_dt_device[] = {
@ -2329,6 +2335,7 @@ void *vidc_get_drv_data(struct device *dev)
ARRAY_SIZE(yupik_capabilities_v1);
}
msm_vidc_ddr_ubwc_config(driver_data, 0xe);
driver_data->max_inst_count = MAX_SUPPORTED_INSTANCES_24;
}
exit:
return driver_data;

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*/
#include <linux/iommu.h>
@ -822,6 +822,7 @@ int read_platform_resources_from_drv_data(
res->vpu_ver = platform_data->vpu_ver;
res->ubwc_config = platform_data->ubwc_config;
res->max_inst_count = platform_data->max_inst_count;
return rc;