
This commit back ports the DPLL related commits from the upstream kernel that are identified by Intel to provide the expected SyncE/GNSS functionality. There are totally 46 back ported commits included the four commits I added are used to resolve the conflicts during back porting. The 0046 patch is cherry picked from kernel-6.9. The 0031-0045 patches are cherry picked from kernel-6.8. The 0001-0030 patches are cherry picked from kernel-6.7. We also change the in-tree ice driver version to 6.6.40-stx.2 from 6.6.40-stx.1. * To fix the conflict of 91e43ca0090b ("ice: fix linking when CONFIG_PTP_1588_CLOCK=n"), we cherry pick 12a5a28b565b ("ice: remove ICE_F_PTP_EXTTS feature flag") and 89776a6a702e ("ice: check netlist before enabling ICE_F_GNSS"). Adjust 12a5a28b565b because 0d1b22367ec2 ("ice: fix pin assignment for E810-T without SMA control") already included the part code of 12a5a28b565b. https://git.yoctoproject.org/linux-yocto/commit/?id=0d1b22367ec2 * Cherry pick 7049fd5df7 ("netlink: specs: remove redundant type keys from attributes in subsets") to fix the the conflict of c3c6ab95c397 ("dpll: spec: add support for pin-dpll signal phase offset/adjust.") * Cherry pick be16574609f1 ("ice: introduce hw->phy_model for handling PTP PHY differences") to fix the confilict of 6db5f2cd9ebb ("ice: dpll:fix output pin capabilities"). Verification: - Build kernel and out of tree modules success for rt and std. - Install success onto a All-in-One lab with rt kernel. - Boot up successfully in the lab. - interfaces are up and pass packets for rt and std. - Check dmesg to see DDP package is loaded successfully and the version is 1.3.36.0 for rt and std, that is same with the OOT ice-1.14.9 driver. - The SyncE/GNSS functionality tests were done by the network team. Story: 2011056 Task: 50797 Change-Id: I715480681c7c43d53b0a0126b34135562e9d02a0 Signed-off-by: Jiping Ma <jiping.ma2@windriver.com>
280 lines
8.4 KiB
Diff
280 lines
8.4 KiB
Diff
From 41ef885df68771af53969ce6ce97016bc2fc418b Mon Sep 17 00:00:00 2001
|
|
From: Jiri Pirko <jiri@nvidia.com>
|
|
Date: Wed, 13 Sep 2023 21:49:39 +0100
|
|
Subject: [PATCH 05/46] netdev: expose DPLL pin handle for netdevice
|
|
|
|
In case netdevice represents a SyncE port, the user needs to understand
|
|
the connection between netdevice and associated DPLL pin. There might me
|
|
multiple netdevices pointing to the same pin, in case of VF/SF
|
|
implementation.
|
|
|
|
Add a IFLA Netlink attribute to nest the DPLL pin handle, similar to
|
|
how it is implemented for devlink port. Add a struct dpll_pin pointer
|
|
to netdev and protect access to it by RTNL. Expose netdev_dpll_pin_set()
|
|
and netdev_dpll_pin_clear() helpers to the drivers so they can set/clear
|
|
the DPLL pin relationship to netdev.
|
|
|
|
Note that during the lifetime of struct dpll_pin the pin handle does not
|
|
change. Therefore it is save to access it lockless. It is drivers
|
|
responsibility to call netdev_dpll_pin_clear() before dpll_pin_put().
|
|
|
|
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
|
|
Signed-off-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
|
|
Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
(cherry picked from commit 5f18426928800c59fb0f9bc8fb0c182bb6f5ee24)
|
|
Signed-off-by: Jiping Ma <jiping.ma2@windriver.com>
|
|
---
|
|
drivers/dpll/dpll_netlink.c | 16 ++++++++++++++--
|
|
include/linux/dpll.h | 15 +++++++++++++++
|
|
include/linux/netdevice.h | 21 +++++++++++++++++++++
|
|
include/uapi/linux/if_link.h | 2 +-
|
|
net/core/dev.c | 22 ++++++++++++++++++++++
|
|
net/core/rtnetlink.c | 36 ++++++++++++++++++++++++++++++++++++
|
|
6 files changed, 109 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/dpll/dpll_netlink.c b/drivers/dpll/dpll_netlink.c
|
|
index 9464a6865977..764437a0661b 100644
|
|
--- a/drivers/dpll/dpll_netlink.c
|
|
+++ b/drivers/dpll/dpll_netlink.c
|
|
@@ -47,6 +47,18 @@ dpll_msg_add_dev_parent_handle(struct sk_buff *msg, u32 id)
|
|
return 0;
|
|
}
|
|
|
|
+/**
|
|
+ * dpll_msg_pin_handle_size - get size of pin handle attribute for given pin
|
|
+ * @pin: pin pointer
|
|
+ *
|
|
+ * Return: byte size of pin handle attribute for given pin.
|
|
+ */
|
|
+size_t dpll_msg_pin_handle_size(struct dpll_pin *pin)
|
|
+{
|
|
+ return pin ? nla_total_size(4) : 0; /* DPLL_A_PIN_ID */
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(dpll_msg_pin_handle_size);
|
|
+
|
|
/**
|
|
* dpll_msg_add_pin_handle - attach pin handle attribute to a given message
|
|
* @msg: pointer to sk_buff message to attach a pin handle
|
|
@@ -56,8 +68,7 @@ dpll_msg_add_dev_parent_handle(struct sk_buff *msg, u32 id)
|
|
* * 0 - success
|
|
* * -EMSGSIZE - no space in message to attach pin handle
|
|
*/
|
|
-static int
|
|
-dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
|
|
+int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
|
|
{
|
|
if (!pin)
|
|
return 0;
|
|
@@ -65,6 +76,7 @@ dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
|
|
return -EMSGSIZE;
|
|
return 0;
|
|
}
|
|
+EXPORT_SYMBOL_GPL(dpll_msg_add_pin_handle);
|
|
|
|
static int
|
|
dpll_msg_add_mode(struct sk_buff *msg, struct dpll_device *dpll,
|
|
diff --git a/include/linux/dpll.h b/include/linux/dpll.h
|
|
index 2202310c10cd..bbc480cd2932 100644
|
|
--- a/include/linux/dpll.h
|
|
+++ b/include/linux/dpll.h
|
|
@@ -101,6 +101,21 @@ struct dpll_pin_properties {
|
|
struct dpll_pin_frequency *freq_supported;
|
|
};
|
|
|
|
+#if IS_ENABLED(CONFIG_DPLL)
|
|
+size_t dpll_msg_pin_handle_size(struct dpll_pin *pin);
|
|
+int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin);
|
|
+#else
|
|
+static inline size_t dpll_msg_pin_handle_size(struct dpll_pin *pin)
|
|
+{
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static inline int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
|
|
+{
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
struct dpll_device *
|
|
dpll_device_get(u64 clock_id, u32 dev_driver_id, struct module *module);
|
|
|
|
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
|
|
index b8e60a20416b..272c44030449 100644
|
|
--- a/include/linux/netdevice.h
|
|
+++ b/include/linux/netdevice.h
|
|
@@ -79,6 +79,8 @@ struct xdp_buff;
|
|
struct xdp_frame;
|
|
struct xdp_metadata_ops;
|
|
struct xdp_md;
|
|
+/* DPLL specific */
|
|
+struct dpll_pin;
|
|
|
|
typedef u32 xdp_features_t;
|
|
|
|
@@ -2060,6 +2062,9 @@ enum netdev_stat_type {
|
|
* SET_NETDEV_DEVLINK_PORT macro. This pointer is static
|
|
* during the time netdevice is registered.
|
|
*
|
|
+ * @dpll_pin: Pointer to the SyncE source pin of a DPLL subsystem,
|
|
+ * where the clock is recovered.
|
|
+ *
|
|
* FIXME: cleanup struct net_device such that network protocol info
|
|
* moves out.
|
|
*/
|
|
@@ -2417,6 +2422,10 @@ struct net_device {
|
|
struct rtnl_hw_stats64 *offload_xstats_l3;
|
|
|
|
struct devlink_port *devlink_port;
|
|
+
|
|
+#if IS_ENABLED(CONFIG_DPLL)
|
|
+ struct dpll_pin *dpll_pin;
|
|
+#endif
|
|
};
|
|
#define to_net_dev(d) container_of(d, struct net_device, dev)
|
|
|
|
@@ -3962,6 +3971,18 @@ int dev_get_mac_address(struct sockaddr *sa, struct net *net, char *dev_name);
|
|
int dev_get_port_parent_id(struct net_device *dev,
|
|
struct netdev_phys_item_id *ppid, bool recurse);
|
|
bool netdev_port_same_parent_id(struct net_device *a, struct net_device *b);
|
|
+void netdev_dpll_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin);
|
|
+void netdev_dpll_pin_clear(struct net_device *dev);
|
|
+
|
|
+static inline struct dpll_pin *netdev_dpll_pin(const struct net_device *dev)
|
|
+{
|
|
+#if IS_ENABLED(CONFIG_DPLL)
|
|
+ return dev->dpll_pin;
|
|
+#else
|
|
+ return NULL;
|
|
+#endif
|
|
+}
|
|
+
|
|
struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *dev, bool *again);
|
|
struct sk_buff *dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
|
struct netdev_queue *txq, int *ret);
|
|
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
|
|
index ce3117df9cec..fac351a93aed 100644
|
|
--- a/include/uapi/linux/if_link.h
|
|
+++ b/include/uapi/linux/if_link.h
|
|
@@ -376,7 +376,7 @@ enum {
|
|
|
|
IFLA_GSO_IPV4_MAX_SIZE,
|
|
IFLA_GRO_IPV4_MAX_SIZE,
|
|
-
|
|
+ IFLA_DPLL_PIN,
|
|
__IFLA_MAX
|
|
};
|
|
|
|
diff --git a/net/core/dev.c b/net/core/dev.c
|
|
index 890b3b758d3f..5895bf5fab4b 100644
|
|
--- a/net/core/dev.c
|
|
+++ b/net/core/dev.c
|
|
@@ -9064,6 +9064,28 @@ bool netdev_port_same_parent_id(struct net_device *a, struct net_device *b)
|
|
}
|
|
EXPORT_SYMBOL(netdev_port_same_parent_id);
|
|
|
|
+static void netdev_dpll_pin_assign(struct net_device *dev, struct dpll_pin *dpll_pin)
|
|
+{
|
|
+#if IS_ENABLED(CONFIG_DPLL)
|
|
+ rtnl_lock();
|
|
+ dev->dpll_pin = dpll_pin;
|
|
+ rtnl_unlock();
|
|
+#endif
|
|
+}
|
|
+
|
|
+void netdev_dpll_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin)
|
|
+{
|
|
+ WARN_ON(!dpll_pin);
|
|
+ netdev_dpll_pin_assign(dev, dpll_pin);
|
|
+}
|
|
+EXPORT_SYMBOL(netdev_dpll_pin_set);
|
|
+
|
|
+void netdev_dpll_pin_clear(struct net_device *dev)
|
|
+{
|
|
+ netdev_dpll_pin_assign(dev, NULL);
|
|
+}
|
|
+EXPORT_SYMBOL(netdev_dpll_pin_clear);
|
|
+
|
|
/**
|
|
* dev_change_proto_down - set carrier according to proto_down.
|
|
*
|
|
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
|
|
index 7ea66de1442c..bb004419d318 100644
|
|
--- a/net/core/rtnetlink.c
|
|
+++ b/net/core/rtnetlink.c
|
|
@@ -57,6 +57,7 @@
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
#include <net/addrconf.h>
|
|
#endif
|
|
+#include <linux/dpll.h>
|
|
|
|
#include "dev.h"
|
|
|
|
@@ -1055,6 +1056,15 @@ static size_t rtnl_devlink_port_size(const struct net_device *dev)
|
|
return size;
|
|
}
|
|
|
|
+static size_t rtnl_dpll_pin_size(const struct net_device *dev)
|
|
+{
|
|
+ size_t size = nla_total_size(0); /* nest IFLA_DPLL_PIN */
|
|
+
|
|
+ size += dpll_msg_pin_handle_size(netdev_dpll_pin(dev));
|
|
+
|
|
+ return size;
|
|
+}
|
|
+
|
|
static noinline size_t if_nlmsg_size(const struct net_device *dev,
|
|
u32 ext_filter_mask)
|
|
{
|
|
@@ -1111,6 +1121,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
|
|
+ rtnl_prop_list_size(dev)
|
|
+ nla_total_size(MAX_ADDR_LEN) /* IFLA_PERM_ADDRESS */
|
|
+ rtnl_devlink_port_size(dev)
|
|
+ + rtnl_dpll_pin_size(dev)
|
|
+ 0;
|
|
}
|
|
|
|
@@ -1774,6 +1785,28 @@ static int rtnl_fill_devlink_port(struct sk_buff *skb,
|
|
return ret;
|
|
}
|
|
|
|
+static int rtnl_fill_dpll_pin(struct sk_buff *skb,
|
|
+ const struct net_device *dev)
|
|
+{
|
|
+ struct nlattr *dpll_pin_nest;
|
|
+ int ret;
|
|
+
|
|
+ dpll_pin_nest = nla_nest_start(skb, IFLA_DPLL_PIN);
|
|
+ if (!dpll_pin_nest)
|
|
+ return -EMSGSIZE;
|
|
+
|
|
+ ret = dpll_msg_add_pin_handle(skb, netdev_dpll_pin(dev));
|
|
+ if (ret < 0)
|
|
+ goto nest_cancel;
|
|
+
|
|
+ nla_nest_end(skb, dpll_pin_nest);
|
|
+ return 0;
|
|
+
|
|
+nest_cancel:
|
|
+ nla_nest_cancel(skb, dpll_pin_nest);
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static int rtnl_fill_ifinfo(struct sk_buff *skb,
|
|
struct net_device *dev, struct net *src_net,
|
|
int type, u32 pid, u32 seq, u32 change,
|
|
@@ -1916,6 +1949,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
|
|
if (rtnl_fill_devlink_port(skb, dev))
|
|
goto nla_put_failure;
|
|
|
|
+ if (rtnl_fill_dpll_pin(skb, dev))
|
|
+ goto nla_put_failure;
|
|
+
|
|
nlmsg_end(skb, nlh);
|
|
return 0;
|
|
|
|
--
|
|
2.43.0
|
|
|