aboutsummaryrefslogtreecommitdiff
path: root/hw/fsp
diff options
context:
space:
mode:
authorVasant Hegde <hegdevasant@linux.vnet.ibm.com>2015-03-08 16:12:47 +0530
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-03-20 02:29:07 +1100
commit4abc10f25e39547f3def70cd5b72407e1cc4ee0d (patch)
tree9a2ef92a7b6e1425186e4b034a86ef0eaaa26162 /hw/fsp
parentc3137a50fb71a253e16b56bb92f62591f288552d (diff)
downloadskiboot-4abc10f25e39547f3def70cd5b72407e1cc4ee0d.zip
skiboot-4abc10f25e39547f3def70cd5b72407e1cc4ee0d.tar.gz
skiboot-4abc10f25e39547f3def70cd5b72407e1cc4ee0d.tar.bz2
FSP/LEDS: Add device tree nodes
This patch creates a parent LED device node called 'led' under the root 'opal' device node. This also creates child device nodes under 'led' corresponding to all individual LEDs on the system whether it is an enclosure type or a descendant type with their location code as name. The location code information will be used by the host to enlist and access all the individual LEDs present on the system. The child LED device nodes also have the properties 'led-types' and 'led-loc' representing what kind of LEDs present on the same loation code and whether it is an enclosure type LED or a descendant type LED. Sample device tree output: ibm,opal { .. .. led { compatible = "ibm,opal-v3-led"; phandle = <0x1000006b>; linux,phandle = <0x1000006b>; U78C9.001.RST0027-P1-C1 { led-types = "identify", "fault"; led-loc = "descendent"; phandle = <0x1000006f>; linux,phandle = <0x1000006f>; }; <snip> }; }; Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com> [stewart@linux.vnet.ibm.com: Move create_led_device_nodes to FSP platform.exit] Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'hw/fsp')
-rw-r--r--hw/fsp/fsp-leds.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/hw/fsp/fsp-leds.c b/hw/fsp/fsp-leds.c
index a03339e..911f853 100644
--- a/hw/fsp/fsp-leds.c
+++ b/hw/fsp/fsp-leds.c
@@ -24,6 +24,7 @@
#include <spcn.h>
#include <lock.h>
#include <errorlog.h>
+#include <opal-api.h>
#include "fsp-leds.h"
@@ -1048,6 +1049,65 @@ static struct fsp_client fsp_indicator_client = {
};
/*
+ * create_led_device_node
+ *
+ * Creates the system parent LED device node and all individual
+ * child LED device nodes under it. This is called right before
+ * starting the payload (Linux) to ensure that the SPCN command
+ * sequence to fetch the LED location code list has been finished
+ * and to have a better chance of creating the deviced nodes.
+ */
+void create_led_device_nodes(void)
+{
+ struct fsp_led_data *led, *next;
+ struct dt_node *pled, *cled;
+
+ if (!fsp_present())
+ return;
+
+ /* Make sure LED list read is completed */
+ while (led_support == LED_STATE_READING)
+ opal_run_pollers();
+
+ if (led_support == LED_STATE_ABSENT) {
+ prlog(PR_WARNING, PREFIX "LED support not available, \
+ hence device tree nodes will not be created\n");
+ return;
+ }
+
+ if (!opal_node) {
+ prlog(PR_WARNING, PREFIX
+ "OPAL parent device node not available\n");
+ return;
+ }
+
+ /* LED parent node */
+ pled = dt_new(opal_node, "led");
+ if (!pled) {
+ prlog(PR_WARNING, PREFIX
+ "Parent device node creation failed\n");
+ return;
+ }
+ dt_add_property_strings(pled, "compatible", "ibm,opal-v3-led");
+
+ /* LED child nodes */
+ list_for_each_safe(&cec_ledq, led, next, link) {
+ cled = dt_new(pled, led->loc_code);
+ if (!cled) {
+ prlog(PR_WARNING, PREFIX
+ "Child device node creation failed\n");
+ continue;
+ }
+
+ dt_add_property_strings(cled, "led-types", "identify", "fault");
+ if (is_enclosure_led(led->loc_code))
+ dt_add_property_strings(cled, "led-loc", "enclosure");
+ else
+ dt_add_property_strings(cled, "led-loc", "descendent");
+ }
+}
+
+/*
* Process the received LED data from SPCN
*
* Every LED state data is added into the CEC list. If the location