PLDM design proposal
Deepak Kodihalli
dkodihal at linux.vnet.ibm.com
Mon Jan 7 15:17:57 AEDT 2019
On 13/12/18 10:00 PM, Deepak Kodihalli wrote:
> Hi All,
>
> I've put down some thoughts below on an initial PLDM design on OpenBMC.
> Thie structure of the document is based on the OpenBMC design template.
> Please review and let me know your feedback. Once we've had a discussion
> here on the list, I can move this to Gerrit with some more details. I'd
> say reading the MCTP proposal from Jeremy should be a precursor to
> reading this.
>
> # PLDM Stack on OpenBMC
>
> Author: Deepak Kodihalli <dkodihal at linux.vnet.ibm.com> <dkodihal>
>
> ## Problem Description
>
> On OpenBMC, in-band IPMI is currently the primary industry-standard
> means of communication between the BMC and the Host firmware. We've
> started hitting some inherent limitations of IPMI on OpenPOWER servers:
> a limited number of sensors, and a lack of a generic control mechanism
> (sensors are a generic monitoring mechanism) are the major ones. There
> is a need to improve upon the communication protocol, but at the same
> time inventing a custom protocol is undesirable.
>
> This design aims to employ Platform Level Data Model (PLDM), a standard
> application layer communication protocol defined by the DMTF. PLDM draws
> inputs from IPMI, but it overcomes most of the latter's limitations.
> PLDM is also designed to run on standard transport protocols, for e.g.
> MCTP (also designed by the DMTF). MCTP provides for a common transport
> layer over several physical channels, by defining hardware bindings. The
> solution of PLDM over MCTP also helps overcome some of the limitations
> of the hardware channels that IPMI uses.
>
> PLDM's purpose is to enable all sorts of "inside the box communication":
> BMC - Host, BMC - BMC, BMC - Network Controller and BMC - Other (for
> e.g. sensor) devices. This design doesn't preclude enablement of
> communication channels not involving the BMC and the host.
>
> ## Background and References
>
> PLDM is designed to be an effective interface and data model that
> provides efficient access to low-level platform inventory, monitoring,
> control, event, and data/parameters transfer functions. For example,
> temperature, voltage, or fan sensors can have a PLDM representation that
> can be used to monitor and control the platform using a set of PLDM
> messages. PLDM defines data representations and commands that abstract
> the platform management hardware.
>
> As stated earlier, PLDM is designed for different flavors of "inside the
> box" communication. PLDM groups commands under broader functions, and
> defines separate specifications for each of these functions (also called
> PLDM "Types"). The currently defined Types (and corresponding specs) are
> : PLDM base (with associated IDs and states specs), BIOS, FRU, Platform
> monitoring and control, Firmware Update and SMBIOS. All these
> specifications are available at:
>
> https://www.dmtf.org/standards/pmci
>
> Some of the reasons PLDM sounds promising (some of these are advantages
> over IPMI):
>
> - Common in-band communication protocol.
>
> - Already existing PLDM Type specifications that cover the most common
> communication requirements. Up to 64 PLDM Types can be defined (the last
> one is OEM). At the moment, 6 are defined. Each PLDM type can house up
> to 256 PLDM commands.
>
> - PLDM sensors are 2 bytes in length.
>
> - PLDM introduces the concept of effecters - a control mechanism. Both
> sensors and effecters are associated to entities (similar to IPMI,
> entities cab be physical or logical), where sensors are a mechanism for
> monitoring and effecters are a mechanism for control. Effecters can be
> numeric or state based. PLDM defines commonly used entities and their
> IDs, but there 8K slots available to define OEM entities.
>
> - PLDM allows bidirectional communication, and sending asynchronous events.
>
> - A very active PLDM related working group in the DMTF.
>
> The plan is to run PLDM over MCTP. MCTP is defined in a spec of its own,
> and a proposal on the MCTP design is in discussion already. There's
> going to be an intermediate PLDM over MCTP binding layer, which lets us
> send PLDM messages over MCTP. This is defined in a spec of its own, and
> the design for this binding will be proposed separately.
>
> ## Requirements
>
> How different BMC/Host/other applications make use of PLDM messages is
> outside the scope of this requirements doc. The requirements listed here
> are related to the PLDM protocol stack and the request/response model:
>
> - Marshalling and unmarshalling of PLDM messages, defined in various
> PLDM Type specs, must be implemented. This can of course be staged based
> on the need of specific Types and functions. Since this is just encoding
> and decoding PLDM messages, I believe there would be motivation to build
> this into a library that could be shared between BMC, host and other
> firmware stacks. The specifics of each PLDM Type (such as FRU table
> structures, sensor PDR structures, etc) are implemented by this lib.
>
> - Mapping PLDM concepts to native OpenBMC concepts must be implemented.
> For e.g.: mapping PLDM sensors to phosphor-hwmon hosted D-Bus objects,
> mapping PLDM FRU data to D-Bus objects hosted by
> phosphor-inventory-manager, etc. The mapping shouldn't be restrictive to
> D-Bus alone (meaning it shouldn't be necessary to put objects on the Bus
> just so serve PLDM requests, a problem that exists with
> phosphor-host-ipmid today). Essentially these are platform specific PLDM
> message handlers.
>
> - The BMC should be able to act as a PLDM responder as well as a PLDM
> requester. As a PLDM responder, the BMC can monitor/control other
> devices. As a PLDM responder, the BMC can react to PLDM messages
> directed to it via requesters in the platform, for e.g, the Host.
>
> - As a PLDM requester, the BMC must be able to discover other PLDM
> enabled components in the platform.
>
> - As a PLDM requester, the BMC must be able to send simultaneous
> messages to different responders, but at the same time it can issue a
> single message to a specific responder at a time.
>
> - As a PLDM requester, the BMC must be able to handle out of order
> responses.
>
> - As a PLDM responder, the BMC may simultaneously respond to messages
> from different requesters, but the spec doesn't mandate this. In other
> words the responder could be single-threaded.
>
> - It should be possible to plug-in non-existent PLDM functions (these
> maybe new/existing standard Types, or OEM Types) into the PLDM stack.
>
> ## Proposed Design
>
> The following are high level structural elements of the design:
>
> ### PLDM encode/decode libraries
>
> This library would take a PLDM message, decode it and spit out the
> different fields of the message. Conversely, given a PLDM Type, command
> code, and the command's data fields, it would make a PLDM message. The
> thought is to design this library such that it can be used by BMC and
> the host firmware stacks, because it's the encode/decode and protocol
> piece (and not the handling of a message). I'd like to know if there's
> enough motivation to have this as a common lib. That would mean
> additional requirements such as having this as a C lib instead of C++,
> because of the runtime constraints of host firmware stacks. If there's
> not enough interest to have this as a common lib, this could just be
> part of the provider libs (see below), and it could then be written in C++.
>
> There would be one encode/decode lib per PLDM Type. So for e.g.
> something like /usr/lib/pldm/libbase.so, /usr/lib/pldm/libfru.so, etc.
>
> ### PLDM provider libraries
>
> These libraries would implement the platform specific handling of
> incoming PLDM requests (basically helping with the PLDM responder
> implementation, see next bullet point), so for instance they would query
> D-Bus objects (or even something like a JSON file) to fetch platform
> specific information to respond to the PLDM message. They would link
> with the encode/decode libs. Like the encode/decode libs, there would be
> one per PLDM Type (for e.g /usr/lib/pldm/providers/libfru.so).
>
> These libraries would essentially be plug-ins. That lets someone add
> functionality for new PLDM (standard as well as OEM) Types, and it also
> lets them replace default handlers. The libraries would implement a
> "register" API to plug-in handlers for specific PLDM messages. Something
> like:
>
> template <typename Handler, typename... args>
> auto register(uint8_t type, uint8_t command, Handler handler);
>
> This allows for providing a strongly-typed C++ handler registration
> scheme. It would also be possible to validate the parameters passed to
> the handler at compile time.
>
> ### Request/Response Model
>
> There are two approaches that I've described here, and they correlate to
> the two options in Jeremy's MCTP design for how to notify on incoming
> PLDM messages: in-process callbacks vs D-Bus signals.
>
> #### With in-process callbacks
>
> In this case, there would be a single PLDM (over MCTP) daemon that
> implements both the PLDM responder and PLDM requester function. The
> daemon would link with the encode/decode libs mentioned above, and the
> MCTP lib.
>
> The PLDM responder function would involve registering the PLDM provider
> libs on startup. The PLDM responder implementation would sit in the
> callback handler from the transport's rx. If it receives PLDM messages
> of type Request, it will route them to an appropriate handler in a
> provider lib, get the response back, and send back a PLDM response
> message via the transport's tx API. If it receives messages of type
> Response, it will put them on a "Response queue".
>
> I think designing the BMC as a PLDM requester is interesting. We haven't
> had this with IPMI, because the BMC was typically an IPMI server. I
> envision PLDM requester functions to be spread across multiple OpenBMC
> applications (instead of a single big requester app) - based on the
> responder they're talking and the high level function they implement.
> For example, there could be an app that lets the BMC upgrade firmware
> for other devices using PLDM - this would be a generic app in the sense
> that the same set of commands might have to be run irrespective of the
> device on the other side. There could also be an app that does fan
> control on a remote device, based on sensors from that device and
> algorithms specific to that device.
>
> The PLDM daemon would have to provide a D-Bus interface to send a PLDM
> request message. This API would be used by apps wanting to send out PLDM
> requests. If the message payload is too large, the interface could
> accept an fd (containing the message), instead of an array of bytes. The
> implementation of this would send the PLDM request message via the
> transport's tx API, and then conditionally wait on the response queue to
> have an entry that matches this request (the match is by instance id).
> The conditional wait (or something equivalent) is required because the
> app sending the PLDM message must block until getting a response back
> from the remote PLDM device.
>
> With what's been described above, it's obvious that the responder and
> requester functions need to be able to run concurrently (this is as per
> the PLDM spec as well). The BMC can simultaneously act as a responder
> and requester. Waiting on a rx from the transport layer shouldn't block
> other BMC apps from sending PLDM messages. So this means the PLDM daemon
> would have to be multi-threaded, or maybe we can instead achieve this
> via an event loop.
>
> #### With D-Bus signals
>
> This lets us separate PLDM daemons from the MCTP daemon, and eliminates
> the need to handle request and response messages concurrently in the
> same daemon, at the cost of much more D-Bus traffic. The MCTP daemon
> would emit D-Bus signals describing the type of the PLDM message
> (request/response) and containing the message payload. Alternatively it
> could pass the PLDM message over a D-Bus API that the PLDM daemons would
> implement. The MCTP daemon would also implement a D-Bus API to send PLDM
> messages, as with the previous approach.
>
> With this approach, I'd recommend two separate PLDM daemons - a
> responder daemon and a requester daemon. The responder daemon reacts to
> D-Bus signals corresponding to PLDM Request messages. It handles
> incoming requests as before. The requester daemon would react to D-Bus
> signals corresponding to PLDM response messages. It would implement the
> instance id generation, and would also implement the response queue and
> the conditional wait on that queue. It would also have to implement a
> D-Bus API to let other PLDM-enabled OpenBMC apps send PLDM requests. The
> implementation of that API would send the message to the MCTP daemon,
> and then block on the response queue to get a response back.
>
> ### Multiple requesters and responders
>
> The PLDM spec does allow simultaneous connections between multiple
> responders/requesters. For e.g. the BMC talking to a multi-host system
> on two different physical channels. Instead of implementing this in one
> MCTP/PLDM daemon, we could spawn one daemon per physical channel.
>
> ## Impacts
>
> Development would be required to implement the PLDM protocol, the
> request/response model, and platform specific handling. Low level design
> is required to implement the protocol specifics of each of the PLDM
> Types. Such low level design is not included in this proposal.
>
> Design and development needs to involve potential host firmware
> implementations.
>
> ## Testing
>
> Testing can be done without having to depend on the underlying transport
> layer.
>
> The responder function can be tested by mocking a requester and the
> transport layer: this would essentially test the protocol handling and
> platform specific handling. The requester function can be tested by
> mocking a responder: this would test the instance id handling and the
> send/receive functions.
>
> APIs from the shared libraries can be tested via fuzzing.
>
> Thanks,
> Deepak
Hi,
I received some feedback on this, and I will respond to those soon (just
got back from vacation). Others on the To: list (people who expressed
interest in PLDM/MCTP), would like to opine on this?
Thanks,
Deepak
More information about the openbmc
mailing list