Message ID | 20150205084040.12859.72532.stgit@localhost.localdomain |
---|---|
State | Changes Requested |
Headers | show |
On Thu, Feb 05, 2015 at 02:10:40PM +0530, Vasant Hegde wrote: > + /* LED parent node */ > + pled = dt_new(opal_node, "led"); > + if (!pled) { > + prlog(PR_WARNING, PREFIX > + "LED 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 > + "LED child device node creation failed\n"); > + continue; > + } > + > + dt_add_property_strings(cled, "compatible", "ibm,opal-v3-led"); Do you need the compatible property for every led? You already have it at /led, isn't that sufficient? Ananth
On 02/12/2015 01:43 PM, Ananth N Mavinakayanahalli wrote: > On Thu, Feb 05, 2015 at 02:10:40PM +0530, Vasant Hegde wrote: > >> + /* LED parent node */ >> + pled = dt_new(opal_node, "led"); >> + if (!pled) { >> + prlog(PR_WARNING, PREFIX >> + "LED 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 >> + "LED child device node creation failed\n"); >> + continue; >> + } >> + >> + dt_add_property_strings(cled, "compatible", "ibm,opal-v3-led"); > > Do you need the compatible property for every led? You already have it > at /led, isn't that sufficient? Ananth, Ah! You are right.. its redundant. Will fix it. -Vasant
Vasant Hegde <hegdevasant@linux.vnet.ibm.com> writes: > 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"; > compatible = "ibm,opal-v3-led"; > led-loc = "descendent"; > phandle = <0x1000006f>; > linux,phandle = <0x1000006f>; > }; > > <snip> > }; > }; Please add something to doc/device-tree/ describing changes.
On 02/16/2015 10:34 AM, Stewart Smith wrote: > Vasant Hegde <hegdevasant@linux.vnet.ibm.com> writes: >> 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 .../... > > Please add something to doc/device-tree/ describing changes. Sure. Will fix DT stuff as well and respin rest of the patches later this week. -Vasant >
diff --git a/core/init.c b/core/init.c index 2c7e30c..76eeafc 100644 --- a/core/init.c +++ b/core/init.c @@ -370,6 +370,12 @@ void __noreturn load_and_boot_kernel(bool is_reboot) */ occ_pstates_init(); + /* + * LED related SPCN commands might take a while to + * complete. Call this as late as possible. + */ + create_led_device_nodes(); + /* Set kernel command line argument if specified */ #ifdef KERNEL_COMMAND_LINE dt_add_property_string(dt_chosen, "bootargs", KERNEL_COMMAND_LINE); diff --git a/hw/fsp/fsp-leds.c b/hw/fsp/fsp-leds.c index 2ac9723..cf3328b 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.h> #include "fsp-leds.h" @@ -964,6 +965,66 @@ 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 + "LED 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 + "LED child device node creation failed\n"); + continue; + } + + dt_add_property_strings(cled, "compatible", "ibm,opal-v3-led"); + 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 diff --git a/include/fsp.h b/include/fsp.h index 9ef7d9f..c2c586d 100644 --- a/include/fsp.h +++ b/include/fsp.h @@ -773,6 +773,7 @@ extern void fsp_init_diag(void); /* LED */ extern void fsp_led_init(void); +extern void create_led_device_nodes(void); /* EPOW */ extern void fsp_epow_init(void);