RE: [PATCH 5/6] media: chips-media: wave5: refine SRAM usage

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, Ivan and Brandon.

>-----Original Message-----
>From: Brandon Brnich <b-brnich@xxxxxx>
>Sent: Wednesday, March 20, 2024 6:01 AM
>To: Ivan Bornyakov <brnkv.i1@xxxxxxxxx>
>Cc: Nas Chung <nas.chung@xxxxxxxxxxxxxxx>; Philipp Zabel
><p.zabel@xxxxxxxxxxxxxx>; Rob Herring <robh@xxxxxxxxxx>; Krzysztof
>Kozlowski <krzysztof.kozlowski+dt@xxxxxxxxxx>; Conor Dooley
><conor+dt@xxxxxxxxxx>; linux-media@xxxxxxxxxxxxxxx; linux-
>kernel@xxxxxxxxxxxxxxx; devicetree@xxxxxxxxxxxxxxx; jackson.lee
><jackson.lee@xxxxxxxxxxxxxxx>; Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>
>Subject: Re: [PATCH 5/6] media: chips-media: wave5: refine SRAM usage
>
>Hi Ivan,
>
>On 14:24-20240319, Ivan Bornyakov wrote:
>> Hello, Nas
>>
>> On Tue, Mar 19, 2024 at 10:56:22AM +0000, Nas Chung wrote:
>> > Hi, Ivan.
>> >
>> > >
>> > >Allocate SRAM memory on module probe, free on remove. There is no
>need
>> > >to allocate on device open, free on close, the memory is the same
>every
>> > >time.
>> >
>> > If there is no decoder/encoder instance, driver don't need to
>allocate SRAM memory.
>> > The main reason of allocating the memory in open() is to allow other
>modules to
>> > use more SRAM memory, if wave5 is not working.
>
>I have to agree with this statement. Moving allocation to probe results
>in wasting SRAM when VPU is not in use. VPU should only be allocating
>SRAM
>when a stream instance is running and free that back once all instances
>close.
>
>> > >
>> > >Also use gen_pool_size() to determine SRAM memory size to be
>allocated
>> > >instead of separate "sram-size" DT property to reduce duplication.
>> > >
>> > >Signed-off-by: Ivan Bornyakov <brnkv.i1@xxxxxxxxx>
>> > >---
>> > > .../platform/chips-media/wave5/wave5-helper.c |  3 ---
>> > > .../platform/chips-media/wave5/wave5-vdi.c    | 21 ++++++++++-------
>--
>> > > .../chips-media/wave5/wave5-vpu-dec.c         |  2 --
>> > > .../chips-media/wave5/wave5-vpu-enc.c         |  2 --
>> > > .../platform/chips-media/wave5/wave5-vpu.c    | 12 +++++------
>> > > .../platform/chips-media/wave5/wave5-vpuapi.h |  1 -
>> > > 6 files changed, 16 insertions(+), 25 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..ec710b838dfe 100644
>> > >--- a/drivers/media/platform/chips-media/wave5/wave5-helper.c
>> > >+++ b/drivers/media/platform/chips-media/wave5/wave5-helper.c
>> > >@@ -29,9 +29,6 @@ void wave5_cleanup_instance(struct vpu_instance
>*inst)
>> > > {
>> > > 	int i;
>> > >
>> > >-	if (list_is_singular(&inst->list))
>> > >-		wave5_vdi_free_sram(inst->dev);
>> > >-
>> > > 	for (i = 0; i < inst->fbc_buf_count; i++)
>> > > 		wave5_vpu_dec_reset_framebuffer(inst, i);
>> > >
>> > >diff --git a/drivers/media/platform/chips-media/wave5/wave5-vdi.c
>> > >b/drivers/media/platform/chips-media/wave5/wave5-vdi.c
>> > >index 3809f70bc0b4..ee671f5a2f37 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 = gen_pool_size(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-
>dec.c
>> > >b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
>> > >index aa0401f35d32..84dbe56216ad 100644
>> > >--- a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
>> > >+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
>> > >@@ -1854,8 +1854,6 @@ static int wave5_vpu_open_dec(struct file
>*filp)
>> > > 		goto cleanup_inst;
>> > > 	}
>> > >
>> > >-	wave5_vdi_allocate_sram(inst->dev);
>> > >-
>> > > 	return 0;
>> > >
>> > > cleanup_inst:
>> > >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..86ddcb82443b 100644
>> > >--- a/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c
>> > >+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c
>> > >@@ -1727,8 +1727,6 @@ static int wave5_vpu_open_enc(struct file
>*filp)
>> > > 		goto cleanup_inst;
>> > > 	}
>> > >
>> > >-	wave5_vdi_allocate_sram(inst->dev);
>> > >-
>> > > 	return 0;
>> > >
>> > > cleanup_inst:
>> > >diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
>> > >b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
>> > >index f3ecadefd37a..2a0a70dd7062 100644
>> > >--- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c
>> > >+++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c
>> > >@@ -178,16 +178,11 @@ static int wave5_vpu_probe(struct
>platform_device
>> > >*pdev)
>> > > 		return ret;
>> > > 	}
>> > >
>> > >-	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;
>> > >-	}
>> > >-
>> >
>> > Required SRAM size is different from each wave5 product.
>> > And, SoC vendor also can configure the different SRAM size
>> > depend on target SoC specification even they use the same wave5
>product.
>> >
>>
>> One can limit iomem address range in SRAM node. Here is the example of
>> how I setup Wave515 with SRAM:
>>
>> 	sram@2000000 {
>> 		compatible = "mmio-sram";
>> 		reg = <0x0 0x2000000 0x0 0x80000>;
>> 		#address-cells = <1>;
>> 		#size-cells = <1>;
>> 		ranges = <0x0 0x0 0x2000000 0x80000>;
>>
>> 		wave515_vpu_sram: wave515-vpu-sram@0 {
>> 			reg = <0x0 0x80000>;
>> 			pool;
>> 		};
>> 	};
>>
>> 	wave515@410000 {
>> 		compatible = "cnm,wave515";
>> 		reg = <0x0 0x410000 0x0 0x10000>;
>> 		clocks = <&clk_ref1>;
>> 		clock-names = "videc";
>> 		interrupt-parent = <&wave515_intc>;
>> 		interrupts = <16 IRQ_TYPE_LEVEL_HIGH>;
>> 		resets = <&wave515_reset 0>,
>> 			 <&wave515_reset 4>,
>> 			 <&wave515_reset 8>,
>> 			 <&wave515_reset 12>;
>> 		sram = <&wave515_vpu_sram>;
>> 	};
>>
>> gen_pool_size() returns size of wave515_vpu_sram, no need for extra
>> "sram-size" property.

