All of lore.kernel.org
 help / color / mirror / Atom feed
From: Atanas Filipov <atanas.filipov@oss.qualcomm.com>
To: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Cc: djakov@kernel.org, andersson@kernel.org, konradybcio@kernel.org,
	robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org,
	krzysztof.kozlowski@oss.qualcomm.com,
	odelu.kukatla@oss.qualcomm.com,
	raviteja.laggyshetty@oss.qualcomm.com,
	vivek.aknurwar@oss.qualcomm.com, quic_afilipov@quicinc.com,
	loic.poulain@oss.qualcomm.com, linux-arm-msm@vger.kernel.org,
	linux-pm@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	"Gjorgji Rosikopulos (Consultant)"
	<gjorgji.rosikopulos@oss.qualcomm.com>
Subject: Re: [PATCH v1 1/3] dt-bindings: interconnect: Add Qualcomm CAMNOC ICC binding
Date: Mon, 17 Aug 2026 14:16:54 +0300	[thread overview]
Message-ID: <3345fb17-aea0-4568-b7b2-c394cd76900c@oss.qualcomm.com> (raw)
In-Reply-To: <65c47a9b-5f1d-4e17-bbed-4c37369025ff@oss.qualcomm.com>

On 8/11/2026 2:59 PM, Atanas Filipov wrote:
> On 8/8/2026 12:12 AM, Dmitry Baryshkov wrote:
>> On Fri, Aug 07, 2026 at 02:49:49PM +0300, Atanas Filipov wrote:
>>> Add a device tree binding for the Qualcomm Camera Network-on-Chip
>>> (CAMNOC) interconnect provider. CAMNOC is the internal AXI
>>> interconnect within the camera subsystem that arbitrates bandwidth
>>> between camera sub-devices and the external memory interconnect.
>>>
>>> The CAMNOC ICC provider aggregates bandwidth requests from multiple
>>> independent consumers and scales the CAMNOC AXI clock accordingly,
>>> avoiding the race conditions that arise when each consumer calls
>>> clk_set_rate() directly on the shared clock.
>>>
>>> Signed-off-by: Atanas Filipov <atanas.filipov@oss.qualcomm.com>
>>> ---
>>>   .../bindings/interconnect/qcom,camnoc.yaml    | 98 +++++++++++++++++++
>>>   .../dt-bindings/interconnect/qcom,camnoc.h    | 12 +++
>>>   2 files changed, 110 insertions(+)
>>>   create mode 100644 Documentation/devicetree/bindings/interconnect/ 
>>> qcom,camnoc.yaml
>>>   create mode 100644 include/dt-bindings/interconnect/qcom,camnoc.h
>>>
>>> diff --git a/Documentation/devicetree/bindings/interconnect/ 
>>> qcom,camnoc.yaml b/Documentation/devicetree/bindings/interconnect/ 
>>> qcom,camnoc.yaml
>>> new file mode 100644
>>> index 000000000000..b2f5c140ff80
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/interconnect/qcom,camnoc.yaml
>>> @@ -0,0 +1,98 @@
>>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>>> +%YAML 1.2
>>> +---
>>> +$id: http://devicetree.org/schemas/interconnect/qcom,camnoc.yaml#
>>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
>>> +
>>> +title: Qualcomm Camera NOC (CAMNOC) Interconnect Provider
>>> +
>>> +maintainers:
>>> +  - Aleksandar Filipov <quic_afilipov@quicinc.com>
>>> +
>>> +description:
>>> +  The Camera Network-on-Chip (CAMNOC) is the internal AXI interconnect
>>> +  within the Qualcomm camera subsystem. It arbitrates AXI bandwidth
>>> +  between camera sub-devices (IFE, JPEG, BPS, etc.) and the external
>>> +  memory interconnect. Multiple consumers may independently request
>>> +  bandwidth; the CAMNOC ICC provider aggregates these requests and
>>> +  scales CAM_CC_CAMNOC_AXI_CLK accordingly.
>>> +
>>> +properties:
>>> +  compatible:
>>> +    enum:
>>> +      - qcom,sm8250-cam-virt
>>> +
>>> +  clocks:
>>> +    items:
>>> +      - description: CAMNOC AXI clock
>>> +
>>> +  clock-names:
>>> +    items:
>>> +      - const: camnoc_axi
>>> +
>>> +  '#interconnect-cells':
>>> +    const: 1
>>> +
>>> +required:
>>> +  - compatible
>>> +  - clocks
>>> +  - clock-names
>>> +  - '#interconnect-cells'
>>> +
>>> +additionalProperties: false
>>> +
>>> +examples:
>>> +  - |
>>> +    #include <dt-bindings/clock/qcom,camcc-sm8250.h>
>>> +    #include <dt-bindings/interconnect/qcom,camnoc.h>
>>> +
>>> +    camnoc_icc: interconnect {
>>> +        compatible = "qcom,sm8250-cam-virt";
>>> +        clocks = <&camcc CAM_CC_CAMNOC_AXI_CLK>;
>>> +        clock-names = "camnoc_axi";
>>> +        #interconnect-cells = <1>;
>>> +    };
>>> +
>>> +    /* Example camera sub-device consuming the CAMNOC provider above */
>>> +    camera-subsystem@ac53000 {
>>> +        reg = <0x0ac53000 0x1000>;
>>> +
>>> +        interconnects = <&camnoc_icc MASTER_CAMNOC_JPEG
>>> +                         &camnoc_icc SLAVE_CAMNOC_AXI>;
>>> +        interconnect-names = "camnoc";
>>> +
>>> +        /*
>>> +         * Optional: an operating-points-v2 table lets the consumer
>>> +         * drive its CAMNOC bandwidth vote from the same OPP that
>>> +         * selects its core clock rate and RPMh performance state.
>>
>> Is this a table for the camera-subsystem or for the CAMNOC_AXI_CLK? In
>> the latter case, the OPP table should be a part of the camnoc device.
>>

The OPP table belongs to the consumer, not to the CAMNOC provider.
Each consumer (IFE, JPEG, BPS, etc.) has its own dedicated core clock
(opp-hz) and its own CAMNOC bandwidth requirement (opp-peak-kBps) that
depends on its operating point, resolution, and quality settings. These
differ per sub-device, so a single shared OPP table in cam_virt would
not be meaningful.

The cam_virt node only owns CAM_CC_CAMNOC_AXI_CLK and aggregates votes
from all consumers -- it has no knowledge of individual consumer
operating points.

> 
> The OPP table in the example belongs to the consumer device, not to the 
> CAMNOC provider. It describes the operating points
> of the camera sub-device itself: core clock frequency, RPMh performance 
> state, and CAMNOC bandwidth vote bundled together in
> a single OPP entry. The opp-peak-kBps field is the bandwidth the 
> consumer passes to icc_set_bw() when it transitions to that
> operating point.
> 
> This follows the standard ICC consumer pattern: the consumer owns the 
> OPP table and uses opp-peak-kBps to drive its bandwidth
> vote. The CAMNOC provider has no per-consumer bandwidth table of its own 
> — it only aggregates the votes it receives.
> 
> The comment in the example was perhaps misleading. I will reword it in 
> v2 to make it clear that the OPP table belongs to the
> consumer and that opp-peak-kBps is the ICC bandwidth vote, not a clock 
> rate table for CAMNOC_AXI_CLK.
> 
>>> +         */
>>> +        operating-points-v2 = <&camera_opp_table>;
>>> +
>>> +        camera_opp_table: opp-table {
>>> +            compatible = "operating-points-v2";
>>> +
>>> +            opp-100000000 {
>>> +                opp-hz = /bits/ 64 <100000000>;
>>> +                opp-peak-kBps = <22246>;
>>> +                required-opps = <&rpmhpd_opp_min_svs>;
>>> +            };
>>> +
>>> +            opp-200000000 {
>>> +                opp-hz = /bits/ 64 <200000000>;
>>> +                opp-peak-kBps = <44492>;
>>> +                required-opps = <&rpmhpd_opp_low_svs>;
>>> +            };
>>> +
>>> +            opp-400000000 {
>>> +                opp-hz = /bits/ 64 <400000000>;
>>> +                opp-peak-kBps = <88983>;
>>> +                required-opps = <&rpmhpd_opp_svs>;
>>> +            };
>>> +
>>> +            opp-480000000 {
>>> +                opp-hz = /bits/ 64 <480000000>;
>>> +                opp-peak-kBps = <106780>;
>>> +                required-opps = <&rpmhpd_opp_svs_l1>;
>>> +            };
>>> +        };
>>> +    };
>>> diff --git a/include/dt-bindings/interconnect/qcom,camnoc.h b/ 
>>> include/dt-bindings/interconnect/qcom,camnoc.h
>>> new file mode 100644
>>> index 000000000000..a03f5e3f6446
>>> --- /dev/null
>>> +++ b/include/dt-bindings/interconnect/qcom,camnoc.h
>>> @@ -0,0 +1,12 @@
>>> +/* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */
>>> +/*
>>> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
>>> + */
>>> +
>>> +#ifndef __DT_BINDINGS_INTERCONNECT_QCOM_CAMNOC_H
>>> +#define __DT_BINDINGS_INTERCONNECT_QCOM_CAMNOC_H
>>> +
>>> +#define MASTER_CAMNOC_JPEG    0
>>
>> I guess, there are other connection ports. Please describe them.

