* [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc)
@ 2022-12-05 21:24 Tony Nguyen
2022-12-05 21:24 ` [PATCH net-next 1/8] igc: allow BaseTime 0 enrollment for Qbv Tony Nguyen
` (9 more replies)
0 siblings, 10 replies; 13+ messages in thread
From: Tony Nguyen @ 2022-12-05 21:24 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet
Cc: Tony Nguyen, netdev, sasha.neftin, muhammad.husaini.zulkifli
Muhammad Husaini Zulkifli says:
This patch series improves the Time-Sensitive Networking(TSN) Qbv Scheduling
features. I225 stepping had some hardware restrictions; I226 enables us to
further enhance the driver code and offer more Qbv capabilities.
An overview of each patch is given below:
Patch 1: Allow configuring the basetime with a value of zero.
Patch 2: To enable basetime scheduling in the future, remove the existing
restriction for i226 stepping while maintain the restriction for i225.
Patch 3: Ensure basetime values are not negative
Patch 4: Handle the Qbv end time correctly if cycle time parameter is
configured during the Gate Control List. Applicable for both i225 and i226.
Patch 5: Remove the restriction which require a controller reset when
setting the basetime register for new i226 steps and enable the second
GCL configuration.
Patch 6: Setting the Qbv start time and end time properly if the particular
gate is close in the Gate Control List due to hardware bug.
Patch 7: Configure strict cycle for better behaved transmissions
Patch 8: Allow scheduling packet to next cycle for i225
Test Procedure:
Talker: udp_tai application is being used to generate the Qbv packet.
Receiver: Capture using tcpdump to analyze the packet using wireshark.
The following are changes since commit 343a5d358e4ab5597e90e1eafa7eba55eb42e96b:
net: phy: mxl-gpy: rename MMD_VEND1 macros to match datasheet
and are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue 1GbE
Muhammad Husaini Zulkifli (2):
igc: remove I226 Qbv BaseTime restriction
igc: Add checking for basetime less than zero
Tan Tee Min (4):
igc: allow BaseTime 0 enrollment for Qbv
igc: recalculate Qbv end_time by considering cycle time
igc: enable Qbv configuration for 2nd GCL
igc: Set Qbv start_time and end_time to end_time if not being
configured in GCL
Vinicius Costa Gomes (2):
igc: Use strict cycles for Qbv scheduling
igc: Enhance Qbv scheduling by using first flag bit
drivers/net/ethernet/intel/igc/igc.h | 3 +
drivers/net/ethernet/intel/igc/igc_base.c | 29 +++
drivers/net/ethernet/intel/igc/igc_base.h | 2 +
drivers/net/ethernet/intel/igc/igc_defines.h | 3 +
drivers/net/ethernet/intel/igc/igc_main.c | 224 ++++++++++++++++---
drivers/net/ethernet/intel/igc/igc_tsn.c | 66 +++---
drivers/net/ethernet/intel/igc/igc_tsn.h | 2 +-
7 files changed, 266 insertions(+), 63 deletions(-)
--
2.35.1
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH net-next 1/8] igc: allow BaseTime 0 enrollment for Qbv 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen @ 2022-12-05 21:24 ` Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 2/8] igc: remove I226 Qbv BaseTime restriction Tony Nguyen ` (8 subsequent siblings) 9 siblings, 0 replies; 13+ messages in thread From: Tony Nguyen @ 2022-12-05 21:24 UTC (permalink / raw) To: davem, kuba, pabeni, edumazet Cc: Tan Tee Min, netdev, anthony.l.nguyen, sasha.neftin, Muhammad Husaini Zulkifli, Naama Meir From: Tan Tee Min <tee.min.tan@linux.intel.com> Introduce qbv_enable flag in igc_adapter struct to store the Qbv on/off. So this allow the BaseTime to enroll with zero value. Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Signed-off-by: Tan Tee Min <tee.min.tan@linux.intel.com> Tested-by: Naama Meir <naamax.meir@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> --- drivers/net/ethernet/intel/igc/igc.h | 1 + drivers/net/ethernet/intel/igc/igc_main.c | 2 ++ drivers/net/ethernet/intel/igc/igc_tsn.c | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h index 1e7e7071f64d..c816623dc521 100644 --- a/drivers/net/ethernet/intel/igc/igc.h +++ b/drivers/net/ethernet/intel/igc/igc.h @@ -182,6 +182,7 @@ struct igc_adapter { ktime_t base_time; ktime_t cycle_time; + bool qbv_enable; /* OS defined structs */ struct pci_dev *pdev; diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 1586e1e435c6..140d96dc475c 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -5926,6 +5926,8 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, u32 start_time = 0, end_time = 0; size_t n; + adapter->qbv_enable = qopt->enable; + if (!qopt->enable) return igc_tsn_clear_schedule(adapter); diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.c b/drivers/net/ethernet/intel/igc/igc_tsn.c index f975ed807da1..b63736176709 100644 --- a/drivers/net/ethernet/intel/igc/igc_tsn.c +++ b/drivers/net/ethernet/intel/igc/igc_tsn.c @@ -36,7 +36,7 @@ static unsigned int igc_tsn_new_flags(struct igc_adapter *adapter) { unsigned int new_flags = adapter->flags & ~IGC_FLAG_TSN_ANY_ENABLED; - if (adapter->base_time) + if (adapter->qbv_enable) new_flags |= IGC_FLAG_TSN_QBV_ENABLED; if (is_any_launchtime(adapter)) -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next 2/8] igc: remove I226 Qbv BaseTime restriction 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 1/8] igc: allow BaseTime 0 enrollment for Qbv Tony Nguyen @ 2022-12-05 21:24 ` Tony Nguyen 2022-12-08 12:28 ` Kurt Kanzenbach 2022-12-05 21:24 ` [PATCH net-next 3/8] igc: Add checking for basetime less than zero Tony Nguyen ` (7 subsequent siblings) 9 siblings, 1 reply; 13+ messages in thread From: Tony Nguyen @ 2022-12-05 21:24 UTC (permalink / raw) To: davem, kuba, pabeni, edumazet Cc: Muhammad Husaini Zulkifli, netdev, anthony.l.nguyen, sasha.neftin, Tan Tee Min, Naama Meir From: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Remove the Qbv BaseTime restriction for I226 so that the BaseTime can be scheduled to the future time. A new register bit of Tx Qav Control (Bit-7: FutScdDis) was introduced to allow I226 scheduling future time as Qbv BaseTime and not having the Tx hang timeout issue. Besides, according to datasheet section 7.5.2.9.3.3, FutScdDis bit has to be configured first before the cycle time and base time. Indeed the FutScdDis bit is only active on re-configuration, thus we have to set the BASET_L to zero and then only set it to the desired value. Please also note that the Qbv configuration flow is moved around based on the Qbv programming guideline that is documented in the latest datasheet. Co-developed-by: Tan Tee Min <tee.min.tan@linux.intel.com> Signed-off-by: Tan Tee Min <tee.min.tan@linux.intel.com> Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Tested-by: Naama Meir <naamax.meir@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> --- drivers/net/ethernet/intel/igc/igc_base.c | 29 +++++++++++++ drivers/net/ethernet/intel/igc/igc_base.h | 2 + drivers/net/ethernet/intel/igc/igc_defines.h | 1 + drivers/net/ethernet/intel/igc/igc_main.c | 5 ++- drivers/net/ethernet/intel/igc/igc_tsn.c | 44 +++++++++++++------- 5 files changed, 65 insertions(+), 16 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc_base.c b/drivers/net/ethernet/intel/igc/igc_base.c index a15927e77272..a1d815af507d 100644 --- a/drivers/net/ethernet/intel/igc/igc_base.c +++ b/drivers/net/ethernet/intel/igc/igc_base.c @@ -396,6 +396,35 @@ void igc_rx_fifo_flush_base(struct igc_hw *hw) rd32(IGC_MPC); } +bool igc_is_device_id_i225(struct igc_hw *hw) +{ + switch (hw->device_id) { + case IGC_DEV_ID_I225_LM: + case IGC_DEV_ID_I225_V: + case IGC_DEV_ID_I225_I: + case IGC_DEV_ID_I225_K: + case IGC_DEV_ID_I225_K2: + case IGC_DEV_ID_I225_LMVP: + case IGC_DEV_ID_I225_IT: + return true; + default: + return false; + } +} + +bool igc_is_device_id_i226(struct igc_hw *hw) +{ + switch (hw->device_id) { + case IGC_DEV_ID_I226_LM: + case IGC_DEV_ID_I226_V: + case IGC_DEV_ID_I226_K: + case IGC_DEV_ID_I226_IT: + return true; + default: + return false; + } +} + static struct igc_mac_operations igc_mac_ops_base = { .init_hw = igc_init_hw_base, .check_for_link = igc_check_for_copper_link, diff --git a/drivers/net/ethernet/intel/igc/igc_base.h b/drivers/net/ethernet/intel/igc/igc_base.h index ce530f5fd7bd..7a992befca24 100644 --- a/drivers/net/ethernet/intel/igc/igc_base.h +++ b/drivers/net/ethernet/intel/igc/igc_base.h @@ -7,6 +7,8 @@ /* forward declaration */ void igc_rx_fifo_flush_base(struct igc_hw *hw); void igc_power_down_phy_copper_base(struct igc_hw *hw); +bool igc_is_device_id_i225(struct igc_hw *hw); +bool igc_is_device_id_i226(struct igc_hw *hw); /* Transmit Descriptor - Advanced */ union igc_adv_tx_desc { diff --git a/drivers/net/ethernet/intel/igc/igc_defines.h b/drivers/net/ethernet/intel/igc/igc_defines.h index f7311aeb293b..25ba10f5df96 100644 --- a/drivers/net/ethernet/intel/igc/igc_defines.h +++ b/drivers/net/ethernet/intel/igc/igc_defines.h @@ -520,6 +520,7 @@ /* Transmit Scheduling */ #define IGC_TQAVCTRL_TRANSMIT_MODE_TSN 0x00000001 #define IGC_TQAVCTRL_ENHANCED_QAV 0x00000008 +#define IGC_TQAVCTRL_FUTSCDDIS 0x00000080 #define IGC_TXQCTL_QUEUE_MODE_LAUNCHT 0x00000001 #define IGC_TXQCTL_STRICT_CYCLE 0x00000002 diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 140d96dc475c..eb4b916a609d 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -5840,6 +5840,7 @@ static bool validate_schedule(struct igc_adapter *adapter, const struct tc_taprio_qopt_offload *qopt) { int queue_uses[IGC_MAX_TX_QUEUES] = { }; + struct igc_hw *hw = &adapter->hw; struct timespec64 now; size_t n; @@ -5852,8 +5853,10 @@ static bool validate_schedule(struct igc_adapter *adapter, * in the future, it will hold all the packets until that * time, causing a lot of TX Hangs, so to avoid that, we * reject schedules that would start in the future. + * Note: Limitation above is no longer in i226. */ - if (!is_base_time_past(qopt->base_time, &now)) + if (!is_base_time_past(qopt->base_time, &now) && + igc_is_device_id_i225(hw)) return false; for (n = 0; n < qopt->num_entries; n++) { diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.c b/drivers/net/ethernet/intel/igc/igc_tsn.c index b63736176709..d7832cf1bc5b 100644 --- a/drivers/net/ethernet/intel/igc/igc_tsn.c +++ b/drivers/net/ethernet/intel/igc/igc_tsn.c @@ -2,6 +2,7 @@ /* Copyright (c) 2019 Intel Corporation */ #include "igc.h" +#include "igc_hw.h" #include "igc_tsn.h" static bool is_any_launchtime(struct igc_adapter *adapter) @@ -92,7 +93,8 @@ static int igc_tsn_disable_offload(struct igc_adapter *adapter) tqavctrl = rd32(IGC_TQAVCTRL); tqavctrl &= ~(IGC_TQAVCTRL_TRANSMIT_MODE_TSN | - IGC_TQAVCTRL_ENHANCED_QAV); + IGC_TQAVCTRL_ENHANCED_QAV | IGC_TQAVCTRL_FUTSCDDIS); + wr32(IGC_TQAVCTRL, tqavctrl); for (i = 0; i < adapter->num_tx_queues; i++) { @@ -117,20 +119,10 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter) ktime_t base_time, systim; int i; - cycle = adapter->cycle_time; - base_time = adapter->base_time; - wr32(IGC_TSAUXC, 0); wr32(IGC_DTXMXPKTSZ, IGC_DTXMXPKTSZ_TSN); wr32(IGC_TXPBS, IGC_TXPBSIZE_TSN); - tqavctrl = rd32(IGC_TQAVCTRL); - tqavctrl |= IGC_TQAVCTRL_TRANSMIT_MODE_TSN | IGC_TQAVCTRL_ENHANCED_QAV; - wr32(IGC_TQAVCTRL, tqavctrl); - - wr32(IGC_QBVCYCLET_S, cycle); - wr32(IGC_QBVCYCLET, cycle); - for (i = 0; i < adapter->num_tx_queues; i++) { struct igc_ring *ring = adapter->tx_ring[i]; u32 txqctl = 0; @@ -240,21 +232,43 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter) wr32(IGC_TXQCTL(i), txqctl); } + tqavctrl = rd32(IGC_TQAVCTRL); + tqavctrl |= IGC_TQAVCTRL_TRANSMIT_MODE_TSN | IGC_TQAVCTRL_ENHANCED_QAV; + + cycle = adapter->cycle_time; + base_time = adapter->base_time; + nsec = rd32(IGC_SYSTIML); sec = rd32(IGC_SYSTIMH); systim = ktime_set(sec, nsec); - if (ktime_compare(systim, base_time) > 0) { - s64 n; + s64 n = div64_s64(ktime_sub_ns(systim, base_time), cycle); - n = div64_s64(ktime_sub_ns(systim, base_time), cycle); base_time = ktime_add_ns(base_time, (n + 1) * cycle); + } else { + /* According to datasheet section 7.5.2.9.3.3, FutScdDis bit + * has to be configured before the cycle time and base time. + */ + if (igc_is_device_id_i226(hw)) + tqavctrl |= IGC_TQAVCTRL_FUTSCDDIS; } - baset_h = div_s64_rem(base_time, NSEC_PER_SEC, &baset_l); + wr32(IGC_TQAVCTRL, tqavctrl); + + wr32(IGC_QBVCYCLET_S, cycle); + wr32(IGC_QBVCYCLET, cycle); + baset_h = div_s64_rem(base_time, NSEC_PER_SEC, &baset_l); wr32(IGC_BASET_H, baset_h); + + /* In i226, Future base time is only supported when FutScdDis bit + * is enabled and only active for re-configuration. + * In this case, initialize the base time with zero to create + * "re-configuration" scenario then only set the desired base time. + */ + if (tqavctrl & IGC_TQAVCTRL_FUTSCDDIS) + wr32(IGC_BASET_L, 0); wr32(IGC_BASET_L, baset_l); return 0; -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH net-next 2/8] igc: remove I226 Qbv BaseTime restriction 2022-12-05 21:24 ` [PATCH net-next 2/8] igc: remove I226 Qbv BaseTime restriction Tony Nguyen @ 2022-12-08 12:28 ` Kurt Kanzenbach 2022-12-09 1:50 ` Zulkifli, Muhammad Husaini 0 siblings, 1 reply; 13+ messages in thread From: Kurt Kanzenbach @ 2022-12-08 12:28 UTC (permalink / raw) To: Tony Nguyen, davem, kuba, pabeni, edumazet Cc: Muhammad Husaini Zulkifli, netdev, anthony.l.nguyen, sasha.neftin, Tan Tee Min, Naama Meir [-- Attachment #1: Type: text/plain, Size: 2173 bytes --] On Mon Dec 05 2022, Tony Nguyen wrote: > From: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> > > Remove the Qbv BaseTime restriction for I226 so that the BaseTime can be > scheduled to the future time. A new register bit of Tx Qav Control > (Bit-7: FutScdDis) was introduced to allow I226 scheduling future time as > Qbv BaseTime and not having the Tx hang timeout issue. > > Besides, according to datasheet section 7.5.2.9.3.3, FutScdDis bit has to > be configured first before the cycle time and base time. > > Indeed the FutScdDis bit is only active on re-configuration, thus we have > to set the BASET_L to zero and then only set it to the desired value. > > Please also note that the Qbv configuration flow is moved around based on > the Qbv programming guideline that is documented in the latest datasheet. > > Co-developed-by: Tan Tee Min <tee.min.tan@linux.intel.com> > Signed-off-by: Tan Tee Min <tee.min.tan@linux.intel.com> > Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> > Tested-by: Naama Meir <naamax.meir@linux.intel.com> > Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> [snip] > @@ -5852,8 +5853,10 @@ static bool validate_schedule(struct igc_adapter *adapter, > * in the future, it will hold all the packets until that > * time, causing a lot of TX Hangs, so to avoid that, we > * reject schedules that would start in the future. > + * Note: Limitation above is no longer in i226. > */ > - if (!is_base_time_past(qopt->base_time, &now)) > + if (!is_base_time_past(qopt->base_time, &now) && > + igc_is_device_id_i225(hw)) > return false; Nothing against this patch per se, but you should lift the base time restriction for i225 as well. Even if it's hardware limitation, the driver should deal with that e.g., using a timer, workqueue, ... The TAPRIO interface allows the user to set an arbitrary base time, which can and most likely will be in the future. IMHO the driver should handle that. For instance, the hellcreek TSN switch has a similar limitation (base time can only be applied up to 8 seconds in the future) and I've worked around it in the driver. Thanks, Kurt [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 861 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH net-next 2/8] igc: remove I226 Qbv BaseTime restriction 2022-12-08 12:28 ` Kurt Kanzenbach @ 2022-12-09 1:50 ` Zulkifli, Muhammad Husaini 0 siblings, 0 replies; 13+ messages in thread From: Zulkifli, Muhammad Husaini @ 2022-12-09 1:50 UTC (permalink / raw) To: Kurt Kanzenbach, Nguyen, Anthony L, davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com Cc: netdev@vger.kernel.org, Nguyen, Anthony L, Neftin, Sasha, Tan Tee Min, Naama Meir Hello, > -----Original Message----- > From: Kurt Kanzenbach <kurt@linutronix.de> > Sent: Thursday, 8 December, 2022 8:28 PM > To: Nguyen, Anthony L <anthony.l.nguyen@intel.com>; > davem@davemloft.net; kuba@kernel.org; pabeni@redhat.com; > edumazet@google.com > Cc: Zulkifli, Muhammad Husaini <muhammad.husaini.zulkifli@intel.com>; > netdev@vger.kernel.org; Nguyen, Anthony L > <anthony.l.nguyen@intel.com>; Neftin, Sasha <sasha.neftin@intel.com>; > Tan Tee Min <tee.min.tan@linux.intel.com>; Naama Meir > <naamax.meir@linux.intel.com> > Subject: Re: [PATCH net-next 2/8] igc: remove I226 Qbv BaseTime restriction > > On Mon Dec 05 2022, Tony Nguyen wrote: > > From: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> > > > > Remove the Qbv BaseTime restriction for I226 so that the BaseTime can > > be scheduled to the future time. A new register bit of Tx Qav Control > > (Bit-7: FutScdDis) was introduced to allow I226 scheduling future time > > as Qbv BaseTime and not having the Tx hang timeout issue. > > > > Besides, according to datasheet section 7.5.2.9.3.3, FutScdDis bit has > > to be configured first before the cycle time and base time. > > > > Indeed the FutScdDis bit is only active on re-configuration, thus we > > have to set the BASET_L to zero and then only set it to the desired value. > > > > Please also note that the Qbv configuration flow is moved around based > > on the Qbv programming guideline that is documented in the latest > datasheet. > > > > Co-developed-by: Tan Tee Min <tee.min.tan@linux.intel.com> > > Signed-off-by: Tan Tee Min <tee.min.tan@linux.intel.com> > > Signed-off-by: Muhammad Husaini Zulkifli > > <muhammad.husaini.zulkifli@intel.com> > > Tested-by: Naama Meir <naamax.meir@linux.intel.com> > > Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> > > [snip] > > > @@ -5852,8 +5853,10 @@ static bool validate_schedule(struct igc_adapter > *adapter, > > * in the future, it will hold all the packets until that > > * time, causing a lot of TX Hangs, so to avoid that, we > > * reject schedules that would start in the future. > > + * Note: Limitation above is no longer in i226. > > */ > > - if (!is_base_time_past(qopt->base_time, &now)) > > + if (!is_base_time_past(qopt->base_time, &now) && > > + igc_is_device_id_i225(hw)) > > return false; > > Nothing against this patch per se, but you should lift the base time restriction > for i225 as well. Even if it's hardware limitation, the driver should deal with > that e.g., using a timer, workqueue, ... The TAPRIO interface allows the user > to set an arbitrary base time, which can and most likely will be in the future. > IMHO the driver should handle that. For instance, the hellcreek TSN switch > has a similar limitation (base time can only be applied up to 8 seconds in the > future) and I've worked around it in the driver. > Thanks Kurt for the comment. I agreed with you. We can revisit this for i225 later. As for now, our side will lift the restriction for i226 first as HW supporting it. Thanks, Husaini > Thanks, > Kurt ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH net-next 3/8] igc: Add checking for basetime less than zero 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 1/8] igc: allow BaseTime 0 enrollment for Qbv Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 2/8] igc: remove I226 Qbv BaseTime restriction Tony Nguyen @ 2022-12-05 21:24 ` Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 4/8] igc: recalculate Qbv end_time by considering cycle time Tony Nguyen ` (6 subsequent siblings) 9 siblings, 0 replies; 13+ messages in thread From: Tony Nguyen @ 2022-12-05 21:24 UTC (permalink / raw) To: davem, kuba, pabeni, edumazet Cc: Muhammad Husaini Zulkifli, netdev, anthony.l.nguyen, sasha.neftin, Naama Meir From: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Using the tc qdisc command, the user can set basetime to any value. Checking should be done on the driver's side to prevent registering basetime values that are less than zero. Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Tested-by: Naama Meir <naamax.meir@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> --- drivers/net/ethernet/intel/igc/igc_main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index eb4b916a609d..35c473703950 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -5934,6 +5934,9 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, if (!qopt->enable) return igc_tsn_clear_schedule(adapter); + if (qopt->base_time < 0) + return -ERANGE; + if (adapter->base_time) return -EALREADY; -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next 4/8] igc: recalculate Qbv end_time by considering cycle time 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen ` (2 preceding siblings ...) 2022-12-05 21:24 ` [PATCH net-next 3/8] igc: Add checking for basetime less than zero Tony Nguyen @ 2022-12-05 21:24 ` Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 5/8] igc: enable Qbv configuration for 2nd GCL Tony Nguyen ` (5 subsequent siblings) 9 siblings, 0 replies; 13+ messages in thread From: Tony Nguyen @ 2022-12-05 21:24 UTC (permalink / raw) To: davem, kuba, pabeni, edumazet Cc: Tan Tee Min, netdev, anthony.l.nguyen, sasha.neftin, Muhammad Husaini Zulkifli, Naama Meir From: Tan Tee Min <tee.min.tan@linux.intel.com> Qbv users can specify a cycle time that is not equal to the total GCL intervals. Hence, recalculation is necessary here to exclude the time interval that exceeds the cycle time. As those GCL which exceeds the cycle time will be truncated. According to IEEE Std. 802.1Q-2018 section 8.6.9.2, once the end of the list is reached, it will switch to the END_OF_CYCLE state and leave the gates in the same state until the next cycle is started. Signed-off-by: Tan Tee Min <tee.min.tan@linux.intel.com> Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Tested-by: Naama Meir <naamax.meir@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> --- drivers/net/ethernet/intel/igc/igc_main.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 35c473703950..5aa72eac2a35 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -5952,6 +5952,21 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, end_time += e->interval; + /* If any of the conditions below are true, we need to manually + * control the end time of the cycle. + * 1. Qbv users can specify a cycle time that is not equal + * to the total GCL intervals. Hence, recalculation is + * necessary here to exclude the time interval that + * exceeds the cycle time. + * 2. According to IEEE Std. 802.1Q-2018 section 8.6.9.2, + * once the end of the list is reached, it will switch + * to the END_OF_CYCLE state and leave the gates in the + * same state until the next cycle is started. + */ + if (end_time > adapter->cycle_time || + n + 1 == qopt->num_entries) + end_time = adapter->cycle_time; + for (i = 0; i < adapter->num_tx_queues; i++) { struct igc_ring *ring = adapter->tx_ring[i]; -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next 5/8] igc: enable Qbv configuration for 2nd GCL 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen ` (3 preceding siblings ...) 2022-12-05 21:24 ` [PATCH net-next 4/8] igc: recalculate Qbv end_time by considering cycle time Tony Nguyen @ 2022-12-05 21:24 ` Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 6/8] igc: Set Qbv start_time and end_time to end_time if not being configured in GCL Tony Nguyen ` (4 subsequent siblings) 9 siblings, 0 replies; 13+ messages in thread From: Tony Nguyen @ 2022-12-05 21:24 UTC (permalink / raw) To: davem, kuba, pabeni, edumazet Cc: Tan Tee Min, netdev, anthony.l.nguyen, sasha.neftin, Muhammad Husaini Zulkifli, Naama Meir From: Tan Tee Min <tee.min.tan@linux.intel.com> Make reset task only executes for i225 and Qbv disabling to allow i226 configure for 2nd GCL without resetting the adapter. In i226, Tx won't hang if there is a GCL is already running, so in this case we don't need to set FutScdDis bit. Signed-off-by: Tan Tee Min <tee.min.tan@linux.intel.com> Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Tested-by: Naama Meir <naamax.meir@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> --- drivers/net/ethernet/intel/igc/igc_main.c | 9 +++++---- drivers/net/ethernet/intel/igc/igc_tsn.c | 13 +++++++++---- drivers/net/ethernet/intel/igc/igc_tsn.h | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 5aa72eac2a35..480b814dc18c 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -5902,7 +5902,7 @@ static int igc_tsn_enable_launchtime(struct igc_adapter *adapter, if (err) return err; - return igc_tsn_offload_apply(adapter); + return igc_tsn_offload_apply(adapter, qopt->enable); } static int igc_tsn_clear_schedule(struct igc_adapter *adapter) @@ -5926,6 +5926,7 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, struct tc_taprio_qopt_offload *qopt) { bool queue_configured[IGC_MAX_TX_QUEUES] = { }; + struct igc_hw *hw = &adapter->hw; u32 start_time = 0, end_time = 0; size_t n; @@ -5937,7 +5938,7 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, if (qopt->base_time < 0) return -ERANGE; - if (adapter->base_time) + if (igc_is_device_id_i225(hw) && adapter->base_time) return -EALREADY; if (!validate_schedule(adapter, qopt)) @@ -6003,7 +6004,7 @@ static int igc_tsn_enable_qbv_scheduling(struct igc_adapter *adapter, if (err) return err; - return igc_tsn_offload_apply(adapter); + return igc_tsn_offload_apply(adapter, qopt->enable); } static int igc_save_cbs_params(struct igc_adapter *adapter, int queue, @@ -6071,7 +6072,7 @@ static int igc_tsn_enable_cbs(struct igc_adapter *adapter, if (err) return err; - return igc_tsn_offload_apply(adapter); + return igc_tsn_offload_apply(adapter, qopt->enable); } static int igc_setup_tc(struct net_device *dev, enum tc_setup_type type, diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.c b/drivers/net/ethernet/intel/igc/igc_tsn.c index d7832cf1bc5b..5d351c873c41 100644 --- a/drivers/net/ethernet/intel/igc/igc_tsn.c +++ b/drivers/net/ethernet/intel/igc/igc_tsn.c @@ -232,7 +232,7 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter) wr32(IGC_TXQCTL(i), txqctl); } - tqavctrl = rd32(IGC_TQAVCTRL); + tqavctrl = rd32(IGC_TQAVCTRL) & ~IGC_TQAVCTRL_FUTSCDDIS; tqavctrl |= IGC_TQAVCTRL_TRANSMIT_MODE_TSN | IGC_TQAVCTRL_ENHANCED_QAV; cycle = adapter->cycle_time; @@ -249,8 +249,11 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter) } else { /* According to datasheet section 7.5.2.9.3.3, FutScdDis bit * has to be configured before the cycle time and base time. + * Tx won't hang if there is a GCL is already running, + * so in this case we don't need to set FutScdDis. */ - if (igc_is_device_id_i226(hw)) + if (igc_is_device_id_i226(hw) && + !(rd32(IGC_BASET_H) || rd32(IGC_BASET_L))) tqavctrl |= IGC_TQAVCTRL_FUTSCDDIS; } @@ -293,11 +296,13 @@ int igc_tsn_reset(struct igc_adapter *adapter) return err; } -int igc_tsn_offload_apply(struct igc_adapter *adapter) +int igc_tsn_offload_apply(struct igc_adapter *adapter, bool enable) { + struct igc_hw *hw = &adapter->hw; int err; - if (netif_running(adapter->netdev)) { + if (netif_running(adapter->netdev) && + (igc_is_device_id_i225(hw) || !enable)) { schedule_work(&adapter->reset_task); return 0; } diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.h b/drivers/net/ethernet/intel/igc/igc_tsn.h index b53e6af560b7..631222bb6eb5 100644 --- a/drivers/net/ethernet/intel/igc/igc_tsn.h +++ b/drivers/net/ethernet/intel/igc/igc_tsn.h @@ -4,7 +4,7 @@ #ifndef _IGC_TSN_H_ #define _IGC_TSN_H_ -int igc_tsn_offload_apply(struct igc_adapter *adapter); +int igc_tsn_offload_apply(struct igc_adapter *adapter, bool enable); int igc_tsn_reset(struct igc_adapter *adapter); void igc_tsn_adjust_txtime_offset(struct igc_adapter *adapter); -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next 6/8] igc: Set Qbv start_time and end_time to end_time if not being configured in GCL 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen ` (4 preceding siblings ...) 2022-12-05 21:24 ` [PATCH net-next 5/8] igc: enable Qbv configuration for 2nd GCL Tony Nguyen @ 2022-12-05 21:24 ` Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 7/8] igc: Use strict cycles for Qbv scheduling Tony Nguyen ` (3 subsequent siblings) 9 siblings, 0 replies; 13+ messages in thread From: Tony Nguyen @ 2022-12-05 21:24 UTC (permalink / raw) To: davem, kuba, pabeni, edumazet Cc: Tan Tee Min, netdev, anthony.l.nguyen, sasha.neftin, Muhammad Husaini Zulkifli, Naama Meir From: Tan Tee Min <tee.min.tan@linux.intel.com> The default setting of end_time minus start_time is whole 1 second. Thus, if it's not being configured in any GCL entry then it will be staying at original 1 second. This patch is changing the start_time and end_time to be end_time as if setting zero will be having weird HW behavior where the gate will not be fully closed. Signed-off-by: Tan Tee Min <tee.min.tan@linux.intel.com> Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Tested-by: Naama Meir <naamax.meir@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> --- drivers/net/ethernet/intel/igc/igc_main.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 480b814dc18c..e9cd306ac79c 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -5929,6 +5929,7 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, struct igc_hw *hw = &adapter->hw; u32 start_time = 0, end_time = 0; size_t n; + int i; adapter->qbv_enable = qopt->enable; @@ -5949,7 +5950,6 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, for (n = 0; n < qopt->num_entries; n++) { struct tc_taprio_sched_entry *e = &qopt->entries[n]; - int i; end_time += e->interval; @@ -5988,6 +5988,18 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, start_time += e->interval; } + /* Check whether a queue gets configured. + * If not, set the start and end time to be end time. + */ + for (i = 0; i < adapter->num_tx_queues; i++) { + if (!queue_configured[i]) { + struct igc_ring *ring = adapter->tx_ring[i]; + + ring->start_time = end_time; + ring->end_time = end_time; + } + } + return 0; } -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next 7/8] igc: Use strict cycles for Qbv scheduling 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen ` (5 preceding siblings ...) 2022-12-05 21:24 ` [PATCH net-next 6/8] igc: Set Qbv start_time and end_time to end_time if not being configured in GCL Tony Nguyen @ 2022-12-05 21:24 ` Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 8/8] igc: Enhance Qbv scheduling by using first flag bit Tony Nguyen ` (2 subsequent siblings) 9 siblings, 0 replies; 13+ messages in thread From: Tony Nguyen @ 2022-12-05 21:24 UTC (permalink / raw) To: davem, kuba, pabeni, edumazet Cc: Vinicius Costa Gomes, netdev, anthony.l.nguyen, sasha.neftin, Aravindhan Gunasekaran, Muhammad Husaini Zulkifli, Naama Meir From: Vinicius Costa Gomes <vinicius.gomes@intel.com> Configuring strict cycle mode in the controller forces more well behaved transmissions when taprio is offloaded. When set this strict_cycle and strict_end, transmission is not enabled if the whole packet cannot be completed before end of the Qbv cycle. Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> Signed-off-by: Aravindhan Gunasekaran <aravindhan.gunasekaran@intel.com> Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Tested-by: Naama Meir <naamax.meir@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> --- drivers/net/ethernet/intel/igc/igc_tsn.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.c b/drivers/net/ethernet/intel/igc/igc_tsn.c index 5d351c873c41..d26fc0f47640 100644 --- a/drivers/net/ethernet/intel/igc/igc_tsn.c +++ b/drivers/net/ethernet/intel/igc/igc_tsn.c @@ -132,15 +132,8 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter) wr32(IGC_STQT(i), ring->start_time); wr32(IGC_ENDQT(i), ring->end_time); - if (adapter->base_time) { - /* If we have a base_time we are in "taprio" - * mode and we need to be strict about the - * cycles: only transmit a packet if it can be - * completed during that cycle. - */ - txqctl |= IGC_TXQCTL_STRICT_CYCLE | - IGC_TXQCTL_STRICT_END; - } + txqctl |= IGC_TXQCTL_STRICT_CYCLE | + IGC_TXQCTL_STRICT_END; if (ring->launchtime_enable) txqctl |= IGC_TXQCTL_QUEUE_MODE_LAUNCHT; -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next 8/8] igc: Enhance Qbv scheduling by using first flag bit 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen ` (6 preceding siblings ...) 2022-12-05 21:24 ` [PATCH net-next 7/8] igc: Use strict cycles for Qbv scheduling Tony Nguyen @ 2022-12-05 21:24 ` Tony Nguyen 2022-12-07 7:46 ` [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Leon Romanovsky 2022-12-08 0:10 ` Jakub Kicinski 9 siblings, 0 replies; 13+ messages in thread From: Tony Nguyen @ 2022-12-05 21:24 UTC (permalink / raw) To: davem, kuba, pabeni, edumazet Cc: Vinicius Costa Gomes, netdev, anthony.l.nguyen, sasha.neftin, Aravindhan Gunasekaran, Muhammad Husaini Zulkifli, Malli C From: Vinicius Costa Gomes <vinicius.gomes@intel.com> The I225 hardware has a limitation that packets can only be scheduled in the [0, cycle-time] interval. So, scheduling a packet to the start of the next cycle doesn't usually work. To overcome this, we use the Transmit Descriptor first flag to indicates that a packet should be the first packet (from a queue) in a cycle according to the section 7.5.2.9.3.4 The First Packet on Each QBV Cycle in Intel Discrete I225/6 User Manual. But this only works if there was any packet from that queue during the current cycle, to avoid this issue, we issue an empty packet if that's not the case. Also require one more descriptor to be available, to take into account the empty packet that might be issued. Test Setup: Talker: Use l2_tai to generate the launchtime into packet load. Listener: Use timedump.c to compute the delta between packet arrival and LaunchTime packet payload. Test Result: Before: 1666000610127300000,1666000610127300096,96,621273 1666000610127400000,1666000610127400192,192,621274 1666000610127500000,1666000610127500032,32,621275 1666000610127600000,1666000610127600128,128,621276 1666000610127700000,1666000610127700224,224,621277 1666000610127800000,1666000610127800064,64,621278 1666000610127900000,1666000610127900160,160,621279 1666000610128000000,1666000610128000000,0,621280 1666000610128100000,1666000610128100096,96,621281 1666000610128200000,1666000610128200192,192,621282 1666000610128300000,1666000610128300032,32,621283 1666000610128400000,1666000610128301056,-98944,621284 1666000610128500000,1666000610128302080,-197920,621285 1666000610128600000,1666000610128302848,-297152,621286 1666000610128700000,1666000610128303872,-396128,621287 1666000610128800000,1666000610128304896,-495104,621288 1666000610128900000,1666000610128305664,-594336,621289 1666000610129000000,1666000610128306688,-693312,621290 1666000610129100000,1666000610128307712,-792288,621291 1666000610129200000,1666000610128308480,-891520,621292 1666000610129300000,1666000610128309504,-990496,621293 1666000610129400000,1666000610128310528,-1089472,621294 1666000610129500000,1666000610128311296,-1188704,621295 1666000610129600000,1666000610128312320,-1287680,621296 1666000610129700000,1666000610128313344,-1386656,621297 1666000610129800000,1666000610128314112,-1485888,621298 1666000610129900000,1666000610128315136,-1584864,621299 1666000610130000000,1666000610128316160,-1683840,621300 1666000610130100000,1666000610128316928,-1783072,621301 1666000610130200000,1666000610128317952,-1882048,621302 1666000610130300000,1666000610128318976,-1981024,621303 1666000610130400000,1666000610128319744,-2080256,621304 1666000610130500000,1666000610128320768,-2179232,621305 1666000610130600000,1666000610128321792,-2278208,621306 1666000610130700000,1666000610128322816,-2377184,621307 1666000610130800000,1666000610128323584,-2476416,621308 1666000610130900000,1666000610128324608,-2575392,621309 1666000610131000000,1666000610128325632,-2674368,621310 1666000610131100000,1666000610128326400,-2773600,621311 1666000610131200000,1666000610128327424,-2872576,621312 1666000610131300000,1666000610128328448,-2971552,621313 1666000610131400000,1666000610128329216,-3070784,621314 1666000610131500000,1666000610131500032,32,621315 1666000610131600000,1666000610131600128,128,621316 1666000610131700000,1666000610131700224,224,621317 After: 1666073510646200000,1666073510646200064,64,2676462 1666073510646300000,1666073510646300160,160,2676463 1666073510646400000,1666073510646400256,256,2676464 1666073510646500000,1666073510646500096,96,2676465 1666073510646600000,1666073510646600192,192,2676466 1666073510646700000,1666073510646700032,32,2676467 1666073510646800000,1666073510646800128,128,2676468 1666073510646900000,1666073510646900224,224,2676469 1666073510647000000,1666073510647000064,64,2676470 1666073510647100000,1666073510647100160,160,2676471 1666073510647200000,1666073510647200256,256,2676472 1666073510647300000,1666073510647300096,96,2676473 1666073510647400000,1666073510647400192,192,2676474 1666073510647500000,1666073510647500032,32,2676475 1666073510647600000,1666073510647600128,128,2676476 1666073510647700000,1666073510647700224,224,2676477 1666073510647800000,1666073510647800064,64,2676478 1666073510647900000,1666073510647900160,160,2676479 1666073510648000000,1666073510648000000,0,2676480 1666073510648100000,1666073510648100096,96,2676481 1666073510648200000,1666073510648200192,192,2676482 1666073510648300000,1666073510648300032,32,2676483 1666073510648400000,1666073510648400128,128,2676484 1666073510648500000,1666073510648500224,224,2676485 1666073510648600000,1666073510648600064,64,2676486 1666073510648700000,1666073510648700160,160,2676487 1666073510648800000,1666073510648800000,0,2676488 1666073510648900000,1666073510648900096,96,2676489 1666073510649000000,1666073510649000192,192,2676490 1666073510649100000,1666073510649100032,32,2676491 1666073510649200000,1666073510649200128,128,2676492 1666073510649300000,1666073510649300224,224,2676493 1666073510649400000,1666073510649400064,64,2676494 1666073510649500000,1666073510649500160,160,2676495 1666073510649600000,1666073510649600000,0,2676496 1666073510649700000,1666073510649700096,96,2676497 1666073510649800000,1666073510649800192,192,2676498 1666073510649900000,1666073510649900032,32,2676499 1666073510650000000,1666073510650000128,128,2676500 Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> Co-developed-by: Aravindhan Gunasekaran <aravindhan.gunasekaran@intel.com> Signed-off-by: Aravindhan Gunasekaran <aravindhan.gunasekaran@intel.com> Co-developed-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com> Signed-off-by: Malli C <mallikarjuna.chilakala@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> --- drivers/net/ethernet/intel/igc/igc.h | 2 + drivers/net/ethernet/intel/igc/igc_defines.h | 2 + drivers/net/ethernet/intel/igc/igc_main.c | 176 ++++++++++++++++--- 3 files changed, 151 insertions(+), 29 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h index c816623dc521..df3e26c0cf01 100644 --- a/drivers/net/ethernet/intel/igc/igc.h +++ b/drivers/net/ethernet/intel/igc/igc.h @@ -94,6 +94,8 @@ struct igc_ring { u8 queue_index; /* logical index of the ring*/ u8 reg_idx; /* physical index of the ring */ bool launchtime_enable; /* true if LaunchTime is enabled */ + ktime_t last_tx_cycle; /* end of the cycle with a launchtime transmission */ + ktime_t last_ff_cycle; /* Last cycle with an active first flag */ u32 start_time; u32 end_time; diff --git a/drivers/net/ethernet/intel/igc/igc_defines.h b/drivers/net/ethernet/intel/igc/igc_defines.h index 25ba10f5df96..0e23f6244ffb 100644 --- a/drivers/net/ethernet/intel/igc/igc_defines.h +++ b/drivers/net/ethernet/intel/igc/igc_defines.h @@ -321,6 +321,8 @@ #define IGC_ADVTXD_L4LEN_SHIFT 8 /* Adv ctxt L4LEN shift */ #define IGC_ADVTXD_MSS_SHIFT 16 /* Adv ctxt MSS shift */ +#define IGC_ADVTXD_TSN_CNTX_FIRST 0x00000080 + /* Transmit Control */ #define IGC_TCTL_EN 0x00000002 /* enable Tx */ #define IGC_TCTL_PSP 0x00000008 /* pad short packets */ diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index e9cd306ac79c..212560f22254 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -1000,25 +1000,118 @@ static int igc_write_mc_addr_list(struct net_device *netdev) return netdev_mc_count(netdev); } -static __le32 igc_tx_launchtime(struct igc_adapter *adapter, ktime_t txtime) +static __le32 igc_tx_launchtime(struct igc_ring *ring, ktime_t txtime, + bool *first_flag, bool *insert_empty) { + struct igc_adapter *adapter = netdev_priv(ring->netdev); ktime_t cycle_time = adapter->cycle_time; ktime_t base_time = adapter->base_time; + ktime_t now = ktime_get_clocktai(); + ktime_t baset_est, end_of_cycle; u32 launchtime; + s64 n; - /* FIXME: when using ETF together with taprio, we may have a - * case where 'delta' is larger than the cycle_time, this may - * cause problems if we don't read the current value of - * IGC_BASET, as the value writen into the launchtime - * descriptor field may be misinterpreted. + n = div64_s64(ktime_sub_ns(now, base_time), cycle_time); + + baset_est = ktime_add_ns(base_time, cycle_time * (n)); + end_of_cycle = ktime_add_ns(baset_est, cycle_time); + + if (ktime_compare(txtime, end_of_cycle) >= 0) { + if (baset_est != ring->last_ff_cycle) { + *first_flag = true; + ring->last_ff_cycle = baset_est; + + if (ktime_compare(txtime, ring->last_tx_cycle) > 0) + *insert_empty = true; + } + } + + /* Introducing a window at end of cycle on which packets + * potentially not honor launchtime. Window of 5us chosen + * considering software update the tail pointer and packets + * are dma'ed to packet buffer. */ - div_s64_rem(ktime_sub_ns(txtime, base_time), cycle_time, &launchtime); + if ((ktime_sub_ns(end_of_cycle, now) < 5 * NSEC_PER_USEC)) + netdev_warn(ring->netdev, "Packet with txtime=%llu may not be honoured\n", + txtime); + + ring->last_tx_cycle = end_of_cycle; + + launchtime = ktime_sub_ns(txtime, baset_est); + if (launchtime > 0) + div_s64_rem(launchtime, cycle_time, &launchtime); + else + launchtime = 0; return cpu_to_le32(launchtime); } +static int igc_init_empty_frame(struct igc_ring *ring, + struct igc_tx_buffer *buffer, + struct sk_buff *skb) +{ + unsigned int size; + dma_addr_t dma; + + size = skb_headlen(skb); + + dma = dma_map_single(ring->dev, skb->data, size, DMA_TO_DEVICE); + if (dma_mapping_error(ring->dev, dma)) { + netdev_err_once(ring->netdev, "Failed to map DMA for TX\n"); + return -ENOMEM; + } + + buffer->skb = skb; + buffer->protocol = 0; + buffer->bytecount = skb->len; + buffer->gso_segs = 1; + buffer->time_stamp = jiffies; + dma_unmap_len_set(buffer, len, skb->len); + dma_unmap_addr_set(buffer, dma, dma); + + return 0; +} + +static int igc_init_tx_empty_descriptor(struct igc_ring *ring, + struct sk_buff *skb, + struct igc_tx_buffer *first) +{ + union igc_adv_tx_desc *desc; + u32 cmd_type, olinfo_status; + int err; + + if (!igc_desc_unused(ring)) + return -EBUSY; + + err = igc_init_empty_frame(ring, first, skb); + if (err) + return err; + + cmd_type = IGC_ADVTXD_DTYP_DATA | IGC_ADVTXD_DCMD_DEXT | + IGC_ADVTXD_DCMD_IFCS | IGC_TXD_DCMD | + first->bytecount; + olinfo_status = first->bytecount << IGC_ADVTXD_PAYLEN_SHIFT; + + desc = IGC_TX_DESC(ring, ring->next_to_use); + desc->read.cmd_type_len = cpu_to_le32(cmd_type); + desc->read.olinfo_status = cpu_to_le32(olinfo_status); + desc->read.buffer_addr = cpu_to_le64(dma_unmap_addr(first, dma)); + + netdev_tx_sent_queue(txring_txq(ring), skb->len); + + first->next_to_watch = desc; + + ring->next_to_use++; + if (ring->next_to_use == ring->count) + ring->next_to_use = 0; + + return 0; +} + +#define IGC_EMPTY_FRAME_SIZE 60 + static void igc_tx_ctxtdesc(struct igc_ring *tx_ring, - struct igc_tx_buffer *first, + __le32 launch_time, bool first_flag, u32 vlan_macip_lens, u32 type_tucmd, u32 mss_l4len_idx) { @@ -1037,26 +1130,17 @@ static void igc_tx_ctxtdesc(struct igc_ring *tx_ring, if (test_bit(IGC_RING_FLAG_TX_CTX_IDX, &tx_ring->flags)) mss_l4len_idx |= tx_ring->reg_idx << 4; + if (first_flag) + mss_l4len_idx |= IGC_ADVTXD_TSN_CNTX_FIRST; + context_desc->vlan_macip_lens = cpu_to_le32(vlan_macip_lens); context_desc->type_tucmd_mlhl = cpu_to_le32(type_tucmd); context_desc->mss_l4len_idx = cpu_to_le32(mss_l4len_idx); - - /* We assume there is always a valid Tx time available. Invalid times - * should have been handled by the upper layers. - */ - if (tx_ring->launchtime_enable) { - struct igc_adapter *adapter = netdev_priv(tx_ring->netdev); - ktime_t txtime = first->skb->tstamp; - - skb_txtime_consumed(first->skb); - context_desc->launch_time = igc_tx_launchtime(adapter, - txtime); - } else { - context_desc->launch_time = 0; - } + context_desc->launch_time = launch_time; } -static void igc_tx_csum(struct igc_ring *tx_ring, struct igc_tx_buffer *first) +static void igc_tx_csum(struct igc_ring *tx_ring, struct igc_tx_buffer *first, + __le32 launch_time, bool first_flag) { struct sk_buff *skb = first->skb; u32 vlan_macip_lens = 0; @@ -1096,7 +1180,8 @@ static void igc_tx_csum(struct igc_ring *tx_ring, struct igc_tx_buffer *first) vlan_macip_lens |= skb_network_offset(skb) << IGC_ADVTXD_MACLEN_SHIFT; vlan_macip_lens |= first->tx_flags & IGC_TX_FLAGS_VLAN_MASK; - igc_tx_ctxtdesc(tx_ring, first, vlan_macip_lens, type_tucmd, 0); + igc_tx_ctxtdesc(tx_ring, launch_time, first_flag, + vlan_macip_lens, type_tucmd, 0); } static int __igc_maybe_stop_tx(struct igc_ring *tx_ring, const u16 size) @@ -1320,6 +1405,7 @@ static int igc_tx_map(struct igc_ring *tx_ring, static int igc_tso(struct igc_ring *tx_ring, struct igc_tx_buffer *first, + __le32 launch_time, bool first_flag, u8 *hdr_len) { u32 vlan_macip_lens, type_tucmd, mss_l4len_idx; @@ -1406,8 +1492,8 @@ static int igc_tso(struct igc_ring *tx_ring, vlan_macip_lens |= (ip.hdr - skb->data) << IGC_ADVTXD_MACLEN_SHIFT; vlan_macip_lens |= first->tx_flags & IGC_TX_FLAGS_VLAN_MASK; - igc_tx_ctxtdesc(tx_ring, first, vlan_macip_lens, - type_tucmd, mss_l4len_idx); + igc_tx_ctxtdesc(tx_ring, launch_time, first_flag, + vlan_macip_lens, type_tucmd, mss_l4len_idx); return 1; } @@ -1415,11 +1501,14 @@ static int igc_tso(struct igc_ring *tx_ring, static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb, struct igc_ring *tx_ring) { + bool first_flag = false, insert_empty = false; u16 count = TXD_USE_COUNT(skb_headlen(skb)); __be16 protocol = vlan_get_protocol(skb); struct igc_tx_buffer *first; + __le32 launch_time = 0; u32 tx_flags = 0; unsigned short f; + ktime_t txtime; u8 hdr_len = 0; int tso = 0; @@ -1433,11 +1522,40 @@ static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb, count += TXD_USE_COUNT(skb_frag_size( &skb_shinfo(skb)->frags[f])); - if (igc_maybe_stop_tx(tx_ring, count + 3)) { + if (igc_maybe_stop_tx(tx_ring, count + 5)) { /* this is a hard error */ return NETDEV_TX_BUSY; } + if (!tx_ring->launchtime_enable) + goto done; + + txtime = skb->tstamp; + skb->tstamp = ktime_set(0, 0); + launch_time = igc_tx_launchtime(tx_ring, txtime, &first_flag, &insert_empty); + + if (insert_empty) { + struct igc_tx_buffer *empty_info; + struct sk_buff *empty; + void *data; + + empty_info = &tx_ring->tx_buffer_info[tx_ring->next_to_use]; + empty = alloc_skb(IGC_EMPTY_FRAME_SIZE, GFP_ATOMIC); + if (!empty) + goto done; + + data = skb_put(empty, IGC_EMPTY_FRAME_SIZE); + memset(data, 0, IGC_EMPTY_FRAME_SIZE); + + igc_tx_ctxtdesc(tx_ring, 0, false, 0, 0, 0); + + if (igc_init_tx_empty_descriptor(tx_ring, + empty, + empty_info) < 0) + dev_kfree_skb_any(empty); + } + +done: /* record the location of the first descriptor for this packet */ first = &tx_ring->tx_buffer_info[tx_ring->next_to_use]; first->type = IGC_TX_BUFFER_TYPE_SKB; @@ -1474,11 +1592,11 @@ static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb, first->tx_flags = tx_flags; first->protocol = protocol; - tso = igc_tso(tx_ring, first, &hdr_len); + tso = igc_tso(tx_ring, first, launch_time, first_flag, &hdr_len); if (tso < 0) goto out_drop; else if (!tso) - igc_tx_csum(tx_ring, first); + igc_tx_csum(tx_ring, first, launch_time, first_flag); igc_tx_map(tx_ring, first, hdr_len); -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen ` (7 preceding siblings ...) 2022-12-05 21:24 ` [PATCH net-next 8/8] igc: Enhance Qbv scheduling by using first flag bit Tony Nguyen @ 2022-12-07 7:46 ` Leon Romanovsky 2022-12-08 0:10 ` Jakub Kicinski 9 siblings, 0 replies; 13+ messages in thread From: Leon Romanovsky @ 2022-12-07 7:46 UTC (permalink / raw) To: Tony Nguyen Cc: davem, kuba, pabeni, edumazet, netdev, sasha.neftin, muhammad.husaini.zulkifli On Mon, Dec 05, 2022 at 01:24:06PM -0800, Tony Nguyen wrote: > Muhammad Husaini Zulkifli says: > > This patch series improves the Time-Sensitive Networking(TSN) Qbv Scheduling > features. I225 stepping had some hardware restrictions; I226 enables us to > further enhance the driver code and offer more Qbv capabilities. <...> > Muhammad Husaini Zulkifli (2): > igc: remove I226 Qbv BaseTime restriction > igc: Add checking for basetime less than zero > > Tan Tee Min (4): > igc: allow BaseTime 0 enrollment for Qbv > igc: recalculate Qbv end_time by considering cycle time > igc: enable Qbv configuration for 2nd GCL > igc: Set Qbv start_time and end_time to end_time if not being > configured in GCL > > Vinicius Costa Gomes (2): > igc: Use strict cycles for Qbv scheduling > igc: Enhance Qbv scheduling by using first flag bit > > drivers/net/ethernet/intel/igc/igc.h | 3 + > drivers/net/ethernet/intel/igc/igc_base.c | 29 +++ > drivers/net/ethernet/intel/igc/igc_base.h | 2 + > drivers/net/ethernet/intel/igc/igc_defines.h | 3 + > drivers/net/ethernet/intel/igc/igc_main.c | 224 ++++++++++++++++--- > drivers/net/ethernet/intel/igc/igc_tsn.c | 66 +++--- > drivers/net/ethernet/intel/igc/igc_tsn.h | 2 +- > 7 files changed, 266 insertions(+), 63 deletions(-) > Thanks, Reviewed-by: Leon Romanovsky <leonro@nvidia.com> ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen ` (8 preceding siblings ...) 2022-12-07 7:46 ` [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Leon Romanovsky @ 2022-12-08 0:10 ` Jakub Kicinski 9 siblings, 0 replies; 13+ messages in thread From: Jakub Kicinski @ 2022-12-08 0:10 UTC (permalink / raw) To: Tony Nguyen Cc: davem, pabeni, edumazet, netdev, sasha.neftin, muhammad.husaini.zulkifli On Mon, 5 Dec 2022 13:24:06 -0800 Tony Nguyen wrote: > This patch series improves the Time-Sensitive Networking(TSN) Qbv Scheduling > features. I225 stepping had some hardware restrictions; I226 enables us to > further enhance the driver code and offer more Qbv capabilities. I didn't apply this yesterday because it was unclear if any of these patches are fixes. Could you confirm they are not? ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2022-12-09 1:50 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-12-05 21:24 [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 1/8] igc: allow BaseTime 0 enrollment for Qbv Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 2/8] igc: remove I226 Qbv BaseTime restriction Tony Nguyen 2022-12-08 12:28 ` Kurt Kanzenbach 2022-12-09 1:50 ` Zulkifli, Muhammad Husaini 2022-12-05 21:24 ` [PATCH net-next 3/8] igc: Add checking for basetime less than zero Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 4/8] igc: recalculate Qbv end_time by considering cycle time Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 5/8] igc: enable Qbv configuration for 2nd GCL Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 6/8] igc: Set Qbv start_time and end_time to end_time if not being configured in GCL Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 7/8] igc: Use strict cycles for Qbv scheduling Tony Nguyen 2022-12-05 21:24 ` [PATCH net-next 8/8] igc: Enhance Qbv scheduling by using first flag bit Tony Nguyen 2022-12-07 7:46 ` [PATCH net-next 0/8][pull request] Intel Wired LAN Driver Updates 2022-12-05 (igc) Leon Romanovsky 2022-12-08 0:10 ` Jakub Kicinski
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).