[Intel-wired-lan] [next-queue PATCH v1 1/2] igc: Add support for taprio offloading
Vinicius Costa Gomes
vinicius.gomes at intel.com
Fri Jan 31 22:58:14 UTC 2020
Hi,
<andre.guedes at linux.intel.com> writes:
> Hi Vinicius,
>
> Quoting Vinicius Costa Gomes (2020-01-30 13:34:54)
>> @@ -418,6 +422,10 @@ struct igc_adapter {
>> u32 max_frame_size;
>> u32 min_frame_size;
>>
>> + ktime_t base_time;
>> + ktime_t cycle_time;
>> + bool baset_set;
>
> 'baset_set' is not used anywhere in the code.
Will fix. It was a leftover from a previous version.
>
>> @@ -565,6 +573,8 @@ int igc_ptp_set_ts_config(struct net_device *netdev, struct ifreq *ifr);
>> int igc_ptp_get_ts_config(struct net_device *netdev, struct ifreq *ifr);
>> void igc_ptp_tx_hang(struct igc_adapter *adapter);
>>
>> +int igc_tsn_offload_apply(struct igc_adapter *adapter);
>
> Since this patch adds the igc_tsn.c, how about we create the igc_tsn.h as
> well and put this prototype there, following the apporach implemented in other
> parts of the driver e.g. base, mac, nvm, etc.?
>
I can do that.
>> @@ -428,6 +432,22 @@
>> #define IGC_TSYNCTXCTL_START_SYNC 0x80000000 /* initiate sync */
>> #define IGC_TSYNCTXCTL_TXSYNSIG 0x00000020 /* Sample TX tstamp in PHY sop */
>>
>> +/* Transmit Scheduling */
>> +#define IGC_TQAVCTRL_TRANSMIT_MODE_TSN 0x00000001
>> +#define IGC_TQAVCTRL_ENHANCED_QAV 0x00000008
>> +
>> +#define IGC_TXQCTL_QUEUE_MODE_LAUNCHT 0x00000001
>> +#define IGC_TXQCTL_STRICT_CYCLE 0x00000002
>> +#define IGC_TXQCTL_STRICT_END 0x00000004
>> +#define IGC_TXQCTL_PREEMPTIBLE 0x00000008
>> +
>> +#define IGC_BASET_L_AUTO_SET 0x40000000
>> +#define IGC_BASET_L_COPY_H 0x80000000
>> +
>> +#define IGC_QBVCYCLET_S_PLUS1 0x80000000
>> +
>> +#define IGC_TSAUXC_DISABLE_SYSTIME_0 BIT(31)
>
> Most of this macros aren't used in the code. I'd suggest we add them when they
> are needed.
>
> Also, IGC_TXQCTL_QUEUE_MODE_LAUNCHT is not used by this patch, but by the next
> one so it should probably be introduced in the next patch.
Will fix this as well.
>
>> +static bool validate_schedule(const struct tc_taprio_qopt_offload *qopt)
>> +{
>> + int queue_uses[IGC_MAX_TX_QUEUES] = { };
>> + size_t n;
>> +
>> + if (qopt->cycle_time_extension)
>> + return false;
>> +
>> + for (n = 0; n < qopt->num_entries; n++) {
>> + const struct tc_taprio_sched_entry *e;
>> + int i;
>> +
>> + e = &qopt->entries[n];
>> +
>> + for (i = 0; i < IGC_MAX_TX_QUEUES; i++) {
>> + if (e->gate_mask & BIT(i))
>> + queue_uses[i]++;
>> +
>> + /* i225 only supports "global" frame
>> + * preemption settings
>> + */
>> + if (e->command != TC_TAPRIO_CMD_SET_GATES)
>> + return false;
>
> We can move this check to the outer loop.
Oh, yeah. Will fix.
>
>> diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.c b/drivers/net/ethernet/intel/igc/igc_tsn.c
>> new file mode 100644
>> index 000000000000..affffce0e870
>> --- /dev/null
>> +++ b/drivers/net/ethernet/intel/igc/igc_tsn.c
>> @@ -0,0 +1,137 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/* Copyright (c) 2019 Intel Corporation */
>> +
>> +#include "igc.h"
>> +
>> +/* Returns the TSN specific registers to their default values after
>> + * TSN offloading is disabled.
>> + */
>> +static int igc_tsn_disable_offload(struct igc_adapter *adapter)
>> +{
>> + struct igc_hw *hw = &adapter->hw;
>> + u32 tqavctrl;
>> + int i;
>> +
>> + if (!(adapter->flags & IGC_FLAG_TSN_QBV_ENABLED))
>> + return 0;
>> +
>> + adapter->cycle_time = 0;
>> +
>> + wr32(IGC_TXPBS, I225_TXPBSIZE_DEFAULT);
>
> Don't we want to reset IGC_DTXMXPKTSZ register as well since we touch it in
> igc_tsn_enable_offload()?
Oh, yeah. Will fix.
>
>> +int igc_tsn_offload_apply(struct igc_adapter *adapter)
>> +{
>> + bool is_any_enabled = adapter->base_time;
>> +
>> + if (!(adapter->flags & IGC_FLAG_TSN_QBV_ENABLED) && !is_any_enabled)
>> + return 0;
>> +
>> + if (!is_any_enabled) {
>> + int err = igc_tsn_disable_offload(adapter);
>> +
>> + if (err < 0)
>> + return err;
>> +
>> + /* The BASET registers aren't cleared when writing
>> + * into them, force a reset if the interface is
>> + * running.
>> + */
>> + if (netif_running(adapter->netdev))
>> + schedule_work(&adapter->reset_task);
>> +
>> + return err;
>
> Nitpicking: return 0 instead.
Will fix.
More information about the Intel-wired-lan
mailing list