mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
e13c542d52
This represents a physical chip in the system and allows a stable numbering scheme to be passed to udev for userspace to recognize which chip is which. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Acked-by: Rob Herring <robh@kernel.org>
157 lines
5.1 KiB
Plaintext
157 lines
5.1 KiB
Plaintext
FSI bus & engine generic device tree bindings
|
|
=============================================
|
|
|
|
The FSI bus is probe-able, so the OS is able to enumerate FSI slaves, and
|
|
engines within those slaves. However, we have a facility to match devicetree
|
|
nodes to probed engines. This allows for fsi engines to expose non-probeable
|
|
busses, which are then exposed by the device tree. For example, an FSI engine
|
|
that is an I2C master - the I2C bus can be described by the device tree under
|
|
the engine's device tree node.
|
|
|
|
FSI masters may require their own DT nodes (to describe the master HW itself);
|
|
that requirement is defined by the master's implementation, and is described by
|
|
the fsi-master-* binding specifications.
|
|
|
|
Under the masters' nodes, we can describe the bus topology using nodes to
|
|
represent the FSI slaves and their slave engines. As a basic outline:
|
|
|
|
fsi-master {
|
|
/* top-level of FSI bus topology, bound to an FSI master driver and
|
|
* exposes an FSI bus */
|
|
|
|
fsi-slave@<link,id> {
|
|
/* this node defines the FSI slave device, and is handled
|
|
* entirely with FSI core code */
|
|
|
|
fsi-slave-engine@<addr> {
|
|
/* this node defines the engine endpoint & address range, which
|
|
* is bound to the relevant fsi device driver */
|
|
...
|
|
};
|
|
|
|
fsi-slave-engine@<addr> {
|
|
...
|
|
};
|
|
|
|
};
|
|
};
|
|
|
|
Note that since the bus is probe-able, some (or all) of the topology may
|
|
not be described; this binding only provides an optional facility for
|
|
adding subordinate device tree nodes as children of FSI engines.
|
|
|
|
FSI masters
|
|
-----------
|
|
|
|
FSI master nodes declare themselves as such with the "fsi-master" compatible
|
|
value. It's likely that an implementation-specific compatible value will
|
|
be needed as well, for example:
|
|
|
|
compatible = "fsi-master-gpio", "fsi-master";
|
|
|
|
Since the master nodes describe the top-level of the FSI topology, they also
|
|
need to declare the FSI-standard addressing scheme. This requires two cells for
|
|
addresses (link index and slave ID), and no size:
|
|
|
|
#address-cells = <2>;
|
|
#size-cells = <0>;
|
|
|
|
An optional boolean property can be added to indicate that a particular master
|
|
should not scan for connected devices at initialization time. This is
|
|
necessary in cases where a scan could cause arbitration issues with other
|
|
masters that may be present on the bus.
|
|
|
|
no-scan-on-init;
|
|
|
|
FSI slaves
|
|
----------
|
|
|
|
Slaves are identified by a (link-index, slave-id) pair, so require two cells
|
|
for an address identifier. Since these are not a range, no size cells are
|
|
required. For an example, a slave on link 1, with ID 2, could be represented
|
|
as:
|
|
|
|
cfam@1,2 {
|
|
reg = <1 2>;
|
|
[...];
|
|
}
|
|
|
|
Each slave provides an address-space, under which the engines are accessible.
|
|
That address space has a maximum of 23 bits, so we use one cell to represent
|
|
addresses and sizes in the slave address space:
|
|
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
|
|
Optionally, a slave can provide a global unique chip ID which is used to
|
|
identify the physical location of the chip in a system specific way
|
|
|
|
chip-id = <0>;
|
|
|
|
FSI engines (devices)
|
|
---------------------
|
|
|
|
Engines are identified by their address under the slaves' address spaces. We
|
|
use a single cell for address and size. Engine nodes represent the endpoint
|
|
FSI device, and are passed to those FSI device drivers' ->probe() functions.
|
|
|
|
For example, for a slave using a single 0x400-byte page starting at address
|
|
0xc00:
|
|
|
|
engine@c00 {
|
|
reg = <0xc00 0x400>;
|
|
};
|
|
|
|
|
|
Full example
|
|
------------
|
|
|
|
Here's an example that illustrates:
|
|
- an FSI master
|
|
- connected to an FSI slave
|
|
- that contains an engine that is an I2C master
|
|
- connected to an I2C EEPROM
|
|
|
|
The FSI master may be connected to additional slaves, and slaves may have
|
|
additional engines, but they don't necessarily need to be describe in the
|
|
device tree if no extra platform information is required.
|
|
|
|
/* The GPIO-based FSI master node, describing the top level of the
|
|
* FSI bus
|
|
*/
|
|
gpio-fsi {
|
|
compatible = "fsi-master-gpio", "fsi-master";
|
|
#address-cells = <2>;
|
|
#size-cells = <0>;
|
|
|
|
/* A FSI slave (aka. CFAM) at link 0, ID 0. */
|
|
cfam@0,0 {
|
|
reg = <0 0>;
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
chip-id = <0>;
|
|
|
|
/* FSI engine at 0xc00, using a single page. In this example,
|
|
* it's an I2C master controller, so subnodes describe the
|
|
* I2C bus.
|
|
*/
|
|
i2c-controller@c00 {
|
|
reg = <0xc00 0x400>;
|
|
|
|
/* Engine-specific data. In this case, we're describing an
|
|
* I2C bus, so we're conforming to the generic I2C binding
|
|
*/
|
|
compatible = "some-vendor,fsi-i2c-controller";
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
|
|
/* I2C endpoint device: an Atmel EEPROM */
|
|
eeprom@50 {
|
|
compatible = "atmel,24c256";
|
|
reg = <0x50>;
|
|
pagesize = <64>;
|
|
};
|
|
};
|
|
};
|
|
};
|