mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v3 0/5] Wave515 decoder IP support
@ 2024-04-05 16:41 Ivan Bornyakov
  2024-04-05 16:41 ` [PATCH v3 1/5] media: chips-media: wave5: support decoding HEVC Main10 profile Ivan Bornyakov
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Ivan Bornyakov @ 2024-04-05 16:41 UTC (permalink / raw)
  To: Nas Chung, Jackson Lee, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke
  Cc: Ivan Bornyakov, linux-media, linux-kernel

Initial support for Wave515 multi-decoder IP among other refinements.
This was tested on FPGA prototype, so wave5_dt_ids[] was not expanded.

fluster score for JCT-VC-HEVC_V1 testsuite with
GStreamer-H.265-V4L2-Gst1.0 decoder is 132/147

The issue with Main10 tests is that fluster expects decoded file to be
in yuv420p10le format while this driver decodes HEVC Main10 into 8-bit
yuv420p. Though result is looks alright to the naked eye, proper
decoding into yuv420p10le is to be added.

The rest failed fluster tests are common with Wave521.

ChangeLog:
  v1:
https://lore.kernel.org/linux-media/20240318144225.30835-1-brnkv.i1@gmail.com/
  v2:
https://lore.kernel.org/linux-media/20240325064102.9278-1-brnkv.i1@gmail.com/
    * drop patch "dt-bindings: media: cnm,wave521c: drop resets restriction"
      The only user of Wave5 in mainline is TI K3 boards, thus there is
      no real need to alter dt-bindings
    * in patch "media: chips-media: wave5: support decoding HEVC Main10 profile"
      add check for flag "support_hevc10bit_dec"
    * in patch "media: chips-media: wave5: support reset lines" move
      reset_control_deassert() out of else branch, add
      reset_control_assert() to probe error path.
    * rework patch "media: chips-media: wave5: drop "sram-size" DT prop"
       - don't move alloc/free form device open/close
       - intead of exact configuration of reserved SRAM memory in DT and
	 allocating all of it, allocate all available SRAM memory up to
	 WAVE5_MAX_SRAM_SIZE from whatever pool provided.
    * adjust patch "media: chips-media: wave5: support Wave515 decoder"
      according to changes in patches
      "media: chips-media: wave5: support decoding HEVC Main10 profile" and
      "media: chips-media: wave5: drop "sram-size" DT prop"
  v3:
    * reword patch "media: chips-media: wave5: separate irq setup routine"
      a bit.
    * in patch "media: chips-media: wave5: drop "sram-size" DT prop"
       - move MAX_SRAM_SIZE define into match_data->sram_size
       - add placeholders for validation that allocated SRAM memory is
	 enough to encode/decode bitstream of given resolution before
	 setting W5_USE_SEC_AXI and W5_CMD_ENC_PIC_USE_SEC_AXI registers
       - reword accordingly
    * in patch "media: chips-media: wave5: support Wave515 decoder"
       - add comments around SRAM memory allocation/freeing about
	 Wave515 specifics
       - add comments about BSOPTION_RD_PTR_VALID_FLAG bit in
	 W5_BS_OPTION register
       - add W[AVE]521_ prefix to defines, for wich there are W[AVE]515_
	 alternatieves
       - add semi-magic Wave515 specific formulas to estimate SRAM usage

Ivan Bornyakov (5):
  media: chips-media: wave5: support decoding HEVC Main10 profile
  media: chips-media: wave5: support reset lines
  media: chips-media: wave5: separate irq setup routine
  media: chips-media: wave5: drop "sram-size" DT prop
  media: chips-media: wave5: support Wave515 decoder

 .../platform/chips-media/wave5/wave5-helper.c |   8 +-
 .../platform/chips-media/wave5/wave5-hw.c     | 395 +++++++++++++-----
 .../chips-media/wave5/wave5-regdefine.h       |   5 +
 .../platform/chips-media/wave5/wave5-vdi.c    |  27 +-
 .../chips-media/wave5/wave5-vpu-dec.c         |  51 ++-
 .../chips-media/wave5/wave5-vpu-enc.c         |   2 +-
 .../platform/chips-media/wave5/wave5-vpu.c    |  35 +-
 .../platform/chips-media/wave5/wave5-vpuapi.h |   3 +
 .../chips-media/wave5/wave5-vpuconfig.h       |  16 +-
 .../media/platform/chips-media/wave5/wave5.h  |   6 +
 10 files changed, 407 insertions(+), 141 deletions(-)

-- 
2.44.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3 1/5] media: chips-media: wave5: support decoding HEVC Main10 profile
  2024-04-05 16:41 [PATCH v3 0/5] Wave515 decoder IP support Ivan Bornyakov
@ 2024-04-05 16:41 ` Ivan Bornyakov
  2024-04-05 16:41 ` [PATCH v3 2/5] media: chips-media: wave5: support reset lines Ivan Bornyakov
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Ivan Bornyakov @ 2024-04-05 16:41 UTC (permalink / raw)
  To: Nas Chung, Jackson Lee, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke
  Cc: Ivan Bornyakov, linux-media, linux-kernel

Add support for decoding HEVC Main10 profile by scaling FBC buffer
stride and size by the factor of (bitdepth / 8).

Signed-off-by: Ivan Bornyakov <brnkv.i1@gmail.com>
---
 .../chips-media/wave5/wave5-vpu-dec.c         | 30 +++++++++++--------
 .../platform/chips-media/wave5/wave5-vpuapi.h |  1 +
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
index ef227af72348..5a71a711f2e8 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
@@ -1055,6 +1055,22 @@ static int wave5_prepare_fb(struct vpu_instance *inst)
 	int ret, i;
 	struct v4l2_m2m_buffer *buf, *n;
 	struct v4l2_m2m_ctx *m2m_ctx = inst->v4l2_fh.m2m_ctx;
+	u32 bitdepth = inst->codec_info->dec_info.initial_info.luma_bitdepth;
+
+	switch (bitdepth) {
+	case 8:
+		break;
+	case 10:
+		if (inst->std == W_HEVC_DEC &&
+		    inst->dev->attr.support_hevc10bit_dec)
+			break;
+
+		fallthrough;
+	default:
+		dev_err(inst->dev->dev, "no support for %d bit depth\n", bitdepth);
+
+		return -EINVAL;
+	}
 
 	linear_num = v4l2_m2m_num_dst_bufs_ready(m2m_ctx);
 	non_linear_num = inst->fbc_buf_count;
@@ -1063,7 +1079,7 @@ static int wave5_prepare_fb(struct vpu_instance *inst)
 		struct frame_buffer *frame = &inst->frame_buf[i];
 		struct vpu_buf *vframe = &inst->frame_vbuf[i];
 
-		fb_stride = inst->dst_fmt.width;
+		fb_stride = ALIGN(inst->dst_fmt.width * bitdepth / 8, 32);
 		fb_height = ALIGN(inst->dst_fmt.height, 32);
 		luma_size = fb_stride * fb_height;
 
@@ -1408,22 +1424,10 @@ static int wave5_vpu_dec_start_streaming(struct vb2_queue *q, unsigned int count
 		if (ret)
 			goto free_bitstream_vbuf;
 	} else if (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
-		struct dec_initial_info *initial_info =
-			&inst->codec_info->dec_info.initial_info;
-
 		if (inst->state == VPU_INST_STATE_STOP)
 			ret = switch_state(inst, VPU_INST_STATE_INIT_SEQ);
 		if (ret)
 			goto return_buffers;
-
-		if (inst->state == VPU_INST_STATE_INIT_SEQ) {
-			if (initial_info->luma_bitdepth != 8) {
-				dev_info(inst->dev->dev, "%s: no support for %d bit depth",
-					 __func__, initial_info->luma_bitdepth);
-				ret = -EINVAL;
-				goto return_buffers;
-			}
-		}
 	}
 
 	return ret;
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
index 352f6e904e50..465ff9dfe8b1 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
@@ -327,6 +327,7 @@ struct vpu_attr {
 	u32 support_backbone: 1;
 	u32 support_avc10bit_enc: 1;
 	u32 support_hevc10bit_enc: 1;
+	u32 support_hevc10bit_dec: 1;
 	u32 support_vcore_backbone: 1;
 	u32 support_vcpu_backbone: 1;
 };
-- 
2.44.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3 2/5] media: chips-media: wave5: support reset lines
  2024-04-05 16:41 [PATCH v3 0/5] Wave515 decoder IP support Ivan Bornyakov
  2024-04-05 16:41 ` [PATCH v3 1/5] media: chips-media: wave5: support decoding HEVC Main10 profile Ivan Bornyakov
@ 2024-04-05 16:41 ` Ivan Bornyakov
  2024-04-05 16:41 ` [PATCH v3 3/5] media: chips-media: wave5: separate irq setup routine Ivan Bornyakov
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Ivan Bornyakov @ 2024-04-05 16:41 UTC (permalink / raw)
  To: Nas Chung, Jackson Lee, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke
  Cc: Ivan Bornyakov, linux-media, linux-kernel

Add initial support for optional reset lines. For now, simply deassert
resets on driver probe and assert them back on driver remove.

Signed-off-by: Ivan Bornyakov <brnkv.i1@gmail.com>
---
 .../media/platform/chips-media/wave5/wave5-vpu.c | 16 +++++++++++++++-
 .../platform/chips-media/wave5/wave5-vpuapi.h    |  1 +
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
index 1b3df5b04249..1e631da58e15 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
@@ -10,6 +10,7 @@
 #include <linux/clk.h>
 #include <linux/firmware.h>
 #include <linux/interrupt.h>
+#include <linux/reset.h>
 #include "wave5-vpu.h"
 #include "wave5-regdefine.h"
 #include "wave5-vpuconfig.h"
@@ -151,6 +152,16 @@ static int wave5_vpu_probe(struct platform_device *pdev)
 	dev_set_drvdata(&pdev->dev, dev);
 	dev->dev = &pdev->dev;
 
+	dev->resets = devm_reset_control_array_get_optional_exclusive(&pdev->dev);
+	if (IS_ERR(dev->resets)) {
+		return dev_err_probe(&pdev->dev, PTR_ERR(dev->resets),
+				     "Failed to get reset control\n");
+	}
+
+	ret = reset_control_deassert(dev->resets);
+	if (ret)
+		return dev_err_probe(&pdev->dev, ret, "Failed to deassert resets\n");
+
 	ret = devm_clk_bulk_get_all(&pdev->dev, &dev->clks);
 
 	/* continue without clock, assume externally managed */
@@ -163,7 +174,7 @@ static int wave5_vpu_probe(struct platform_device *pdev)
 	ret = clk_bulk_prepare_enable(dev->num_clks, dev->clks);
 	if (ret) {
 		dev_err(&pdev->dev, "Enabling clocks, fail: %d\n", ret);
-		return ret;
+		goto err_reset_assert;
 	}
 
 	ret = of_property_read_u32(pdev->dev.of_node, "sram-size",
@@ -246,6 +257,8 @@ static int wave5_vpu_probe(struct platform_device *pdev)
 	wave5_vdi_release(&pdev->dev);
 err_clk_dis:
 	clk_bulk_disable_unprepare(dev->num_clks, dev->clks);
+err_reset_assert:
+	reset_control_assert(dev->resets);
 
 	return ret;
 }
@@ -256,6 +269,7 @@ static void wave5_vpu_remove(struct platform_device *pdev)
 
 	mutex_destroy(&dev->dev_lock);
 	mutex_destroy(&dev->hw_lock);
+	reset_control_assert(dev->resets);
 	clk_bulk_disable_unprepare(dev->num_clks, dev->clks);
 	wave5_vpu_enc_unregister_device(dev);
 	wave5_vpu_dec_unregister_device(dev);
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
index 465ff9dfe8b1..da530fd98964 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
@@ -758,6 +758,7 @@ struct vpu_device {
 	struct ida inst_ida;
 	struct clk_bulk_data *clks;
 	int num_clks;
+	struct reset_control *resets;
 };
 
 struct vpu_instance;
-- 
2.44.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3 3/5] media: chips-media: wave5: separate irq setup routine
  2024-04-05 16:41 [PATCH v3 0/5] Wave515 decoder IP support Ivan Bornyakov
  2024-04-05 16:41 ` [PATCH v3 1/5] media: chips-media: wave5: support decoding HEVC Main10 profile Ivan Bornyakov
  2024-04-05 16:41 ` [PATCH v3 2/5] media: chips-media: wave5: support reset lines Ivan Bornyakov
