mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-13 16:16:15 -04:00
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:
parent
9f18b35929
commit
6ac9be10aa
7 changed files with 51 additions and 34 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 :
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue