mirror of https://gitee.com/openkylin/linux.git
173 lines
4.5 KiB
Plaintext
173 lines
4.5 KiB
Plaintext
=======================================================
|
|
ARM CCI cache coherent interconnect binding description
|
|
=======================================================
|
|
|
|
ARM multi-cluster systems maintain intra-cluster coherency through a
|
|
cache coherent interconnect (CCI) that is capable of monitoring bus
|
|
transactions and manage coherency, TLB invalidations and memory barriers.
|
|
|
|
It allows snooping and distributed virtual memory message broadcast across
|
|
clusters, through memory mapped interface, with a global control register
|
|
space and multiple sets of interface control registers, one per slave
|
|
interface.
|
|
|
|
Bindings for the CCI node follow the ePAPR standard, available from:
|
|
|
|
www.power.org/documentation/epapr-version-1-1/
|
|
|
|
with the addition of the bindings described in this document which are
|
|
specific to ARM.
|
|
|
|
* CCI interconnect node
|
|
|
|
Description: Describes a CCI cache coherent Interconnect component
|
|
|
|
Node name must be "cci".
|
|
Node's parent must be the root node /, and the address space visible
|
|
through the CCI interconnect is the same as the one seen from the
|
|
root node (ie from CPUs perspective as per DT standard).
|
|
Every CCI node has to define the following properties:
|
|
|
|
- compatible
|
|
Usage: required
|
|
Value type: <string>
|
|
Definition: must be set to
|
|
"arm,cci-400"
|
|
|
|
- reg
|
|
Usage: required
|
|
Value type: <prop-encoded-array>
|
|
Definition: A standard property. Specifies base physical
|
|
address of CCI control registers common to all
|
|
interfaces.
|
|
|
|
- ranges:
|
|
Usage: required
|
|
Value type: <prop-encoded-array>
|
|
Definition: A standard property. Follow rules in the ePAPR for
|
|
hierarchical bus addressing. CCI interfaces
|
|
addresses refer to the parent node addressing
|
|
scheme to declare their register bases.
|
|
|
|
CCI interconnect node can define the following child nodes:
|
|
|
|
- CCI control interface nodes
|
|
|
|
Node name must be "slave-if".
|
|
Parent node must be CCI interconnect node.
|
|
|
|
A CCI control interface node must contain the following
|
|
properties:
|
|
|
|
- compatible
|
|
Usage: required
|
|
Value type: <string>
|
|
Definition: must be set to
|
|
"arm,cci-400-ctrl-if"
|
|
|
|
- interface-type:
|
|
Usage: required
|
|
Value type: <string>
|
|
Definition: must be set to one of {"ace", "ace-lite"}
|
|
depending on the interface type the node
|
|
represents.
|
|
|
|
- reg:
|
|
Usage: required
|
|
Value type: <prop-encoded-array>
|
|
Definition: the base address and size of the
|
|
corresponding interface programming
|
|
registers.
|
|
|
|
* CCI interconnect bus masters
|
|
|
|
Description: masters in the device tree connected to a CCI port
|
|
(inclusive of CPUs and their cpu nodes).
|
|
|
|
A CCI interconnect bus master node must contain the following
|
|
properties:
|
|
|
|
- cci-control-port:
|
|
Usage: required
|
|
Value type: <phandle>
|
|
Definition: a phandle containing the CCI control interface node
|
|
the master is connected to.
|
|
|
|
Example:
|
|
|
|
cpus {
|
|
#size-cells = <0>;
|
|
#address-cells = <1>;
|
|
|
|
CPU0: cpu@0 {
|
|
device_type = "cpu";
|
|
compatible = "arm,cortex-a15";
|
|
cci-control-port = <&cci_control1>;
|
|
reg = <0x0>;
|
|
};
|
|
|
|
CPU1: cpu@1 {
|
|
device_type = "cpu";
|
|
compatible = "arm,cortex-a15";
|
|
cci-control-port = <&cci_control1>;
|
|
reg = <0x1>;
|
|
};
|
|
|
|
CPU2: cpu@100 {
|
|
device_type = "cpu";
|
|
compatible = "arm,cortex-a7";
|
|
cci-control-port = <&cci_control2>;
|
|
reg = <0x100>;
|
|
};
|
|
|
|
CPU3: cpu@101 {
|
|
device_type = "cpu";
|
|
compatible = "arm,cortex-a7";
|
|
cci-control-port = <&cci_control2>;
|
|
reg = <0x101>;
|
|
};
|
|
|
|
};
|
|
|
|
dma0: dma@3000000 {
|
|
compatible = "arm,pl330", "arm,primecell";
|
|
cci-control-port = <&cci_control0>;
|
|
reg = <0x0 0x3000000 0x0 0x1000>;
|
|
interrupts = <10>;
|
|
#dma-cells = <1>;
|
|
#dma-channels = <8>;
|
|
#dma-requests = <32>;
|
|
};
|
|
|
|
cci@2c090000 {
|
|
compatible = "arm,cci-400";
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
reg = <0x0 0x2c090000 0 0x1000>;
|
|
ranges = <0x0 0x0 0x2c090000 0x6000>;
|
|
|
|
cci_control0: slave-if@1000 {
|
|
compatible = "arm,cci-400-ctrl-if";
|
|
interface-type = "ace-lite";
|
|
reg = <0x1000 0x1000>;
|
|
};
|
|
|
|
cci_control1: slave-if@4000 {
|
|
compatible = "arm,cci-400-ctrl-if";
|
|
interface-type = "ace";
|
|
reg = <0x4000 0x1000>;
|
|
};
|
|
|
|
cci_control2: slave-if@5000 {
|
|
compatible = "arm,cci-400-ctrl-if";
|
|
interface-type = "ace";
|
|
reg = <0x5000 0x1000>;
|
|
};
|
|
};
|
|
|
|
This CCI node corresponds to a CCI component whose control registers sits
|
|
at address 0x000000002c090000.
|
|
CCI slave interface @0x000000002c091000 is connected to dma controller dma0.
|
|
CCI slave interface @0x000000002c094000 is connected to CPUs {CPU0, CPU1};
|
|
CCI slave interface @0x000000002c095000 is connected to CPUs {CPU2, CPU3};
|