xref: /openbmc/pldm/README.md (revision 4d99c311)
1# To Build
2
3Need `meson` and `ninja`. Alternatively, source an OpenBMC ARM/x86 SDK.
4
5```
6meson setup build && ninja -C build
7```
8
9## To run unit tests
10
11The simplest way of running the tests is as described by the meson man page:
12
13```
14meson setup builddir && meson setup test -C builddir
15```
16
17Alternatively, tests can be run in the OpenBMC CI docker container, or with an
18OpenBMC x86 sdk(see below for x86 steps).
19
20```
21meson setup -Doe-sdk=enabled build
22ninja -C build test
23```
24
25## To enable pldm verbosity
26
27pldm daemon accepts a command line argument `--verbose` or `--v` or `-v` to
28enable the daemon to run in verbose mode. It can be done via adding this option
29to the environment file that pldm service consumes.
30
31```
32echo 'PLDMD_ARGS="--verbose"' > /etc/default/pldmd
33systemctl restart pldmd
34```
35
36## To disable pldm verbosity
37
38```
39rm /etc/default/pldmd
40systemctl restart pldmd
41```
42
43# Code Organization
44
45At a high-level, code in this repository belongs to one of the following three
46components.
47
48## libpldmresponder
49
50This library provides handlers for incoming PLDM request messages. It provides
51for a registration as well as a plug-in mechanism. The library is implemented in
52modern C++, and handles OpenBMC's platform specifics.
53
54The handlers are of the form
55
56```
57Response handler(Request payload, size_t payloadLen)
58```
59
60Source files are named according to the PLDM Type, for eg base.[hpp/cpp],
61fru.[hpp/cpp], etc.
62
63## OEM/vendor-specific functions
64
65This will support OEM or vendor-specific functions and semantic information.
66Following directory structure has to be used:
67
68```
69    pldm repo
70     |---- oem
71            |----<oem_name>
72                      |----libpldmresponder
73                            |---<oem based handler files>
74
75```
76
77<oem_name> - This folder must be created with the name of the OEM/vendor in
78lower case. Folders named libpldm and libpldmresponder must be created under the
79folder <oem_name>
80
81Files having the oem functionality for the libpldmresponder library should be
82placed under the folder oem/<oem_name>/libpldmresponder. They must be adhering
83to the rules mentioned under the libpldmresponder section above.
84
85Once the above is done a meson option has to be created in
86`pldm/meson_options.txt` with its mapped compiler flag to enable conditional
87compilation.
88
89For consistency would recommend using "oem-<oem_name>".
90
91The `pldm/meson.build` and the corresponding source file(s) will need to
92incorporate the logic of adding its mapped compiler flag to allow conditional
93compilation of the code.
94
95## libpldm
96
97pldm daemon links against the libpldm library during compilation, For more
98information on libpldm please refer to
99[libpldm](https://github.com/openbmc/libpldm)
100
101## pldmtool
102
103For more information on pldmtool please refer to plmdtool/README.md.
104
105# Flows
106
107This section documents important code flow paths.
108
109## BMC as PLDM responder
110
111a) PLDM daemon receives PLDM request message from underlying transport (MCTP).
112
113b) PLDM daemon routes message to message handler, based on the PLDM command.
114
115c) Message handler decodes request payload into various field(s) of the request
116message. It can make use of a decode_foo_req() API, and doesn't have to perform
117deserialization of the request payload by itself.
118
119d) Message handler works with the request field(s) and generates response
120field(s).
121
122e) Message handler prepares a response message. It can make use of an
123encode_foo_resp() API, and doesn't have to perform the serialization of the
124response field(s) by itself.
125
126f) The PLDM daemon sends the response message prepared at step e) to the remote
127PLDM device.
128
129## BMC as PLDM requester
130
131a) A BMC PLDM requester app prepares a PLDM request message. There would be
132several requester apps (based on functionality/PLDM remote device). Each of them
133needn't bother with the serialization of request field(s), and can instead make
134use of an encode_foo_req() API.
135
136b) BMC requester app requests PLDM daemon to send the request message to remote
137PLDM device.
138
139c) Once the PLDM daemon receives a corresponding response message, it notifies
140the requester app.
141
142d) The requester app has to work with the response field(s). It can make use of
143a decode_foo_resp() API to deserialize the response message.
144
145# PDR Implementation
146
147While PLDM Platform Descriptor Records (PDRs) are mostly static information,
148they can vary across platforms and systems. For this reason, platform specific
149PDR information is encoded in platform specific JSON files. JSON files must be
150named based on the PDR type number. For example a state effecter PDR JSON file
151will be named 11.json. The JSON files may also include information to enable
152additional processing (apart from PDR creation) for specific PDR types, for eg
153mapping an effecter id to a D-Bus object.
154
155The PLDM responder implementation finds and parses PDR JSON files to create the
156PDR repository. Platform specific PDR modifications would likely just result in
157JSON updates. New PDR type support would require JSON updates as well as PDR
158generation code. The PDR generator is a map of PDR Type -> C++ lambda to create
159PDR entries for that type based on the JSON, and to update the central PDR repo.
160