Re: [PATCH 3/8] dt-bindings: media: nxp: Add Wave6 video codec device

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

 



On Thu, Feb 13, 2025 at 07:50:53AM +0000, Nas Chung wrote:
> >> +    items:
> >> +      - enum:
> >> +          - nxp,imx95-wave633c-ctrl
> >> +          - nxp,imx95-wave633c
> >
> >I don't understand why you duplicated compatibles. You split this for
> >driver? That's a no. There are no two hardwares.
> 
> Yes, I want to introduce two different devices and drivers,
> even though there is only one hardware.

That's a no. Bindings are for hardware, not drivers.
Linux driver design is independent of bindings.

> 
> Wave6 IP has five independent register regions:
> 
> One register region is dedicated to the control device,
> which manages shared resources such as firmware loading and power domains.
> 
> The remaining four register regions are assigned to
> four independent VPU devices, each accessing its own dedicated region.
> (to support 4 vms)

This could be, but your binding said something completely opposite. Look
how other bindings do it, first.

> 
> Would it be reasonable to split the YAML into separate files
> for the VPU control device and the VPU device ?
> (like nxp,wave633c-ctrl.yaml)

No, it changes nothing.

> 
> >
> >These compatibles are anyway weird - why imx95 is in chipmedia product?
> >Is this part of a SoC?
> 
> I want to represent that the Wave633 is part of the i.MX95.
> Chips&Media's Wave633 can also be integrated into SoCs from other vendors.

OK


> By using the compatible name, the same Wave6 driver can distinguish
> different implementations.

So you tell DT maintainer how DT works, brilliant...

> 
> However, I agree that "imx95" is not strictly necessary in current status.
> So, using "nxp,wave633c" would be a better choice, right ?

No, NXP did not create wave633c. SoC components must have SoC prefix,
assuming this is a Soc component.

> 
> >
> >> +
> >> +  reg:
> >> +    maxItems: 1
> >> +
> >> +  interrupts:
> >> +    maxItems: 1
> >> +
> >> +  clocks:
> >> +    items:
> >> +      - description: VPU clock
> >> +      - description: VPU associated block clock
> >> +
> >> +  clock-names:
> >> +    items:
> >> +      - const: vpu
> >> +      - const: vpublk_wave
> >> +
> >> +  power-domains:
> >> +    minItems: 1
> >> +    items:
> >> +      - description: Main VPU power domain
> >> +      - description: Performance power domain
> >> +
> >> +  power-domain-names:
> >> +    items:
> >> +      - const: vpumix
> >> +      - const: vpuperf
> >> +
> >> +  cnm,ctrl:
> >
> >What is this prefix about? Is this nxp or something else?
> 
> Yes, using "nxp" as the prefix seems more appropriate.
> 
> >
> >> +    $ref: /schemas/types.yaml#/definitions/phandle
> >> +    description: phandle of the VPU control device node. Required for VPU
> >operation.
> >
> >Explain - required for what. Operation is too generic.
> 
> phandle of the VPU control device node, which manages shared resources
> such as firmware access and power domains.

Then NAK.

Use proper bindings for this, e.g. power-domains.


> 
> >
> >If this is phandle to second device, then it's proof your split is
> >really wrong.
> 
> Are you suggesting that I should separate them into two YAML files,

No. Splitting into separate files would change nothing - you still would
have here a phandle, right?

> or that I should structure them in a parent-child hierarchy
> within the same YAML file ?

You did not try hard enough to find similar devices, which there is a
ton of.

> 
> I appreciate any guidance on the best approach to structure this in line
> with existing bindings.

Then look for them.

You have one device. If you have sub-blocks with their own
distinguishable address space, then they can be children. But you did
not write it that way. Just look at your example DTS - no children at
all!

> 
> >
> >> +
> >> +  boot:
> >> +    $ref: /schemas/types.yaml#/definitions/phandle
> >> +    description: phandle of the boot memory region node for the VPU
> >control device.
> >
> >No clue what is this... if memory region then use existing bindings.
> 
> Boot is a memory region used for firmware upload.
> Only the control device can access this region.
> By "existing bindings," do you mean I should use "memory-region" instead ?

Look how other bindings do this and what property they use. Yes,
memory-region.

