msm: vidc: Introduce device specific code for video driver
Update vidc driver to make platform driver rather than dtsi
centric driver.
By doing this, we can simplify and enhance codec specific data
processing and remove redundant code.
CRs-Fixed: 2062045
Change-Id: I3c42405854d750110d501461f9897ef90e9120d0
Signed-off-by: Praneeth Paladugu <ppaladug@codeaurora.org>
diff --git a/drivers/media/platform/msm/vidc/Makefile b/drivers/media/platform/msm/vidc/Makefile
index 7bad081..e33eaa8 100644
--- a/drivers/media/platform/msm/vidc/Makefile
+++ b/drivers/media/platform/msm/vidc/Makefile
@@ -1,6 +1,7 @@
ccflags-y += -I$(srctree)/drivers/media/platform/msm/vidc/
msm-vidc-objs := msm_v4l2_vidc.o \
+ msm_vidc_platform.o \
msm_vidc_common.o \
msm_vidc.o \
msm_vdec.o \
diff --git a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
index 5c34f28..895d862 100644
--- a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c
@@ -36,7 +36,6 @@
struct msm_vidc_drv *vidc_driver;
-uint32_t msm_vidc_pwr_collapse_delay = 3000;
static inline struct msm_vidc_inst *get_vidc_inst(struct file *filp, void *fh)
{
@@ -315,6 +314,7 @@
core->resources.pdev = pdev;
if (pdev->dev.of_node) {
/* Target supports DT, parse from it */
+ rc = read_platform_resources_from_drv_data(core);
rc = read_platform_resources_from_dt(&core->resources);
} else {
dprintk(VIDC_ERR, "pdev node is NULL\n");
@@ -375,13 +375,18 @@
{
unsigned long val = 0;
int rc = 0;
+ struct msm_vidc_core *core = NULL;
rc = kstrtoul(buf, 0, &val);
if (rc)
return rc;
else if (!val)
return -EINVAL;
- msm_vidc_pwr_collapse_delay = val;
+
+ core = get_vidc_core(MSM_VIDC_CORE_VENUS);
+ if (!core)
+ return -EINVAL;
+ core->resources.msm_vidc_pwr_collapse_delay = val;
return count;
}
@@ -389,7 +394,14 @@
struct device_attribute *attr,
char *buf)
{
- return snprintf(buf, PAGE_SIZE, "%u\n", msm_vidc_pwr_collapse_delay);
+ struct msm_vidc_core *core = NULL;
+
+ core = get_vidc_core(MSM_VIDC_CORE_VENUS);
+ if (!core)
+ return -EINVAL;
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ core->resources.msm_vidc_pwr_collapse_delay);
}
static DEVICE_ATTR(pwr_collapse_delay, 0644, show_pwr_collapse_delay,
@@ -481,6 +493,7 @@
goto err_no_mem;
}
+ core->platform_data = vidc_get_drv_data(&pdev->dev);
dev_set_drvdata(&pdev->dev, core);
rc = msm_vidc_initialize_core(pdev, core);
if (rc) {
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_clocks.c b/drivers/media/platform/msm/vidc/msm_vidc_clocks.c
index 05af186..9d5981b 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_clocks.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_clocks.c
@@ -537,73 +537,31 @@
return true;
}
-static bool msm_dcvs_check_codec_supported(int fourcc,
- unsigned long codecs_supported, enum session_type type)
-{
- int codec_bit, session_type_bit;
- bool codec_type, session_type;
- unsigned long session;
-
- session = VIDC_VOTE_DATA_SESSION_VAL(get_hal_codec(fourcc),
- get_hal_domain(type));
-
- if (!codecs_supported || !session)
- return false;
-
- /* ffs returns a 1 indexed, test_bit takes a 0 indexed...index */
- codec_bit = ffs(session) - 1;
- session_type_bit = codec_bit + 1;
-
- codec_type =
- test_bit(codec_bit, &codecs_supported) ==
- test_bit(codec_bit, &session);
- session_type =
- test_bit(session_type_bit, &codecs_supported) ==
- test_bit(session_type_bit, &session);
-
- return codec_type && session_type;
-}
-
int msm_comm_init_clocks_and_bus_data(struct msm_vidc_inst *inst)
{
int rc = 0, j = 0;
- struct clock_freq_table *clk_freq_tbl = NULL;
- struct clock_profile_entry *entry = NULL;
- int fourcc;
+ int fourcc, count;
if (!inst || !inst->core) {
dprintk(VIDC_ERR, "%s Invalid args: Inst = %pK\n",
- __func__, inst);
+ __func__, inst);
return -EINVAL;
}
-
- clk_freq_tbl = &inst->core->resources.clock_freq_tbl;
+ count = inst->core->resources.codec_data_count;
fourcc = inst->session_type == MSM_VIDC_DECODER ?
inst->fmts[OUTPUT_PORT].fourcc :
inst->fmts[CAPTURE_PORT].fourcc;
- for (j = 0; j < clk_freq_tbl->count; j++) {
- bool matched = false;
-
- entry = &clk_freq_tbl->clk_prof_entries[j];
-
- matched = msm_dcvs_check_codec_supported(
- fourcc,
- entry->codec_mask,
- inst->session_type);
-
- if (matched) {
- inst->clk_data.entry = entry;
+ for (j = 0; j < count; j++) {
+ if (inst->core->resources.codec_data[j].session_type ==
+ inst->session_type &&
+ inst->core->resources.codec_data[j].fourcc ==
+ fourcc) {
+ inst->clk_data.entry =
+ &inst->core->resources.codec_data[j];
break;
}
}
-
- if (j == clk_freq_tbl->count) {
- dprintk(VIDC_ERR,
- "Failed : No matching clock entry found\n");
- rc = -EINVAL;
- }
-
return rc;
}
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index fe61e6f..f808116 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -1162,7 +1162,8 @@
hdev = (struct hfi_device *)(inst->core->device);
rc = wait_for_completion_timeout(
&inst->completions[SESSION_MSG_INDEX(cmd)],
- msecs_to_jiffies(msm_vidc_hw_rsp_timeout));
+ msecs_to_jiffies(
+ inst->core->resources.msm_vidc_hw_rsp_timeout));
if (!rc) {
dprintk(VIDC_ERR, "Wait interrupted or timed out: %d\n",
SESSION_MSG_INDEX(cmd));
@@ -2647,7 +2648,8 @@
}
rc = wait_for_completion_timeout(
&inst->completions[abort_completion],
- msecs_to_jiffies(msm_vidc_hw_rsp_timeout));
+ msecs_to_jiffies(
+ inst->core->resources.msm_vidc_hw_rsp_timeout));
if (!rc) {
dprintk(VIDC_ERR,
"%s: Wait interrupted or timed out [%pK]: %d\n",
@@ -2739,7 +2741,7 @@
hdev = (struct hfi_device *)core->device;
rc = wait_for_completion_timeout(
&core->completions[SYS_MSG_INDEX(HAL_SYS_INIT_DONE)],
- msecs_to_jiffies(msm_vidc_hw_rsp_timeout));
+ msecs_to_jiffies(core->resources.msm_vidc_hw_rsp_timeout));
if (!rc) {
dprintk(VIDC_ERR, "%s: Wait interrupted or timed out: %d\n",
__func__, SYS_MSG_INDEX(HAL_SYS_INIT_DONE));
@@ -2878,11 +2880,12 @@
*/
schedule_delayed_work(&core->fw_unload_work,
msecs_to_jiffies(core->state == VIDC_CORE_INVALID ?
- 0 : msm_vidc_firmware_unload_delay));
+ 0 :
+ core->resources.msm_vidc_firmware_unload_delay));
dprintk(VIDC_DBG, "firmware unload delayed by %u ms\n",
core->state == VIDC_CORE_INVALID ?
- 0 : msm_vidc_firmware_unload_delay);
+ 0 : core->resources.msm_vidc_firmware_unload_delay);
}
core_already_uninited:
@@ -4257,7 +4260,8 @@
rc = wait_for_completion_timeout(&inst->completions[
SESSION_MSG_INDEX(HAL_SESSION_PROPERTY_INFO)],
- msecs_to_jiffies(msm_vidc_hw_rsp_timeout));
+ msecs_to_jiffies(
+ inst->core->resources.msm_vidc_hw_rsp_timeout));
if (!rc) {
dprintk(VIDC_ERR,
"%s: Wait interrupted or timed out [%pK]: %d\n",
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.c b/drivers/media/platform/msm/vidc/msm_vidc_debug.c
index c197776..3b1d08d 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_debug.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.c
@@ -25,10 +25,8 @@
int msm_vidc_fw_debug = 0x18;
int msm_vidc_fw_debug_mode = 1;
int msm_vidc_fw_low_power_mode = 1;
-int msm_vidc_hw_rsp_timeout = 2000;
bool msm_vidc_fw_coverage = !true;
bool msm_vidc_sys_idle_indicator = !true;
-int msm_vidc_firmware_unload_delay = 15000;
bool msm_vidc_thermal_mitigation_disabled = !true;
bool msm_vidc_clock_scaling = true;
bool msm_vidc_debug_timeout = !true;
@@ -204,11 +202,8 @@
__debugfs_create(u32, "fw_low_power_mode",
&msm_vidc_fw_low_power_mode) &&
__debugfs_create(u32, "debug_output", &msm_vidc_debug_out) &&
- __debugfs_create(u32, "hw_rsp_timeout", &msm_vidc_hw_rsp_timeout) &&
__debugfs_create(bool, "sys_idle_indicator",
&msm_vidc_sys_idle_indicator) &&
- __debugfs_create(u32, "firmware_unload_delay",
- &msm_vidc_firmware_unload_delay) &&
__debugfs_create(bool, "disable_thermal_mitigation",
&msm_vidc_thermal_mitigation_disabled) &&
__debugfs_create(bool, "clock_scaling",
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.h b/drivers/media/platform/msm/vidc/msm_vidc_debug.h
index f4c851a..9a798b5 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_debug.h
+++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.h
@@ -57,10 +57,8 @@
extern int msm_vidc_fw_debug;
extern int msm_vidc_fw_debug_mode;
extern int msm_vidc_fw_low_power_mode;
-extern int msm_vidc_hw_rsp_timeout;
extern bool msm_vidc_fw_coverage;
extern bool msm_vidc_sys_idle_indicator;
-extern int msm_vidc_firmware_unload_delay;
extern bool msm_vidc_thermal_mitigation_disabled;
extern bool msm_vidc_clock_scaling;
extern bool msm_vidc_debug_timeout;
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_internal.h b/drivers/media/platform/msm/vidc/msm_vidc_internal.h
index 5edd3d5..32c048d 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_internal.h
+++ b/drivers/media/platform/msm/vidc/msm_vidc_internal.h
@@ -152,6 +152,26 @@
enum buffer_owner buffer_ownership;
};
+struct msm_vidc_common_data {
+ char key[128];
+ int value;
+};
+
+struct msm_vidc_codec_data {
+ u32 fourcc;
+ enum session_type session_type;
+ int vpp_cycles;
+ int vsp_cycles;
+ int low_power_cycles;
+};
+
+struct msm_vidc_platform_data {
+ struct msm_vidc_common_data *common_data;
+ unsigned int common_data_length;
+ struct msm_vidc_codec_data *codec_data;
+ unsigned int codec_data_length;
+};
+
struct msm_vidc_format {
char name[MAX_NAME_LENGTH];
u8 description[32];
@@ -228,10 +248,11 @@
unsigned long min_freq;
unsigned long curr_freq;
u32 operating_rate;
- struct clock_profile_entry *entry;
+ struct msm_vidc_codec_data *entry;
u32 core_id;
enum hal_work_mode work_mode;
bool low_latency_mode;
+ bool use_sys_cache;
};
struct profile_data {
@@ -262,6 +283,7 @@
struct mutex lock;
int id;
struct hfi_device *device;
+ struct msm_vidc_platform_data *platform_data;
struct msm_video_device vdev[MSM_VIDC_MAX_DEVICES];
struct v4l2_device v4l2_dev;
struct list_head instances;
@@ -326,6 +348,7 @@
u32 profile;
u32 level;
u32 entropy_mode;
+ struct msm_vidc_codec_data *codec_data;
};
extern struct msm_vidc_drv *vidc_driver;
@@ -407,4 +430,5 @@
* whereas this is private
*/
int msm_vidc_destroy(struct msm_vidc_inst *inst);
+void *vidc_get_drv_data(struct device *dev);
#endif
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_platform.c b/drivers/media/platform/msm/vidc/msm_vidc_platform.c
new file mode 100644
index 0000000..25f22c7
--- /dev/null
+++ b/drivers/media/platform/msm/vidc/msm_vidc_platform.c
@@ -0,0 +1,146 @@
+/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/debugfs.h>
+#include <linux/dma-mapping.h>
+#include <linux/init.h>
+#include <linux/ioctl.h>
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+#include <linux/version.h>
+#include <linux/io.h>
+#include "msm_vidc_internal.h"
+
+
+#define CODEC_ENTRY(n, p, vsp, vpp, lp) \
+{ \
+ .fourcc = n, \
+ .session_type = p, \
+ .vsp_cycles = vsp, \
+ .vpp_cycles = vpp, \
+ .low_power_cycles = lp \
+}
+
+static struct msm_vidc_codec_data default_codec_data[] = {
+ CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 125, 675, 320),
+ CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 125, 675, 320),
+};
+
+static struct msm_vidc_codec_data sdm845_codec_data[] = {
+ CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 125, 675, 320),
+ CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_ENCODER, 125, 675, 320),
+ CODEC_ENTRY(V4L2_PIX_FMT_VP8, MSM_VIDC_ENCODER, 125, 675, 320),
+ CODEC_ENTRY(V4L2_PIX_FMT_MPEG2, MSM_VIDC_DECODER, 50, 200, 200),
+ CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 50, 200, 200),
+ CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_DECODER, 50, 200, 200),
+ CODEC_ENTRY(V4L2_PIX_FMT_VP8, MSM_VIDC_DECODER, 50, 200, 200),
+ CODEC_ENTRY(V4L2_PIX_FMT_VP9, MSM_VIDC_DECODER, 50, 200, 200),
+};
+
+static struct msm_vidc_common_data default_common_data[] = {
+ {
+ .key = "qcon,never-unload-fw",
+ .value = 1,
+ },
+};
+
+static struct msm_vidc_common_data sdm845_common_data[] = {
+ {
+ .key = "qcon,never-unload-fw",
+ .value = 1,
+ },
+ {
+ .key = "qcom,sw-power-collapse",
+ .value = 1,
+ },
+ {
+ .key = "qcom,max-secure-instances",
+ .value = 5,
+ },
+ {
+ .key = "qcom,max-hw-load",
+ .value = 2563200,
+ },
+ {
+ .key = "qcom,max-hq-mbs-per-frame",
+ .value = 8160,
+ },
+ {
+ .key = "qcom,max-hq-frames-per-sec",
+ .value = 60,
+ },
+ {
+ .key = "qcom,max-b-frame-size",
+ .value = 8160,
+ },
+ {
+ .key = "qcom,max-b-frames-per-sec",
+ .value = 60,
+ },
+ {
+ .key = "qcom,power-collapse-delay",
+ .value = 500,
+ },
+ {
+ .key = "qcom,hw-resp-timeout",
+ .value = 2000,
+ },
+};
+
+
+static struct msm_vidc_platform_data default_data = {
+ .codec_data = default_codec_data,
+ .codec_data_length = ARRAY_SIZE(default_codec_data),
+ .common_data = default_common_data,
+ .common_data_length = ARRAY_SIZE(default_common_data),
+};
+
+static struct msm_vidc_platform_data sdm845_data = {
+ .codec_data = sdm845_codec_data,
+ .codec_data_length = ARRAY_SIZE(sdm845_codec_data),
+ .common_data = sdm845_common_data,
+ .common_data_length = ARRAY_SIZE(sdm845_common_data),
+};
+
+static const struct of_device_id msm_vidc_dt_match[] = {
+ {
+ .compatible = "qcom,sdm845-vidc",
+ .data = &sdm845_data,
+ },
+ {},
+};
+
+MODULE_DEVICE_TABLE(of, msm_vidc_dt_match);
+
+void *vidc_get_drv_data(struct device *dev)
+{
+ struct msm_vidc_platform_data *driver_data = NULL;
+ const struct of_device_id *match;
+
+ if (!IS_ENABLED(CONFIG_OF) || !dev->of_node) {
+ driver_data = &default_data;
+ goto exit;
+ }
+
+ match = of_match_node(msm_vidc_dt_match, dev->of_node);
+
+ if (match)
+ driver_data = (struct msm_vidc_platform_data *)match->data;
+
+exit:
+ return driver_data;
+}
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c
index 19ca561..062795f 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c
@@ -132,7 +132,6 @@
msm_vidc_free_clock_table(res);
msm_vidc_free_regulator_table(res);
msm_vidc_free_platform_version_table(res);
- msm_vidc_free_cycles_per_mb_table(res);
msm_vidc_free_allowed_clocks_table(res);
msm_vidc_free_reg_table(res);
msm_vidc_free_qdss_addr_table(res);
@@ -275,12 +274,12 @@
"cache-slice-names", c, &vsc->name);
}
- res->sys_cache_present = true;
+ res->sys_cache_enabled = true;
return 0;
err_load_subcache_table_fail:
- res->sys_cache_present = false;
+ res->sys_cache_enabled = false;
subcaches->count = 0;
subcaches->subcache_tbl = NULL;
@@ -407,118 +406,6 @@
return 0;
}
-static int msm_vidc_load_cycles_per_mb_table(
- struct msm_vidc_platform_resources *res)
-{
- int rc = 0, i = 0;
- struct clock_freq_table *clock_freq_tbl = &res->clock_freq_tbl;
- struct clock_profile_entry *entry = NULL;
- struct device_node *parent_node = NULL;
- struct device_node *child_node = NULL;
- struct platform_device *pdev = res->pdev;
-
- parent_node = of_find_node_by_name(pdev->dev.of_node,
- "qcom,clock-freq-tbl");
- if (!parent_node) {
- dprintk(VIDC_DBG, "Node qcom,clock-freq-tbl not found.\n");
- return 0;
- }
-
- clock_freq_tbl->count = 0;
- for_each_child_of_node(parent_node, child_node)
- clock_freq_tbl->count++;
-
- if (!clock_freq_tbl->count) {
- dprintk(VIDC_DBG, "No child nodes in qcom,clock-freq-tbl\n");
- return 0;
- }
-
- clock_freq_tbl->clk_prof_entries = devm_kzalloc(&pdev->dev,
- sizeof(*clock_freq_tbl->clk_prof_entries) *
- clock_freq_tbl->count, GFP_KERNEL);
- if (!clock_freq_tbl->clk_prof_entries) {
- dprintk(VIDC_DBG, "no memory to allocate clk_prof_entries\n");
- return -ENOMEM;
- }
-
- for_each_child_of_node(parent_node, child_node) {
-
- if (i >= clock_freq_tbl->count) {
- dprintk(VIDC_ERR,
- "qcom,clock-freq-tbl: invalid child node %d, max is %d\n",
- i, clock_freq_tbl->count);
- break;
- }
-
- entry = &clock_freq_tbl->clk_prof_entries[i];
- dprintk(VIDC_DBG, "qcom,clock-freq-tbl: profile[%d]\n", i);
-
- if (of_find_property(child_node, "qcom,codec-mask", NULL)) {
- rc = of_property_read_u32(child_node,
- "qcom,codec-mask", &entry->codec_mask);
- if (rc) {
- dprintk(VIDC_ERR,
- "qcom,codec-mask not found\n");
- goto error;
- }
- } else {
- entry->codec_mask = 0;
- }
- dprintk(VIDC_DBG, "codec_mask %#x\n", entry->codec_mask);
-
- if (of_find_property(child_node,
- "qcom,vsp-cycles-per-mb", NULL)) {
- rc = of_property_read_u32(child_node,
- "qcom,vsp-cycles-per-mb",
- &entry->vsp_cycles);
- if (rc) {
- dprintk(VIDC_ERR,
- "qcom,vsp-cycles-per-mb not found\n");
- goto error;
- }
- } else {
- entry->vsp_cycles = 0;
- }
- dprintk(VIDC_DBG, "vsp cycles_per_mb %d\n", entry->vsp_cycles);
-
- if (of_find_property(child_node,
- "qcom,vpp-cycles-per-mb", NULL)) {
- rc = of_property_read_u32(child_node,
- "qcom,vpp-cycles-per-mb",
- &entry->vpp_cycles);
- if (rc) {
- dprintk(VIDC_ERR,
- "qcom,vpp-cycles-per-mb not found\n");
- goto error;
- }
- } else {
- entry->vpp_cycles = 0;
- }
- dprintk(VIDC_DBG, "vpp cycles_per_mb %d\n", entry->vpp_cycles);
-
- if (of_find_property(child_node,
- "qcom,low-power-cycles-per-mb", NULL)) {
- rc = of_property_read_u32(child_node,
- "qcom,low-power-cycles-per-mb",
- &entry->low_power_cycles);
- if (rc) {
- dprintk(VIDC_ERR,
- "qcom,low-power-cycles-per-mb not found\n");
- goto error;
- }
- } else {
- entry->low_power_cycles = 0;
- }
- dprintk(VIDC_DBG, "low_power_factor %d\n",
- entry->low_power_cycles);
-
- i++;
- }
-
-error:
- return rc;
-}
-
static int msm_vidc_populate_bus(struct device *dev,
struct msm_vidc_platform_resources *res)
{
@@ -818,6 +705,83 @@
return rc;
}
+static int find_key_value(struct msm_vidc_platform_data *platform_data,
+ const char *key)
+{
+ int i = 0;
+ struct msm_vidc_common_data *common_data = platform_data->common_data;
+ int size = platform_data->common_data_length;
+
+ for (i = 0; i < size; i++) {
+ if (!strcmp(common_data[i].key, key))
+ return common_data[i].value;
+ }
+ return 0;
+}
+
+int read_platform_resources_from_drv_data(
+ struct msm_vidc_core *core)
+{
+ struct msm_vidc_platform_data *platform_data;
+ struct msm_vidc_platform_resources *res;
+ int rc = 0;
+
+ if (!core || !core->platform_data) {
+ dprintk(VIDC_ERR, "%s Invalid data\n", __func__);
+ return -ENOENT;
+ }
+ platform_data = core->platform_data;
+ res = &core->resources;
+
+ res->codec_data_count = platform_data->codec_data_length;
+ res->codec_data = platform_data->codec_data;
+
+ res->fw_name = "venus";
+
+ dprintk(VIDC_DBG, "Firmware filename: %s\n", res->fw_name);
+
+ res->max_load = find_key_value(platform_data,
+ "qcom,max-hw-load");
+
+ res->max_hq_mbs_per_frame = find_key_value(platform_data,
+ "qcom,max-hq-mbs-per-frame");
+
+ res->max_hq_fps = find_key_value(platform_data,
+ "qcom,max-hq-frames-per-sec");
+
+ res->sw_power_collapsible = find_key_value(platform_data,
+ "qcom,sw-power-collapse");
+
+ res->never_unload_fw = find_key_value(platform_data,
+ "qcom,never-unload-fw");
+
+ res->debug_timeout = find_key_value(platform_data,
+ "qcom,debug-timeout");
+
+ res->debug_timeout |= msm_vidc_debug_timeout;
+
+ res->pm_qos_latency_us = find_key_value(platform_data,
+ "qcom,pm-qos-latency-us");
+
+ res->max_secure_inst_count = find_key_value(platform_data,
+ "qcom,max-secure-instances");
+
+ res->slave_side_cp = find_key_value(platform_data,
+ "qcom,slave-side-cp");
+ res->sys_idle_indicator = find_key_value(platform_data,
+ "qcom,enable-idle-indicator");
+ res->thermal_mitigable = find_key_value(platform_data,
+ "qcom,enable-thermal-mitigation");
+ res->msm_vidc_pwr_collapse_delay = find_key_value(platform_data,
+ "qcom,power-collapse-delay");
+ res->msm_vidc_firmware_unload_delay = find_key_value(platform_data,
+ "qcom,fw-unload-delay");
+ res->msm_vidc_hw_rsp_timeout = find_key_value(platform_data,
+ "qcom,hw-resp-timeout");
+ return rc;
+
+}
+
int read_platform_resources_from_dt(
struct msm_vidc_platform_resources *res)
{
@@ -842,26 +806,6 @@
kres = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
res->irq = kres ? kres->start : -1;
- res->sys_idle_indicator = of_property_read_bool(pdev->dev.of_node,
- "qcom,enable-idle-indicator");
-
- res->thermal_mitigable =
- of_property_read_bool(pdev->dev.of_node,
- "qcom,enable-thermal-mitigation");
-
- rc = of_property_read_string(pdev->dev.of_node, "qcom,firmware-name",
- &res->fw_name);
- if (rc) {
- dprintk(VIDC_ERR, "Failed to read firmware name: %d\n", rc);
- goto err_load_reg_table;
- }
- dprintk(VIDC_DBG, "Firmware filename: %s\n", res->fw_name);
-
- rc = of_property_read_string(pdev->dev.of_node, "qcom,hfi-version",
- &res->hfi_version);
- if (rc)
- dprintk(VIDC_DBG, "HFI packetization will default to legacy\n");
-
rc = msm_vidc_load_platform_version_table(res);
if (rc)
dprintk(VIDC_ERR, "Failed to load pf version table: %d\n", rc);
@@ -900,13 +844,6 @@
goto err_load_clock_table;
}
- rc = msm_vidc_load_cycles_per_mb_table(res);
- if (rc) {
- dprintk(VIDC_ERR,
- "Failed to load cycles per mb table: %d\n", rc);
- goto err_load_cycles_per_mb_table;
- }
-
rc = msm_vidc_load_allowed_clocks_table(res);
if (rc) {
dprintk(VIDC_ERR,
@@ -914,32 +851,6 @@
goto err_load_allowed_clocks_table;
}
- rc = of_property_read_u32(pdev->dev.of_node, "qcom,max-hw-load",
- &res->max_load);
- if (rc) {
- dprintk(VIDC_ERR,
- "Failed to determine max load supported: %d\n", rc);
- goto err_load_max_hw_load;
- }
-
- rc = of_property_read_u32(pdev->dev.of_node,
- "qcom,max-hq-mbs-per-frame",
- &res->max_hq_mbs_per_frame);
- if (rc) {
- dprintk(VIDC_ERR,
- "Failed to determine Max HQ mbs per frame: %d\n", rc);
- goto err_load_HQ_values;
- }
-
- rc = of_property_read_u32(pdev->dev.of_node,
- "qcom,max-hq-frames-per-sec",
- &res->max_hq_fps);
- if (rc) {
- dprintk(VIDC_ERR,
- "Failed to determine Max HQ fps: %d\n", rc);
- goto err_load_HQ_values;
- }
-
rc = msm_vidc_populate_legacy_context_bank(res);
if (rc) {
dprintk(VIDC_ERR,
@@ -958,39 +869,11 @@
"Using fw-bias : %pa", &res->firmware_base);
}
- res->sw_power_collapsible = of_property_read_bool(pdev->dev.of_node,
- "qcom,sw-power-collapse");
- dprintk(VIDC_DBG, "Power collapse supported = %s\n",
- res->sw_power_collapsible ? "yes" : "no");
-
- res->never_unload_fw = of_property_read_bool(pdev->dev.of_node,
- "qcom,never-unload-fw");
-
- res->debug_timeout = of_property_read_bool(pdev->dev.of_node,
- "qcom,debug-timeout");
-
- msm_vidc_debug_timeout |= res->debug_timeout;
-
- of_property_read_u32(pdev->dev.of_node,
- "qcom,pm-qos-latency-us", &res->pm_qos_latency_us);
-
- res->slave_side_cp = of_property_read_bool(pdev->dev.of_node,
- "qcom,slave-side-cp");
- dprintk(VIDC_DBG, "Slave side cp = %s\n",
- res->slave_side_cp ? "yes" : "no");
-
- of_property_read_u32(pdev->dev.of_node,
- "qcom,max-secure-instances",
- &res->max_secure_inst_count);
- return rc;
+return rc;
err_setup_legacy_cb:
-err_load_HQ_values:
-err_load_max_hw_load:
msm_vidc_free_allowed_clocks_table(res);
err_load_allowed_clocks_table:
- msm_vidc_free_cycles_per_mb_table(res);
-err_load_cycles_per_mb_table:
msm_vidc_free_clock_table(res);
err_load_clock_table:
msm_vidc_free_regulator_table(res);
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.h b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.h
index 4ba9057..a682282 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.h
+++ b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.h
@@ -22,6 +22,8 @@
int read_hfi_type(struct platform_device *pdev);
+int read_platform_resources_from_drv_data(
+ struct msm_vidc_core *core);
int read_platform_resources_from_dt(
struct msm_vidc_platform_resources *res);
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_resources.h b/drivers/media/platform/msm/vidc/msm_vidc_resources.h
index b07785a..dda5e80 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_resources.h
+++ b/drivers/media/platform/msm/vidc/msm_vidc_resources.h
@@ -185,6 +185,11 @@
uint32_t pm_qos_latency_us;
uint32_t max_inst_count;
uint32_t max_secure_inst_count;
+ int msm_vidc_hw_rsp_timeout;
+ int msm_vidc_firmware_unload_delay;
+ uint32_t msm_vidc_pwr_collapse_delay;
+ struct msm_vidc_codec_data *codec_data;
+ int codec_data_count;
};
static inline bool is_iommu_present(struct msm_vidc_platform_resources *res)
@@ -192,7 +197,5 @@
return !list_empty(&res->context_banks);
}
-extern uint32_t msm_vidc_pwr_collapse_delay;
-
#endif
diff --git a/drivers/media/platform/msm/vidc/venus_hfi.c b/drivers/media/platform/msm/vidc/venus_hfi.c
index 6139e46..62dcc59 100644
--- a/drivers/media/platform/msm/vidc/venus_hfi.c
+++ b/drivers/media/platform/msm/vidc/venus_hfi.c
@@ -723,35 +723,6 @@
}
}
-static bool __is_session_supported(unsigned long sessions_supported,
- enum vidc_vote_data_session session_type)
-{
- bool same_codec, same_session_type;
- int codec_bit, session_type_bit;
- unsigned long session = session_type;
-
- if (!sessions_supported || !session)
- return false;
-
- /* ffs returns a 1 indexed, test_bit takes a 0 indexed...index */
- codec_bit = ffs(session) - 1;
- session_type_bit = codec_bit + 1;
-
- same_codec = test_bit(codec_bit, &sessions_supported) ==
- test_bit(codec_bit, &session);
- same_session_type = test_bit(session_type_bit, &sessions_supported) ==
- test_bit(session_type_bit, &session);
-
- return same_codec && same_session_type;
-}
-
-bool venus_hfi_is_session_supported(unsigned long sessions_supported,
- enum vidc_vote_data_session session_type)
-{
- return __is_session_supported(sessions_supported, session_type);
-}
-EXPORT_SYMBOL(venus_hfi_is_session_supported);
-
static int __devfreq_target(struct device *devfreq_dev,
unsigned long *freq, u32 flags)
{
@@ -1151,11 +1122,9 @@
static int __scale_clocks(struct venus_hfi_device *device)
{
int rc = 0;
- struct clock_freq_table *clk_freq_tbl = NULL;
struct allowed_clock_rates_table *allowed_clks_tbl = NULL;
u32 rate = 0;
- clk_freq_tbl = &device->res->clock_freq_tbl;
allowed_clks_tbl = device->res->allowed_clks_tbl;
dprintk(VIDC_DBG, "%s: NULL scale data\n", __func__);
@@ -1214,7 +1183,7 @@
if (!queue_delayed_work(device->venus_pm_workq,
&venus_hfi_pm_work,
msecs_to_jiffies(
- msm_vidc_pwr_collapse_delay))) {
+ device->res->msm_vidc_pwr_collapse_delay))) {
dprintk(VIDC_DBG,
"PM work already scheduled\n");
}
@@ -2848,7 +2817,8 @@
device->skip_pc_count, wfi_status, idle_status, pc_ready);
queue_delayed_work(device->venus_pm_workq,
&venus_hfi_pm_work,
- msecs_to_jiffies(msm_vidc_pwr_collapse_delay));
+ msecs_to_jiffies(
+ device->res->msm_vidc_pwr_collapse_delay));
exit:
mutex_unlock(&device->lock);
}
@@ -3097,7 +3067,8 @@
cancel_delayed_work(&venus_hfi_pm_work);
if (!queue_delayed_work(device->venus_pm_workq,
&venus_hfi_pm_work,
- msecs_to_jiffies(msm_vidc_pwr_collapse_delay))) {
+ msecs_to_jiffies(
+ device->res->msm_vidc_pwr_collapse_delay))) {
dprintk(VIDC_ERR, "PM work already scheduled\n");
}
}