Thanks for sharing the example.
I agree that the "sram-size" property is not needed.

>
>"sram-size" property does need to be removed, as this was the consensus
>gathered from my patch[0]. However, I think your method is still taking

I missed the previous consensus for the sram-size property.
Thanks for letting me know.

>a more static approach. One of the recommendations in my thread[1] was
>making a list of known SRAM sizes given typical resolutions and
>iterating through until a valid allocation is done. I don't think this
>is the correct approach either based on Nas's comment that each Wave5
>has different SRAM size requirement. It would clutter up the file too
>much if each wave5 product had its own SRAM size mapping.
>
>Could another approach be to change Wave5 dts node to have property set
>as "sram = <&sram>;" in your example, then driver calls
>gen_pool_availble to get size remaining? From there, a check could be
>put in place to make sure an unnecessary amount is not being allocated.

Ivan's approach looks good to me.
It is similar to your first patch, which adds the sram-size property
to configure different SRAM sizes for each device.
And, Driver won't know unnecessary amount is allocated before parsing
bitstream header.

>
>
>[0]:
>https://lore.kernel.org/lkml/99bf4d6d988d426492fffc8de9015751c323bd8a.cam
>el@xxxxxxxxxxxx/
>[1]: https://lore.kernel.org/lkml/9c5b7b2c-8a66-4173-dfe9-
>5724ec5f733d@xxxxxx/
>
>Thanks,
>Brandon
>>
>> > Thanks.
>> > Nas.
>> >
>> > > 	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");
>> > >+	else
>> > >+		wave5_vdi_allocate_sram(dev);
>> > >
>> > > 	dev->product_code = wave5_vdi_read_register(dev,
>> > >VPU_PRODUCT_CODE_REGISTER);
>> > > 	ret = wave5_vdi_init(&pdev->dev);
>> > >@@ -259,6 +254,8 @@ static int wave5_vpu_probe(struct
>platform_device
>> > >*pdev)
>> > > err_clk_dis:
>> > > 	clk_bulk_disable_unprepare(dev->num_clks, dev->clks);
>> > >
>> > >+	wave5_vdi_free_sram(dev);
>> > >+
>> > > 	return ret;
>> > > }
>> > >
>> > >@@ -275,6 +272,7 @@ static void wave5_vpu_remove(struct
>platform_device
>> > >*pdev)
>> > > 	v4l2_device_unregister(&dev->v4l2_dev);
>> > > 	wave5_vdi_release(&pdev->dev);
>> > > 	ida_destroy(&dev->inst_ida);
>> > >+	wave5_vdi_free_sram(dev);
>> > > }
>> > >
>> > > static const struct wave5_match_data ti_wave521c_data = {
>> > >diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
>> > >b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
>> > >index fa62a85080b5..8d88381ac55e 100644
>> > >--- a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
>> > >+++ b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
>> > >@@ -749,7 +749,6 @@ struct vpu_device {
>> > > 	struct vpu_attr attr;
>> > > 	struct vpu_buf common_mem;
>> > > 	u32 last_performance_cycles;
>> > >-	u32 sram_size;
>> > > 	struct gen_pool *sram_pool;
>> > > 	struct vpu_buf sram_buf;
>> > > 	void __iomem *vdb_register;
>> > >--
>> > >2.44.0
>> >
>>





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux