| This document describes the generic device tree binding for MSI controllers and | |
| their master(s). | |
| Message Signaled Interrupts (MSIs) are a class of interrupts generated by a | |
| write to an MMIO address. | |
| MSIs were originally specified by PCI (and are used with PCIe), but may also be | |
| used with other busses, and hence a mechanism is required to relate devices on | |
| those busses to the MSI controllers which they are capable of using, | |
| potentially including additional information. | |
| MSIs are distinguished by some combination of: | |
| - The doorbell (the MMIO address written to). | |
| Devices may be configured by software to write to arbitrary doorbells which | |
| they can address. An MSI controller may feature a number of doorbells. | |
| - The payload (the value written to the doorbell). | |
| Devices may be configured to write an arbitrary payload chosen by software. | |
| MSI controllers may have restrictions on permitted payloads. | |
| - Sideband information accompanying the write. | |
| Typically this is neither configurable nor probeable, and depends on the path | |
| taken through the memory system (i.e. it is a property of the combination of | |
| MSI controller and device rather than a property of either in isolation). | |
| MSI controllers: | |
| ================ | |
| An MSI controller signals interrupts to a CPU when a write is made to an MMIO | |
| address by some master. An MSI controller may feature a number of doorbells. | |
| Required properties: | |
| -------------------- | |
| - msi-controller: Identifies the node as an MSI controller. | |
| Optional properties: | |
| -------------------- | |
| - #msi-cells: The number of cells in an msi-specifier, required if not zero. | |
| Typically this will encode information related to sideband data, and will | |
| not encode doorbells or payloads as these can be configured dynamically. | |
| The meaning of the msi-specifier is defined by the device tree binding of | |
| the specific MSI controller. | |
| MSI clients | |
| =========== | |
| MSI clients are devices which generate MSIs. For each MSI they wish to | |
| generate, the doorbell and payload may be configured, though sideband | |
| information may not be configurable. | |
| Required properties: | |
| -------------------- | |
| - msi-parent: A list of phandle + msi-specifier pairs, one for each MSI | |
| controller which the device is capable of using. | |
| This property is unordered, and MSIs may be allocated from any combination of | |
| MSI controllers listed in the msi-parent property. | |
| If a device has restrictions on the allocation of MSIs, these restrictions | |
| must be described with additional properties. | |
| When #msi-cells is non-zero, busses with an msi-parent will require | |
| additional properties to describe the relationship between devices on the bus | |
| and the set of MSIs they can potentially generate. | |
| Example | |
| ======= | |
| / { | |
| #address-cells = <1>; | |
| #size-cells = <1>; | |
| msi_a: msi-controller@a { | |
| reg = <0xa 0xf00>; | |
| compatible = "vendor-a,some-controller"; | |
| msi-controller; | |
| /* No sideband data, so #msi-cells omitted */ | |
| }; | |
| msi_b: msi-controller@b { | |
| reg = <0xb 0xf00>; | |
| compatible = "vendor-b,another-controller"; | |
| msi-controller; | |
| /* Each device has some unique ID */ | |
| #msi-cells = <1>; | |
| }; | |
| msi_c: msi-controller@c { | |
| reg = <0xb 0xf00>; | |
| compatible = "vendor-b,another-controller"; | |
| msi-controller; | |
| /* Each device has some unique ID */ | |
| #msi-cells = <1>; | |
| }; | |
| dev@0 { | |
| reg = <0x0 0xf00>; | |
| compatible = "vendor-c,some-device"; | |
| /* Can only generate MSIs to msi_a */ | |
| msi-parent = <&msi_a>; | |
| }; | |
| dev@1 { | |
| reg = <0x1 0xf00>; | |
| compatible = "vendor-c,some-device"; | |
| /* | |
| * Can generate MSIs to either A or B. | |
| */ | |
| msi-parent = <&msi_a>, <&msi_b 0x17>; | |
| }; | |
| dev@2 { | |
| reg = <0x2 0xf00>; | |
| compatible = "vendor-c,some-device"; | |
| /* | |
| * Has different IDs at each MSI controller. | |
| * Can generate MSIs to all of the MSI controllers. | |
| */ | |
| msi-parent = <&msi_a>, <&msi_b 0x17>, <&msi_c 0x53>; | |
| }; | |
| }; |