Addressed in v2: qcom,camnoc.h now lists all SM8250 CAMNOC master ports
(IFE 0/1, IFE Lite 0-4, BPS, IPE 0/1, JPEG, JPEG DMA, CDM, FD, SBI,
ICP) with a short comment per group.

Thanks for the review.
Atanas

>>
>>> +#define SLAVE_CAMNOC_AXI    1
>>> +
>>> +#endif /* __DT_BINDINGS_INTERCONNECT_QCOM_CAMNOC_H */
>>> -- 
>>> 2.34.1
>>>
>>
> 


  parent reply	other threads:[~2026-08-17 11:16 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-07 11:49 [PATCH v1 0/3] Add Qualcomm CAMNOC ICC provider Atanas Filipov
2026-08-07 11:49 ` [PATCH v1 1/3] dt-bindings: interconnect: Add Qualcomm CAMNOC ICC binding Atanas Filipov
2026-08-07 21:12   ` Dmitry Baryshkov
2026-08-11 11:59     ` Atanas Filipov
2026-08-11 14:00       ` Dmitry Baryshkov
2026-08-17 11:16       ` Atanas Filipov [this message]
2026-08-07 11:49 ` [PATCH v1 2/3] interconnect: qcom: Add CAMNOC interconnect provider driver Atanas Filipov
2026-08-07 12:03   ` sashiko-bot
2026-08-07 11:49 ` [PATCH v1 3/3] arm64: dts: qcom: sm8250: Add CAMNOC ICC provider node Atanas Filipov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3345fb17-aea0-4568-b7b2-c394cd76900c@oss.qualcomm.com \
    --to=atanas.filipov@oss.qualcomm.com \
    --cc=andersson@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=djakov@kernel.org \
    --cc=dmitry.baryshkov@oss.qualcomm.com \
    --cc=gjorgji.rosikopulos@oss.qualcomm.com \
    --cc=konradybcio@kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=krzysztof.kozlowski@oss.qualcomm.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=loic.poulain@oss.qualcomm.com \
    --cc=odelu.kukatla@oss.qualcomm.com \
    --cc=quic_afilipov@quicinc.com \
    --cc=raviteja.laggyshetty@oss.qualcomm.com \
    --cc=robh@kernel.org \
    --cc=vivek.aknurwar@oss.qualcomm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.