2022-04-28 08:12:17

by Vikash Garodia

[permalink] [raw]
Subject: [PATCH] media: venus: set ubwc configuration on specific video hardware

UBWC configuration parameters would vary across video hardware
generations. At the same time, driver is expected to configure
these parameters, without relying on video firmware to use the
default configurations.
Setting the configuration parameters for sc7280.

Signed-off-by: Vikash Garodia <[email protected]>
---
drivers/media/platform/qcom/venus/core.c | 5 +++
drivers/media/platform/qcom/venus/core.h | 18 +++++++++
drivers/media/platform/qcom/venus/hfi_cmds.c | 9 +++++
drivers/media/platform/qcom/venus/hfi_cmds.h | 1 +
drivers/media/platform/qcom/venus/hfi_helper.h | 20 ++++++++++
drivers/media/platform/qcom/venus/hfi_venus.c | 54 ++++++++++++++++++++++++++
6 files changed, 107 insertions(+)

diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c
index 877eca1..75d8e14 100644
--- a/drivers/media/platform/qcom/venus/core.c
+++ b/drivers/media/platform/qcom/venus/core.c
@@ -832,6 +832,10 @@ static const struct reg_val sm7280_reg_preset[] = {
{ 0xb0088, 0 },
};

+static const struct ubwc_config sc7280_ubwc_config[] = {
+ {{1, 1, 1, 0, 0, 0}, 8, 32, 14, 0, 0},
+};
+
static const struct venus_resources sc7280_res = {
.freq_tbl = sc7280_freq_table,
.freq_tbl_size = ARRAY_SIZE(sc7280_freq_table),
@@ -841,6 +845,7 @@ static const struct venus_resources sc7280_res = {
.bw_tbl_enc_size = ARRAY_SIZE(sc7280_bw_table_enc),
.bw_tbl_dec = sc7280_bw_table_dec,
.bw_tbl_dec_size = ARRAY_SIZE(sc7280_bw_table_dec),
+ .ubwc_conf = sc7280_ubwc_config,
.clks = {"core", "bus", "iface"},
.clks_num = 3,
.vcodec0_clks = {"vcodec_core", "vcodec_bus"},
diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
index c3023340..ef71462 100644
--- a/drivers/media/platform/qcom/venus/core.h
+++ b/drivers/media/platform/qcom/venus/core.h
@@ -47,6 +47,23 @@ struct bw_tbl {
u32 peak_10bit;
};

+struct ubwc_config {
+ struct {
+ u32 max_channel_override : 1;
+ u32 mal_length_override : 1;
+ u32 hb_override : 1;
+ u32 bank_swzl_level_override : 1;
+ u32 bank_spreading_override : 1;
+ u32 reserved : 27;
+ } override_bit_info;
+
+ u32 max_channels;
+ u32 mal_length;
+ u32 highest_bank_bit;
+ u32 bank_swzl_level;
+ u32 bank_spreading;
+};
+
struct venus_resources {
u64 dma_mask;
const struct freq_tbl *freq_tbl;
@@ -57,6 +74,7 @@ struct venus_resources {
unsigned int bw_tbl_dec_size;
const struct reg_val *reg_tbl;
unsigned int reg_tbl_size;
+ const struct ubwc_config *ubwc_conf;
const char * const clks[VIDC_CLKS_NUM_MAX];
unsigned int clks_num;
const char * const vcodec0_clks[VIDC_VCODEC_CLKS_NUM_MAX];
diff --git a/drivers/media/platform/qcom/venus/hfi_cmds.c b/drivers/media/platform/qcom/venus/hfi_cmds.c
index 4ecd444..036eaca 100644
--- a/drivers/media/platform/qcom/venus/hfi_cmds.c
+++ b/drivers/media/platform/qcom/venus/hfi_cmds.c
@@ -58,6 +58,15 @@ void pkt_sys_coverage_config(struct hfi_sys_set_property_pkt *pkt, u32 mode)
pkt->data[1] = mode;
}

+void pkt_sys_ubwc_config(struct hfi_sys_set_property_pkt *pkt, struct hfi_ubwc_config *hfi)
+{
+ pkt->hdr.size = struct_size(pkt, data, 1) + sizeof(*hfi);
+ pkt->hdr.pkt_type = HFI_CMD_SYS_SET_PROPERTY;
+ pkt->num_properties = 1;
+ pkt->data[0] = HFI_PROPERTY_SYS_UBWC_CONFIG;
+ memcpy(&pkt->data[1], hfi, sizeof(*hfi));
+}
+
int pkt_sys_set_resource(struct hfi_sys_set_resource_pkt *pkt, u32 id, u32 size,
u32 addr, void *cookie)
{
diff --git a/drivers/media/platform/qcom/venus/hfi_cmds.h b/drivers/media/platform/qcom/venus/hfi_cmds.h
index 327ed90..ce7179e 100644
--- a/drivers/media/platform/qcom/venus/hfi_cmds.h
+++ b/drivers/media/platform/qcom/venus/hfi_cmds.h
@@ -256,6 +256,7 @@ void pkt_sys_init(struct hfi_sys_init_pkt *pkt, u32 arch_type);
void pkt_sys_pc_prep(struct hfi_sys_pc_prep_pkt *pkt);
void pkt_sys_idle_indicator(struct hfi_sys_set_property_pkt *pkt, u32 enable);
void pkt_sys_power_control(struct hfi_sys_set_property_pkt *pkt, u32 enable);
+void pkt_sys_ubwc_config(struct hfi_sys_set_property_pkt *pkt, struct hfi_ubwc_config *hfi);
int pkt_sys_set_resource(struct hfi_sys_set_resource_pkt *pkt, u32 id, u32 size,
u32 addr, void *cookie);
int pkt_sys_unset_resource(struct hfi_sys_release_resource_pkt *pkt, u32 id,
diff --git a/drivers/media/platform/qcom/venus/hfi_helper.h b/drivers/media/platform/qcom/venus/hfi_helper.h
index 2daa88e..d2d6719 100644
--- a/drivers/media/platform/qcom/venus/hfi_helper.h
+++ b/drivers/media/platform/qcom/venus/hfi_helper.h
@@ -427,6 +427,7 @@
#define HFI_PROPERTY_SYS_CODEC_POWER_PLANE_CTRL 0x5
#define HFI_PROPERTY_SYS_IMAGE_VERSION 0x6
#define HFI_PROPERTY_SYS_CONFIG_COVERAGE 0x7
+#define HFI_PROPERTY_SYS_UBWC_CONFIG 0x8

/*
* HFI_PROPERTY_PARAM_COMMON_START
@@ -626,6 +627,25 @@ struct hfi_debug_config {
u32 mode;
};

+struct hfi_ubwc_config {
+ u32 size;
+ u32 packet_type;
+ struct {
+ u32 max_channel_override : 1;
+ u32 mal_length_override : 1;
+ u32 hb_override : 1;
+ u32 bank_swzl_level_override : 1;
+ u32 bank_spreading_override : 1;
+ u32 reserved : 27;
+ } override_bit_info;
+ u32 max_channels;
+ u32 mal_length;
+ u32 highest_bank_bit;
+ u32 bank_swzl_level;
+ u32 bank_spreading;
+ u32 reserved[2];
+};
+
struct hfi_enable {
u32 enable;
};
diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
index 3a75a27..25131d0 100644
--- a/drivers/media/platform/qcom/venus/hfi_venus.c
+++ b/drivers/media/platform/qcom/venus/hfi_venus.c
@@ -904,6 +904,52 @@ static int venus_sys_set_power_control(struct venus_hfi_device *hdev,
return 0;
}

+static int venus_sys_set_ubwc_config(struct venus_hfi_device *hdev)
+{
+ struct hfi_sys_set_property_pkt *pkt;
+ u8 packet[IFACEQ_VAR_SMALL_PKT_SIZE];
+ struct hfi_ubwc_config *hfi;
+ const struct venus_resources *res = hdev->core->res;
+ const struct ubwc_config *ubwc_conf = res->ubwc_conf;
+ int ret;
+
+ hfi = kzalloc(sizeof(*hfi), GFP_KERNEL);
+ if (!hfi)
+ return -ENOMEM;
+
+ pkt = (struct hfi_sys_set_property_pkt *)packet;
+
+ hfi->max_channels = ubwc_conf->max_channels;
+ hfi->override_bit_info.max_channel_override =
+ ubwc_conf->override_bit_info.max_channel_override;
+
+ hfi->mal_length = ubwc_conf->mal_length;
+ hfi->override_bit_info.mal_length_override =
+ ubwc_conf->override_bit_info.mal_length_override;
+
+ hfi->highest_bank_bit = ubwc_conf->highest_bank_bit;
+ hfi->override_bit_info.hb_override =
+ ubwc_conf->override_bit_info.hb_override;
+
+ hfi->bank_swzl_level = ubwc_conf->bank_swzl_level;
+ hfi->override_bit_info.bank_swzl_level_override =
+ ubwc_conf->override_bit_info.bank_swzl_level_override;
+
+ hfi->bank_spreading = ubwc_conf->bank_spreading;
+ hfi->override_bit_info.bank_spreading_override =
+ ubwc_conf->override_bit_info.bank_spreading_override;
+
+ pkt_sys_ubwc_config(pkt, hfi);
+
+ kfree(hfi);
+
+ ret = venus_iface_cmdq_write(hdev, pkt, false);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static int venus_get_queue_size(struct venus_hfi_device *hdev,
unsigned int index)
{
@@ -922,6 +968,7 @@ static int venus_get_queue_size(struct venus_hfi_device *hdev,
static int venus_sys_set_default_properties(struct venus_hfi_device *hdev)
{
struct device *dev = hdev->core->dev;
+ const struct venus_resources *res = hdev->core->res;
int ret;

ret = venus_sys_set_debug(hdev, venus_fw_debug);
@@ -945,6 +992,13 @@ static int venus_sys_set_default_properties(struct venus_hfi_device *hdev)
dev_warn(dev, "setting hw power collapse ON failed (%d)\n",
ret);

+ /* For specific venus core, it is mandatory to set the UBWC configuration */
+ if (res->ubwc_conf) {
+ ret = venus_sys_set_ubwc_config();
+ if (ret)
+ dev_warn(dev, "setting ubwc config failed (%d)\n", ret);
+ }
+
return ret;
}

--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


2022-05-03 00:25:39

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] media: venus: set ubwc configuration on specific video hardware

Hi Vikash,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on media-tree/master]
[also build test ERROR on v5.18-rc4 next-20220429]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/intel-lab-lkp/linux/commits/Vikash-Garodia/media-venus-set-ubwc-configuration-on-specific-video-hardware/20220428-153510
base: git://linuxtv.org/media_tree.git master
config: arm64-defconfig (https://download.01.org/0day-ci/archive/20220430/[email protected]/config)
compiler: aarch64-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/22d299bea1f679d007cb71b3916bf39bb957ab66
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Vikash-Garodia/media-venus-set-ubwc-configuration-on-specific-video-hardware/20220428-153510
git checkout 22d299bea1f679d007cb71b3916bf39bb957ab66
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash drivers/media/platform/qcom/venus/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

All errors (new ones prefixed by >>):

drivers/media/platform/qcom/venus/hfi_venus.c: In function 'venus_sys_set_default_properties':
>> drivers/media/platform/qcom/venus/hfi_venus.c:997:23: error: too few arguments to function 'venus_sys_set_ubwc_config'
997 | ret = venus_sys_set_ubwc_config();
| ^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/platform/qcom/venus/hfi_venus.c:907:12: note: declared here
907 | static int venus_sys_set_ubwc_config(struct venus_hfi_device *hdev)
| ^~~~~~~~~~~~~~~~~~~~~~~~~


vim +/venus_sys_set_ubwc_config +997 drivers/media/platform/qcom/venus/hfi_venus.c

967
968 static int venus_sys_set_default_properties(struct venus_hfi_device *hdev)
969 {
970 struct device *dev = hdev->core->dev;
971 const struct venus_resources *res = hdev->core->res;
972 int ret;
973
974 ret = venus_sys_set_debug(hdev, venus_fw_debug);
975 if (ret)
976 dev_warn(dev, "setting fw debug msg ON failed (%d)\n", ret);
977
978 /*
979 * Idle indicator is disabled by default on some 4xx firmware versions,
980 * enable it explicitly in order to make suspend functional by checking
981 * WFI (wait-for-interrupt) bit.
982 */
983 if (IS_V4(hdev->core) || IS_V6(hdev->core))
984 venus_sys_idle_indicator = true;
985
986 ret = venus_sys_set_idle_message(hdev, venus_sys_idle_indicator);
987 if (ret)
988 dev_warn(dev, "setting idle response ON failed (%d)\n", ret);
989
990 ret = venus_sys_set_power_control(hdev, venus_fw_low_power_mode);
991 if (ret)
992 dev_warn(dev, "setting hw power collapse ON failed (%d)\n",
993 ret);
994
995 /* For specific venus core, it is mandatory to set the UBWC configuration */
996 if (res->ubwc_conf) {
> 997 ret = venus_sys_set_ubwc_config();
998 if (ret)
999 dev_warn(dev, "setting ubwc config failed (%d)\n", ret);
1000 }
1001
1002 return ret;
1003 }
1004

--
0-DAY CI Kernel Test Service
https://01.org/lkp

2022-05-03 00:37:57

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] media: venus: set ubwc configuration on specific video hardware

Hi Vikash,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on media-tree/master]
[also build test ERROR on v5.18-rc4 next-20220429]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/intel-lab-lkp/linux/commits/Vikash-Garodia/media-venus-set-ubwc-configuration-on-specific-video-hardware/20220428-153510
base: git://linuxtv.org/media_tree.git master
config: arm64-allmodconfig (https://download.01.org/0day-ci/archive/20220430/[email protected]/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project c59473aacce38cd7dd77eebceaf3c98c5707ab3b)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# https://github.com/intel-lab-lkp/linux/commit/22d299bea1f679d007cb71b3916bf39bb957ab66
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Vikash-Garodia/media-venus-set-ubwc-configuration-on-specific-video-hardware/20220428-153510
git checkout 22d299bea1f679d007cb71b3916bf39bb957ab66
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash arch/arm64/crypto/ arch/arm64/kernel/ drivers/media/platform/qcom/venus/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

All errors (new ones prefixed by >>):

>> drivers/media/platform/qcom/venus/hfi_venus.c:997:35: error: too few arguments to function call, single argument 'hdev' was not specified
ret = venus_sys_set_ubwc_config();
~~~~~~~~~~~~~~~~~~~~~~~~~ ^
drivers/media/platform/qcom/venus/hfi_venus.c:907:12: note: 'venus_sys_set_ubwc_config' declared here
static int venus_sys_set_ubwc_config(struct venus_hfi_device *hdev)
^
1 error generated.


vim +/hdev +997 drivers/media/platform/qcom/venus/hfi_venus.c

967
968 static int venus_sys_set_default_properties(struct venus_hfi_device *hdev)
969 {
970 struct device *dev = hdev->core->dev;
971 const struct venus_resources *res = hdev->core->res;
972 int ret;
973
974 ret = venus_sys_set_debug(hdev, venus_fw_debug);
975 if (ret)
976 dev_warn(dev, "setting fw debug msg ON failed (%d)\n", ret);
977
978 /*
979 * Idle indicator is disabled by default on some 4xx firmware versions,
980 * enable it explicitly in order to make suspend functional by checking
981 * WFI (wait-for-interrupt) bit.
982 */
983 if (IS_V4(hdev->core) || IS_V6(hdev->core))
984 venus_sys_idle_indicator = true;
985
986 ret = venus_sys_set_idle_message(hdev, venus_sys_idle_indicator);
987 if (ret)
988 dev_warn(dev, "setting idle response ON failed (%d)\n", ret);
989
990 ret = venus_sys_set_power_control(hdev, venus_fw_low_power_mode);
991 if (ret)
992 dev_warn(dev, "setting hw power collapse ON failed (%d)\n",
993 ret);
994
995 /* For specific venus core, it is mandatory to set the UBWC configuration */
996 if (res->ubwc_conf) {
> 997 ret = venus_sys_set_ubwc_config();
998 if (ret)
999 dev_warn(dev, "setting ubwc config failed (%d)\n", ret);
1000 }
1001
1002 return ret;
1003 }
1004

--
0-DAY CI Kernel Test Service
https://01.org/lkp