2026-01-29 22:25:33 +08:00

228 lines
5.3 KiB
YAML

# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/arm/arm,mpam-msc.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Arm Memory System Resource Partitioning and Monitoring (MPAM)
description: |
The Arm MPAM specification can be found here:
https://developer.arm.com/documentation/ddi0598/latest
maintainers:
- Rob Herring <robh@kernel.org>
properties:
compatible:
items:
- const: arm,mpam-msc # Further details are discoverable
- const: arm,mpam-memory-controller-msc
reg:
maxItems: 1
description: A memory region containing registers as defined in the MPAM
specification.
interrupts:
minItems: 1
items:
- description: error (optional)
- description: overflow (optional, only for monitoring)
interrupt-names:
oneOf:
- items:
- enum: [ error, overflow ]
- items:
- const: error
- const: overflow
arm,not-ready-us:
description: The maximum time in microseconds for monitoring data to be
accurate after a settings change. For more information, see the
Not-Ready (NRDY) bit description in the MPAM specification.
numa-node-id: true # see NUMA binding
'#address-cells':
const: 1
'#size-cells':
const: 0
patternProperties:
'^ris@[0-9a-f]$':
type: object
additionalProperties: false
description: |
RIS nodes for each RIS in an MSC. These nodes are required for each RIS
implementing known MPAM controls
properties:
compatible:
enum:
# Bulk storage for cache
- arm,mpam-cache
# Memory bandwidth
- arm,mpam-memory
reg:
minimum: 0
maximum: 0xf
cpus:
$ref: '/schemas/types.yaml#/definitions/phandle-array'
description:
Phandle(s) to the CPU node(s) this RIS belongs to. By default, the parent
device's affinity is used.
arm,mpam-device:
$ref: '/schemas/types.yaml#/definitions/phandle'
description:
By default, the MPAM enabled device associated with a RIS is the MSC's
parent node. It is possible for each RIS to be associated with different
devices in which case 'arm,mpam-device' should be used.
required:
- compatible
- reg
required:
- compatible
- reg
dependencies:
interrupts: [ interrupt-names ]
additionalProperties: false
examples:
- |
/*
cpus {
cpu@0 {
next-level-cache = <&L2_0>;
};
cpu@100 {
next-level-cache = <&L2_1>;
};
};
*/
L2_0: cache-controller-0 {
compatible = "cache";
cache-level = <2>;
cache-unified;
next-level-cache = <&L3>;
};
L2_1: cache-controller-1 {
compatible = "cache";
cache-level = <2>;
cache-unified;
next-level-cache = <&L3>;
};
L3: cache-controller@30000000 {
compatible = "arm,dsu-l3-cache", "cache";
cache-level = <3>;
cache-unified;
ranges = <0x0 0x30000000 0x800000>;
#address-cells = <1>;
#size-cells = <1>;
msc@10000 {
compatible = "arm,mpam-msc";
/* CPU affinity implied by parent cache node's */
reg = <0x10000 0x2000>;
interrupts = <1>, <2>;
interrupt-names = "error", "overflow";
arm,not-ready-us = <1>;
};
};
mem: memory-controller@20000 {
compatible = "foo,a-memory-controller";
reg = <0x20000 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
ranges;
msc@21000 {
compatible = "arm,mpam-memory-controller-msc", "arm,mpam-msc";
reg = <0x21000 0x1000>;
interrupts = <3>;
interrupt-names = "error";
arm,not-ready-us = <1>;
numa-node-id = <1>;
};
};
iommu@40000 {
reg = <0x40000 0x1000>;
ranges;
#address-cells = <1>;
#size-cells = <1>;
msc@41000 {
compatible = "arm,mpam-msc";
reg = <0 0x1000>;
interrupts = <5>, <6>;
interrupt-names = "error", "overflow";
arm,not-ready-us = <1>;
#address-cells = <1>;
#size-cells = <0>;
ris@2 {
compatible = "arm,mpam-cache";
reg = <0>;
// TODO: How to map to device(s)?
};
};
};
msc@80000 {
compatible = "foo,a-standalone-msc";
reg = <0x80000 0x1000>;
clocks = <&clks 123>;
ranges;
#address-cells = <1>;
#size-cells = <1>;
msc@10000 {
compatible = "arm,mpam-msc";
reg = <0x10000 0x2000>;
interrupts = <7>;
interrupt-names = "overflow";
arm,not-ready-us = <1>;
#address-cells = <1>;
#size-cells = <0>;
ris@0 {
compatible = "arm,mpam-cache";
reg = <0>;
arm,mpam-device = <&L2_0>;
};
ris@1 {
compatible = "arm,mpam-memory";
reg = <1>;
arm,mpam-device = <&mem>;
};
};
};
...