From 4e5d9d16a1d7f591534a0570edc1006be02d74f6 Mon Sep 17 00:00:00 2001 From: Aditya Prayoga Date: Fri, 7 Dec 2018 11:17:40 +0800 Subject: [PATCH] update LED page --- .../files/led/libata_leds_trigger_mvebu.patch | 222 ++++++++++++++++++ docs/img/led/led_expansion_wiring_diagram.png | Bin 0 -> 10789 bytes docs/img/led/led_location.png | Bin 0 -> 41908 bytes docs/led.md | 175 +++++++++++++- 4 files changed, 385 insertions(+), 12 deletions(-) create mode 100644 docs/files/led/libata_leds_trigger_mvebu.patch create mode 100755 docs/img/led/led_expansion_wiring_diagram.png create mode 100644 docs/img/led/led_location.png diff --git a/docs/files/led/libata_leds_trigger_mvebu.patch b/docs/files/led/libata_leds_trigger_mvebu.patch new file mode 100644 index 0000000..bed08d8 --- /dev/null +++ b/docs/files/led/libata_leds_trigger_mvebu.patch @@ -0,0 +1,222 @@ +From 7c0053bae4a4e7dbab69402c47eb84e33143a176 Mon Sep 17 00:00:00 2001 +Message-Id: <7c0053bae4a4e7dbab69402c47eb84e33143a176.1544101943.git.aditya@kobol.io> +From: Daniel Golle +Date: Sat, 13 Dec 2014 01:07:20 +0100 +Subject: [PATCH] libata: add ledtrig support + +This adds a LED trigger for each ATA port indicating disk activity. + +As this is needed only on specific platforms (NAS SoCs and such), +these platforms should define ARCH_WANTS_LIBATA_LEDS if there +are boards with LED(s) intended to indicate ATA disk activity and +need the OS to take care of that. +In that way, if not selected, LED trigger support not will be +included in libata-core and both, codepaths and structures remain +untouched. + +I'm currently deploying this for the oxnas target in OpenWrt +https://dev.openwrt.org/changeset/43675/ + +v2: rebased to kernel/git/tj/libata.git + plus small corrections and comments added + +Signed-off-by: Daniel Golle +URL: https://patchwork.ozlabs.org/patch/420733/ +[Aditya Prayoga: +* Port forward +* Change ATA_LEDS default to no +* Reduce performance impact by moving ata_led_act() call from + ata_qc_new() to ata_qc_complete()] +Signed-off-by: Aditya Prayoga + +ARM: mvebu: Enable ARCH_WANT_LIBATA_LEDS in Armada 38x + +Enable hidden symbol ARCH_WANT_LIBATA_LEDS so CONFIG_ATA_LEDS can be +used in kernel configuration. + +URL: https://lists.openwrt.org/pipermail/openwrt- +devel/2017-March/006582.html + +Signed-off-by: Aditya Prayoga +--- + arch/arm/configs/mvebu_v7_defconfig | 1 + + arch/arm/mach-mvebu/Kconfig | 1 + + drivers/ata/Kconfig | 16 +++++++++++ + drivers/ata/libata-core.c | 56 +++++++++++++++++++++++++++++++++++++ + include/linux/libata.h | 7 +++++ + 5 files changed, 81 insertions(+) + +diff --git a/arch/arm/configs/mvebu_v7_defconfig b/arch/arm/configs/mvebu_v7_defconfig +index 5514021..3d39ab2 100644 +--- a/arch/arm/configs/mvebu_v7_defconfig ++++ b/arch/arm/configs/mvebu_v7_defconfig +@@ -59,6 +59,7 @@ CONFIG_MTD_UBI=y + CONFIG_EEPROM_AT24=y + CONFIG_BLK_DEV_SD=y + CONFIG_ATA=y ++CONFIG_ATA_LEDS=y + CONFIG_SATA_AHCI=y + CONFIG_AHCI_MVEBU=y + CONFIG_SATA_MV=y +diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig +index 2c20599..51f3256 100644 +--- a/arch/arm/mach-mvebu/Kconfig ++++ b/arch/arm/mach-mvebu/Kconfig +@@ -68,6 +68,7 @@ config MACH_ARMADA_38X + select HAVE_SMP + select MACH_MVEBU_V7 + select PINCTRL_ARMADA_38X ++ select ARCH_WANT_LIBATA_LEDS + help + Say 'Y' here if you want your kernel to support boards based + on the Marvell Armada 380/385 SoC with device tree. +diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig +index 39b181d..143bbd5 100644 +--- a/drivers/ata/Kconfig ++++ b/drivers/ata/Kconfig +@@ -46,6 +46,22 @@ config ATA_VERBOSE_ERROR + + If unsure, say Y. + ++config ARCH_WANT_LIBATA_LEDS ++ bool ++ ++config ATA_LEDS ++ bool "support ATA port LED triggers" ++ depends on ARCH_WANT_LIBATA_LEDS ++ select NEW_LEDS ++ select LEDS_CLASS ++ select LEDS_TRIGGERS ++ default y ++ help ++ This option adds a LED trigger for each registered ATA port. ++ It is used to drive disk activity leds connected via GPIO. ++ ++ If unsure, say N. ++ + config ATA_ACPI + bool "ATA ACPI Support" + depends on ACPI +diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c +index 599e01b..65228f5 100644 +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -5105,6 +5105,30 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) + } + + /** ++ * ata_led_act - Trigger port activity LED ++ * @ap: indicating port ++ * ++ * Blinks any LEDs registered to the trigger. ++ * Commonly used with leds-gpio on NAS systems with disk activity ++ * indicator LEDs. ++ * ++ * LOCKING: ++ * None. ++ */ ++static inline void ata_led_act(struct ata_port *ap) ++{ ++#ifdef CONFIG_ATA_LEDS ++#define LIBATA_BLINK_DELAY 20 /* ms */ ++ unsigned long led_delay = LIBATA_BLINK_DELAY; ++ ++ if (unlikely(!ap->ledtrig)) ++ return; ++ ++ led_trigger_blink_oneshot(ap->ledtrig, &led_delay, &led_delay, 0); ++#endif /* CONFIG_ATA_LEDS */ ++} ++ ++/** + * ata_qc_new_init - Request an available ATA command, and initialize it + * @dev: Device from whom we request an available command structure + * @tag: tag +@@ -5249,6 +5273,10 @@ void ata_qc_complete(struct ata_queued_cmd *qc) + /* Trigger the LED (if available) */ + ledtrig_disk_activity(!!(qc->tf.flags & ATA_TFLAG_WRITE)); + ++#ifdef CONFIG_ATA_LEDS ++ ata_led_act(ap); ++#endif ++ + /* XXX: New EH and old EH use different mechanisms to + * synchronize EH with regular execution path. + * +@@ -6028,6 +6056,9 @@ struct ata_port *ata_port_alloc(struct ata_host *host) + ap->stats.unhandled_irq = 1; + ap->stats.idle_irq = 1; + #endif ++#ifdef CONFIG_ATA_LEDS ++ ap->ledtrig = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); ++#endif + ata_sff_port_init(ap); + + return ap; +@@ -6063,6 +6094,12 @@ static void ata_host_release(struct kref *kref) + + kfree(ap->pmp_link); + kfree(ap->slave_link); ++#ifdef CONFIG_ATA_LEDS ++ if (ap->ledtrig) { ++ led_trigger_unregister(ap->ledtrig); ++ kfree(ap->ledtrig); ++ }; ++#endif + kfree(ap); + host->ports[i] = NULL; + } +@@ -6527,6 +6564,25 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) + host->ports[i]->local_port_no = i + 1; + } + ++#ifdef CONFIG_ATA_LEDS ++ /* register LED triggers for all ports */ ++ for (i = 0; i < host->n_ports; i++) { ++ if (unlikely(!host->ports[i]->ledtrig)) ++ continue; ++ ++ snprintf(host->ports[i]->ledtrig_name, ++ sizeof(host->ports[i]->ledtrig_name), "ata%u", ++ host->ports[i]->print_id); ++ ++ host->ports[i]->ledtrig->name = host->ports[i]->ledtrig_name; ++ ++ if (led_trigger_register(host->ports[i]->ledtrig)) { ++ kfree(host->ports[i]->ledtrig); ++ host->ports[i]->ledtrig = NULL; ++ } ++ } ++#endif ++ + /* Create associated sysfs transport objects */ + for (i = 0; i < host->n_ports; i++) { + rc = ata_tport_add(host->dev,host->ports[i]); +diff --git a/include/linux/libata.h b/include/linux/libata.h +index 38c95d6..3cc5f63 100644 +--- a/include/linux/libata.h ++++ b/include/linux/libata.h +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + + /* + * Define if arch has non-standard setup. This is a _PCI_ standard +@@ -893,6 +894,12 @@ struct ata_port { + #ifdef CONFIG_ATA_ACPI + struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */ + #endif ++ ++#ifdef CONFIG_ATA_LEDS ++ struct led_trigger *ledtrig; ++ char ledtrig_name[8]; ++#endif ++ + /* owned by EH */ + u8 sector_buf[ATA_SECT_SIZE] ____cacheline_aligned; + }; +-- +2.7.4 + diff --git a/docs/img/led/led_expansion_wiring_diagram.png b/docs/img/led/led_expansion_wiring_diagram.png new file mode 100755 index 0000000000000000000000000000000000000000..72b522c6df270ebed936e395bccfce7becab87e7 GIT binary patch literal 10789 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 literal 0 HcmV?d00001 diff --git a/docs/img/led/led_location.png b/docs/img/led/led_location.png new file mode 100644 index 0000000000000000000000000000000000000000..015669ab729fc675db2ed51a887226e9a8d605f9 GIT binary patch literal 41908 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 XPRvQqmG7h;1AiJS+P6xS9zOej)sE** literal 0 HcmV?d00001 diff --git a/docs/led.md b/docs/led.md index a209d64..7daae18 100644 --- a/docs/led.md +++ b/docs/led.md @@ -1,6 +1,25 @@ +![LED location](/img/led/led_location.png) + +## On-Board LEDs + +| LED number | Color | Software control | Remarks | +|------------|-------|------------------|---------| +| LED1 | Green | Yes | Active-low | +| LED2 | Red | Yes | Active-low | +| LED3 | Green | Yes | Active-low | +| LED4 | Green | Yes | Active-low | +| LED5 | Green | Yes | Active-low | +| LED6 | Green | Yes | Active-low | +| LED7 | Green | Yes | Active-low | +| LED8 | Green | No | Power indicator | + +!!! info + LED1 - LED7 is preconfigured for certain indicator under Linux, see [LED under Linux](#led-under-linux) + ## Expansion Panel (J18) -Helios4 board was designed to either use the on-board LEDs or use a custom expansion panel (not-available). If you wish to use the header insure to switch to OFF the DIP switch SW2. +Helios4 board was designed to either use the on-board LEDs or use a custom expansion panel (not-available). +If you wish to use the header insure to switch to OFF the DIP switch SW2. ![Dipswitch LED](/img/led/dipswitch_led_off.png) @@ -9,14 +28,146 @@ Helios4 board was designed to either use the on-board LEDs or use a custom expan ![J18 Pinout](/img/led/gpio_pinout_j18.png) | Pin | LED number | Remarks | -|------------|----------|---------| -| 1 | - | 3.3V supply | -| 2 | - | Not connected | -| 3 | LED1 | Heartbeat LED | -| 4 | LED2 | System Fault LED | -| 5 | LED3 | SATA port 1 LED | -| 6 | LED4 | SATA port 2 LED | -| 7 | LED5 | SATA port 3 LED | -| 8 | LED6 | SATA port 4 LED | -| 9 | LED7 | USB activity LED | -| 10 | - | GND | +|-----|------------|---------| +| 1 | - | 3.3V supply | +| 2 | - | Not connected | +| 3 | LED1 | Active-low | +| 4 | LED2 | Active-low | +| 5 | LED3 | Active-low | +| 6 | LED4 | Active-low | +| 7 | LED5 | Active-low | +| 8 | LED6 | Active-low | +| 9 | LED7 | Active-low | +| 10 | - | GND | + +!!! info + LED1 - LED7 is preconfigured for certain indicator under Linux, see [LED under Linux](#led-under-linux) + +### Wiring Diagram + +Since the signals to control the LEDs are active low, connect the pin to LED's cathode. +Below is example of the wiring diagram. + +![Wiring Example](/img/led/led_expansion_wiring_diagram.png) + + +## LED under Linux + +| LED | Name | Default Trigger | Remarks | +|------|----------------------|-----------------|---------| +| LED1 | helios4:green:status | heartbeat | Blinking periodically | +| LED2 | helios4:red:fault | none | See [Configuring Fault LED](#configuring-fault-led) | +| LED3 | helios4:green:ata1 | ata1 | Blinking on SATA1 activity | +| LED4 | helios4:green:ata2 | ata2 | Blinking on SATA2 activity | +| LED5 | helios4:green:ata3 | ata3 | Blinking on SATA3 activity | +| LED6 | helios4:green:ata4 | ata4 | Blinking on SATA4 activity | +| LED7 | helios4:green:usb | usb-host | Blinking on USB activity, any port | + +!!! note + **ata* ** trigger requires additional patch to mainline kernel. The patch can be found from + [here](/files/led/libata_leds_trigger_mvebu.patch) and is not needed for Armbian. + +The LEDs can be accessed under leds class in sysfs. + +``` +root@helios4:~/# ls -l /sys/class/leds/ + +lrwxrwxrwx 1 root root 0 Dec 4 06:57 helios4:green:ata1 -> ../../devices/platform/io-leds/leds/helios4:green:ata1 +lrwxrwxrwx 1 root root 0 Dec 4 06:57 helios4:green:ata2 -> ../../devices/platform/io-leds/leds/helios4:green:ata2 +lrwxrwxrwx 1 root root 0 Dec 4 06:57 helios4:green:ata3 -> ../../devices/platform/io-leds/leds/helios4:green:ata3 +lrwxrwxrwx 1 root root 0 Dec 4 06:57 helios4:green:ata4 -> ../../devices/platform/io-leds/leds/helios4:green:ata4 +lrwxrwxrwx 1 root root 0 Dec 4 06:57 helios4:green:status -> ../../devices/platform/system-leds/leds/helios4:green:status +lrwxrwxrwx 1 root root 0 Dec 4 06:57 helios4:green:usb -> ../../devices/platform/io-leds/leds/helios4:green:usb +lrwxrwxrwx 1 root root 0 Dec 4 06:57 helios4:red:fault -> ../../devices/platform/system-leds/leds/helios4:red:fault + +``` + +### LEDs Trigger + +- none + +No automatic trigger. Manually control the LED by manipulating "brightness". +More info see [Configuring LED trigger](#configuring-led-trigger). + +- heartbeat + +LED "double" flashes at a load average based rate. The interval might changed during high load. +If the LED no longer blink, that is mean the system lock-up or hung and has to be reset'd. + +- ataN + +LED blink on any read/write activity at specific SATA port. + +- usb-host + +LED blink on USB activity at any port. + +- panic + +This trigger allows LEDs to be configured to blink on a kernel panic. + +- timer + +This allows LEDs to be controlled by a programmable timer via sysfs. delay_on to set how long +the led turned on and delay_off to set how long the led turned off. + + +### Configuring LED trigger + +To configure, simply set the trigger type. For example to set status led triggered by timer + +``` +echo timer | sudo tee -a /sys/class/leds/helios4\:green\:status/trigger +``` + +and done. + +Some of the trigger may exposed additional parameter than can be configured further. + +On **none** trigger, to turn on the LED set the brightness bigger than 0. + +``` +echo 1 | sudo tee -a /sys/class/leds/helios4\:green\:status/brightness +``` + +and to turn off the LED set the brightness to 0. + +``` +echo 0 | sudo tee -a /sys/class/leds/helios4\:green\:status/brightness +``` + +On **timer** trigger, it will exposed *delay_on* and *delay_off* with default value both 0.5 seconds. +To change the delay, set the respective parameter (value in milliseconds) + +``` +echo 1000 | sudo tee -a /sys/class/leds/helios4\:green\:status/delay_on +echo 200 | sudo tee -a /sys/class/leds/helios4\:green\:status/delay_off +``` + +!!! note + The changes is not retained across reboot. Use startup script or udev rules to make it permanent. + +### Configuring Fault LED + +While other LEDs are preconfigured, the fault LED remains unconfigured (trigger:**none**). + +#### 1. As Kernel Panic Indicator + +To configure the LED as Kernel panic indicator, set the trigger to **panic**. +However, this functionality might be redundant with status LED. If the status LED no longer blinking, +that mean the system is hung which can be translated into kernel panic occurred. + +To trigger kernel panic to test the LED, run +``` +echo c > /proc/sysrq-trigger +``` + +!!! warning + Triggering kernel panic can lead to data loss. Use with caution! + +#### 2. As MDADM Fault Indicator + +To configure the LED as MDADM fault indicator, please refer to [MDADM: Configure Fault LED](/mdadm/#configure-fault-led) + +!!! info + On Armbian, this is the default setting for fault LED.