1# Fan Presence Configuration File
2
3## Table of Contents
4
5- [Overview](#overview)
6- [Data Format](#data-format)
7- [Example](#example)
8- [System Config Location](#system-config-location)
9- [Contents](#contents)
10- [Validation](#validation)
11- [Firmware Updates](#firmware-updates)
12- [Loading and Reloading](#loading-and-reloading)
13
14## Overview
15
16The `phosphor-fan-presence-tach` application is controlled by a configuration
17file (config file) to manage the `Present` property's state on the
18`xyz.openbmc_project.Inventory.Item` interface for fan inventory objects. The
19config file defines the method(s) and policy(s) to use in determining the
20presence of each fan within a machine.
21
22## Data Format
23
24The config file is written using the
25[JSON (JavaScript Object Notation)](https://www.json.org/) data format and can
26be created using a text editor.
27
28## Example
29
30See [config.json](../../presence/example/config.json).
31
32## System Config Location
33
34The config file name is `config.json`.
35
36### Supported Directory
37
38`/usr/share/phosphor-fan-presence/presence/`
39
40The supported version of the config file is installed under this read-only
41directory location as part of the firmware image install. This is where the
42config file will be loaded from when no overriding config file exists.
43
44#### Default Location
45
46Where a single config file for 1-or-more system types can be used, the config
47file can be located at the base of the supported directory.
48
49i.e.) `/usr/share/phosphor-fan-presence/presence/config.json`
50
51#### Compatible System Type Location
52
53The config file location can also be based on a system type. This is necessary
54where more than one type of machine is supported in a single BMC firmware image
55and those system types can not share a common config file.
56
57A system type sub-directory can be obtained from the
58`Inventory.Decorator.Compatible` D-Bus interface's `Names` property. The
59property holds a list of one or more compatible system types.
60
61Example:
62
63- `com.ampere.Hardware.Chassis.Model.MtJade`
64- `com.ampere.Hardware.Chassis.Model.MtMitchell`
65
66The `phosphor-fan-presence-tach` application then traverses the supported
67directory, appending each compatible system type entry as a sub-directory on
68each config file until it is found.
69
70Example:
71
721. `/usr/share/phosphor-fan-presence/presence/com.ampere.Hardware.Chassis.Model.MtJade/`
73   - (directory/config file does not exist)
742. `/usr/share/phosphor-fan-presence/presence/com.ampere.Hardware.Chassis.Model.MtMitchell/config.json`
75   - (config file found)
76
77If a config file is not found and the machine is powered on, an error is logged
78and `phosphor-fan-presence-tach` application terminates preventing the machine
79from successfully powering on.
80
81### Override Directory
82
83`/etc/phosphor-fan-presence/presence/`
84
85A different version of the config file can be loaded by placing it into this
86writable directory location. This avoids the need to build and install a new
87firmware image on the BMC when changing the configuration, such as for testing
88purposes.
89
90The override directory may not exist on the BMC, therefore to be able to use an
91overriding config file it must be created using the following command:
92
93`mkdir -p /etc/phosphor-fan-presence/presence`
94
95### Search Order
96
97The `phosphor-fan-presence-tach` application will search for the config file at
98the directory locations in the following order:
99
1001. Override directory
1012. Supported directory
102   - Default location
103   - Compatible System Type location
104
105## Contents
106
107### Structure
108
109The config file consists of an array of fan objects that define how their
110presence is detected and the policy used to update its present state within
111inventory.
112
113```json
114[
115  {
116    "name": "fan0",
117    "path": "/system/chassis/motherboard/fan0",
118    "methods": [
119      {
120        "type": ...
121      },
122      .
123      .
124      .
125    ],
126    "rpolicy": {
127        "type": ...
128    }
129  },
130  .
131  .
132  .
133]
134```
135
136### Syntax
137
138Fan object attributes: **(Required unless otherwise noted)**
139
140- [name](name.md)
141- [path](path.md)
142- [methods](methods.md)
143- [rpolicy](rpolicy.md)
144- [eeprom](eeprom.md) _optional_
145
146### Comments
147
148The JSON data format does not support comments. However, an optional `comments`
149attribute name can be used to annotate any specific entry of the JSON
150configuration. It is suggested that the value of this `comments` attribute be an
151array of strings for comments containing line breaks. All `comments` objects are
152ignored when the JSON configuration is processed.
153
154**_Note: Only 1 `comments` object can exist at any given 'layer' of the
155configuration hierarchy_**
156
157Example:
158
159```json
160[
161  {
162    "comments": [
163      "First fan in the system",
164      "Uses two methods of presence detection"
165    ],
166    "name": "fan0",
167    "path": "/system/chassis/motherboard/fan0",
168    "methods": [
169      {
170        "comments": "Use GPIO for presence detection",
171        "type": "gpio",
172        .
173        .
174        .
175      },
176      {
177        "comments": "Also use the tach for presence detection",
178        "type": "tach",
179        .
180        .
181        .
182      }
183    ],
184    "rpolicy": {
185        "type": ...
186    }
187  },
188  .
189  .
190  .
191]
192```
193
194## Validation
195
196TBD
197
198## Firmware Updates
199
200When a new firmware image is installed on the BMC, it will update the config
201file in the standard directory.
202
203The override directory will **not** be modified by a firmware update. If a
204config file exists in the override directory, it will continue to be used as the
205fan presence configuration instead of the config file located under the
206appropriate location within the supported directory.
207
208## Loading and Reloading
209
210The config file is loaded when the `phosphor-fan-presence-tach` application
211starts.
212
213To force the application to reload the config file, use the following command on
214the BMC:
215
216`systemctl kill -s HUP phosphor-fan-presence-tach@0.service`
217
218To confirm which config file was loaded, use the following command on the BMC:
219
220`journalctl -u phosphor-fan-presence-tach@0.service | grep Loading`
221