summaryrefslogtreecommitdiff
path: root/meta-yadro/meta-nicole/recipes-kernel
diff options
context:
space:
mode:
authorArtem Senichev <a.senichev@yadro.com>2020-02-19 12:20:50 +0300
committerBrad Bishop <bradleyb@fuzziesquirrel.com>2020-02-20 20:06:38 +0300
commit7f598ef5f3886ac6b773889b6bb33ec6fe741091 (patch)
tree63270073dcaa97c3c4bfa125e05fac08a5d9a198 /meta-yadro/meta-nicole/recipes-kernel
parent110bb2f806d9387213c11f2bd4b1ff24c326bdef (diff)
downloadopenbmc-7f598ef5f3886ac6b773889b6bb33ec6fe741091.tar.xz
nicole: NCSI channel selector
NCSI channel number is selected depending on GPIO state of a pin described in the device tree (gpio/nsci_cfg node). Currently, this pin is controlled via MCU, and its state represents Nicole's physical position inside a fabric. Channel selector scheme: * GPIO pin is LOW: channel 0; * GPIO pin is HIGH: channel 1; * invalid configuration or error: channel 0. After changing pin's state it is necessary to reboot the BMC to apply new channel number. (From meta-yadro rev: 2661355417e52d968e9845298c37cae8ff1dfe6b) Signed-off-by: Artem Senichev <a.senichev@yadro.com> Change-Id: I8eeac34f71197fc110e41d186dd1fd4d2f1ef064 Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Diffstat (limited to 'meta-yadro/meta-nicole/recipes-kernel')
-rw-r--r--meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed/0001-Add-NCSI-channel-selector.patch131
-rw-r--r--meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed/arch/arm/boot/dts/aspeed-bmc-opp-nicole.dts6
-rw-r--r--meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed_%.bbappend1
3 files changed, 138 insertions, 0 deletions
diff --git a/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed/0001-Add-NCSI-channel-selector.patch b/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed/0001-Add-NCSI-channel-selector.patch
new file mode 100644
index 000000000..6028f42d2
--- /dev/null
+++ b/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed/0001-Add-NCSI-channel-selector.patch
@@ -0,0 +1,131 @@
+From b19111bb23044c9312d13e64dd1df2a9565f6b38 Mon Sep 17 00:00:00 2001
+From: Artem Senichev <a.senichev@yadro.com>
+Date: Wed, 12 Feb 2020 14:05:15 +0300
+Subject: [PATCH] Add NCSI channel selector
+
+NCSI channel number is selected depending on GPIO state of a pin
+described in the device tree (gpio/nsci_cfg node).
+Currently, this pin is controlled via MCU, and its state represents
+Nicole's physical position inside a fabric.
+
+Channel selector scheme:
+* GPIO pin value is 0: channel 0;
+* GPIO pin value is 1: channel 1;
+* invalid configuration or error: channel 0.
+
+After changing pin's state it is necessary to reboot the BMC to apply
+new channel number.
+
+Signed-off-by: Artem Senichev <a.senichev@yadro.com>
+---
+ net/ncsi/ncsi-rsp.c | 80 ++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 79 insertions(+), 1 deletion(-)
+
+diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c
+index d876bd55f356..d211a7e64b14 100644
+--- a/net/ncsi/ncsi-rsp.c
++++ b/net/ncsi/ncsi-rsp.c
+@@ -9,6 +9,9 @@
+ #include <linux/netdevice.h>
+ #include <linux/etherdevice.h>
+ #include <linux/skbuff.h>
++#include <linux/of.h>
++#include <linux/gpio.h>
++#include <linux/gpio/consumer.h>
+
+ #include <net/ncsi.h>
+ #include <net/net_namespace.h>
+@@ -19,6 +22,81 @@
+ #include "ncsi-pkt.h"
+ #include "ncsi-netlink.h"
+
++/* NSCI channel number, used as default in case of errors. */
++#define NCSI_DEFAULT_CHANNEL 0
++
++/* Predicate for gpiochip_find() call. */
++static int device_match(struct gpio_chip* chip, void* data)
++{
++ const struct device_node *node = data;
++ return chip->of_node == node;
++}
++
++/**
++ * ncsi_select_channel() - Get channel number for NCSI.
++ * @dev: Network device.
++ *
++ * NCSI channel number is selected depending on GPIO state of a pin
++ * described in the device tree (gpio/nsci_cfg node).
++ *
++ * Return: channel number.
++ */
++static int ncsi_select_channel(const struct net_device* dev)
++{
++ static int channel_id = -1;
++ struct device_node* node = NULL;
++
++ while (channel_id < 0) {
++ struct gpio_chip* chip;
++ const struct gpio_desc* desc;
++ u32 pin;
++ int rc;
++
++ /* Read NCSI configuration node from device tree */
++ node = of_find_node_by_name(NULL, "ncsi_cfg");
++ if (!node) {
++ netdev_err(dev, "NCSI: Configuration node not found\n");
++ break;
++ }
++
++ /* Read GPIO pin configuration */
++ rc = of_property_read_u32_index(node, "gpios", 0, &pin);
++ if (rc) {
++ netdev_err(dev, "NCSI: GPIO configuration not found\n");
++ break;
++ }
++
++ /* Find GPIO chip */
++ chip = gpiochip_find(node->parent, device_match);
++ if (!chip) {
++ netdev_err(dev, "NCSI: GPIO chip not found\n");
++ break;
++ }
++
++ /* Read GPIO state */
++ desc = gpio_to_desc(chip->base + pin);
++ if (!desc) {
++ netdev_err(dev, "NCSI: Cannot get GPIO descriptor\n");
++ break;
++ }
++ channel_id = gpiod_get_value(desc);
++ if (channel_id < 0) {
++ netdev_err(dev, "NCSI: GPIO read error %d\n", channel_id);
++ }
++ break;
++ }
++
++ if (node) {
++ of_node_put(node);
++ }
++ if (channel_id < 0) {
++ channel_id = NCSI_DEFAULT_CHANNEL;
++ }
++ netdev_info(dev, "NCSI: Set channel %d\n", channel_id);
++
++ return channel_id;
++}
++
+ static int ncsi_validate_rsp_pkt(struct ncsi_request *nr,
+ unsigned short payload)
+ {
+@@ -87,7 +165,7 @@ static int ncsi_rsp_handler_cis(struct ncsi_request *nr)
+ if (ndp->flags & NCSI_DEV_PROBED)
+ return -ENXIO;
+
+- id = NCSI_CHANNEL_INDEX(rsp->rsp.common.channel);
++ id = ncsi_select_channel(ndp->ndev.dev);
+ nc = ncsi_add_channel(np, id);
+ }
+
+--
+2.25.0
+
diff --git a/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed/arch/arm/boot/dts/aspeed-bmc-opp-nicole.dts b/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed/arch/arm/boot/dts/aspeed-bmc-opp-nicole.dts
index 51c8de0df..07f7d2902 100644
--- a/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed/arch/arm/boot/dts/aspeed-bmc-opp-nicole.dts
+++ b/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed/arch/arm/boot/dts/aspeed-bmc-opp-nicole.dts
@@ -217,6 +217,12 @@
output-low;
line-name = "seq_cont";
};
+ ncsi_cfg {
+ gpio-hog;
+ input;
+ gpios = <ASPEED_GPIO(E, 1) GPIO_ACTIVE_HIGH>;
+ line-name = "ncsi_cfg";
+ };
};
&vuart {
diff --git a/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed_%.bbappend b/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed_%.bbappend
index bd3e47596..bf06fe23f 100644
--- a/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed_%.bbappend
+++ b/meta-yadro/meta-nicole/recipes-kernel/linux/linux-aspeed_%.bbappend
@@ -1,6 +1,7 @@
FILESEXTRAPATHS_prepend_nicole := "${THISDIR}/${PN}:"
SRC_URI += "file://nicole.cfg \
file://arch \
+ file://0001-Add-NCSI-channel-selector.patch \
"
# Merge source tree by original project with our layer of additional files