Master-aware devices and sideband ID data

Chalamarla, Tirumalesh Tirumalesh.Chalamarla at caviumnetworks.com
Fri May 29 10:46:07 PDT 2015


> On May 27, 2015, at 10:39 AM, Mark Rutland <mark.rutland at arm.com> wrote:
> 
> On Tue, May 26, 2015 at 11:20:59PM +0100, Chalamarla, Tirumalesh wrote:
>> This is some thing we also like to see in ITS and SMMU drivers. 
>>> On Mar 24, 2015, at 8:50 AM, Mark Rutland <mark.rutland at arm.com> wrote:
>>> 
>>> Hi all,
>>> 
>>> For some devices, identification of particular masters is critical to
>>> their operation (e.g. IOMMUs, MSI controllers). The identity of masters
>>> is determined from sideband signals on the bus, and it may or may not be
>>> possible to probe and/or configure this information. Worse still, these
>>> information may be rewritten by intermediate buses, so the
>>> information for a given master may differ at different points in the bus
>>> hierarchy.
>>> 
>>> We currently describe this master information for devices attached to
>>> IOMMUs, with a master ID being encoded in the iommu-cells. However this
>>> only covers the ID between the master and its IOMMU(s), and we don't
>>> currently have a mechanism to describe the master IDs as they are seen
>>> by devices beyond the IOMMU(s), or in the absence of any IOMMU(s).
>>> 
>>> The following are example of master IDs:
>>> * PCIe Requester IDs (RIDs) (bus:device.function AKA BDF)
>>> * SMMU Stream IDs (SIDs)
>>> * GICv3 ITS Device IDs (DIDs)
>>> 
>>> In the case of a system with PCIe, SMMU and GICv3, the master IDs are
>>> rewritten in a chain of RID=>SID=>DID, as in the following diagram:
>>> 
>>> +-------------+
>>> | PCIe master |
>>> +-------------+
>>>   ||
>>>   || Requester ID (RID)
>>>   || Probeable from RC.
>>>   \/
>>> +-------------------+
>>> | PCIe Root Complex |
>>> +-------------------+
>>>   ||
>>>   || SMMU Stream ID (SID)
>>>   || Derived from RID, static non-probeable mapping.
>>>   \/
>>> +--------------+
>>> | SMMU (IOMMU) |
>>> +--------------+
>>>   ||
>>>   || ITS Device ID (DID)
>>>   || Derived from SID, static non-probeable mapping.
>>>   \/
>>> +----------------------------+
>>> | GICv3 ITS (MSI controller) |
>>> +----------------------------+
>>> 
>>> In simpler cases, you might have a simpler set of master ID
>>> translations, e.g. just a DID:
>>> 
>>> +-----------------+
>>> | Platform device |
>>> +-----------------+
>>>   ||
>>>   || ITS Device ID (DID)
>>>   || Hard-wired on the bus.
>>>   \/
>>> +----------------------------+
>>> | GICv3 ITS (MSI controller) |
>>> +----------------------------+
>>> 
>>> Ignoring current bindings for the moment, I can see how we can describe
>>> this with a generic master id-binding, with master-id-map along the
>>> lines of interrupt-map, with a tuple format like:
>>> <child-id-base child-id-length parent parent-id-base>
>>> 
>>> For the PCIe example, this would look something like the following (with
>>> properties omitted for brevity):
>>> 
>>> PCI: pci at af000000 {
>>> 	...
>>> 	
>>> 	/* Requester ID of PCIe endpoints, implicit at runtime */
>>> 	master-id-cells = <1>;
>>> 
>>> 	/* RIDS idmapped to SIDS @ SMMU */
>>> 	master-id-map = <0 0x10000 &SMMU 0>;
>>> }
>>> 
>>> SMMU: iommu at bf000000 {
>>> 	...
>>> 
>>> 	/* SID, derived from RID */
>>> 	master-id-cells = <1>;
>>> 
>>> 	/* 
>>> 	 * For some reason the high bit of the ID was negated.
>>> 	 */
>>> 	master-id-map = <0x0000 0x8000 &ITS 0x0 0x8000>,
>>> 	                <0x8000 0x8000 &ITS 0x0 0x0000>;
>>> 
>>> };
>>> 
>>> ITS: its at cf000000 {
>>> 	...
>>> 
>>> 	/* DID, derived from SID */
>>> 	master-id-cells = <2>;
>>> 
>>> 	/* 
>>> 	 * Master traffic not propagated beyond this point, so no
>>> 	 * master-id-ranges
>>> 	 */
>>> };
>> 
>> I think it is nice to have max IDs supported by masters. so that drivers can check and enforce.  
> 
> The set of IDs that we expect to transform (i.e. those masters use)
> would be implicit in the first master-id-map from a master. In the PCI
> example above, no master is expected to generate an ID outside of the
> range 0-0x10000 inclusive (and that's all the SMMU would see).
> 
> For devices which are not hotpluggable, the nodes for those devices
> would describe the specific set of IDs they use.
> 
> Generally, between a master and a slave there might not be one
> contiguous set of valid IDs as these may be rewritten along the way (as
> happens at the SMMU between the PCI root complex and the ITS in the
> example above).
> 
> Which drivers do you think need this information? What exactly are they
> trying to check and enforce?
> 

I think, i miss understood by the names, so it is not base it is some thing like

x => f(x) => y           (and f(x) is bitwise | )

ok now i see it. 


>>> For the simpler case, this would look something like:
>>> 
>>> DEV: device at af000000 {
>>> 	master-id-cells = <1>;
>>> 	master-ids = <0xf>, <0xb>;
>>> 	master-id-map = <0 0xf &ITS 0 0>;
>>> };
>>> 
>>> ITS: its at cf000000 {
>>> 	...
>>> 
>>> 	/* DID */
>>> 	master-id-cells = <2>;
>>> };
>>> 
>> Is this is not depending heavily on discover order, how do drivers
>> know which device to get which ID. is it implicitly assumed in
>> discovery order? 
> 
> I'm not sure I follow the question. Could you elaborate?
> 
>> what happens to hot pluggable devices.  
> 
> It would be necessary to be able to discover the ID assigned to the
> device by the hotpluggable bus. For example, this could depend on which
> slot the device is plugged into.
> 
> If you can't discover the ID associated with a hotpluggable device from
> the bus it is plugged into I can't see how hotplug could work.
> 
> From that point on I would expect the ID transformations to be static as
> in the example.
> 

what if i have an SMMU with two ITS masters and i want to decide which one to use based on runtime like which CPU i am serving.

i am thinking in terms go NUMA based systems, where my pci device is on node 0, if the interrupt is targeted to CPU on node 1, i would like to use ITS1, otherwise 
ITS0. 

is it possible to specify some thing like that or do you think its is best to leave to ITS driver. 

Thanks,
Tirumalesh. 

> Thanks,
> Mark.




More information about the linux-arm-kernel mailing list