media: venus: set ubwc configuration on specific video hardware
authorVikash Garodia <quic_vgarodia@quicinc.com>
Wed, 13 Jul 2022 11:59:36 +0000 (12:59 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 15 Jul 2022 14:41:55 +0000 (15:41 +0100)
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 <quic_vgarodia@quicinc.com>
Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/qcom/venus/core.c
drivers/media/platform/qcom/venus/core.h
drivers/media/platform/qcom/venus/hfi_cmds.c
drivers/media/platform/qcom/venus/hfi_cmds.h
drivers/media/platform/qcom/venus/hfi_helper.h
drivers/media/platform/qcom/venus/hfi_venus.c

index abfa5d699fe2655c0c40d0662572bc0af0adb842..990a1519f968df9b93ea7a1ba6a5f0234ee05775 100644 (file)
@@ -845,6 +845,10 @@ static const struct reg_val sm7280_reg_preset[] = {
        { 0xb0088, 0 },
 };
 
+static const struct hfi_ubwc_config sc7280_ubwc_config = {
+       0, 0, {1, 1, 1, 0, 0, 0}, 8, 32, 14, 0, 0, {0, 0}
+};
+
 static const struct venus_resources sc7280_res = {
        .freq_tbl = sc7280_freq_table,
        .freq_tbl_size = ARRAY_SIZE(sc7280_freq_table),
@@ -854,6 +858,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"},
index d33825553edcd062980cdc34f142c1159d628216..32551c2602a98b5886bc42a4c1897b2dda2f35da 100644 (file)
@@ -16,6 +16,7 @@
 #include "dbgfs.h"
 #include "hfi.h"
 #include "hfi_platform.h"
+#include "hfi_helper.h"
 
 #define VDBGL  "VenusLow : "
 #define VDBGM  "VenusMed : "
@@ -57,6 +58,7 @@ struct venus_resources {
        unsigned int bw_tbl_dec_size;
        const struct reg_val *reg_tbl;
        unsigned int reg_tbl_size;
+       const struct hfi_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];
index 4ecd444050bb6f0689f5811dfe60806a95976319..930b743f225e80661f849d3c3d4c086420f10c43 100644 (file)
@@ -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, const 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)
 {
index 327ed90a278881216d1a3f91ab36291e757f0a8b..99bc0b6db67c3f24d4fb9fa16a77adcc213ad917 100644 (file)
@@ -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, const 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,
index 2daa88e3df9f98ec898f9e89593d7473dbcbc382..d2d6719a2ba4130f4ea0ef6e386dbfdef20aaa6c 100644 (file)
 #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;
 };
index 9a34662fea38824cf6087343427cf23bf2b17c5b..2ad40b3945b0b315c60b12a9a504289001555809 100644 (file)
@@ -904,6 +904,24 @@ 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];
+       const struct venus_resources *res = hdev->core->res;
+       int ret;
+
+       pkt = (struct hfi_sys_set_property_pkt *)packet;
+
+       pkt_sys_ubwc_config(pkt, res->ubwc_conf);
+
+       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 +940,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 +964,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(hdev);
+               if (ret)
+                       dev_warn(dev, "setting ubwc config failed (%d)\n", ret);
+       }
+
        return ret;
 }