[PATCH 3/6] iommu/arm-smmu: Add DT PMU support
Rob Herring
robh at kernel.org
Wed Mar 2 07:33:14 PST 2022
Send DT patches to the DT list if you want them reviewed with some
guarantee that I'll see them. (Except right now as PW stopped getting
mail. :( )
On Thu, Feb 17, 2022 at 02:24:17PM +0000, Robin Murphy wrote:
> Since IORT describes PMU interrupts rather inflexibly as an inherent
What's IORT? ;)
> part of the SMMU, the best way to avoid excessive complexity is to make
> the way we handle DT look as similar as possible. Fortunately the
> de-facto standard for mentioning PMU interrupts at all under the current
> binding has been to include them in the global interrupt count, listing
> them after the actual fault interrupt(s), so we can capitalise on that.
> It's about 9 years too late to redefine "#global-interrupts" to exclude
> anything other than context interrupts without breaking compatibility,
> so we're stuck with a slightly convoluted definition of PMU interrupts
> as an optional subdivision of the "global" interrupts, but it works.
>
> Signed-off-by: Robin Murphy <robin.murphy at arm.com>
>
> ---
>
> Not sure whether the count-backwards-from-the-middle nature of "number
> of PMU interrupts" is too ugly and "index of first PMU interrupt" might
> be any better.
Can this be solved with 'interrupt-names' instead deprecating
#global-interrupts along the way?
> ---
> .../devicetree/bindings/iommu/arm,smmu.yaml | 19 ++++++++++++++++++-
> drivers/iommu/arm/arm-smmu/arm-smmu.c | 4 ++++
> 2 files changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/iommu/arm,smmu.yaml b/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
> index da5381c8ee11..9d39df42528a 100644
> --- a/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
> +++ b/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
> @@ -87,10 +87,18 @@ properties:
>
> '#global-interrupts':
> description: The number of global interrupts exposed by the device.
> + Includes the count of PMU interrupts, if present.
> $ref: /schemas/types.yaml#/definitions/uint32
> minimum: 0
> maximum: 260 # 2 secure, 2 non-secure, and up to 256 perf counters
>
> + '#pmu-interrupts':
It would have been great if everything that's a count/size used '#', but
that didn't happen. So I'm not that wild about using '#' randomly at
all.
This needs a vendor prefix (arm,).
> + description: The number of PMU interrupts. Must be equal to the number of
> + implemented counter groups.
> + $ref: /schemas/types.yaml#/definitions/uint32
> + minimum: 1
> + maximum: 256
> +
> '#iommu-cells':
> enum: [ 1, 2 ]
> description: |
> @@ -115,6 +123,10 @@ properties:
> context bank. In the case of a single, combined interrupt, it must be
> listed multiple times.
>
> + If a PMU is present, the global interrupt entries consist of any fault
> + interrupts first, followed by #pmu-interrupts entries, one per implemented
> + counter group, specified in order of their indexing by the SMMU.
> +
> dma-coherent:
> description: |
> Present if page table walks made by the SMMU are cache coherent with the
> @@ -190,9 +202,14 @@ examples:
> smmu1: iommu at ba5e0000 {
> compatible = "arm,smmu-v1";
> reg = <0xba5e0000 0x10000>;
> - #global-interrupts = <2>;
> + #global-interrupts = <6>; /* 2 fault + 4 PMU */
> + #pmu-interrupts = <4>;
> interrupts = <0 32 4>,
> <0 33 4>,
> + <0 94 4>, /* This is the first PMU interrupt */
> + <0 95 4>,
> + <0 96 4>,
> + <0 97 4>,
> <0 34 4>, /* This is the first context interrupt */
> <0 35 4>,
> <0 36 4>,
> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c b/drivers/iommu/arm/arm-smmu/arm-smmu.c
> index cbfe4cc914f0..8d6c8106fc1d 100644
> --- a/drivers/iommu/arm/arm-smmu/arm-smmu.c
> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c
> @@ -1995,6 +1995,10 @@ static int arm_smmu_device_dt_probe(struct arm_smmu_device *smmu,
> return dev_err_probe(dev, -ENODEV,
> "missing #global-interrupts property\n");
> *pmu_irqs = 0;
> + of_property_read_u32(dev->of_node, "#pmu-interrupts", pmu_irqs);
> + if (*pmu_irqs > *global_irqs)
> + return dev_err_probe(dev, -EINVAL, "invalid #pmu_interrupts property");
> + *global_irqs -= *pmu_irqs;
>
> data = of_device_get_match_data(dev);
> smmu->version = data->version;
> --
> 2.28.0.dirty
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
More information about the linux-arm-kernel
mailing list