Re: [PATCH] venus: Add platform specific capabilities
On 5/29/20 10:18 AM, Dikshita Agarwal wrote: > Add platform specific capabilities and use them > in place of firmware capabilities. > > Signed-off-by: Dikshita Agarwal > --- > drivers/media/platform/qcom/venus/core.c | 3 + > drivers/media/platform/qcom/venus/hfi_helper.h | 3 +- > drivers/media/platform/qcom/venus/hfi_parser.c | 21 +-- > .../media/platform/qcom/venus/hfi_platform_data.c | 153 > - > .../media/platform/qcom/venus/hfi_platform_data.h | 37 - > 5 files changed, 193 insertions(+), 24 deletions(-) > > diff --git a/drivers/media/platform/qcom/venus/core.c > b/drivers/media/platform/qcom/venus/core.c > index 4fde4aa..8221e5c 100644 > --- a/drivers/media/platform/qcom/venus/core.c > +++ b/drivers/media/platform/qcom/venus/core.c > @@ -273,6 +273,9 @@ static int venus_probe(struct platform_device *pdev) > if (ret) > goto err_venus_shutdown; > > + if (core->hfi_data && core->hfi_data->venus_parse_resources) > + venus_parse_resources(core); > + > ret = hfi_core_init(core); > if (ret) > goto err_venus_shutdown; > diff --git a/drivers/media/platform/qcom/venus/hfi_helper.h > b/drivers/media/platform/qcom/venus/hfi_helper.h > index f6613df..1671012 100644 > --- a/drivers/media/platform/qcom/venus/hfi_helper.h > +++ b/drivers/media/platform/qcom/venus/hfi_helper.h > @@ -520,7 +520,8 @@ > enum hfi_version { > HFI_VERSION_1XX, > HFI_VERSION_3XX, > - HFI_VERSION_4XX > + HFI_VERSION_4XX, > + HFI_VERSION_6XX > }; > > struct hfi_buffer_info { > diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c > b/drivers/media/platform/qcom/venus/hfi_parser.c > index 7f515a4..b4b60e1 100644 > --- a/drivers/media/platform/qcom/venus/hfi_parser.c > +++ b/drivers/media/platform/qcom/venus/hfi_parser.c > @@ -10,30 +10,11 @@ > #include "core.h" > #include "hfi_helper.h" > #include "hfi_parser.h" > +#include "hfi_platform_data.h" > > typedef void (*func)(struct venus_caps *cap, const void *data, >unsigned int size); > > -static void init_codecs(struct venus_core *core) > -{ > - struct venus_caps *caps = core->caps, *cap; > - unsigned long bit; > - > - for_each_set_bit(bit, >dec_codecs, MAX_CODEC_NUM) { > - cap = [core->codecs_count++]; > - cap->codec = BIT(bit); > - cap->domain = VIDC_SESSION_TYPE_DEC; > - cap->valid = false; > - } > - > - for_each_set_bit(bit, >enc_codecs, MAX_CODEC_NUM) { > - cap = [core->codecs_count++]; > - cap->codec = BIT(bit); > - cap->domain = VIDC_SESSION_TYPE_ENC; > - cap->valid = false; > - } > -} > - Please keep this function in hfi_parse.c and make a copy here. I don't want to make such cross dependency between hfi_parse and hfi_platform. Once we are in good shape with hfi_platform we could drop the hfi_parser completely and don't rely on firmware. > static void for_each_codec(struct venus_caps *caps, unsigned int caps_num, > u32 codecs, u32 domain, func cb, void *data, > unsigned int size) > diff --git a/drivers/media/platform/qcom/venus/hfi_platform_data.c > b/drivers/media/platform/qcom/venus/hfi_platform_data.c > index 9d9035f..fc838f5 100644 > --- a/drivers/media/platform/qcom/venus/hfi_platform_data.c > +++ b/drivers/media/platform/qcom/venus/hfi_platform_data.c > @@ -5,8 +5,132 @@ > #include "hfi_platform_data.h" > #include "core.h" > > +void init_codecs(struct venus_core *core) > +{ > + struct venus_caps *caps = core->caps, *cap; > + unsigned long bit; > + > + for_each_set_bit(bit, >dec_codecs, MAX_CODEC_NUM) { > + cap = [core->codecs_count++]; > + cap->codec = BIT(bit); > + cap->domain = VIDC_SESSION_TYPE_DEC; > + cap->valid = false; > + } > + > + for_each_set_bit(bit, >enc_codecs, MAX_CODEC_NUM) { > + cap = [core->codecs_count++]; > + cap->codec = BIT(bit); > + cap->domain = VIDC_SESSION_TYPE_ENC; > + cap->valid = false; > + } > +} > + > +static void parse_codecs(struct venus_core *core) s/parse_codecs/fill_codecs/ > +{ > + const struct venus_hfi_platform_data *hfi_data = core->hfi_data; > + const struct venus_codecs *codecs = hfi_data->venus_codecs; > + unsigned int i, codecs_size; > + > + core->enc_codecs = 0; > + core->dec_codecs = 0; > + codecs_size = hfi_data->venus_codecs_size; > + > + for (i = 0; i < codecs_size; i++) { > + if (codecs[i].domain == VIDC_SESSION_TYPE_ENC) > + core->enc_codecs |= codecs[i].codecs; > + else > + core->dec_codecs |= codecs[i].codecs; > + } > + init_codecs(core); > +} > + > +static int fill_raw_fmt(struct venus_capability *hfi_data_caps, > + struct
Re: [PATCH] venus: Add platform specific capabilities
Hi Stanimir, A gentle reminder for the review. Thanks, Dikshita On 2020-05-29 12:48, Dikshita Agarwal wrote: Add platform specific capabilities and use them in place of firmware capabilities. Signed-off-by: Dikshita Agarwal --- drivers/media/platform/qcom/venus/core.c | 3 + drivers/media/platform/qcom/venus/hfi_helper.h | 3 +- drivers/media/platform/qcom/venus/hfi_parser.c | 21 +-- .../media/platform/qcom/venus/hfi_platform_data.c | 153 - .../media/platform/qcom/venus/hfi_platform_data.h | 37 - 5 files changed, 193 insertions(+), 24 deletions(-) diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c index 4fde4aa..8221e5c 100644 --- a/drivers/media/platform/qcom/venus/core.c +++ b/drivers/media/platform/qcom/venus/core.c @@ -273,6 +273,9 @@ static int venus_probe(struct platform_device *pdev) if (ret) goto err_venus_shutdown; + if (core->hfi_data && core->hfi_data->venus_parse_resources) + venus_parse_resources(core); + ret = hfi_core_init(core); if (ret) goto err_venus_shutdown; diff --git a/drivers/media/platform/qcom/venus/hfi_helper.h b/drivers/media/platform/qcom/venus/hfi_helper.h index f6613df..1671012 100644 --- a/drivers/media/platform/qcom/venus/hfi_helper.h +++ b/drivers/media/platform/qcom/venus/hfi_helper.h @@ -520,7 +520,8 @@ enum hfi_version { HFI_VERSION_1XX, HFI_VERSION_3XX, - HFI_VERSION_4XX + HFI_VERSION_4XX, + HFI_VERSION_6XX }; struct hfi_buffer_info { diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c index 7f515a4..b4b60e1 100644 --- a/drivers/media/platform/qcom/venus/hfi_parser.c +++ b/drivers/media/platform/qcom/venus/hfi_parser.c @@ -10,30 +10,11 @@ #include "core.h" #include "hfi_helper.h" #include "hfi_parser.h" +#include "hfi_platform_data.h" typedef void (*func)(struct venus_caps *cap, const void *data, unsigned int size); -static void init_codecs(struct venus_core *core) -{ - struct venus_caps *caps = core->caps, *cap; - unsigned long bit; - - for_each_set_bit(bit, >dec_codecs, MAX_CODEC_NUM) { - cap = [core->codecs_count++]; - cap->codec = BIT(bit); - cap->domain = VIDC_SESSION_TYPE_DEC; - cap->valid = false; - } - - for_each_set_bit(bit, >enc_codecs, MAX_CODEC_NUM) { - cap = [core->codecs_count++]; - cap->codec = BIT(bit); - cap->domain = VIDC_SESSION_TYPE_ENC; - cap->valid = false; - } -} - static void for_each_codec(struct venus_caps *caps, unsigned int caps_num, u32 codecs, u32 domain, func cb, void *data, unsigned int size) diff --git a/drivers/media/platform/qcom/venus/hfi_platform_data.c b/drivers/media/platform/qcom/venus/hfi_platform_data.c index 9d9035f..fc838f5 100644 --- a/drivers/media/platform/qcom/venus/hfi_platform_data.c +++ b/drivers/media/platform/qcom/venus/hfi_platform_data.c @@ -5,8 +5,132 @@ #include "hfi_platform_data.h" #include "core.h" +void init_codecs(struct venus_core *core) +{ + struct venus_caps *caps = core->caps, *cap; + unsigned long bit; + + for_each_set_bit(bit, >dec_codecs, MAX_CODEC_NUM) { + cap = [core->codecs_count++]; + cap->codec = BIT(bit); + cap->domain = VIDC_SESSION_TYPE_DEC; + cap->valid = false; + } + + for_each_set_bit(bit, >enc_codecs, MAX_CODEC_NUM) { + cap = [core->codecs_count++]; + cap->codec = BIT(bit); + cap->domain = VIDC_SESSION_TYPE_ENC; + cap->valid = false; + } +} + +static void parse_codecs(struct venus_core *core) +{ + const struct venus_hfi_platform_data *hfi_data = core->hfi_data; + const struct venus_codecs *codecs = hfi_data->venus_codecs; + unsigned int i, codecs_size; + + core->enc_codecs = 0; + core->dec_codecs = 0; + codecs_size = hfi_data->venus_codecs_size; + + for (i = 0; i < codecs_size; i++) { + if (codecs[i].domain == VIDC_SESSION_TYPE_ENC) + core->enc_codecs |= codecs[i].codecs; + else + core->dec_codecs |= codecs[i].codecs; + } + init_codecs(core); +} + +static int fill_raw_fmt(struct venus_capability *hfi_data_caps, + struct venus_caps *core_caps) +{ + if ((core_caps->num_pl + 1) == HFI_MAX_PROFILE_COUNT) + return -EINVAL; + + core_caps->fmts[core_caps->num_fmts].buftype = + hfi_data_caps->capability_type; + core_caps->fmts[core_caps->num_fmts].fmt = + hfi_data_caps->defaul_value; + core_caps->num_fmts += 1; + + return 0; +}
[PATCH] venus: Add platform specific capabilities
Add platform specific capabilities and use them in place of firmware capabilities. Signed-off-by: Dikshita Agarwal --- drivers/media/platform/qcom/venus/core.c | 3 + drivers/media/platform/qcom/venus/hfi_helper.h | 3 +- drivers/media/platform/qcom/venus/hfi_parser.c | 21 +-- .../media/platform/qcom/venus/hfi_platform_data.c | 153 - .../media/platform/qcom/venus/hfi_platform_data.h | 37 - 5 files changed, 193 insertions(+), 24 deletions(-) diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c index 4fde4aa..8221e5c 100644 --- a/drivers/media/platform/qcom/venus/core.c +++ b/drivers/media/platform/qcom/venus/core.c @@ -273,6 +273,9 @@ static int venus_probe(struct platform_device *pdev) if (ret) goto err_venus_shutdown; + if (core->hfi_data && core->hfi_data->venus_parse_resources) + venus_parse_resources(core); + ret = hfi_core_init(core); if (ret) goto err_venus_shutdown; diff --git a/drivers/media/platform/qcom/venus/hfi_helper.h b/drivers/media/platform/qcom/venus/hfi_helper.h index f6613df..1671012 100644 --- a/drivers/media/platform/qcom/venus/hfi_helper.h +++ b/drivers/media/platform/qcom/venus/hfi_helper.h @@ -520,7 +520,8 @@ enum hfi_version { HFI_VERSION_1XX, HFI_VERSION_3XX, - HFI_VERSION_4XX + HFI_VERSION_4XX, + HFI_VERSION_6XX }; struct hfi_buffer_info { diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c index 7f515a4..b4b60e1 100644 --- a/drivers/media/platform/qcom/venus/hfi_parser.c +++ b/drivers/media/platform/qcom/venus/hfi_parser.c @@ -10,30 +10,11 @@ #include "core.h" #include "hfi_helper.h" #include "hfi_parser.h" +#include "hfi_platform_data.h" typedef void (*func)(struct venus_caps *cap, const void *data, unsigned int size); -static void init_codecs(struct venus_core *core) -{ - struct venus_caps *caps = core->caps, *cap; - unsigned long bit; - - for_each_set_bit(bit, >dec_codecs, MAX_CODEC_NUM) { - cap = [core->codecs_count++]; - cap->codec = BIT(bit); - cap->domain = VIDC_SESSION_TYPE_DEC; - cap->valid = false; - } - - for_each_set_bit(bit, >enc_codecs, MAX_CODEC_NUM) { - cap = [core->codecs_count++]; - cap->codec = BIT(bit); - cap->domain = VIDC_SESSION_TYPE_ENC; - cap->valid = false; - } -} - static void for_each_codec(struct venus_caps *caps, unsigned int caps_num, u32 codecs, u32 domain, func cb, void *data, unsigned int size) diff --git a/drivers/media/platform/qcom/venus/hfi_platform_data.c b/drivers/media/platform/qcom/venus/hfi_platform_data.c index 9d9035f..fc838f5 100644 --- a/drivers/media/platform/qcom/venus/hfi_platform_data.c +++ b/drivers/media/platform/qcom/venus/hfi_platform_data.c @@ -5,8 +5,132 @@ #include "hfi_platform_data.h" #include "core.h" +void init_codecs(struct venus_core *core) +{ + struct venus_caps *caps = core->caps, *cap; + unsigned long bit; + + for_each_set_bit(bit, >dec_codecs, MAX_CODEC_NUM) { + cap = [core->codecs_count++]; + cap->codec = BIT(bit); + cap->domain = VIDC_SESSION_TYPE_DEC; + cap->valid = false; + } + + for_each_set_bit(bit, >enc_codecs, MAX_CODEC_NUM) { + cap = [core->codecs_count++]; + cap->codec = BIT(bit); + cap->domain = VIDC_SESSION_TYPE_ENC; + cap->valid = false; + } +} + +static void parse_codecs(struct venus_core *core) +{ + const struct venus_hfi_platform_data *hfi_data = core->hfi_data; + const struct venus_codecs *codecs = hfi_data->venus_codecs; + unsigned int i, codecs_size; + + core->enc_codecs = 0; + core->dec_codecs = 0; + codecs_size = hfi_data->venus_codecs_size; + + for (i = 0; i < codecs_size; i++) { + if (codecs[i].domain == VIDC_SESSION_TYPE_ENC) + core->enc_codecs |= codecs[i].codecs; + else + core->dec_codecs |= codecs[i].codecs; + } + init_codecs(core); +} + +static int fill_raw_fmt(struct venus_capability *hfi_data_caps, + struct venus_caps *core_caps) +{ + if ((core_caps->num_pl + 1) == HFI_MAX_PROFILE_COUNT) + return -EINVAL; + + core_caps->fmts[core_caps->num_fmts].buftype = + hfi_data_caps->capability_type; + core_caps->fmts[core_caps->num_fmts].fmt = + hfi_data_caps->defaul_value; + core_caps->num_fmts += 1; + + return 0; +} + +static int fill_profile(struct venus_capability *hfi_data_caps, + struct venus_caps