@ 2024-04-05 16:41 ` Ivan Bornyakov
  2024-04-05 16:41 ` [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT prop Ivan Bornyakov
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Ivan Bornyakov @ 2024-04-05 16:41 UTC (permalink / raw)
  To: Nas Chung, Jackson Lee, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke
  Cc: Ivan Bornyakov, linux-media, linux-kernel

Implement a separate setup routine for interrupts to reduce code
duplication. Also enable interrupts based on vpu_attr->support_encoders
and vpu_attr->support_decoders fields to facilitate support for other
Wave5xx IPs, because not all of them are both encoders and decoders.

Signed-off-by: Ivan Bornyakov <brnkv.i1@gmail.com>
---
 .../platform/chips-media/wave5/wave5-hw.c     | 53 +++++++++----------
 1 file changed, 24 insertions(+), 29 deletions(-)

diff --git a/drivers/media/platform/chips-media/wave5/wave5-hw.c b/drivers/media/platform/chips-media/wave5/wave5-hw.c
index 2d82791f575e..cdd0a0948a94 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-hw.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-hw.c
@@ -299,6 +299,27 @@ static int wave5_send_query(struct vpu_device *vpu_dev, struct vpu_instance *ins
 	return wave5_vpu_firmware_command_queue_error_check(vpu_dev, NULL);
 }
 
+static void setup_wave5_interrupts(struct vpu_device *vpu_dev)
+{
+	u32 reg_val = 0;
+
+	if (vpu_dev->attr.support_encoders) {
+		/* Encoder interrupt */
+		reg_val |= BIT(INT_WAVE5_ENC_SET_PARAM);
+		reg_val |= BIT(INT_WAVE5_ENC_PIC);
+		reg_val |= BIT(INT_WAVE5_BSBUF_FULL);
+	}
+
+	if (vpu_dev->attr.support_decoders) {
+		/* Decoder interrupt */
+		reg_val |= BIT(INT_WAVE5_INIT_SEQ);
+		reg_val |= BIT(INT_WAVE5_DEC_PIC);
+		reg_val |= BIT(INT_WAVE5_BSBUF_EMPTY);
+	}
+
+	return vpu_write_reg(vpu_dev, W5_VPU_VINT_ENABLE, reg_val);
+}
+
 static int setup_wave5_properties(struct device *dev)
 {
 	struct vpu_device *vpu_dev = dev_get_drvdata(dev);
@@ -340,6 +361,8 @@ static int setup_wave5_properties(struct device *dev)
 	p_attr->support_vcpu_backbone = FIELD_GET(FEATURE_VCPU_BACKBONE, hw_config_def0);
 	p_attr->support_vcore_backbone = FIELD_GET(FEATURE_VCORE_BACKBONE, hw_config_def0);
 
+	setup_wave5_interrupts(vpu_dev);
+
 	return 0;
 }
 
@@ -417,16 +440,6 @@ int wave5_vpu_init(struct device *dev, u8 *fw, size_t size)
 	wave5_fio_writel(vpu_dev, W5_BACKBONE_AXI_PARAM, 0);
 	vpu_write_reg(vpu_dev, W5_SEC_AXI_PARAM, 0);
 
-	/* Encoder interrupt */
-	reg_val = BIT(INT_WAVE5_ENC_SET_PARAM);
-	reg_val |= BIT(INT_WAVE5_ENC_PIC);
-	reg_val |= BIT(INT_WAVE5_BSBUF_FULL);
-	/* Decoder interrupt */
-	reg_val |= BIT(INT_WAVE5_INIT_SEQ);
-	reg_val |= BIT(INT_WAVE5_DEC_PIC);
-	reg_val |= BIT(INT_WAVE5_BSBUF_EMPTY);
-	vpu_write_reg(vpu_dev, W5_VPU_VINT_ENABLE, reg_val);
-
 	reg_val = vpu_read_reg(vpu_dev, W5_VPU_RET_VPU_CONFIG0);
 	if (FIELD_GET(FEATURE_BACKBONE, reg_val)) {
 		reg_val = ((WAVE5_PROC_AXI_ID << 28) |
@@ -1034,16 +1047,6 @@ int wave5_vpu_re_init(struct device *dev, u8 *fw, size_t size)
 		wave5_fio_writel(vpu_dev, W5_BACKBONE_AXI_PARAM, 0);
 		vpu_write_reg(vpu_dev, W5_SEC_AXI_PARAM, 0);
 
-		/* Encoder interrupt */
-		reg_val = BIT(INT_WAVE5_ENC_SET_PARAM);
-		reg_val |= BIT(INT_WAVE5_ENC_PIC);
-		reg_val |= BIT(INT_WAVE5_BSBUF_FULL);
-		/* Decoder interrupt */
-		reg_val |= BIT(INT_WAVE5_INIT_SEQ);
-		reg_val |= BIT(INT_WAVE5_DEC_PIC);
-		reg_val |= BIT(INT_WAVE5_BSBUF_EMPTY);
-		vpu_write_reg(vpu_dev, W5_VPU_VINT_ENABLE, reg_val);
-
 		reg_val = vpu_read_reg(vpu_dev, W5_VPU_RET_VPU_CONFIG0);
 		if (FIELD_GET(FEATURE_BACKBONE, reg_val)) {
 			reg_val = ((WAVE5_PROC_AXI_ID << 28) |
@@ -1134,15 +1137,7 @@ static int wave5_vpu_sleep_wake(struct device *dev, bool i_sleep_wake, const uin
 		wave5_fio_writel(vpu_dev, W5_BACKBONE_AXI_PARAM, 0);
 		vpu_write_reg(vpu_dev, W5_SEC_AXI_PARAM, 0);
 
-		/* Encoder interrupt */
-		reg_val = BIT(INT_WAVE5_ENC_SET_PARAM);
-		reg_val |= BIT(INT_WAVE5_ENC_PIC);
-		reg_val |= BIT(INT_WAVE5_BSBUF_FULL);
-		/* Decoder interrupt */
-		reg_val |= BIT(INT_WAVE5_INIT_SEQ);
-		reg_val |= BIT(INT_WAVE5_DEC_PIC);
-		reg_val |= BIT(INT_WAVE5_BSBUF_EMPTY);
-		vpu_write_reg(vpu_dev, W5_VPU_VINT_ENABLE, reg_val);
+		setup_wave5_interrupts(vpu_dev);
 
 		reg_val = vpu_read_reg(vpu_dev, W5_VPU_RET_VPU_CONFIG0);
 		if (FIELD_GET(FEATURE_BACKBONE, reg_val)) {
-- 
2.44.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT prop
  2024-04-05 16:41 [PATCH v3 0/5] Wave515 decoder IP support Ivan Bornyakov
                   ` (2 preceding siblings ...)
  2024-04-05 16:41 ` [PATCH v3 3/5] media: chips-media: wave5: separate irq setup routine Ivan Bornyakov
@ 2024-04-05 16:41 ` Ivan Bornyakov
  2024-04-09  4:50   ` jackson.lee
  2024-04-05 16:41 ` [PATCH v3 5/5] media: chips-media: wave5: support Wave515 decoder Ivan Bornyakov
  2024-04-11  8:13 ` [PATCH v3 0/5] Wave515 decoder IP support jackson.lee
  5 siblings, 1 reply; 12+ messages in thread
From: Ivan Bornyakov @ 2024-04-05 16:41 UTC (permalink / raw)
  To: Nas Chung, Jackson Lee, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke
  Cc: Ivan Bornyakov, linux-media, linux-kernel

Move excessive "sram-size" device-tree property to device match data.
Also change SRAM memory allocation strategy: instead of allocation exact
sram_size bytes, allocate all available SRAM memory up to sram_size.
Add placeholders wave5_vpu_dec_validate_sec_axi() and
wave5_vpu_enc_validate_sec_axi() for validation that allocated SRAM
memory is enough to decode/encode bitstream of given resolution.

Signed-off-by: Ivan Bornyakov <brnkv.i1@gmail.com>
---
 .../platform/chips-media/wave5/wave5-hw.c     | 62 +++++++++++++++++--
 .../platform/chips-media/wave5/wave5-vdi.c    | 21 ++++---
 .../platform/chips-media/wave5/wave5-vpu.c    | 11 ++--
 3 files changed, 72 insertions(+), 22 deletions(-)

diff --git a/drivers/media/platform/chips-media/wave5/wave5-hw.c b/drivers/media/platform/chips-media/wave5/wave5-hw.c
index cdd0a0948a94..36f2fc818013 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-hw.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-hw.c
@@ -843,6 +843,36 @@ int wave5_vpu_dec_register_framebuffer(struct vpu_instance *inst, struct frame_b
 	return ret;
 }
 
+static u32 wave5_vpu_dec_validate_sec_axi(struct vpu_instance *inst)
+{
+	struct dec_info *p_dec_info = &inst->codec_info->dec_info;
+	u32 bit_size = 0, ip_size = 0, lf_size = 0, ret = 0;
+	u32 sram_size = inst->dev->sram_size;
+
+	if (!sram_size)
+		return 0;
+
+	/*
+	 * TODO: calculate bit_size, ip_size, lf_size from inst->src_fmt.width
+	 * and inst->codec_info->dec_info.initial_info.luma_bitdepth
+	 */
+
+	if (p_dec_info->sec_axi_info.use_bit_enable && sram_size >= bit_size) {
+		ret |= BIT(0);
+		sram_size -= bit_size;
+	}
+
+	if (p_dec_info->sec_axi_info.use_ip_enable && sram_size >= ip_size) {
+		ret |= BIT(9);
+		sram_size -= ip_size;
+	}
+
+	if (p_dec_info->sec_axi_info.use_lf_row_enable && sram_size >= lf_size)
+		ret |= BIT(15);
+
+	return ret;
+}
+
 int wave5_vpu_decode(struct vpu_instance *inst, u32 *fail_res)
 {
 	u32 reg_val;
@@ -855,9 +885,7 @@ int wave5_vpu_decode(struct vpu_instance *inst, u32 *fail_res)
 	vpu_write_reg(inst->dev, W5_BS_OPTION, get_bitstream_options(p_dec_info));
 
 	/* secondary AXI */
-	reg_val = p_dec_info->sec_axi_info.use_bit_enable |
-		(p_dec_info->sec_axi_info.use_ip_enable << 9) |
-		(p_dec_info->sec_axi_info.use_lf_row_enable << 15);
+	reg_val = wave5_vpu_dec_validate_sec_axi(inst);
 	vpu_write_reg(inst->dev, W5_USE_SEC_AXI, reg_val);
 
 	/* set attributes of user buffer */
@@ -1938,6 +1966,31 @@ int wave5_vpu_enc_register_framebuffer(struct device *dev, struct vpu_instance *
 	return ret;
 }
 
+static u32 wave5_vpu_enc_validate_sec_axi(struct vpu_instance *inst)
+{
+	struct enc_info *p_enc_info = &inst->codec_info->enc_info;
+	u32 rdo_size = 0, lf_size = 0, ret = 0;
+	u32 sram_size = inst->dev->sram_size;
+
+	if (!sram_size)
+		return 0;
+
+	/*
+	 * TODO: calculate rdo_size and lf_size from inst->src_fmt.width and
+	 * inst->codec_info->enc_info.open_param.wave_param.internal_bit_depth
+	 */
+
+	if (p_enc_info->sec_axi_info.use_enc_rdo_enable && sram_size >= rdo_size) {
+		ret |= BIT(11);
+		sram_size -= rdo_size;
+	}
+
+	if (p_enc_info->sec_axi_info.use_enc_lf_enable && sram_size >= lf_size)
+		ret |= BIT(15);
+
+	return ret;
+}
+
 int wave5_vpu_encode(struct vpu_instance *inst, struct enc_param *option, u32 *fail_res)
 {
 	u32 src_frame_format;
@@ -1959,8 +2012,7 @@ int wave5_vpu_encode(struct vpu_instance *inst, struct enc_param *option, u32 *f
 
 	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_SRC_AXI_SEL, DEFAULT_SRC_AXI);
 	/* secondary AXI */
-	reg_val = (p_enc_info->sec_axi_info.use_enc_rdo_enable << 11) |
-		(p_enc_info->sec_axi_info.use_enc_lf_enable << 15);
+	reg_val = wave5_vpu_enc_validate_sec_axi(inst);
 	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_USE_SEC_AXI, reg_val);
 
 	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_REPORT_PARAM, 0);
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vdi.c b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
index 3809f70bc0b4..556de2f043fe 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vdi.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
@@ -174,16 +174,19 @@ int wave5_vdi_allocate_array(struct vpu_device *vpu_dev, struct vpu_buf *array,
 void wave5_vdi_allocate_sram(struct vpu_device *vpu_dev)
 {
 	struct vpu_buf *vb = &vpu_dev->sram_buf;
+	dma_addr_t daddr;
+	void *vaddr;
+	size_t size;
 
-	if (!vpu_dev->sram_pool || !vpu_dev->sram_size)
+	if (!vpu_dev->sram_pool || vb->vaddr)
 		return;
 
-	if (!vb->vaddr) {
-		vb->size = vpu_dev->sram_size;
-		vb->vaddr = gen_pool_dma_alloc(vpu_dev->sram_pool, vb->size,
-					       &vb->daddr);
-		if (!vb->vaddr)
-			vb->size = 0;
+	size = min_t(size_t, vpu_dev->sram_size, gen_pool_avail(vpu_dev->sram_pool));
+	vaddr = gen_pool_dma_alloc(vpu_dev->sram_pool, size, &daddr);
+	if (vaddr) {
+		vb->vaddr = vaddr;
+		vb->daddr = daddr;
+		vb->size = size;
 	}
 
 	dev_dbg(vpu_dev->dev, "%s: sram daddr: %pad, size: %zu, vaddr: 0x%p\n",
@@ -197,9 +200,7 @@ void wave5_vdi_free_sram(struct vpu_device *vpu_dev)
 	if (!vb->size || !vb->vaddr)
 		return;
 
-	if (vb->vaddr)
-		gen_pool_free(vpu_dev->sram_pool, (unsigned long)vb->vaddr,
-			      vb->size);
+	gen_pool_free(vpu_dev->sram_pool, (unsigned long)vb->vaddr, vb->size);
 
 	memset(vb, 0, sizeof(*vb));
 }
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
index 1e631da58e15..9e93969ab6db 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
@@ -25,6 +25,7 @@
 struct wave5_match_data {
 	int flags;
 	const char *fw_name;
+	u32 sram_size;
 };
 
 int wave5_vpu_wait_interrupt(struct vpu_instance *inst, unsigned int timeout)
@@ -177,17 +178,12 @@ static int wave5_vpu_probe(struct platform_device *pdev)
 		goto err_reset_assert;
 	}
 
-	ret = of_property_read_u32(pdev->dev.of_node, "sram-size",
-				   &dev->sram_size);
-	if (ret) {
-		dev_warn(&pdev->dev, "sram-size not found\n");
-		dev->sram_size = 0;
-	}
-
 	dev->sram_pool = of_gen_pool_get(pdev->dev.of_node, "sram", 0);
 	if (!dev->sram_pool)
 		dev_warn(&pdev->dev, "sram node not found\n");
 
+	dev->sram_size = match_data->sram_size;
+
 	dev->product_code = wave5_vdi_read_register(dev, VPU_PRODUCT_CODE_REGISTER);
 	ret = wave5_vdi_init(&pdev->dev);
 	if (ret < 0) {
@@ -281,6 +277,7 @@ static void wave5_vpu_remove(struct platform_device *pdev)
 static const struct wave5_match_data ti_wave521c_data = {
 	.flags = WAVE5_IS_ENC | WAVE5_IS_DEC,
 	.fw_name = "cnm/wave521c_k3_codec_fw.bin",
+	.sram_size = (64 * 1024),
 };
 
 static const struct of_device_id wave5_dt_ids[] = {
-- 
2.44.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3 5/5] media: chips-media: wave5: support Wave515 decoder
  2024-04-05 16:41 [PATCH v3 0/5] Wave515 decoder IP support Ivan Bornyakov
                   ` (3 preceding siblings ...)
  2024-04-05 16:41 ` [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT prop Ivan Bornyakov
@ 2024-04-05 16:41 ` Ivan Bornyakov
  2024-04-11  8:13 ` [PATCH v3 0/5] Wave515 decoder IP support jackson.lee
  5 siblings, 0 replies; 12+ messages in thread
From: Ivan Bornyakov @ 2024-04-05 16:41 UTC (permalink / raw)
  To: Nas Chung, Jackson Lee, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke
  Cc: Ivan Bornyakov, linux-media, linux-kernel

Add initial support for Wave515 multi-decoder IP. For now it is only
able to decode HEVC Main/Main10 profile videos into YUV420.

This was tested on FPGA prototype, so wave5_dt_ids[] was not expanded.
Users of the real hardware with Wave515 IP will have to
 * provide firmware specific to their SoC
 * add struct wave5_match_data like this:

	static const struct wave5_match_data platform_name_wave515_data = {
		.flags = WAVE5_IS_DEC,
		.fw_name = "cnm/wave515_platform_name_fw.bin",
		.sram_size = (71 * 1024),
	};

 * add item to wave5_dt_ids[] like this:

	{
		.compatible = "vendor,soc-wave515",
		.data = &platform_name_wave515_data,
	},

 * describe new compatible in
   Documentation/devicetree/bindings/media/cnm,wave521c.yaml

Signed-off-by: Ivan Bornyakov <brnkv.i1@gmail.com>
---
 .../platform/chips-media/wave5/wave5-helper.c |   8 +-
 .../platform/chips-media/wave5/wave5-hw.c     | 286 +++++++++++++-----
 .../chips-media/wave5/wave5-regdefine.h       |   5 +
 .../platform/chips-media/wave5/wave5-vdi.c    |   6 +-
 .../chips-media/wave5/wave5-vpu-dec.c         |  21 +-
 .../chips-media/wave5/wave5-vpu-enc.c         |   2 +-
 .../platform/chips-media/wave5/wave5-vpu.c    |   8 +-
 .../platform/chips-media/wave5/wave5-vpuapi.h |   1 +
 .../chips-media/wave5/wave5-vpuconfig.h       |  16 +-
 .../media/platform/chips-media/wave5/wave5.h  |   6 +
 10 files changed, 280 insertions(+), 79 deletions(-)

diff --git a/drivers/media/platform/chips-media/wave5/wave5-helper.c b/drivers/media/platform/chips-media/wave5/wave5-helper.c
index 8433ecab230c..bb89b279ca8f 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-helper.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-helper.c
@@ -29,7 +29,13 @@ void wave5_cleanup_instance(struct vpu_instance *inst)
 {
 	int i;
 
-	if (list_is_singular(&inst->list))
+	/*
+	 * For Wave515 SRAM memory is allocated at
+	 * wave5_vpu_dec_register_device() and freed at
+	 * wave5_vpu_dec_unregister_device().
+	 */
+	if (list_is_singular(&inst->list) &&
+	    inst->dev->product_code != WAVE515_CODE)
 		wave5_vdi_free_sram(inst->dev);
 
 	for (i = 0; i < inst->fbc_buf_count; i++)
diff --git a/drivers/media/platform/chips-media/wave5/wave5-hw.c b/drivers/media/platform/chips-media/wave5/wave5-hw.c
index 36f2fc818013..c89aafabc742 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-hw.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-hw.c
@@ -18,18 +18,20 @@
 #define QUEUE_REPORT_MASK		0xffff
 
 /* Encoder support fields */
-#define FEATURE_HEVC10BIT_ENC		BIT(3)
-#define FEATURE_AVC10BIT_ENC		BIT(11)
-#define FEATURE_AVC_ENCODER		BIT(1)
-#define FEATURE_HEVC_ENCODER		BIT(0)
+#define W521_FEATURE_HEVC10BIT_ENC	BIT(3)
+#define W521_FEATURE_AVC10BIT_ENC	BIT(11)
+#define W521_FEATURE_AVC_ENCODER	BIT(1)
+#define W521_FEATURE_HEVC_ENCODER	BIT(0)
 
 /* Decoder support fields */
-#define FEATURE_AVC_DECODER		BIT(3)
-#define FEATURE_HEVC_DECODER		BIT(2)
+#define W521_FEATURE_AVC_DECODER	BIT(3)
+#define W521_FEATURE_HEVC_DECODER	BIT(2)
+#define W515_FEATURE_HEVC10BIT_DEC	BIT(1)
+#define W515_FEATURE_HEVC_DECODER	BIT(0)
 
-#define FEATURE_BACKBONE		BIT(16)
-#define FEATURE_VCORE_BACKBONE		BIT(22)
-#define FEATURE_VCPU_BACKBONE		BIT(28)
+#define W521_FEATURE_BACKBONE		BIT(16)
+#define W521_FEATURE_VCORE_BACKBONE	BIT(22)
+#define W521_FEATURE_VCPU_BACKBONE	BIT(28)
 
 #define REMAP_CTRL_MAX_SIZE_BITS	((W5_REMAP_MAX_SIZE >> 12) & 0x1ff)
 #define REMAP_CTRL_REGISTER_VALUE(index)	(			\
@@ -155,6 +157,8 @@ static int wave5_wait_bus_busy(struct vpu_device *vpu_dev, unsigned int addr)
 {
 	u32 gdi_status_check_value = 0x3f;
 
+	if (vpu_dev->product_code == WAVE515_CODE)
+		gdi_status_check_value = 0x0738;
 	if (vpu_dev->product_code == WAVE521C_CODE ||
 	    vpu_dev->product_code == WAVE521_CODE ||
 	    vpu_dev->product_code == WAVE521E1_CODE)
@@ -186,6 +190,8 @@ unsigned int wave5_vpu_get_product_id(struct vpu_device *vpu_dev)
 	u32 val = vpu_read_reg(vpu_dev, W5_PRODUCT_NUMBER);
 
 	switch (val) {
+	case WAVE515_CODE:
+		return PRODUCT_ID_515;
 	case WAVE521C_CODE:
 		return PRODUCT_ID_521;
 	case WAVE521_CODE:
@@ -349,17 +355,33 @@ static int setup_wave5_properties(struct device *dev)
 	hw_config_def1 = vpu_read_reg(vpu_dev, W5_RET_STD_DEF1);
 	hw_config_feature = vpu_read_reg(vpu_dev, W5_RET_CONF_FEATURE);
 
-	p_attr->support_hevc10bit_enc = FIELD_GET(FEATURE_HEVC10BIT_ENC, hw_config_feature);
-	p_attr->support_avc10bit_enc = FIELD_GET(FEATURE_AVC10BIT_ENC, hw_config_feature);
-
-	p_attr->support_decoders = FIELD_GET(FEATURE_AVC_DECODER, hw_config_def1) << STD_AVC;
-	p_attr->support_decoders |= FIELD_GET(FEATURE_HEVC_DECODER, hw_config_def1) << STD_HEVC;
-	p_attr->support_encoders = FIELD_GET(FEATURE_AVC_ENCODER, hw_config_def1) << STD_AVC;
-	p_attr->support_encoders |= FIELD_GET(FEATURE_HEVC_ENCODER, hw_config_def1) << STD_HEVC;
-
-	p_attr->support_backbone = FIELD_GET(FEATURE_BACKBONE, hw_config_def0);
-	p_attr->support_vcpu_backbone = FIELD_GET(FEATURE_VCPU_BACKBONE, hw_config_def0);
-	p_attr->support_vcore_backbone = FIELD_GET(FEATURE_VCORE_BACKBONE, hw_config_def0);
+	if (vpu_dev->product_code == WAVE515_CODE) {
+		p_attr->support_hevc10bit_dec = FIELD_GET(W515_FEATURE_HEVC10BIT_DEC,
+							  hw_config_feature);
+		p_attr->support_decoders = FIELD_GET(W515_FEATURE_HEVC_DECODER,
+						     hw_config_def1) << STD_HEVC;
+	} else {
+		p_attr->support_hevc10bit_enc = FIELD_GET(W521_FEATURE_HEVC10BIT_ENC,
+							  hw_config_feature);
+		p_attr->support_avc10bit_enc = FIELD_GET(W521_FEATURE_AVC10BIT_ENC,
+							 hw_config_feature);
+
+		p_attr->support_decoders = FIELD_GET(W521_FEATURE_AVC_DECODER,
+						     hw_config_def1) << STD_AVC;
+		p_attr->support_decoders |= FIELD_GET(W521_FEATURE_HEVC_DECODER,
+						      hw_config_def1) << STD_HEVC;
+		p_attr->support_encoders = FIELD_GET(W521_FEATURE_AVC_ENCODER,
+						     hw_config_def1) << STD_AVC;
+		p_attr->support_encoders |= FIELD_GET(W521_FEATURE_HEVC_ENCODER,
+						      hw_config_def1) << STD_HEVC;
+
+		p_attr->support_backbone = FIELD_GET(W521_FEATURE_BACKBONE,
+						     hw_config_def0);
+		p_attr->support_vcpu_backbone = FIELD_GET(W521_FEATURE_VCPU_BACKBONE,
+							  hw_config_def0);
+		p_attr->support_vcore_backbone = FIELD_GET(W521_FEATURE_VCORE_BACKBONE,
+							   hw_config_def0);
+	}
 
 	setup_wave5_interrupts(vpu_dev);
 
@@ -403,12 +425,18 @@ int wave5_vpu_init(struct device *dev, u8 *fw, size_t size)
 	common_vb = &vpu_dev->common_mem;
 
 	code_base = common_vb->daddr;
+
+	if (vpu_dev->product_code == WAVE515_CODE)
+		code_size = WAVE515_MAX_CODE_BUF_SIZE;
+	else
+		code_size = WAVE521_MAX_CODE_BUF_SIZE;
+
 	/* ALIGN TO 4KB */
-	code_size = (WAVE5_MAX_CODE_BUF_SIZE & ~0xfff);
+	code_size &= ~0xfff;
 	if (code_size < size * 2)
 		return -EINVAL;
 
-	temp_base = common_vb->daddr + WAVE5_TEMPBUF_OFFSET;
+	temp_base = code_base + code_size;
 	temp_size = WAVE5_TEMPBUF_SIZE;
 
 	ret = wave5_vdi_write_memory(vpu_dev, common_vb, 0, fw, size);
@@ -436,12 +464,15 @@ int wave5_vpu_init(struct device *dev, u8 *fw, size_t size)
 
 	/* These register must be reset explicitly */
 	vpu_write_reg(vpu_dev, W5_HW_OPTION, 0);
-	wave5_fio_writel(vpu_dev, W5_BACKBONE_PROC_EXT_ADDR, 0);
-	wave5_fio_writel(vpu_dev, W5_BACKBONE_AXI_PARAM, 0);
-	vpu_write_reg(vpu_dev, W5_SEC_AXI_PARAM, 0);
+
+	if (vpu_dev->product_code != WAVE515_CODE) {
+		wave5_fio_writel(vpu_dev, W5_BACKBONE_PROC_EXT_ADDR, 0);
+		wave5_fio_writel(vpu_dev, W5_BACKBONE_AXI_PARAM, 0);
+		vpu_write_reg(vpu_dev, W5_SEC_AXI_PARAM, 0);
+	}
 
 	reg_val = vpu_read_reg(vpu_dev, W5_VPU_RET_VPU_CONFIG0);
-	if (FIELD_GET(FEATURE_BACKBONE, reg_val)) {
+	if (FIELD_GET(W521_FEATURE_BACKBONE, reg_val)) {
 		reg_val = ((WAVE5_PROC_AXI_ID << 28) |
 			   (WAVE5_PRP_AXI_ID << 24) |
 			   (WAVE5_FBD_Y_AXI_ID << 20) |
@@ -453,6 +484,24 @@ int wave5_vpu_init(struct device *dev, u8 *fw, size_t size)
 		wave5_fio_writel(vpu_dev, W5_BACKBONE_PROG_AXI_ID, reg_val);
 	}
 
+	if (vpu_dev->product_code == WAVE515_CODE) {
+		dma_addr_t task_buf_base;
+
+		vpu_write_reg(vpu_dev, W5_CMD_INIT_NUM_TASK_BUF, WAVE515_COMMAND_QUEUE_DEPTH);
+		vpu_write_reg(vpu_dev, W5_CMD_INIT_TASK_BUF_SIZE, WAVE515_ONE_TASKBUF_SIZE);
+
+		for (i = 0; i < WAVE515_COMMAND_QUEUE_DEPTH; i++) {
+			task_buf_base = temp_base + temp_size +
+					(i * WAVE515_ONE_TASKBUF_SIZE);
+			vpu_write_reg(vpu_dev,
+				      W5_CMD_INIT_ADDR_TASK_BUF0 + (i * 4),
+				      task_buf_base);
+		}
+
+		vpu_write_reg(vpu_dev, W515_CMD_ADDR_SEC_AXI, vpu_dev->sram_buf.daddr);
+		vpu_write_reg(vpu_dev, W515_CMD_SEC_AXI_SIZE, vpu_dev->sram_buf.size);
+	}
+
 	vpu_write_reg(vpu_dev, W5_VPU_BUSY_STATUS, 1);
 	vpu_write_reg(vpu_dev, W5_COMMAND, W5_INIT_VPU);
 	vpu_write_reg(vpu_dev, W5_VPU_REMAP_CORE_START, 1);
@@ -493,29 +542,40 @@ int wave5_vpu_build_up_dec_param(struct vpu_instance *inst,
 		return -EINVAL;
 	}
 
-	p_dec_info->vb_work.size = WAVE521DEC_WORKBUF_SIZE;
+	if (vpu_dev->product == PRODUCT_ID_515)
+		p_dec_info->vb_work.size = WAVE515DEC_WORKBUF_SIZE;
+	else
+		p_dec_info->vb_work.size = WAVE521DEC_WORKBUF_SIZE;
+
 	ret = wave5_vdi_allocate_dma_memory(inst->dev, &p_dec_info->vb_work);
 	if (ret)
 		return ret;
 
-	vpu_write_reg(inst->dev, W5_CMD_DEC_VCORE_INFO, 1);
+	if (inst->dev->product_code != WAVE515_CODE)
+		vpu_write_reg(inst->dev, W5_CMD_DEC_VCORE_INFO, 1);
 
 	wave5_vdi_clear_memory(inst->dev, &p_dec_info->vb_work);
 
 	vpu_write_reg(inst->dev, W5_ADDR_WORK_BASE, p_dec_info->vb_work.daddr);
 	vpu_write_reg(inst->dev, W5_WORK_SIZE, p_dec_info->vb_work.size);
 
-	vpu_write_reg(inst->dev, W5_CMD_ADDR_SEC_AXI, vpu_dev->sram_buf.daddr);
-	vpu_write_reg(inst->dev, W5_CMD_SEC_AXI_SIZE, vpu_dev->sram_buf.size);
+	if (inst->dev->product_code != WAVE515_CODE) {
+		vpu_write_reg(inst->dev, W5_CMD_ADDR_SEC_AXI, vpu_dev->sram_buf.daddr);
+		vpu_write_reg(inst->dev, W5_CMD_SEC_AXI_SIZE, vpu_dev->sram_buf.size);
+	}
 
 	vpu_write_reg(inst->dev, W5_CMD_DEC_BS_START_ADDR, p_dec_info->stream_buf_start_addr);
 	vpu_write_reg(inst->dev, W5_CMD_DEC_BS_SIZE, p_dec_info->stream_buf_size);
 
 	/* NOTE: SDMA reads MSB first */
 	vpu_write_reg(inst->dev, W5_CMD_BS_PARAM, BITSTREAM_ENDIANNESS_BIG_ENDIAN);
-	/* This register must be reset explicitly */
-	vpu_write_reg(inst->dev, W5_CMD_EXT_ADDR, 0);
-	vpu_write_reg(inst->dev, W5_CMD_NUM_CQ_DEPTH_M1, (COMMAND_QUEUE_DEPTH - 1));
+
+	if (inst->dev->product_code != WAVE515_CODE) {
+		/* This register must be reset explicitly */
+		vpu_write_reg(inst->dev, W5_CMD_EXT_ADDR, 0);
+		vpu_write_reg(inst->dev, W5_CMD_NUM_CQ_DEPTH_M1,
+			      WAVE521_COMMAND_QUEUE_DEPTH - 1);
+	}
 
 	ret = send_firmware_command(inst, W5_CREATE_INSTANCE, true, NULL, NULL);
 	if (ret) {
@@ -566,7 +626,7 @@ static u32 get_bitstream_options(struct dec_info *info)
 int wave5_vpu_dec_init_seq(struct vpu_instance *inst)
 {
 	struct dec_info *p_dec_info = &inst->codec_info->dec_info;
-	u32 cmd_option = INIT_SEQ_NORMAL;
+	u32 bs_option, cmd_option = INIT_SEQ_NORMAL;
 	u32 reg_val, fail_res;
 	int ret;
 
@@ -576,7 +636,13 @@ int wave5_vpu_dec_init_seq(struct vpu_instance *inst)
 	vpu_write_reg(inst->dev, W5_BS_RD_PTR, p_dec_info->stream_rd_ptr);
 	vpu_write_reg(inst->dev, W5_BS_WR_PTR, p_dec_info->stream_wr_ptr);
 
-	vpu_write_reg(inst->dev, W5_BS_OPTION, get_bitstream_options(p_dec_info));
+	bs_option = get_bitstream_options(p_dec_info);
+
+	/* Without RD_PTR_VALID_FLAG Wave515 ignores RD_PTR value */
+	if (inst->dev->product_code == WAVE515_CODE)
+		bs_option |= BSOPTION_RD_PTR_VALID_FLAG;
+
+	vpu_write_reg(inst->dev, W5_BS_OPTION, bs_option);
 
 	vpu_write_reg(inst->dev, W5_COMMAND_OPTION, cmd_option);
 	vpu_write_reg(inst->dev, W5_CMD_DEC_USER_MASK, p_dec_info->user_data_enable);
@@ -642,10 +708,12 @@ static void wave5_get_dec_seq_result(struct vpu_instance *inst, struct dec_initi
 		info->profile = FIELD_GET(SEQ_PARAM_PROFILE_MASK, reg_val);
 	}
 
-	info->vlc_buf_size = vpu_read_reg(inst->dev, W5_RET_VLC_BUF_SIZE);
-	info->param_buf_size = vpu_read_reg(inst->dev, W5_RET_PARAM_BUF_SIZE);
-	p_dec_info->vlc_buf_size = info->vlc_buf_size;
-	p_dec_info->param_buf_size = info->param_buf_size;
+	if (inst->dev->product_code != WAVE515_CODE) {
+		info->vlc_buf_size = vpu_read_reg(inst->dev, W5_RET_VLC_BUF_SIZE);
+		info->param_buf_size = vpu_read_reg(inst->dev, W5_RET_PARAM_BUF_SIZE);
+		p_dec_info->vlc_buf_size = info->vlc_buf_size;
+		p_dec_info->param_buf_size = info->param_buf_size;
+	}
 }
 
 int wave5_vpu_dec_get_seq_info(struct vpu_instance *inst, struct dec_initial_info *info)
@@ -747,22 +815,27 @@ int wave5_vpu_dec_register_framebuffer(struct vpu_instance *inst, struct frame_b
 
 		pic_size = (init_info->pic_width << 16) | (init_info->pic_height);
 
-		vb_buf.size = (p_dec_info->vlc_buf_size * VLC_BUF_NUM) +
-				(p_dec_info->param_buf_size * COMMAND_QUEUE_DEPTH);
-		vb_buf.daddr = 0;
+		if (inst->dev->product_code != WAVE515_CODE) {
+			vb_buf.size = (p_dec_info->vlc_buf_size * VLC_BUF_NUM) +
+				(p_dec_info->param_buf_size * WAVE521_COMMAND_QUEUE_DEPTH);
+			vb_buf.daddr = 0;
 
-		if (vb_buf.size != p_dec_info->vb_task.size) {
-			wave5_vdi_free_dma_memory(inst->dev, &p_dec_info->vb_task);
-			ret = wave5_vdi_allocate_dma_memory(inst->dev, &vb_buf);
-			if (ret)
-				goto free_fbc_c_tbl_buffers;
+			if (vb_buf.size != p_dec_info->vb_task.size) {
+				wave5_vdi_free_dma_memory(inst->dev,
+							  &p_dec_info->vb_task);
+				ret = wave5_vdi_allocate_dma_memory(inst->dev,
+								    &vb_buf);
+				if (ret)
+					goto free_fbc_c_tbl_buffers;
 
-			p_dec_info->vb_task = vb_buf;
-		}
+				p_dec_info->vb_task = vb_buf;
+			}
 
-		vpu_write_reg(inst->dev, W5_CMD_SET_FB_ADDR_TASK_BUF,
-			      p_dec_info->vb_task.daddr);
-		vpu_write_reg(inst->dev, W5_CMD_SET_FB_TASK_BUF_SIZE, vb_buf.size);
+			vpu_write_reg(inst->dev, W5_CMD_SET_FB_ADDR_TASK_BUF,
+				      p_dec_info->vb_task.daddr);
+			vpu_write_reg(inst->dev, W5_CMD_SET_FB_TASK_BUF_SIZE,
+				      vb_buf.size);
+		}
 	} else {
 		pic_size = (init_info->pic_width << 16) | (init_info->pic_height);
 
@@ -845,17 +918,24 @@ int wave5_vpu_dec_register_framebuffer(struct vpu_instance *inst, struct frame_b
 
 static u32 wave5_vpu_dec_validate_sec_axi(struct vpu_instance *inst)
 {
+	u32 bitdepth = inst->codec_info->dec_info.initial_info.luma_bitdepth;
 	struct dec_info *p_dec_info = &inst->codec_info->dec_info;
 	u32 bit_size = 0, ip_size = 0, lf_size = 0, ret = 0;
 	u32 sram_size = inst->dev->sram_size;
+	u32 width = inst->src_fmt.width;
 
 	if (!sram_size)
 		return 0;
 
 	/*
-	 * TODO: calculate bit_size, ip_size, lf_size from inst->src_fmt.width
-	 * and inst->codec_info->dec_info.initial_info.luma_bitdepth
+	 * TODO: calculate bit_size, ip_size, lf_size from width and bitdepth
+	 * for Wave521.
 	 */
+	if (inst->dev->product_code == WAVE515_CODE) {
+		bit_size = DIV_ROUND_UP(width, 16) * 5 * 8;
+		ip_size = ALIGN(width, 16) * 2 * bitdepth / 8;
+		lf_size = ALIGN(width, 16) * 10 * bitdepth / 8;
+	}
 
 	if (p_dec_info->sec_axi_info.use_bit_enable && sram_size >= bit_size) {
 		ret |= BIT(0);
@@ -1033,11 +1113,18 @@ int wave5_vpu_re_init(struct device *dev, u8 *fw, size_t size)
 	common_vb = &vpu_dev->common_mem;
 
 	code_base = common_vb->daddr;
+
+	if (vpu_dev->product_code == WAVE515_CODE)
+		code_size = WAVE515_MAX_CODE_BUF_SIZE;
+	else
+		code_size = WAVE521_MAX_CODE_BUF_SIZE;
+
 	/* ALIGN TO 4KB */
-	code_size = (WAVE5_MAX_CODE_BUF_SIZE & ~0xfff);
+	code_size &= ~0xfff;
 	if (code_size < size * 2)
 		return -EINVAL;
-	temp_base = common_vb->daddr + WAVE5_TEMPBUF_OFFSET;
+
+	temp_base = code_base + code_size;
 	temp_size = WAVE5_TEMPBUF_SIZE;
 
 	old_code_base = vpu_read_reg(vpu_dev, W5_VPU_REMAP_PADDR);
@@ -1071,12 +1158,15 @@ int wave5_vpu_re_init(struct device *dev, u8 *fw, size_t size)
 
 		/* These register must be reset explicitly */
 		vpu_write_reg(vpu_dev, W5_HW_OPTION, 0);
-		wave5_fio_writel(vpu_dev, W5_BACKBONE_PROC_EXT_ADDR, 0);
-		wave5_fio_writel(vpu_dev, W5_BACKBONE_AXI_PARAM, 0);
-		vpu_write_reg(vpu_dev, W5_SEC_AXI_PARAM, 0);
+
+		if (vpu_dev->product_code != WAVE515_CODE) {
+			wave5_fio_writel(vpu_dev, W5_BACKBONE_PROC_EXT_ADDR, 0);
+			wave5_fio_writel(vpu_dev, W5_BACKBONE_AXI_PARAM, 0);
+			vpu_write_reg(vpu_dev, W5_SEC_AXI_PARAM, 0);
+		}
 
 		reg_val = vpu_read_reg(vpu_dev, W5_VPU_RET_VPU_CONFIG0);
-		if (FIELD_GET(FEATURE_BACKBONE, reg_val)) {
+		if (FIELD_GET(W521_FEATURE_BACKBONE, reg_val)) {
 			reg_val = ((WAVE5_PROC_AXI_ID << 28) |
 					(WAVE5_PRP_AXI_ID << 24) |
 					(WAVE5_FBD_Y_AXI_ID << 20) |
@@ -1088,6 +1178,29 @@ int wave5_vpu_re_init(struct device *dev, u8 *fw, size_t size)
 			wave5_fio_writel(vpu_dev, W5_BACKBONE_PROG_AXI_ID, reg_val);
 		}
 
+		if (vpu_dev->product_code == WAVE515_CODE) {
+			dma_addr_t task_buf_base;
+			u32 i;
+
+			vpu_write_reg(vpu_dev, W5_CMD_INIT_NUM_TASK_BUF,
+				      WAVE515_COMMAND_QUEUE_DEPTH);
+			vpu_write_reg(vpu_dev, W5_CMD_INIT_TASK_BUF_SIZE,
+				      WAVE515_ONE_TASKBUF_SIZE);
+
+			for (i = 0; i < WAVE515_COMMAND_QUEUE_DEPTH; i++) {
+				task_buf_base = temp_base + temp_size +
+						(i * WAVE515_ONE_TASKBUF_SIZE);
+				vpu_write_reg(vpu_dev,
+					      W5_CMD_INIT_ADDR_TASK_BUF0 + (i * 4),
+					      task_buf_base);
+			}
+
+			vpu_write_reg(vpu_dev, W515_CMD_ADDR_SEC_AXI,
+				      vpu_dev->sram_buf.daddr);
+			vpu_write_reg(vpu_dev, W515_CMD_SEC_AXI_SIZE,
+				      vpu_dev->sram_buf.size);
+		}
+
 		vpu_write_reg(vpu_dev, W5_VPU_BUSY_STATUS, 1);
 		vpu_write_reg(vpu_dev, W5_COMMAND, W5_INIT_VPU);
 		vpu_write_reg(vpu_dev, W5_VPU_REMAP_CORE_START, 1);
@@ -1111,8 +1224,8 @@ static int wave5_vpu_sleep_wake(struct device *dev, bool i_sleep_wake, const uin
 {
 	u32 reg_val;
 	struct vpu_buf *common_vb;
-	dma_addr_t code_base;
-	u32 code_size, reason_code;
+	dma_addr_t code_base, temp_base;
+	u32 code_size, temp_size, reason_code;
 	struct vpu_device *vpu_dev = dev_get_drvdata(dev);
 	int ret;
 
@@ -1142,13 +1255,22 @@ static int wave5_vpu_sleep_wake(struct device *dev, bool i_sleep_wake, const uin
 		common_vb = &vpu_dev->common_mem;
 
 		code_base = common_vb->daddr;
+
+		if (vpu_dev->product_code == WAVE515_CODE)
+			code_size = WAVE515_MAX_CODE_BUF_SIZE;
+		else
+			code_size = WAVE521_MAX_CODE_BUF_SIZE;
+
 		/* ALIGN TO 4KB */
-		code_size = (WAVE5_MAX_CODE_BUF_SIZE & ~0xfff);
+		code_size &= ~0xfff;
 		if (code_size < size * 2) {
 			dev_err(dev, "size too small\n");
 			return -EINVAL;
 		}
 
+		temp_base = code_base + code_size;
+		temp_size = WAVE5_TEMPBUF_SIZE;
+
 		/* Power on without DEBUG mode */
 		vpu_write_reg(vpu_dev, W5_PO_CONF, 0);
 
@@ -1161,14 +1283,17 @@ static int wave5_vpu_sleep_wake(struct device *dev, bool i_sleep_wake, const uin
 
 		/* These register must be reset explicitly */
 		vpu_write_reg(vpu_dev, W5_HW_OPTION, 0);
-		wave5_fio_writel(vpu_dev, W5_BACKBONE_PROC_EXT_ADDR, 0);
-		wave5_fio_writel(vpu_dev, W5_BACKBONE_AXI_PARAM, 0);
-		vpu_write_reg(vpu_dev, W5_SEC_AXI_PARAM, 0);
+
+		if (vpu_dev->product_code != WAVE515_CODE) {
+			wave5_fio_writel(vpu_dev, W5_BACKBONE_PROC_EXT_ADDR, 0);
+			wave5_fio_writel(vpu_dev, W5_BACKBONE_AXI_PARAM, 0);
+			vpu_write_reg(vpu_dev, W5_SEC_AXI_PARAM, 0);
+		}
 
 		setup_wave5_interrupts(vpu_dev);
 
 		reg_val = vpu_read_reg(vpu_dev, W5_VPU_RET_VPU_CONFIG0);
-		if (FIELD_GET(FEATURE_BACKBONE, reg_val)) {
+		if (FIELD_GET(W521_FEATURE_BACKBONE, reg_val)) {
 			reg_val = ((WAVE5_PROC_AXI_ID << 28) |
 					(WAVE5_PRP_AXI_ID << 24) |
 					(WAVE5_FBD_Y_AXI_ID << 20) |
@@ -1180,6 +1305,29 @@ static int wave5_vpu_sleep_wake(struct device *dev, bool i_sleep_wake, const uin
 			wave5_fio_writel(vpu_dev, W5_BACKBONE_PROG_AXI_ID, reg_val);
 		}
 
+		if (vpu_dev->product_code == WAVE515_CODE) {
+			dma_addr_t task_buf_base;
+			u32 i;
+
+			vpu_write_reg(vpu_dev, W5_CMD_INIT_NUM_TASK_BUF,
+				      WAVE515_COMMAND_QUEUE_DEPTH);
+			vpu_write_reg(vpu_dev, W5_CMD_INIT_TASK_BUF_SIZE,
+				      WAVE515_ONE_TASKBUF_SIZE);
+
+			for (i = 0; i < WAVE515_COMMAND_QUEUE_DEPTH; i++) {
+				task_buf_base = temp_base + temp_size +
+						(i * WAVE515_ONE_TASKBUF_SIZE);
+				vpu_write_reg(vpu_dev,
+					      W5_CMD_INIT_ADDR_TASK_BUF0 + (i * 4),
+					      task_buf_base);
+			}
+
+			vpu_write_reg(vpu_dev, W515_CMD_ADDR_SEC_AXI,
+				      vpu_dev->sram_buf.daddr);
+			vpu_write_reg(vpu_dev, W515_CMD_SEC_AXI_SIZE,
+				      vpu_dev->sram_buf.size);
+		}
+
 		vpu_write_reg(vpu_dev, W5_VPU_BUSY_STATUS, 1);
 		vpu_write_reg(vpu_dev, W5_COMMAND, W5_WAKEUP_VPU);
 		/* Start VPU after settings */
@@ -1424,7 +1572,7 @@ int wave5_vpu_build_up_enc_param(struct device *dev, struct vpu_instance *inst,
 	reg_val = (open_param->line_buf_int_en << 6) | BITSTREAM_ENDIANNESS_BIG_ENDIAN;
 	vpu_write_reg(inst->dev, W5_CMD_BS_PARAM, reg_val);
 	vpu_write_reg(inst->dev, W5_CMD_EXT_ADDR, 0);
-	vpu_write_reg(inst->dev, W5_CMD_NUM_CQ_DEPTH_M1, (COMMAND_QUEUE_DEPTH - 1));
+	vpu_write_reg(inst->dev, W5_CMD_NUM_CQ_DEPTH_M1, WAVE521_COMMAND_QUEUE_DEPTH - 1);
 
 	/* This register must be reset explicitly */
 	vpu_write_reg(inst->dev, W5_CMD_ENC_SRC_OPTIONS, 0);
@@ -1878,7 +2026,7 @@ int wave5_vpu_enc_register_framebuffer(struct device *dev, struct vpu_instance *
 	p_enc_info->vb_sub_sam_buf = vb_sub_sam_buf;
 
 	vb_task.size = (p_enc_info->vlc_buf_size * VLC_BUF_NUM) +
-			(p_enc_info->param_buf_size * COMMAND_QUEUE_DEPTH);
+			(p_enc_info->param_buf_size * WAVE521_COMMAND_QUEUE_DEPTH);
 	vb_task.daddr = 0;
 	if (p_enc_info->vb_task.size == 0) {
 		ret = wave5_vdi_allocate_dma_memory(vpu_dev, &vb_task);
diff --git a/drivers/media/platform/chips-media/wave5/wave5-regdefine.h b/drivers/media/platform/chips-media/wave5/wave5-regdefine.h
index a15c6b2c3d8b..557344754c4c 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-regdefine.h
+++ b/drivers/media/platform/chips-media/wave5/wave5-regdefine.h
@@ -205,6 +205,9 @@ enum query_opt {
 #define W5_ADDR_TEMP_BASE                       (W5_REG_BASE + 0x011C)
 #define W5_TEMP_SIZE                            (W5_REG_BASE + 0x0120)
 #define W5_HW_OPTION                            (W5_REG_BASE + 0x012C)
+#define W5_CMD_INIT_NUM_TASK_BUF		(W5_REG_BASE + 0x0134)
+#define W5_CMD_INIT_ADDR_TASK_BUF0		(W5_REG_BASE + 0x0138)
+#define W5_CMD_INIT_TASK_BUF_SIZE		(W5_REG_BASE + 0x0178)
 #define W5_SEC_AXI_PARAM                        (W5_REG_BASE + 0x0180)
 
 /************************************************************************/
@@ -216,7 +219,9 @@ enum query_opt {
 #define W5_CMD_DEC_BS_SIZE                      (W5_REG_BASE + 0x0120)
 #define W5_CMD_BS_PARAM                         (W5_REG_BASE + 0x0124)
 #define W5_CMD_ADDR_SEC_AXI                     (W5_REG_BASE + 0x0130)
+#define W515_CMD_ADDR_SEC_AXI			(W5_REG_BASE + 0x0124)
 #define W5_CMD_SEC_AXI_SIZE                     (W5_REG_BASE + 0x0134)
+#define W515_CMD_SEC_AXI_SIZE			(W5_REG_BASE + 0x0128)
 #define W5_CMD_EXT_ADDR                         (W5_REG_BASE + 0x0138)
 #define W5_CMD_NUM_CQ_DEPTH_M1                  (W5_REG_BASE + 0x013C)
 #define W5_CMD_ERR_CONCEAL                      (W5_REG_BASE + 0x0140)
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vdi.c b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
index 556de2f043fe..bb13267ced38 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vdi.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
@@ -18,7 +18,11 @@ static int wave5_vdi_allocate_common_memory(struct device *dev)
 	if (!vpu_dev->common_mem.vaddr) {
 		int ret;
 
-		vpu_dev->common_mem.size = SIZE_COMMON;
+		if (vpu_dev->product_code == WAVE515_CODE)
+			vpu_dev->common_mem.size = WAVE515_SIZE_COMMON;
+		else
+			vpu_dev->common_mem.size = WAVE521_SIZE_COMMON;
+
 		ret = wave5_vdi_allocate_dma_memory(vpu_dev, &vpu_dev->common_mem);
 		if (ret) {
 			dev_err(dev, "unable to allocate common buffer\n");
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
index 5a71a711f2e8..6697534e9a12 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
@@ -1869,7 +1869,12 @@ static int wave5_vpu_open_dec(struct file *filp)
 		goto cleanup_inst;
 	}
 
-	wave5_vdi_allocate_sram(inst->dev);
+	/*
+	 * For Wave515 SRAM memory was already allocated
+	 * at wave5_vpu_dec_register_device()
+	 */
+	if (inst->dev->product_code != WAVE515_CODE)
+		wave5_vdi_allocate_sram(inst->dev);
 
 	return 0;
 
@@ -1897,6 +1902,13 @@ int wave5_vpu_dec_register_device(struct vpu_device *dev)
 	struct video_device *vdev_dec;
 	int ret;
 
+	/*
+	 * Secondary AXI setup for Wave515 is done by INIT_VPU command,
+	 * i.e. wave5_vpu_init(), that's why we allocate SRAM memory early.
+	 */
+	if (dev->product_code == WAVE515_CODE)
+		wave5_vdi_allocate_sram(dev);
+
 	vdev_dec = devm_kzalloc(dev->v4l2_dev.dev, sizeof(*vdev_dec), GFP_KERNEL);
 	if (!vdev_dec)
 		return -ENOMEM;
@@ -1930,6 +1942,13 @@ int wave5_vpu_dec_register_device(struct vpu_device *dev)
 
 void wave5_vpu_dec_unregister_device(struct vpu_device *dev)
 {
+	/*
+	 * Here is a freeing pair for Wave515 SRAM memory allocation
+	 * happened at wave5_vpu_dec_register_device().
+	 */
+	if (dev->product_code == WAVE515_CODE)
+		wave5_vdi_free_sram(dev);
+
 	video_unregister_device(dev->video_dev_dec);
 	if (dev->v4l2_m2m_dec_dev)
 		v4l2_m2m_release(dev->v4l2_m2m_dec_dev);
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c
index 8bbf9d10b467..9d2a490d2516 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c
@@ -1247,7 +1247,7 @@ static int initialize_sequence(struct vpu_instance *inst)
 		__func__, initial_info.min_frame_buffer_count,
 		initial_info.min_src_frame_count);
 	inst->min_src_buf_count = initial_info.min_src_frame_count +
-				  COMMAND_QUEUE_DEPTH;
+				  WAVE521_COMMAND_QUEUE_DEPTH;
 
 	ctrl = v4l2_ctrl_find(&inst->v4l2_ctrl_hdl,
 			      V4L2_CID_MIN_BUFFERS_FOR_OUTPUT);
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
index 9e93969ab6db..da254b422cff 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
@@ -61,7 +61,13 @@ static irqreturn_t wave5_vpu_irq_thread(int irq, void *dev_id)
 
 			if (irq_reason & BIT(INT_WAVE5_INIT_SEQ) ||
 			    irq_reason & BIT(INT_WAVE5_ENC_SET_PARAM)) {
-				if (seq_done & BIT(inst->id)) {
+				if ((dev->product_code == WAVE515_CODE) &&
+				    (cmd_done & BIT(inst->id))) {
+					cmd_done &= ~BIT(inst->id);
+					wave5_vdi_write_register(dev, W5_RET_QUEUE_CMD_DONE_INST,
+								 cmd_done);
+					complete(&inst->irq_done);
+				} else if (seq_done & BIT(inst->id)) {
 					seq_done &= ~BIT(inst->id);
 					wave5_vdi_write_register(dev, W5_RET_SEQ_DONE_INSTANCE_INFO,
 								 seq_done);
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
index da530fd98964..71c6d3e6bb20 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
@@ -18,6 +18,7 @@
 #include "wave5-vdi.h"
 
 enum product_id {
+	PRODUCT_ID_515,
 	PRODUCT_ID_521,
 	PRODUCT_ID_511,
 	PRODUCT_ID_517,
diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h b/drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h
index d9751eedb0f9..e4bc2e467cb5 100644
--- a/drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h
+++ b/drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h
@@ -8,6 +8,7 @@
 #ifndef _VPU_CONFIG_H_
 #define _VPU_CONFIG_H_
 
+#define WAVE515_CODE			0x5150
 #define WAVE517_CODE                    0x5170
 #define WAVE537_CODE                    0x5370
 #define WAVE511_CODE                    0x5110
@@ -21,12 +22,13 @@
 		((c) == WAVE517_CODE ||	(c) == WAVE537_CODE ||		\
 		 (c) == WAVE511_CODE || (c) == WAVE521_CODE ||		\
 		 (c) == WAVE521E1_CODE || (c) == WAVE521C_CODE ||	\
-		 (c) == WAVE521C_DUAL_CODE);				\
+		 (c) == WAVE521C_DUAL_CODE) || (c) == WAVE515_CODE;	\
 })
 
 #define WAVE517_WORKBUF_SIZE            (2 * 1024 * 1024)
 #define WAVE521ENC_WORKBUF_SIZE         (128 * 1024)      //HEVC 128K, AVC 40K
 #define WAVE521DEC_WORKBUF_SIZE         (1784 * 1024)
+#define WAVE515DEC_WORKBUF_SIZE		(2 * 1024 * 1024)
 
 #define MAX_NUM_INSTANCE                32
 
@@ -49,17 +51,21 @@
 /************************************************************************/
 #define VLC_BUF_NUM                     (2)
 
-#define COMMAND_QUEUE_DEPTH             (2)
+#define WAVE521_COMMAND_QUEUE_DEPTH	(2)
+#define WAVE515_COMMAND_QUEUE_DEPTH	(4)
 
 #define W5_REMAP_INDEX0                 0
 #define W5_REMAP_INDEX1                 1
 #define W5_REMAP_MAX_SIZE               (1024 * 1024)
 
-#define WAVE5_MAX_CODE_BUF_SIZE         (2 * 1024 * 1024)
-#define WAVE5_TEMPBUF_OFFSET            WAVE5_MAX_CODE_BUF_SIZE
+#define WAVE521_MAX_CODE_BUF_SIZE	(2 * 1024 * 1024)
+#define WAVE515_MAX_CODE_BUF_SIZE	(1024 * 1024)
 #define WAVE5_TEMPBUF_SIZE              (1024 * 1024)
 
-#define SIZE_COMMON                 (WAVE5_MAX_CODE_BUF_SIZE + WAVE5_TEMPBUF_SIZE)
+#define WAVE521_SIZE_COMMON		(WAVE521_MAX_CODE_BUF_SIZE + WAVE5_TEMPBUF_SIZE)
+#define WAVE515_ONE_TASKBUF_SIZE	(8 * 1024 * 1024)
+#define WAVE515_SIZE_COMMON		(WAVE515_MAX_CODE_BUF_SIZE + WAVE5_TEMPBUF_SIZE + \
+					 WAVE515_COMMAND_QUEUE_DEPTH * WAVE515_ONE_TASKBUF_SIZE)
 
 //=====4. VPU REPORT MEMORY  ======================//
 
diff --git a/drivers/media/platform/chips-media/wave5/wave5.h b/drivers/media/platform/chips-media/wave5/wave5.h
index 063028eccd3b..2a29b9164f97 100644
--- a/drivers/media/platform/chips-media/wave5/wave5.h
+++ b/drivers/media/platform/chips-media/wave5/wave5.h
@@ -22,6 +22,12 @@
  */
 #define BSOPTION_ENABLE_EXPLICIT_END		BIT(0)
 #define BSOPTION_HIGHLIGHT_STREAM_END		BIT(1)
+/*
+ * When RD_PTR_VALID_FLAG is 0 Wave515 ignores RD_PTR value and starts to
+ * decode from the access unit end position of the last decoded picture in
+ * bitstream buffer.
+ */
+#define BSOPTION_RD_PTR_VALID_FLAG		BIT(31)
 
 /*
  * Currently the driver only supports hardware with little endian but for source
-- 
2.44.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT prop
  2024-04-05 16:41 ` [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT prop Ivan Bornyakov
@ 2024-04-09  4:50   ` jackson.lee
  2024-04-09  8:12     ` Ivan Bornyakov
  0 siblings, 1 reply; 12+ messages in thread
From: jackson.lee @ 2024-04-09  4:50 UTC (permalink / raw)
  To: Ivan Bornyakov, Nas Chung, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke
  Cc: linux-media, linux-kernel

Hey Ivan

> -----Original Message-----
> From: Ivan Bornyakov <brnkv.i1@gmail.com>
> Sent: Saturday, April 6, 2024 1:41 AM
> To: Nas Chung <nas.chung@chipsnmedia.com>; jackson.lee
> <jackson.lee@chipsnmedia.com>; Mauro Carvalho Chehab <mchehab@kernel.org>;
> Philipp Zabel <p.zabel@pengutronix.de>; Sebastian Fricke
> <sebastian.fricke@collabora.com>
> Cc: Ivan Bornyakov <brnkv.i1@gmail.com>; linux-media@vger.kernel.org;
> linux-kernel@vger.kernel.org
> Subject: [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT
> prop
> 
> Move excessive "sram-size" device-tree property to device match data.
> Also change SRAM memory allocation strategy: instead of allocation exact
> sram_size bytes, allocate all available SRAM memory up to sram_size.
> Add placeholders wave5_vpu_dec_validate_sec_axi() and
> wave5_vpu_enc_validate_sec_axi() for validation that allocated SRAM memory
> is enough to decode/encode bitstream of given resolution.
> 
> Signed-off-by: Ivan Bornyakov <brnkv.i1@gmail.com>
> ---
>  .../platform/chips-media/wave5/wave5-hw.c     | 62 +++++++++++++++++--
>  .../platform/chips-media/wave5/wave5-vdi.c    | 21 ++++---
>  .../platform/chips-media/wave5/wave5-vpu.c    | 11 ++--
>  3 files changed, 72 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/media/platform/chips-media/wave5/wave5-hw.c
> b/drivers/media/platform/chips-media/wave5/wave5-hw.c
> index cdd0a0948a94..36f2fc818013 100644
> --- a/drivers/media/platform/chips-media/wave5/wave5-hw.c
> +++ b/drivers/media/platform/chips-media/wave5/wave5-hw.c
> @@ -843,6 +843,36 @@ int wave5_vpu_dec_register_framebuffer(struct
> vpu_instance *inst, struct frame_b
>  	return ret;
>  }
> 
> +static u32 wave5_vpu_dec_validate_sec_axi(struct vpu_instance *inst) {
> +	struct dec_info *p_dec_info = &inst->codec_info->dec_info;
> +	u32 bit_size = 0, ip_size = 0, lf_size = 0, ret = 0;

The bit_size, ip_size and 1f_size is always 0? If so, why are you using them ?


> +	u32 sram_size = inst->dev->sram_size;
> +
> +	if (!sram_size)
> +		return 0;
> +
> +	/*
> +	 * TODO: calculate bit_size, ip_size, lf_size from inst-
> >src_fmt.width
> +	 * and inst->codec_info->dec_info.initial_info.luma_bitdepth
> +	 */
> +
> +	if (p_dec_info->sec_axi_info.use_bit_enable && sram_size >=
> bit_size) {
> +		ret |= BIT(0);
> +		sram_size -= bit_size;
> +	}
> +
> +	if (p_dec_info->sec_axi_info.use_ip_enable && sram_size >= ip_size)
> {
> +		ret |= BIT(9);
> +		sram_size -= ip_size;
> +	}
> +
> +	if (p_dec_info->sec_axi_info.use_lf_row_enable && sram_size >=
> lf_size)
> +		ret |= BIT(15);
> +
> +	return ret;
> +}
> +
>  int wave5_vpu_decode(struct vpu_instance *inst, u32 *fail_res)  {
>  	u32 reg_val;
> @@ -855,9 +885,7 @@ int wave5_vpu_decode(struct vpu_instance *inst, u32
> *fail_res)
>  	vpu_write_reg(inst->dev, W5_BS_OPTION,
> get_bitstream_options(p_dec_info));
> 
>  	/* secondary AXI */
> -	reg_val = p_dec_info->sec_axi_info.use_bit_enable |
> -		(p_dec_info->sec_axi_info.use_ip_enable << 9) |
> -		(p_dec_info->sec_axi_info.use_lf_row_enable << 15);
> +	reg_val = wave5_vpu_dec_validate_sec_axi(inst);
>  	vpu_write_reg(inst->dev, W5_USE_SEC_AXI, reg_val);
> 
>  	/* set attributes of user buffer */
> @@ -1938,6 +1966,31 @@ int wave5_vpu_enc_register_framebuffer(struct
> device *dev, struct vpu_instance *
>  	return ret;
>  }
> 
> +static u32 wave5_vpu_enc_validate_sec_axi(struct vpu_instance *inst) {
> +	struct enc_info *p_enc_info = &inst->codec_info->enc_info;
> +	u32 rdo_size = 0, lf_size = 0, ret = 0;

The rdo_size and 1f_size is always 0? If so, why are you using them ?

> +	u32 sram_size = inst->dev->sram_size;
> +
> +	if (!sram_size)
> +		return 0;
> +
> +	/*
> +	 * TODO: calculate rdo_size and lf_size from inst->src_fmt.width
> and
> +	 * inst->codec_info-
> >enc_info.open_param.wave_param.internal_bit_depth
> +	 */
> +
> +	if (p_enc_info->sec_axi_info.use_enc_rdo_enable && sram_size >=
> rdo_size) {
> +		ret |= BIT(11);
> +		sram_size -= rdo_size;
> +	}
> +
> +	if (p_enc_info->sec_axi_info.use_enc_lf_enable && sram_size >=
> lf_size)
> +		ret |= BIT(15);
> +
> +	return ret;
> +}
> +
>  int wave5_vpu_encode(struct vpu_instance *inst, struct enc_param *option,
> u32 *fail_res)  {
>  	u32 src_frame_format;
> @@ -1959,8 +2012,7 @@ int wave5_vpu_encode(struct vpu_instance *inst,
> struct enc_param *option, u32 *f
> 
>  	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_SRC_AXI_SEL,
> DEFAULT_SRC_AXI);
>  	/* secondary AXI */
> -	reg_val = (p_enc_info->sec_axi_info.use_enc_rdo_enable << 11) |
> -		(p_enc_info->sec_axi_info.use_enc_lf_enable << 15);
> +	reg_val = wave5_vpu_enc_validate_sec_axi(inst);
>  	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_USE_SEC_AXI, reg_val);
> 
>  	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_REPORT_PARAM, 0); diff --
> git a/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> index 3809f70bc0b4..556de2f043fe 100644
> --- a/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> +++ b/drivers/media/platform/chips-media/wave5/wave5-vdi.c


The below code is not based on the current upstream code. Where did you get the original code ?

> @@ -174,16 +174,19 @@ int wave5_vdi_allocate_array(struct vpu_device
> *vpu_dev, struct vpu_buf *array,  void wave5_vdi_allocate_sram(struct
> vpu_device *vpu_dev)  {
>  	struct vpu_buf *vb = &vpu_dev->sram_buf;
> +	dma_addr_t daddr;
> +	void *vaddr;
> +	size_t size;
> 
> -	if (!vpu_dev->sram_pool || !vpu_dev->sram_size)
> +	if (!vpu_dev->sram_pool || vb->vaddr)
>  		return;
> 
> -	if (!vb->vaddr) {
> -		vb->size = vpu_dev->sram_size;
> -		vb->vaddr = gen_pool_dma_alloc(vpu_dev->sram_pool, vb->size,
> -					       &vb->daddr);
> -		if (!vb->vaddr)
> -			vb->size = 0;
> +	size = min_t(size_t, vpu_dev->sram_size, gen_pool_avail(vpu_dev-
> >sram_pool));
> +	vaddr = gen_pool_dma_alloc(vpu_dev->sram_pool, size, &daddr);
> +	if (vaddr) {
> +		vb->vaddr = vaddr;
> +		vb->daddr = daddr;
> +		vb->size = size;
>  	}
> 
>  	dev_dbg(vpu_dev->dev, "%s: sram daddr: %pad, size: %zu, vaddr:
> 0x%p\n", @@ -197,9 +200,7 @@ void wave5_vdi_free_sram(struct vpu_device
> *vpu_dev)
>  	if (!vb->size || !vb->vaddr)
>  		return;
> 
> -	if (vb->vaddr)
> -		gen_pool_free(vpu_dev->sram_pool, (unsigned long)vb->vaddr,
> -			      vb->size);
> +	gen_pool_free(vpu_dev->sram_pool, (unsigned long)vb->vaddr, vb-
> >size);
> 
>  	memset(vb, 0, sizeof(*vb));
>  }
> diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> index 1e631da58e15..9e93969ab6db 100644
> --- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> @@ -25,6 +25,7 @@
>  struct wave5_match_data {
>  	int flags;
>  	const char *fw_name;
> +	u32 sram_size;
>  };
> 
>  int wave5_vpu_wait_interrupt(struct vpu_instance *inst, unsigned int
> timeout) @@ -177,17 +178,12 @@ static int wave5_vpu_probe(struct
> platform_device *pdev)
>  		goto err_reset_assert;
>  	}
> 
> -	ret = of_property_read_u32(pdev->dev.of_node, "sram-size",
> -				   &dev->sram_size);
> -	if (ret) {
> -		dev_warn(&pdev->dev, "sram-size not found\n");
> -		dev->sram_size = 0;
> -	}
> -
>  	dev->sram_pool = of_gen_pool_get(pdev->dev.of_node, "sram", 0);
>  	if (!dev->sram_pool)
>  		dev_warn(&pdev->dev, "sram node not found\n");
> 
> +	dev->sram_size = match_data->sram_size;
> +
>  	dev->product_code = wave5_vdi_read_register(dev,
> VPU_PRODUCT_CODE_REGISTER);
>  	ret = wave5_vdi_init(&pdev->dev);
>  	if (ret < 0) {
> @@ -281,6 +277,7 @@ static void wave5_vpu_remove(struct platform_device
> *pdev)  static const struct wave5_match_data ti_wave521c_data = {
>  	.flags = WAVE5_IS_ENC | WAVE5_IS_DEC,
>  	.fw_name = "cnm/wave521c_k3_codec_fw.bin",
> +	.sram_size = (64 * 1024),
>  };
> 
>  static const struct of_device_id wave5_dt_ids[] = {
> --
> 2.44.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: RE: [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT prop
  2024-04-09  4:50   ` jackson.lee
@ 2024-04-09  8:12     ` Ivan Bornyakov
  2024-04-11  8:11       ` jackson.lee
  0 siblings, 1 reply; 12+ messages in thread
From: Ivan Bornyakov @ 2024-04-09  8:12 UTC (permalink / raw)
  To: jackson.lee
  Cc: Nas Chung, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke, linux-media, linux-kernel

Hi, Jackson

On Tue, Apr 09, 2024 at 04:50:15AM +0000, jackson.lee wrote:
> Hey Ivan
> 
> > -----Original Message-----
> > From: Ivan Bornyakov <brnkv.i1@gmail.com>
> > Sent: Saturday, April 6, 2024 1:41 AM
> > To: Nas Chung <nas.chung@chipsnmedia.com>; jackson.lee
> > <jackson.lee@chipsnmedia.com>; Mauro Carvalho Chehab <mchehab@kernel.org>;
> > Philipp Zabel <p.zabel@pengutronix.de>; Sebastian Fricke
> > <sebastian.fricke@collabora.com>
> > Cc: Ivan Bornyakov <brnkv.i1@gmail.com>; linux-media@vger.kernel.org;
> > linux-kernel@vger.kernel.org
> > Subject: [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT
> > prop
> > 
> > Move excessive "sram-size" device-tree property to device match data.
> > Also change SRAM memory allocation strategy: instead of allocation exact
> > sram_size bytes, allocate all available SRAM memory up to sram_size.
> > Add placeholders wave5_vpu_dec_validate_sec_axi() and
> > wave5_vpu_enc_validate_sec_axi() for validation that allocated SRAM memory
> > is enough to decode/encode bitstream of given resolution.
> > 
> > Signed-off-by: Ivan Bornyakov <brnkv.i1@gmail.com>
> > ---
> >  .../platform/chips-media/wave5/wave5-hw.c     | 62 +++++++++++++++++--
> >  .../platform/chips-media/wave5/wave5-vdi.c    | 21 ++++---
> >  .../platform/chips-media/wave5/wave5-vpu.c    | 11 ++--
> >  3 files changed, 72 insertions(+), 22 deletions(-)
> > 
> > diff --git a/drivers/media/platform/chips-media/wave5/wave5-hw.c
> > b/drivers/media/platform/chips-media/wave5/wave5-hw.c
> > index cdd0a0948a94..36f2fc818013 100644
> > --- a/drivers/media/platform/chips-media/wave5/wave5-hw.c
> > +++ b/drivers/media/platform/chips-media/wave5/wave5-hw.c
> > @@ -843,6 +843,36 @@ int wave5_vpu_dec_register_framebuffer(struct
> > vpu_instance *inst, struct frame_b
> >  	return ret;
> >  }
> > 
> > +static u32 wave5_vpu_dec_validate_sec_axi(struct vpu_instance *inst) {
> > +	struct dec_info *p_dec_info = &inst->codec_info->dec_info;
> > +	u32 bit_size = 0, ip_size = 0, lf_size = 0, ret = 0;
> 
> The bit_size, ip_size and 1f_size is always 0? If so, why are you using them ?
> 

Since I don't have documentation on Wave521, this is a placeholder for
someone who have documentation to write proper SRAM size validation,
hence TODO comment.

In the next patch "media: chips-media: wave5: support Wave515 decoder"
I added validation of SRAM usage for Wave515, for which I do have
documentation.

> 
> > +	u32 sram_size = inst->dev->sram_size;
> > +
> > +	if (!sram_size)
> > +		return 0;
> > +
> > +	/*
> > +	 * TODO: calculate bit_size, ip_size, lf_size from inst-
> > >src_fmt.width
> > +	 * and inst->codec_info->dec_info.initial_info.luma_bitdepth
> > +	 */
> > +
> > +	if (p_dec_info->sec_axi_info.use_bit_enable && sram_size >=
> > bit_size) {
> > +		ret |= BIT(0);
> > +		sram_size -= bit_size;
> > +	}
> > +
> > +	if (p_dec_info->sec_axi_info.use_ip_enable && sram_size >= ip_size)
> > {
> > +		ret |= BIT(9);
> > +		sram_size -= ip_size;
> > +	}
> > +
> > +	if (p_dec_info->sec_axi_info.use_lf_row_enable && sram_size >=
> > lf_size)
> > +		ret |= BIT(15);
> > +
> > +	return ret;
> > +}
> > +
> >  int wave5_vpu_decode(struct vpu_instance *inst, u32 *fail_res)  {
> >  	u32 reg_val;
> > @@ -855,9 +885,7 @@ int wave5_vpu_decode(struct vpu_instance *inst, u32
> > *fail_res)
> >  	vpu_write_reg(inst->dev, W5_BS_OPTION,
> > get_bitstream_options(p_dec_info));
> > 
> >  	/* secondary AXI */
> > -	reg_val = p_dec_info->sec_axi_info.use_bit_enable |
> > -		(p_dec_info->sec_axi_info.use_ip_enable << 9) |
> > -		(p_dec_info->sec_axi_info.use_lf_row_enable << 15);
> > +	reg_val = wave5_vpu_dec_validate_sec_axi(inst);
> >  	vpu_write_reg(inst->dev, W5_USE_SEC_AXI, reg_val);
> > 
> >  	/* set attributes of user buffer */
> > @@ -1938,6 +1966,31 @@ int wave5_vpu_enc_register_framebuffer(struct
> > device *dev, struct vpu_instance *
> >  	return ret;
> >  }
> > 
> > +static u32 wave5_vpu_enc_validate_sec_axi(struct vpu_instance *inst) {
> > +	struct enc_info *p_enc_info = &inst->codec_info->enc_info;
> > +	u32 rdo_size = 0, lf_size = 0, ret = 0;
> 
> The rdo_size and 1f_size is always 0? If so, why are you using them ?
>

Same as above. It is a placeholder for someone else to implement these.

> > +	u32 sram_size = inst->dev->sram_size;
> > +
> > +	if (!sram_size)
> > +		return 0;
> > +
> > +	/*
> > +	 * TODO: calculate rdo_size and lf_size from inst->src_fmt.width
> > and
> > +	 * inst->codec_info-
> > >enc_info.open_param.wave_param.internal_bit_depth
> > +	 */
> > +
> > +	if (p_enc_info->sec_axi_info.use_enc_rdo_enable && sram_size >=
> > rdo_size) {
> > +		ret |= BIT(11);
> > +		sram_size -= rdo_size;
> > +	}
> > +
> > +	if (p_enc_info->sec_axi_info.use_enc_lf_enable && sram_size >=
> > lf_size)
> > +		ret |= BIT(15);
> > +
> > +	return ret;
> > +}
> > +
> >  int wave5_vpu_encode(struct vpu_instance *inst, struct enc_param *option,
> > u32 *fail_res)  {
> >  	u32 src_frame_format;
> > @@ -1959,8 +2012,7 @@ int wave5_vpu_encode(struct vpu_instance *inst,
> > struct enc_param *option, u32 *f
> > 
> >  	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_SRC_AXI_SEL,
> > DEFAULT_SRC_AXI);
> >  	/* secondary AXI */
> > -	reg_val = (p_enc_info->sec_axi_info.use_enc_rdo_enable << 11) |
> > -		(p_enc_info->sec_axi_info.use_enc_lf_enable << 15);
> > +	reg_val = wave5_vpu_enc_validate_sec_axi(inst);
> >  	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_USE_SEC_AXI, reg_val);
> > 
> >  	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_REPORT_PARAM, 0); diff --
> > git a/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> > b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> > index 3809f70bc0b4..556de2f043fe 100644
> > --- a/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> > +++ b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> 
> 
> The below code is not based on the current upstream code. Where did you get the original code ?
> 

What do you mean? This patch series is based on the latest linux-next.

> > @@ -174,16 +174,19 @@ int wave5_vdi_allocate_array(struct vpu_device
> > *vpu_dev, struct vpu_buf *array,  void wave5_vdi_allocate_sram(struct
> > vpu_device *vpu_dev)  {
> >  	struct vpu_buf *vb = &vpu_dev->sram_buf;
> > +	dma_addr_t daddr;
> > +	void *vaddr;
> > +	size_t size;
> > 
> > -	if (!vpu_dev->sram_pool || !vpu_dev->sram_size)
> > +	if (!vpu_dev->sram_pool || vb->vaddr)
> >  		return;
> > 
> > -	if (!vb->vaddr) {
> > -		vb->size = vpu_dev->sram_size;
> > -		vb->vaddr = gen_pool_dma_alloc(vpu_dev->sram_pool, vb->size,
> > -					       &vb->daddr);
> > -		if (!vb->vaddr)
> > -			vb->size = 0;
> > +	size = min_t(size_t, vpu_dev->sram_size, gen_pool_avail(vpu_dev-
> > >sram_pool));
> > +	vaddr = gen_pool_dma_alloc(vpu_dev->sram_pool, size, &daddr);
> > +	if (vaddr) {
> > +		vb->vaddr = vaddr;
> > +		vb->daddr = daddr;
> > +		vb->size = size;
> >  	}
> > 
> >  	dev_dbg(vpu_dev->dev, "%s: sram daddr: %pad, size: %zu, vaddr:
> > 0x%p\n", @@ -197,9 +200,7 @@ void wave5_vdi_free_sram(struct vpu_device
> > *vpu_dev)
> >  	if (!vb->size || !vb->vaddr)
> >  		return;
> > 
> > -	if (vb->vaddr)
> > -		gen_pool_free(vpu_dev->sram_pool, (unsigned long)vb->vaddr,
> > -			      vb->size);
> > +	gen_pool_free(vpu_dev->sram_pool, (unsigned long)vb->vaddr, vb-
> > >size);
> > 
> >  	memset(vb, 0, sizeof(*vb));
> >  }
> > diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> > b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> > index 1e631da58e15..9e93969ab6db 100644
> > --- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> > +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> > @@ -25,6 +25,7 @@
> >  struct wave5_match_data {
> >  	int flags;
> >  	const char *fw_name;
> > +	u32 sram_size;
> >  };
> > 
> >  int wave5_vpu_wait_interrupt(struct vpu_instance *inst, unsigned int
> > timeout) @@ -177,17 +178,12 @@ static int wave5_vpu_probe(struct
> > platform_device *pdev)
> >  		goto err_reset_assert;
> >  	}
> > 
> > -	ret = of_property_read_u32(pdev->dev.of_node, "sram-size",
> > -				   &dev->sram_size);
> > -	if (ret) {
> > -		dev_warn(&pdev->dev, "sram-size not found\n");
> > -		dev->sram_size = 0;
> > -	}
> > -
> >  	dev->sram_pool = of_gen_pool_get(pdev->dev.of_node, "sram", 0);
> >  	if (!dev->sram_pool)
> >  		dev_warn(&pdev->dev, "sram node not found\n");
> > 
> > +	dev->sram_size = match_data->sram_size;
> > +
> >  	dev->product_code = wave5_vdi_read_register(dev,
> > VPU_PRODUCT_CODE_REGISTER);
> >  	ret = wave5_vdi_init(&pdev->dev);
> >  	if (ret < 0) {
> > @@ -281,6 +277,7 @@ static void wave5_vpu_remove(struct platform_device
> > *pdev)  static const struct wave5_match_data ti_wave521c_data = {
> >  	.flags = WAVE5_IS_ENC | WAVE5_IS_DEC,
> >  	.fw_name = "cnm/wave521c_k3_codec_fw.bin",
> > +	.sram_size = (64 * 1024),
> >  };
> > 
> >  static const struct of_device_id wave5_dt_ids[] = {
> > --
> > 2.44.0
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: RE: [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT prop
  2024-04-09  8:12     ` Ivan Bornyakov
@ 2024-04-11  8:11       ` jackson.lee
  0 siblings, 0 replies; 12+ messages in thread
From: jackson.lee @ 2024-04-11  8:11 UTC (permalink / raw)
  To: Ivan Bornyakov
  Cc: Nas Chung, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke, linux-media, linux-kernel

Hi Ivan

> -----Original Message-----
> From: Ivan Bornyakov <brnkv.i1@gmail.com>
> Sent: Tuesday, April 9, 2024 5:12 PM
> To: jackson.lee <jackson.lee@chipsnmedia.com>
> Cc: Nas Chung <nas.chung@chipsnmedia.com>; Mauro Carvalho Chehab
> <mchehab@kernel.org>; Philipp Zabel <p.zabel@pengutronix.de>; Sebastian
> Fricke <sebastian.fricke@collabora.com>; linux-media@vger.kernel.org;
> linux-kernel@vger.kernel.org
> Subject: Re: RE: [PATCH v3 4/5] media: chips-media: wave5: drop "sram-
> size" DT prop
> 
> Hi, Jackson
> 
> On Tue, Apr 09, 2024 at 04:50:15AM +0000, jackson.lee wrote:
> > Hey Ivan
> >
> > > -----Original Message-----
> > > From: Ivan Bornyakov <brnkv.i1@gmail.com>
> > > Sent: Saturday, April 6, 2024 1:41 AM
> > > To: Nas Chung <nas.chung@chipsnmedia.com>; jackson.lee
> > > <jackson.lee@chipsnmedia.com>; Mauro Carvalho Chehab
> > > <mchehab@kernel.org>; Philipp Zabel <p.zabel@pengutronix.de>;
> > > Sebastian Fricke <sebastian.fricke@collabora.com>
> > > Cc: Ivan Bornyakov <brnkv.i1@gmail.com>;
> > > linux-media@vger.kernel.org; linux-kernel@vger.kernel.org
> > > Subject: [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size"
> > > DT prop
> > >
> > > Move excessive "sram-size" device-tree property to device match data.
> > > Also change SRAM memory allocation strategy: instead of allocation
> > > exact sram_size bytes, allocate all available SRAM memory up to
> sram_size.
> > > Add placeholders wave5_vpu_dec_validate_sec_axi() and
> > > wave5_vpu_enc_validate_sec_axi() for validation that allocated SRAM
> > > memory is enough to decode/encode bitstream of given resolution.
> > >
> > > Signed-off-by: Ivan Bornyakov <brnkv.i1@gmail.com>
> > > ---
> > >  .../platform/chips-media/wave5/wave5-hw.c     | 62 +++++++++++++++++--
> > >  .../platform/chips-media/wave5/wave5-vdi.c    | 21 ++++---
> > >  .../platform/chips-media/wave5/wave5-vpu.c    | 11 ++--
> > >  3 files changed, 72 insertions(+), 22 deletions(-)
> > >
> > > diff --git a/drivers/media/platform/chips-media/wave5/wave5-hw.c
> > > b/drivers/media/platform/chips-media/wave5/wave5-hw.c
> > > index cdd0a0948a94..36f2fc818013 100644
> > > --- a/drivers/media/platform/chips-media/wave5/wave5-hw.c
> > > +++ b/drivers/media/platform/chips-media/wave5/wave5-hw.c
> > > @@ -843,6 +843,36 @@ int wave5_vpu_dec_register_framebuffer(struct
> > > vpu_instance *inst, struct frame_b
> > >  	return ret;
> > >  }
> > >
> > > +static u32 wave5_vpu_dec_validate_sec_axi(struct vpu_instance *inst)
> {
> > > +	struct dec_info *p_dec_info = &inst->codec_info->dec_info;
> > > +	u32 bit_size = 0, ip_size = 0, lf_size = 0, ret = 0;
> >
> > The bit_size, ip_size and 1f_size is always 0? If so, why are you using
> them ?
> >
> 
> Since I don't have documentation on Wave521, this is a placeholder for
> someone who have documentation to write proper SRAM size validation, hence
> TODO comment.
> 
> In the next patch "media: chips-media: wave5: support Wave515 decoder"
> I added validation of SRAM usage for Wave515, for which I do have
> documentation.
> 
> >
> > > +	u32 sram_size = inst->dev->sram_size;
> > > +
> > > +	if (!sram_size)
> > > +		return 0;
> > > +
> > > +	/*
> > > +	 * TODO: calculate bit_size, ip_size, lf_size from inst-
> > > >src_fmt.width
> > > +	 * and inst->codec_info->dec_info.initial_info.luma_bitdepth
> > > +	 */
> > > +
> > > +	if (p_dec_info->sec_axi_info.use_bit_enable && sram_size >=
> > > bit_size) {
> > > +		ret |= BIT(0);
> > > +		sram_size -= bit_size;
> > > +	}
> > > +
> > > +	if (p_dec_info->sec_axi_info.use_ip_enable && sram_size >=
> > > +ip_size)
> > > {
> > > +		ret |= BIT(9);
> > > +		sram_size -= ip_size;
> > > +	}
> > > +
> > > +	if (p_dec_info->sec_axi_info.use_lf_row_enable && sram_size >=
> > > lf_size)
> > > +		ret |= BIT(15);
> > > +
> > > +	return ret;
> > > +}
> > > +
> > >  int wave5_vpu_decode(struct vpu_instance *inst, u32 *fail_res)  {
> > >  	u32 reg_val;
> > > @@ -855,9 +885,7 @@ int wave5_vpu_decode(struct vpu_instance *inst,
> > > u32
> > > *fail_res)
> > >  	vpu_write_reg(inst->dev, W5_BS_OPTION,
> > > get_bitstream_options(p_dec_info));
> > >
> > >  	/* secondary AXI */
> > > -	reg_val = p_dec_info->sec_axi_info.use_bit_enable |
> > > -		(p_dec_info->sec_axi_info.use_ip_enable << 9) |
> > > -		(p_dec_info->sec_axi_info.use_lf_row_enable << 15);
> > > +	reg_val = wave5_vpu_dec_validate_sec_axi(inst);
> > >  	vpu_write_reg(inst->dev, W5_USE_SEC_AXI, reg_val);
> > >
> > >  	/* set attributes of user buffer */ @@ -1938,6 +1966,31 @@ int
> > > wave5_vpu_enc_register_framebuffer(struct
> > > device *dev, struct vpu_instance *
> > >  	return ret;
> > >  }
> > >
> > > +static u32 wave5_vpu_enc_validate_sec_axi(struct vpu_instance *inst)
> {
> > > +	struct enc_info *p_enc_info = &inst->codec_info->enc_info;
> > > +	u32 rdo_size = 0, lf_size = 0, ret = 0;
> >
> > The rdo_size and 1f_size is always 0? If so, why are you using them ?
> >
> 
> Same as above. It is a placeholder for someone else to implement these.
> 
> > > +	u32 sram_size = inst->dev->sram_size;
> > > +
> > > +	if (!sram_size)
> > > +		return 0;
> > > +
> > > +	/*
> > > +	 * TODO: calculate rdo_size and lf_size from inst->src_fmt.width
> > > and
> > > +	 * inst->codec_info-
> > > >enc_info.open_param.wave_param.internal_bit_depth
> > > +	 */
> > > +
> > > +	if (p_enc_info->sec_axi_info.use_enc_rdo_enable && sram_size >=
> > > rdo_size) {
> > > +		ret |= BIT(11);
> > > +		sram_size -= rdo_size;
> > > +	}
> > > +
> > > +	if (p_enc_info->sec_axi_info.use_enc_lf_enable && sram_size >=
> > > lf_size)
> > > +		ret |= BIT(15);
> > > +
> > > +	return ret;
> > > +}
> > > +
> > >  int wave5_vpu_encode(struct vpu_instance *inst, struct enc_param
> > > *option,
> > > u32 *fail_res)  {
> > >  	u32 src_frame_format;
> > > @@ -1959,8 +2012,7 @@ int wave5_vpu_encode(struct vpu_instance
> > > *inst, struct enc_param *option, u32 *f
> > >
> > >  	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_SRC_AXI_SEL,
> > > DEFAULT_SRC_AXI);
> > >  	/* secondary AXI */
> > > -	reg_val = (p_enc_info->sec_axi_info.use_enc_rdo_enable << 11) |
> > > -		(p_enc_info->sec_axi_info.use_enc_lf_enable << 15);
> > > +	reg_val = wave5_vpu_enc_validate_sec_axi(inst);
> > >  	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_USE_SEC_AXI, reg_val);
> > >
> > >  	vpu_write_reg(inst->dev, W5_CMD_ENC_PIC_REPORT_PARAM, 0); diff --
> > > git a/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> > > b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> > > index 3809f70bc0b4..556de2f043fe 100644
> > > --- a/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> > > +++ b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
> >
> >
> > The below code is not based on the current upstream code. Where did you
> get the original code ?
> >
> 
> What do you mean? This patch series is based on the latest linux-next.


I was confused, please ignore the above comment.

> 
> > > @@ -174,16 +174,19 @@ int wave5_vdi_allocate_array(struct vpu_device
> > > *vpu_dev, struct vpu_buf *array,  void
> > > wave5_vdi_allocate_sram(struct vpu_device *vpu_dev)  {
> > >  	struct vpu_buf *vb = &vpu_dev->sram_buf;
> > > +	dma_addr_t daddr;
> > > +	void *vaddr;
> > > +	size_t size;
> > >
> > > -	if (!vpu_dev->sram_pool || !vpu_dev->sram_size)
> > > +	if (!vpu_dev->sram_pool || vb->vaddr)
> > >  		return;
> > >
> > > -	if (!vb->vaddr) {
> > > -		vb->size = vpu_dev->sram_size;
> > > -		vb->vaddr = gen_pool_dma_alloc(vpu_dev->sram_pool, vb->size,
> > > -					       &vb->daddr);
> > > -		if (!vb->vaddr)
> > > -			vb->size = 0;
> > > +	size = min_t(size_t, vpu_dev->sram_size, gen_pool_avail(vpu_dev-
> > > >sram_pool));
> > > +	vaddr = gen_pool_dma_alloc(vpu_dev->sram_pool, size, &daddr);
> > > +	if (vaddr) {
> > > +		vb->vaddr = vaddr;
> > > +		vb->daddr = daddr;
> > > +		vb->size = size;
> > >  	}
> > >
> > >  	dev_dbg(vpu_dev->dev, "%s: sram daddr: %pad, size: %zu, vaddr:
> > > 0x%p\n", @@ -197,9 +200,7 @@ void wave5_vdi_free_sram(struct
> > > vpu_device
> > > *vpu_dev)
> > >  	if (!vb->size || !vb->vaddr)
> > >  		return;
> > >
> > > -	if (vb->vaddr)
> > > -		gen_pool_free(vpu_dev->sram_pool, (unsigned long)vb->vaddr,
> > > -			      vb->size);
> > > +	gen_pool_free(vpu_dev->sram_pool, (unsigned long)vb->vaddr, vb-
> > > >size);
> > >
> > >  	memset(vb, 0, sizeof(*vb));
> > >  }
> > > diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> > > b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> > > index 1e631da58e15..9e93969ab6db 100644
> > > --- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> > > +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
> > > @@ -25,6 +25,7 @@
> > >  struct wave5_match_data {
> > >  	int flags;
> > >  	const char *fw_name;
> > > +	u32 sram_size;
> > >  };
> > >
> > >  int wave5_vpu_wait_interrupt(struct vpu_instance *inst, unsigned
> > > int
> > > timeout) @@ -177,17 +178,12 @@ static int wave5_vpu_probe(struct
> > > platform_device *pdev)
> > >  		goto err_reset_assert;
> > >  	}
> > >
> > > -	ret = of_property_read_u32(pdev->dev.of_node, "sram-size",
> > > -				   &dev->sram_size);
> > > -	if (ret) {
> > > -		dev_warn(&pdev->dev, "sram-size not found\n");
> > > -		dev->sram_size = 0;
> > > -	}
> > > -
> > >  	dev->sram_pool = of_gen_pool_get(pdev->dev.of_node, "sram", 0);
> > >  	if (!dev->sram_pool)
> > >  		dev_warn(&pdev->dev, "sram node not found\n");
> > >
> > > +	dev->sram_size = match_data->sram_size;
> > > +
> > >  	dev->product_code = wave5_vdi_read_register(dev,
> > > VPU_PRODUCT_CODE_REGISTER);
> > >  	ret = wave5_vdi_init(&pdev->dev);
> > >  	if (ret < 0) {
> > > @@ -281,6 +277,7 @@ static void wave5_vpu_remove(struct
> > > platform_device
> > > *pdev)  static const struct wave5_match_data ti_wave521c_data = {
> > >  	.flags = WAVE5_IS_ENC | WAVE5_IS_DEC,
> > >  	.fw_name = "cnm/wave521c_k3_codec_fw.bin",
> > > +	.sram_size = (64 * 1024),
> > >  };
> > >
> > >  static const struct of_device_id wave5_dt_ids[] = {
> > > --
> > > 2.44.0
> >

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH v3 0/5] Wave515 decoder IP support
  2024-04-05 16:41 [PATCH v3 0/5] Wave515 decoder IP support Ivan Bornyakov
                   ` (4 preceding siblings ...)
  2024-04-05 16:41 ` [PATCH v3 5/5] media: chips-media: wave5: support Wave515 decoder Ivan Bornyakov
@ 2024-04-11  8:13 ` jackson.lee
  2024-04-11  9:36   ` Ivan Bornyakov
  5 siblings, 1 reply; 12+ messages in thread
From: jackson.lee @ 2024-04-11  8:13 UTC (permalink / raw)
  To: Ivan Bornyakov, Nas Chung, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke
  Cc: linux-media, linux-kernel

Hi Ivan

Can you provide a score for testing a fluster tool so that we can verify the change on your HW?

Thanks
Jackson

> -----Original Message-----
> From: Ivan Bornyakov <brnkv.i1@gmail.com>
> Sent: Saturday, April 6, 2024 1:41 AM
> To: Nas Chung <nas.chung@chipsnmedia.com>; jackson.lee
> <jackson.lee@chipsnmedia.com>; Mauro Carvalho Chehab <mchehab@kernel.org>;
> Philipp Zabel <p.zabel@pengutronix.de>; Sebastian Fricke
> <sebastian.fricke@collabora.com>
> Cc: Ivan Bornyakov <brnkv.i1@gmail.com>; linux-media@vger.kernel.org;
> linux-kernel@vger.kernel.org
> Subject: [PATCH v3 0/5] Wave515 decoder IP support
> 
> Initial support for Wave515 multi-decoder IP among other refinements.
> This was tested on FPGA prototype, so wave5_dt_ids[] was not expanded.
> 
> fluster score for JCT-VC-HEVC_V1 testsuite with
> GStreamer-H.265-V4L2-Gst1.0 decoder is 132/147
> 
> The issue with Main10 tests is that fluster expects decoded file to be in
> yuv420p10le format while this driver decodes HEVC Main10 into 8-bit
> yuv420p. Though result is looks alright to the naked eye, proper decoding
> into yuv420p10le is to be added.
> 
> The rest failed fluster tests are common with Wave521.
> 
> ChangeLog:
>   v1:
> https://lore.kernel.org/linux-media/20240318144225.30835-1-
> brnkv.i1@gmail.com/
>   v2:
> https://lore.kernel.org/linux-media/20240325064102.9278-1-
> brnkv.i1@gmail.com/
>     * drop patch "dt-bindings: media: cnm,wave521c: drop resets
> restriction"
>       The only user of Wave5 in mainline is TI K3 boards, thus there is
>       no real need to alter dt-bindings
>     * in patch "media: chips-media: wave5: support decoding HEVC Main10
> profile"
>       add check for flag "support_hevc10bit_dec"
>     * in patch "media: chips-media: wave5: support reset lines" move
>       reset_control_deassert() out of else branch, add
>       reset_control_assert() to probe error path.
>     * rework patch "media: chips-media: wave5: drop "sram-size" DT prop"
>        - don't move alloc/free form device open/close
>        - intead of exact configuration of reserved SRAM memory in DT and
> 	 allocating all of it, allocate all available SRAM memory up to
> 	 WAVE5_MAX_SRAM_SIZE from whatever pool provided.
>     * adjust patch "media: chips-media: wave5: support Wave515 decoder"
>       according to changes in patches
>       "media: chips-media: wave5: support decoding HEVC Main10 profile" and
>       "media: chips-media: wave5: drop "sram-size" DT prop"
>   v3:
>     * reword patch "media: chips-media: wave5: separate irq setup routine"
>       a bit.
>     * in patch "media: chips-media: wave5: drop "sram-size" DT prop"
>        - move MAX_SRAM_SIZE define into match_data->sram_size
>        - add placeholders for validation that allocated SRAM memory is
> 	 enough to encode/decode bitstream of given resolution before
> 	 setting W5_USE_SEC_AXI and W5_CMD_ENC_PIC_USE_SEC_AXI registers
>        - reword accordingly
>     * in patch "media: chips-media: wave5: support Wave515 decoder"
>        - add comments around SRAM memory allocation/freeing about
> 	 Wave515 specifics
>        - add comments about BSOPTION_RD_PTR_VALID_FLAG bit in
> 	 W5_BS_OPTION register
>        - add W[AVE]521_ prefix to defines, for wich there are W[AVE]515_
> 	 alternatieves
>        - add semi-magic Wave515 specific formulas to estimate SRAM usage
> 
> Ivan Bornyakov (5):
>   media: chips-media: wave5: support decoding HEVC Main10 profile
>   media: chips-media: wave5: support reset lines
>   media: chips-media: wave5: separate irq setup routine
>   media: chips-media: wave5: drop "sram-size" DT prop
>   media: chips-media: wave5: support Wave515 decoder
> 
>  .../platform/chips-media/wave5/wave5-helper.c |   8 +-
>  .../platform/chips-media/wave5/wave5-hw.c     | 395 +++++++++++++-----
>  .../chips-media/wave5/wave5-regdefine.h       |   5 +
>  .../platform/chips-media/wave5/wave5-vdi.c    |  27 +-
>  .../chips-media/wave5/wave5-vpu-dec.c         |  51 ++-
>  .../chips-media/wave5/wave5-vpu-enc.c         |   2 +-
>  .../platform/chips-media/wave5/wave5-vpu.c    |  35 +-
>  .../platform/chips-media/wave5/wave5-vpuapi.h |   3 +
>  .../chips-media/wave5/wave5-vpuconfig.h       |  16 +-
>  .../media/platform/chips-media/wave5/wave5.h  |   6 +
>  10 files changed, 407 insertions(+), 141 deletions(-)
> 
> --
> 2.44.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: RE: [PATCH v3 0/5] Wave515 decoder IP support
  2024-04-11  8:13 ` [PATCH v3 0/5] Wave515 decoder IP support jackson.lee
@ 2024-04-11  9:36   ` Ivan Bornyakov
  2024-04-15 15:18     ` jackson.lee
  0 siblings, 1 reply; 12+ messages in thread
From: Ivan Bornyakov @ 2024-04-11  9:36 UTC (permalink / raw)
  To: jackson.lee
  Cc: Nas Chung, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke, linux-media, linux-kernel

Hi

On Thu, Apr 11, 2024 at 08:13:39AM +0000, jackson.lee wrote:
> Hi Ivan
> 
> Can you provide a score for testing a fluster tool so that we can verify the change on your HW?
> 

I did that, didn't I?

> Thanks
> Jackson
> 
> > -----Original Message-----
> > From: Ivan Bornyakov <brnkv.i1@gmail.com>
> > Sent: Saturday, April 6, 2024 1:41 AM
> > To: Nas Chung <nas.chung@chipsnmedia.com>; jackson.lee
> > <jackson.lee@chipsnmedia.com>; Mauro Carvalho Chehab <mchehab@kernel.org>;
> > Philipp Zabel <p.zabel@pengutronix.de>; Sebastian Fricke
> > <sebastian.fricke@collabora.com>
> > Cc: Ivan Bornyakov <brnkv.i1@gmail.com>; linux-media@vger.kernel.org;
> > linux-kernel@vger.kernel.org
> > Subject: [PATCH v3 0/5] Wave515 decoder IP support
> > 
> > Initial support for Wave515 multi-decoder IP among other refinements.
> > This was tested on FPGA prototype, so wave5_dt_ids[] was not expanded.
> > 
> > fluster score for JCT-VC-HEVC_V1 testsuite with
> > GStreamer-H.265-V4L2-Gst1.0 decoder is 132/147
> > 

Here it is. Above is the score, below is notes about failed tests.

> > The issue with Main10 tests is that fluster expects decoded file to be in
> > yuv420p10le format while this driver decodes HEVC Main10 into 8-bit
> > yuv420p. Though result is looks alright to the naked eye, proper decoding
> > into yuv420p10le is to be added.
> > 
> > The rest failed fluster tests are common with Wave521.
> > 
> > ChangeLog:
> >   v1:
> > https://lore.kernel.org/linux-media/20240318144225.30835-1-
> > brnkv.i1@gmail.com/
> >   v2:
> > https://lore.kernel.org/linux-media/20240325064102.9278-1-
> > brnkv.i1@gmail.com/
> >     * drop patch "dt-bindings: media: cnm,wave521c: drop resets
> > restriction"
> >       The only user of Wave5 in mainline is TI K3 boards, thus there is
> >       no real need to alter dt-bindings
> >     * in patch "media: chips-media: wave5: support decoding HEVC Main10
> > profile"
> >       add check for flag "support_hevc10bit_dec"
> >     * in patch "media: chips-media: wave5: support reset lines" move
> >       reset_control_deassert() out of else branch, add
> >       reset_control_assert() to probe error path.
> >     * rework patch "media: chips-media: wave5: drop "sram-size" DT prop"
> >        - don't move alloc/free form device open/close
> >        - intead of exact configuration of reserved SRAM memory in DT and
> > 	 allocating all of it, allocate all available SRAM memory up to
> > 	 WAVE5_MAX_SRAM_SIZE from whatever pool provided.
> >     * adjust patch "media: chips-media: wave5: support Wave515 decoder"
> >       according to changes in patches
> >       "media: chips-media: wave5: support decoding HEVC Main10 profile" and
> >       "media: chips-media: wave5: drop "sram-size" DT prop"
> >   v3:
> >     * reword patch "media: chips-media: wave5: separate irq setup routine"
> >       a bit.
> >     * in patch "media: chips-media: wave5: drop "sram-size" DT prop"
> >        - move MAX_SRAM_SIZE define into match_data->sram_size
> >        - add placeholders for validation that allocated SRAM memory is
> > 	 enough to encode/decode bitstream of given resolution before
> > 	 setting W5_USE_SEC_AXI and W5_CMD_ENC_PIC_USE_SEC_AXI registers
> >        - reword accordingly
> >     * in patch "media: chips-media: wave5: support Wave515 decoder"
> >        - add comments around SRAM memory allocation/freeing about
> > 	 Wave515 specifics
> >        - add comments about BSOPTION_RD_PTR_VALID_FLAG bit in
> > 	 W5_BS_OPTION register
> >        - add W[AVE]521_ prefix to defines, for wich there are W[AVE]515_
> > 	 alternatieves
> >        - add semi-magic Wave515 specific formulas to estimate SRAM usage
> > 
> > Ivan Bornyakov (5):
> >   media: chips-media: wave5: support decoding HEVC Main10 profile
> >   media: chips-media: wave5: support reset lines
> >   media: chips-media: wave5: separate irq setup routine
> >   media: chips-media: wave5: drop "sram-size" DT prop
> >   media: chips-media: wave5: support Wave515 decoder
> > 
> >  .../platform/chips-media/wave5/wave5-helper.c |   8 +-
> >  .../platform/chips-media/wave5/wave5-hw.c     | 395 +++++++++++++-----
> >  .../chips-media/wave5/wave5-regdefine.h       |   5 +
> >  .../platform/chips-media/wave5/wave5-vdi.c    |  27 +-
> >  .../chips-media/wave5/wave5-vpu-dec.c         |  51 ++-
> >  .../chips-media/wave5/wave5-vpu-enc.c         |   2 +-
> >  .../platform/chips-media/wave5/wave5-vpu.c    |  35 +-
> >  .../platform/chips-media/wave5/wave5-vpuapi.h |   3 +
> >  .../chips-media/wave5/wave5-vpuconfig.h       |  16 +-
> >  .../media/platform/chips-media/wave5/wave5.h  |   6 +
> >  10 files changed, 407 insertions(+), 141 deletions(-)
> > 
> > --
> > 2.44.0
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: RE: [PATCH v3 0/5] Wave515 decoder IP support
  2024-04-11  9:36   ` Ivan Bornyakov
@ 2024-04-15 15:18     ` jackson.lee
  0 siblings, 0 replies; 12+ messages in thread
From: jackson.lee @ 2024-04-15 15:18 UTC (permalink / raw)
  To: Ivan Bornyakov
  Cc: Nas Chung, Mauro Carvalho Chehab, Philipp Zabel,
	Sebastian Fricke, linux-media, linux-kernel

Hi Ivan

> -----Original Message-----
> From: Ivan Bornyakov <brnkv.i1@gmail.com>
> Sent: Thursday, April 11, 2024 6:37 PM
> To: jackson.lee <jackson.lee@chipsnmedia.com>
> Cc: Nas Chung <nas.chung@chipsnmedia.com>; Mauro Carvalho Chehab
> <mchehab@kernel.org>; Philipp Zabel <p.zabel@pengutronix.de>; Sebastian
> Fricke <sebastian.fricke@collabora.com>; linux-media@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: RE: [PATCH v3 0/5] Wave515 decoder IP support
> 
> Hi
> 
> On Thu, Apr 11, 2024 at 08:13:39AM +0000, jackson.lee wrote:
> > Hi Ivan
> >
> > Can you provide a score for testing a fluster tool so that we can verify
> the change on your HW?
> >
> 
> I did that, didn't I?
> 
> > Thanks
> > Jackson
> >
> > > -----Original Message-----
> > > From: Ivan Bornyakov <brnkv.i1@gmail.com>
> > > Sent: Saturday, April 6, 2024 1:41 AM
> > > To: Nas Chung <nas.chung@chipsnmedia.com>; jackson.lee
> > > <jackson.lee@chipsnmedia.com>; Mauro Carvalho Chehab
> > > <mchehab@kernel.org>; Philipp Zabel <p.zabel@pengutronix.de>;
> > > Sebastian Fricke <sebastian.fricke@collabora.com>
> > > Cc: Ivan Bornyakov <brnkv.i1@gmail.com>;
> > > linux-media@vger.kernel.org; linux-kernel@vger.kernel.org
> > > Subject: [PATCH v3 0/5] Wave515 decoder IP support
> > >
> > > Initial support for Wave515 multi-decoder IP among other refinements.
> > > This was tested on FPGA prototype, so wave5_dt_ids[] was not expanded.
> > >
> > > fluster score for JCT-VC-HEVC_V1 testsuite with
> > > GStreamer-H.265-V4L2-Gst1.0 decoder is 132/147
> > >
> 
> Here it is. Above is the score, below is notes about failed tests.
> 

I didn't see that, It is enough for HEVC

> > > The issue with Main10 tests is that fluster expects decoded file to
> > > be in yuv420p10le format while this driver decodes HEVC Main10 into
> > > 8-bit yuv420p. Though result is looks alright to the naked eye,
> > > proper decoding into yuv420p10le is to be added.
> > >
> > > The rest failed fluster tests are common with Wave521.
> > >
> > > ChangeLog:
> > >   v1:
> > > https://lore.kernel.org/linux-media/20240318144225.30835-1-
> > > brnkv.i1@gmail.com/
> > >   v2:
> > > https://lore.kernel.org/linux-media/20240325064102.9278-1-
> > > brnkv.i1@gmail.com/
> > >     * drop patch "dt-bindings: media: cnm,wave521c: drop resets
> > > restriction"
> > >       The only user of Wave5 in mainline is TI K3 boards, thus there is
> > >       no real need to alter dt-bindings
> > >     * in patch "media: chips-media: wave5: support decoding HEVC
> > > Main10 profile"
> > >       add check for flag "support_hevc10bit_dec"
> > >     * in patch "media: chips-media: wave5: support reset lines" move
> > >       reset_control_deassert() out of else branch, add
> > >       reset_control_assert() to probe error path.
> > >     * rework patch "media: chips-media: wave5: drop "sram-size" DT prop"
> > >        - don't move alloc/free form device open/close
> > >        - intead of exact configuration of reserved SRAM memory in DT and
> > > 	 allocating all of it, allocate all available SRAM memory up to
> > > 	 WAVE5_MAX_SRAM_SIZE from whatever pool provided.
> > >     * adjust patch "media: chips-media: wave5: support Wave515 decoder"
> > >       according to changes in patches
> > >       "media: chips-media: wave5: support decoding HEVC Main10 profile"
> and
> > >       "media: chips-media: wave5: drop "sram-size" DT prop"
> > >   v3:
> > >     * reword patch "media: chips-media: wave5: separate irq setup routine"
> > >       a bit.
> > >     * in patch "media: chips-media: wave5: drop "sram-size" DT prop"
> > >        - move MAX_SRAM_SIZE define into match_data->sram_size
> > >        - add placeholders for validation that allocated SRAM memory is
> > > 	 enough to encode/decode bitstream of given resolution before
> > > 	 setting W5_USE_SEC_AXI and W5_CMD_ENC_PIC_USE_SEC_AXI registers
> > >        - reword accordingly
> > >     * in patch "media: chips-media: wave5: support Wave515 decoder"
> > >        - add comments around SRAM memory allocation/freeing about
> > > 	 Wave515 specifics
> > >        - add comments about BSOPTION_RD_PTR_VALID_FLAG bit in
> > > 	 W5_BS_OPTION register
> > >        - add W[AVE]521_ prefix to defines, for wich there are W[AVE]515_
> > > 	 alternatieves
> > >        - add semi-magic Wave515 specific formulas to estimate SRAM
> > > usage
> > >
> > > Ivan Bornyakov (5):
> > >   media: chips-media: wave5: support decoding HEVC Main10 profile
> > >   media: chips-media: wave5: support reset lines
> > >   media: chips-media: wave5: separate irq setup routine
> > >   media: chips-media: wave5: drop "sram-size" DT prop
> > >   media: chips-media: wave5: support Wave515 decoder
> > >
> > >  .../platform/chips-media/wave5/wave5-helper.c |   8 +-
> > >  .../platform/chips-media/wave5/wave5-hw.c     | 395 +++++++++++++-----
> > >  .../chips-media/wave5/wave5-regdefine.h       |   5 +
> > >  .../platform/chips-media/wave5/wave5-vdi.c    |  27 +-
> > >  .../chips-media/wave5/wave5-vpu-dec.c         |  51 ++-
> > >  .../chips-media/wave5/wave5-vpu-enc.c         |   2 +-
> > >  .../platform/chips-media/wave5/wave5-vpu.c    |  35 +-
> > >  .../platform/chips-media/wave5/wave5-vpuapi.h |   3 +
> > >  .../chips-media/wave5/wave5-vpuconfig.h       |  16 +-
> > >  .../media/platform/chips-media/wave5/wave5.h  |   6 +
> > >  10 files changed, 407 insertions(+), 141 deletions(-)
> > >
> > > --
> > > 2.44.0
> >

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2024-04-15 15:18 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-05 16:41 [PATCH v3 0/5] Wave515 decoder IP support Ivan Bornyakov
2024-04-05 16:41 ` [PATCH v3 1/5] media: chips-media: wave5: support decoding HEVC Main10 profile Ivan Bornyakov
2024-04-05 16:41 ` [PATCH v3 2/5] media: chips-media: wave5: support reset lines Ivan Bornyakov
2024-04-05 16:41 ` [PATCH v3 3/5] media: chips-media: wave5: separate irq setup routine Ivan Bornyakov
2024-04-05 16:41 ` [PATCH v3 4/5] media: chips-media: wave5: drop "sram-size" DT prop Ivan Bornyakov
2024-04-09  4:50   ` jackson.lee
2024-04-09  8:12     ` Ivan Bornyakov
2024-04-11  8:11       ` jackson.lee
2024-04-05 16:41 ` [PATCH v3 5/5] media: chips-media: wave5: support Wave515 decoder Ivan Bornyakov
2024-04-11  8:13 ` [PATCH v3 0/5] Wave515 decoder IP support jackson.lee
2024-04-11  9:36   ` Ivan Bornyakov
2024-04-15 15:18     ` jackson.lee

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®