> 
> >
> >Anyway, wrap your code correctly.
> 
> Okay.
> 
> >
> >> +
> >> +  sram:
> >> +    $ref: /schemas/types.yaml#/definitions/phandle
> >> +    description: phandle of the SRAM memory region node for the VPU
> >control device.
> >> +
> >> +  '#cooling-cells':
> >> +    const: 2
> >> +
> >> +  support-follower:
> >> +    type: boolean
> >> +    description: Indicates whether the VPU domain power always on.
> >
> >You cannot add new common properties in random way. Missing vendor
> >prefix but more important: does not look at all as hardware property but
> >OS policy.
> 
> I agree with you.
> I'll remove it in v2.
> 
> >
> >> +
> >> +patternProperties:
> >> +  "^vpu-ctrl@[0-9a-f]+$":
> >> +    type: object
> >> +    properties:
> >> +      compatible:
> >> +        items:
> >> +          - enum:
> >> +              - nxp,imx95-wave633c-ctrl
> >
> >Really, what? How nxp,imx95-wave633c-ctrl node can have a child with
> >nxp,imx95-wave633c-ctrl compatible?
> >
> >NAK.
> 
> Apologies, I misunderstood the meaning of 'patternProperties'.
> I'll remove it in v2.
> 
> >
> >
> >> +      reg: true
> >> +      clocks: true
> >> +      clock-names: true
> >> +      power-domains:
> >> +        items:
> >> +          - description: Main VPU power domain
> >> +          - description: Performance power domain
> >> +      power-domain-names:
> >> +        items:
> >> +          - const: vpumix
> >> +          - const: vpuperf
> >> +      sram: true
> >> +      boot: true
> >> +      '#cooling-cells': true
> >> +      support-follower: true
> >> +    required:
> >> +      - compatible
> >> +      - reg
> >> +      - clocks
> >> +      - clock-names
> >> +      - power-domains
> >> +      - power-domain-names
> >> +      - sram
> >> +      - boot
> >> +
> >> +    additionalProperties: false
> >> +
> >> +  "^vpu@[0-9a-f]+$":
> >> +    type: object
> >> +    properties:
> >> +      compatible:
> >> +        items:
> >> +          - enum:
> >> +              - nxp,imx95-wave633c
> >> +      reg: true
> >> +      interrupts: true
> >> +      clocks: true
> >> +      clock-names: true
> >> +      power-domains:
> >> +        maxItems: 1
> >> +        description: Main VPU power domain
> >> +      cnm,ctrl: true
> >> +    required:
> >> +      - compatible
> >> +      - reg
> >> +      - interrupts
> >> +      - clocks
> >> +      - clock-names
> >> +      - power-domains
> >> +      - cnm,ctrl
> >
> >All this is just incorrect.
> 
> I'll remove it in v2.
> 
> >
> >> +
> >> +    additionalProperties: false
> >> +
> >> +additionalProperties: false
> >> +
> >> +examples:
> >> +  - |
> >> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> >> +    #include <dt-bindings/clock/nxp,imx95-clock.h>
> >> +
> >> +    soc {
> >> +      #address-cells = <2>;
> >> +      #size-cells = <2>;
> >> +
> >> +      vpuctrl: vpu-ctrl@4c4c0000 {

So this is the parent device...

> >> +        compatible = "nxp,imx95-wave633c-ctrl";
> >> +        reg = <0x0 0x4c4c0000 0x0 0x10000>;
> >> +        clocks = <&scmi_clk 115>,
> >> +            <&vpu_blk_ctrl IMX95_CLK_VPUBLK_WAVE>;
> >> +        clock-names = "vpu", "vpublk_wave";
> >> +        power-domains = <&scmi_devpd 21>, <&scmi_perf 10>;
> >> +        power-domain-names = "vpumix", "vpuperf";
> >> +        #cooling-cells = <2>;
> >> +        boot = <&vpu_boot>;
> >> +        sram = <&sram1>;
> >> +      };
> >> +
> >> +      vpu0: vpu@4c480000 {


And here you have child which is not a child? Your binding and DTS
neither match nor make any sense.

> >
> >Node names should be generic. See also an explanation and list of
> >examples (not exhaustive) in DT specification:
> >https://devicetree-specification.readthedocs.io/en/latest/chapter2-
> >devicetree-basics.html#generic-names-recommendation
> 
> Thanks for sharing the link.
> I'll use "video-codec" as the node name in v2.
> 
> >
> >
> >> +        compatible = "nxp,imx95-wave633c";
> >> +        reg = <0x0 0x4c480000 0x0 0x10000>;
> >> +        interrupts = <GIC_SPI 299 IRQ_TYPE_LEVEL_HIGH>;
> >> +        clocks = <&scmi_clk 115>,
> >> +                <&vpu_blk_ctrl IMX95_CLK_VPUBLK_WAVE>;
> >> +        clock-names = "vpu", "vpublk_wave";
> >> +        power-domains = <&scmi_devpd 21>;
> >> +        cnm,ctrl = <&vpuctrl>;
> >> +      };
> >> +
> >> +      vpu1: vpu@4c490000 {
> >> +        compatible = "nxp,imx95-wave633c";
> >
> >Drop all duplicated examples.
> 
> Wave6 HW is designed for simultaneous access,
> as each VPU device has its own separate register space.
> Therefore, I defined the 4 VPU devices as independent nodes in the example
> to reflect this.

They are redundant in this example. Unless you wanted to express
something else, but you did not.


> 
> >
> >
> >> +        reg = <0x0 0x4c490000 0x0 0x10000>;
> >> +        interrupts = <GIC_SPI 300 IRQ_TYPE_LEVEL_HIGH>;
> >> +        clocks = <&scmi_clk 115>,
> >> +                <&vpu_blk_ctrl IMX95_CLK_VPUBLK_WAVE>;
> >> +        clock-names = "vpu", "vpublk_wave";
> >> +        power-domains = <&scmi_devpd 21>;
> >> +        cnm,ctrl = <&vpuctrl>;
> >> +      };
> >> +
> >> +      vpu2: vpu@4c4a0000 {
> >> +        compatible = "nxp,imx95-wave633c";
> >> +        reg = <0x0 0x4c4a0000 0x0 0x10000>;
> >> +        interrupts = <GIC_SPI 301 IRQ_TYPE_LEVEL_HIGH>;
> >> +        clocks = <&scmi_clk 115>,
> >> +                <&vpu_blk_ctrl IMX95_CLK_VPUBLK_WAVE>;
> >> +        clock-names = "vpu", "vpublk_wave";
> >> +        power-domains = <&scmi_devpd 21>;
> >> +        cnm,ctrl = <&vpuctrl>;
> >> +      };
> >> +
> >> +      vpu3: vpu@4c4b0000 {
> >> +        compatible = "nxp,imx95-wave633c";
> >> +        reg = <0x0 0x4c4b0000 0x0 0x10000>;
> >> +        interrupts = <GIC_SPI 302 IRQ_TYPE_LEVEL_HIGH>;
> >> +        clocks = <&scmi_clk 115>,
> >> +                <&vpu_blk_ctrl IMX95_CLK_VPUBLK_WAVE>;
> >> +        clock-names = "vpu", "vpublk_wave";
> >> +        power-domains = <&scmi_devpd 21>;
> >> +        cnm,ctrl = <&vpuctrl>;
> >> +      };
> >> +    };
> >> diff --git a/MAINTAINERS b/MAINTAINERS
> >> index 896a307fa065..5ff5b1f1ced2 100644
> >> --- a/MAINTAINERS
> >> +++ b/MAINTAINERS
> >> @@ -25462,6 +25462,14 @@ S:	Maintained
> >>  F:	Documentation/devicetree/bindings/media/cnm,wave521c.yaml
> >>  F:	drivers/media/platform/chips-media/wave5/
> >>
> >> +WAVE6 VPU CODEC DRIVER
> >> +M:	Nas Chung <nas.chung@xxxxxxxxxxxxxxx>
> >> +M:	Jackson Lee <jackson.lee@xxxxxxxxxxxxxxx>
> >> +L:	linux-media@xxxxxxxxxxxxxxx
> >> +S:	Maintained
> >> +F:	Documentation/devicetree/bindings/media/nxp,wave633c.yaml
> >> +F:	drivers/media/platform/chips-media/wave6/
> >
> >There is no such file/directory.
> 
> Understood. I'll move the MAINTAINERS update to the last patch in v2.

No, just add entry per entry.

Best regards,
Krzysztof





[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