lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <61742417-9230-4786-960c-9c9baf253e74@linaro.org>
Date: Tue, 2 Sep 2025 09:21:28 +0200
From: Neil Armstrong <neil.armstrong@...aro.org>
To: Dikshita Agarwal <quic_dikshita@...cinc.com>,
 Vikash Garodia <quic_vgarodia@...cinc.com>,
 Abhinav Kumar <abhinav.kumar@...ux.dev>,
 Bryan O'Donoghue <bryan.odonoghue@...aro.org>,
 Mauro Carvalho Chehab <mchehab@...nel.org>
Cc: linux-media@...r.kernel.org, linux-arm-msm@...r.kernel.org,
 linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2] media: iris: add VPU33 specific encoding buffer
 calculation

On 02/09/2025 07:40, Dikshita Agarwal wrote:
> 
> 
> On 9/1/2025 1:25 PM, Neil Armstrong wrote:
>> The VPU33 found in the SM8650 Platform requires some slighly different
>> buffer calculation for encoding to allow working with the latest
>> firwware uploaded on linux-firmware at [1].
>>
>> [1] https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/commit/?id=ece445af91bbee49bf0d8b23c2b99b596ae6eac7
>>
>> Suggested-by: Vikash Garodia <quic_vgarodia@...cinc.com>
>> Signed-off-by: Neil Armstrong <neil.armstrong@...aro.org>
>> ---
>> [2] https://lore.kernel.org/all/20250825-iris-video-encoder-v4-0-84aa2bc0a46b@quicinc.com/
>> ---
>> Changes in v2:
>> - Removed calculation fix for hevc encoding, as it was added in common code
>> - Link to v1: https://lore.kernel.org/r/20250822-topic-sm8x50-iris-encoder-v3-hevc-debug-v1-1-633d904ff7d3@linaro.org
>> ---
>>   drivers/media/platform/qcom/iris/iris_buffer.c     |   2 +-
>>   .../platform/qcom/iris/iris_hfi_gen1_command.c     |   2 +-
>>   .../platform/qcom/iris/iris_platform_common.h      |   2 +
>>   .../media/platform/qcom/iris/iris_platform_gen2.c  |   4 +
>>   .../platform/qcom/iris/iris_platform_sm8250.c      |   2 +
>>   drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 110 ++++++++++++++++++++-
>>   drivers/media/platform/qcom/iris/iris_vpu_buffer.h |   3 +-
>>   7 files changed, 118 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
>> index 8891a297d384b018b3cc8313ad6416db6317798b..c0900038e7defccf7de3cb60e17c71e36a0e8ead 100644
>> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
>> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
>> @@ -284,7 +284,7 @@ static void iris_fill_internal_buf_info(struct iris_inst *inst,
>>   {
>>   	struct iris_buffers *buffers = &inst->buffers[buffer_type];
>>   
>> -	buffers->size = iris_vpu_buf_size(inst, buffer_type);
>> +	buffers->size = inst->core->iris_platform_data->get_vpu_buffer_size(inst, buffer_type);
>>   	buffers->min_count = iris_vpu_buf_count(inst, buffer_type);
>>   }
>>   
>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> index 29cf392ca2566da286ea3e928ce4a22c2e970cc8..e1788c266bb1080921f17248fd5ee60156b3143d 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> @@ -911,7 +911,7 @@ static int iris_hfi_gen1_set_bufsize(struct iris_inst *inst, u32 plane)
>>   
>>   	if (iris_split_mode_enabled(inst)) {
>>   		bufsz.type = HFI_BUFFER_OUTPUT;
>> -		bufsz.size = iris_vpu_buf_size(inst, BUF_DPB);
>> +		bufsz.size = inst->core->iris_platform_data->get_vpu_buffer_size(inst, BUF_DPB);
>>   
>>   		ret = hfi_gen1_set_property(inst, ptype, &bufsz, sizeof(bufsz));
>>   		if (ret)
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> index 96fa7b1bb592441e85664da408ea4ba42c9a15b5..7057c4cd1a9ebefa02c855014e5f19993da58e38 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> @@ -7,6 +7,7 @@
>>   #define __IRIS_PLATFORM_COMMON_H__
>>   
>>   #include <linux/bits.h>
>> +#include "iris_buffer.h"
>>   
>>   struct iris_core;
>>   struct iris_inst;
>> @@ -189,6 +190,7 @@ struct iris_platform_data {
>>   	void (*init_hfi_command_ops)(struct iris_core *core);
>>   	void (*init_hfi_response_ops)(struct iris_core *core);
>>   	struct iris_inst *(*get_instance)(void);
>> +	u32 (*get_vpu_buffer_size)(struct iris_inst *inst, enum iris_buffer_type buffer_type);
>>   	const struct vpu_ops *vpu_ops;
>>   	void (*set_preset_registers)(struct iris_core *core);
>>   	const struct icc_info *icc_tbl;
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
>> index cf4b92f534b272a0a1ac2a0e7bb9316501374332..78a04e76de7c00703b84bd3c1c6e9a884ee7cebe 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
>> @@ -8,6 +8,7 @@
>>   #include "iris_hfi_gen2.h"
>>   #include "iris_hfi_gen2_defines.h"
>>   #include "iris_platform_common.h"
>> +#include "iris_vpu_buffer.h"
>>   #include "iris_vpu_common.h"
>>   
>>   #include "iris_platform_qcs8300.h"
>> @@ -738,6 +739,7 @@ struct iris_platform_data sm8550_data = {
>>   	.get_instance = iris_hfi_gen2_get_instance,
>>   	.init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
>>   	.init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
>> +	.get_vpu_buffer_size = iris_vpu_buf_size,
>>   	.vpu_ops = &iris_vpu3_ops,
>>   	.set_preset_registers = iris_set_sm8550_preset_registers,
>>   	.icc_tbl = sm8550_icc_table,
>> @@ -827,6 +829,7 @@ struct iris_platform_data sm8650_data = {
>>   	.get_instance = iris_hfi_gen2_get_instance,
>>   	.init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
>>   	.init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
>> +	.get_vpu_buffer_size = iris_vpu33x_buf_size,
>>   	.vpu_ops = &iris_vpu33_ops,
>>   	.set_preset_registers = iris_set_sm8550_preset_registers,
>>   	.icc_tbl = sm8550_icc_table,
>> @@ -916,6 +919,7 @@ struct iris_platform_data qcs8300_data = {
>>   	.get_instance = iris_hfi_gen2_get_instance,
>>   	.init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
>>   	.init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
>> +	.get_vpu_buffer_size = iris_vpu_buf_size,
>>   	.vpu_ops = &iris_vpu3_ops,
>>   	.set_preset_registers = iris_set_sm8550_preset_registers,
>>   	.icc_tbl = sm8550_icc_table,
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> index 978d0130d43b5f6febb65430a9bbe3932e8f24df..16486284f8acccf6a95a27f6003e885226e28f4d 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> @@ -9,6 +9,7 @@
>>   #include "iris_resources.h"
>>   #include "iris_hfi_gen1.h"
>>   #include "iris_hfi_gen1_defines.h"
>> +#include "iris_vpu_buffer.h"
>>   #include "iris_vpu_common.h"
>>   
>>   #define BITRATE_MIN		32000
>> @@ -317,6 +318,7 @@ struct iris_platform_data sm8250_data = {
>>   	.get_instance = iris_hfi_gen1_get_instance,
>>   	.init_hfi_command_ops = &iris_hfi_gen1_command_ops_init,
>>   	.init_hfi_response_ops = iris_hfi_gen1_response_ops_init,
>> +	.get_vpu_buffer_size = iris_vpu_buf_size,
>>   	.vpu_ops = &iris_vpu2_ops,
>>   	.set_preset_registers = iris_set_sm8250_preset_registers,
>>   	.icc_tbl = sm8250_icc_table,
>> diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
>> index 34a9094201ccd11d30a776f284ede8248d8017a9..9cb7701722c3644ef4c369fa58490ac83258ea7e 100644
>> --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
>> +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
>> @@ -867,6 +867,34 @@ u32 size_vpss_line_buf(u32 num_vpp_pipes_enc, u32 frame_height_coded,
>>   		      (((((max_t(u32, (frame_width_coded),
>>   				 (frame_height_coded)) + 3) >> 2) << 5) + 256) * 16)), 256);
>>   }
>> +static inline
>> +u32 size_vpss_line_buf_vpu33x(u32 num_vpp_pipes_enc, u32 frame_height_coded,
>> +			      u32 frame_width_coded)
>> +{
>> +	u32 vpss_4tap_top = 0, vpss_4tap_left = 0, vpss_div2_top = 0;
>> +	u32 vpss_div2_left = 0, vpss_top_lb = 0, vpss_left_lb = 0;
>> +	u32 size_left = 0, size_top = 0;
>> +
>> +	vpss_4tap_top = (max_t(u32, frame_width_coded, frame_height_coded) * 2) + 3;
>> +	vpss_4tap_top >>= 2;
>> +	vpss_4tap_top <<= 4;
>> +	vpss_4tap_top += 256;
> 
> Would it be better if combined?
> vpss_4tap_top = ((((max(frame_width_coded, frame_height_coded) * 2) + 3) >>
> 2) << 4) + 256;

Probably, but I don't know how to format it correctly.

Neil

> 
> Thanks,
> Dikshita
> 
>> +	vpss_4tap_left = (((8192 + 3) >> 2) << 5) + 64;
>> +	vpss_div2_top = max_t(u32, frame_width_coded, frame_height_coded) + 3;
>> +	vpss_div2_top >>= 2;
>> +	vpss_div2_top <<= 4;
>> +	vpss_div2_top += 256;
>> +	vpss_div2_left = (max_t(u32, frame_width_coded, frame_height_coded) * 2) + 3;
>> +	vpss_div2_left >>= 2;
>> +	vpss_div2_left <<= 5;
>> +	vpss_div2_left += 64;
>> +	vpss_top_lb = (frame_width_coded + 1) << 3;
>> +	vpss_left_lb = (frame_height_coded << 3) * num_vpp_pipes_enc;
>> +	size_left = (vpss_4tap_left + vpss_div2_left) * 2 * num_vpp_pipes_enc;
>> +	size_top = (vpss_4tap_top + vpss_div2_top) * 2;
>> +
>> +	return ALIGN(size_left + size_top + vpss_top_lb + vpss_left_lb, DMA_ALIGNMENT);
>> +}
>>   


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