Skip to content

Commit be4baac

Browse files
authored
Merge pull request #8 from etantilov/idpf-update-00768
Intel official release 0.0.768
2 parents 0e3fb3e + fdd5960 commit be4baac

File tree

11 files changed

+266
-109
lines changed

11 files changed

+266
-109
lines changed

idpf.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Name: idpf
22
Summary: Infrastructure Data Path Function Linux Driver
3-
Version: 0.0.766
3+
Version: 0.0.768
44
Release: %{?dist}
55
Source: %{name}-%{version}.tar.gz
66
Vendor: Intel Corporation

idpf/pci.updates

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
# (numerical order).
1010
#
1111
8086 Intel Corporation
12-
1452 Smart Network Adapter ES2000
13-
145c Smart Network Adapter ES2000 Virtual Function
12+
1452 Infrastructure Data Path Function
13+
145c Infrastructure Data Path Function
1414
0dd5 SIOV Virtual Function
1515

idpf/src/idpf.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ struct idpf_rss_data;
5252
#endif /* CONFIG_IOMMU_BYPASS */
5353

5454
#define IDPF_DRV_NAME "idpf"
55-
#define IDPF_DRV_VER "0.0.766"
55+
#define IDPF_DRV_VER "0.0.768"
5656

5757
#define IDPF_M(m, s) ((m) << (s))
5858

idpf/src/idpf_ethtool.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1611,8 +1611,13 @@ static void idpf_get_drvinfo(struct net_device *netdev,
16111611
*
16121612
* Set the Tx/Rx timestamp filters
16131613
*/
1614+
#ifdef HAVE_ETHTOOL_KERNEL_TS_INFO
1615+
static void idpf_set_timestamp_filters(struct idpf_vport *vport,
1616+
struct kernel_ethtool_ts_info *info)
1617+
#else
16141618
static void idpf_set_timestamp_filters(struct idpf_vport *vport,
16151619
struct ethtool_ts_info *info)
1620+
#endif /* HAVE_ETHTOOL_KERNEL_TS_INFO */
16161621
{
16171622
if (vport->adapter->ptp.tx_tstamp_access == IDPF_PTP_NONE ||
16181623
!vport->tx_tstamp_caps)
@@ -1634,8 +1639,13 @@ static void idpf_set_timestamp_filters(struct idpf_vport *vport,
16341639
* @netdev: network interface device structure
16351640
* @info: ethtool timestamping info structure
16361641
*/
1642+
#ifdef HAVE_ETHTOOL_KERNEL_TS_INFO
1643+
static int idpf_get_ts_info(struct net_device *netdev,
1644+
struct kernel_ethtool_ts_info *info)
1645+
#else
16371646
static int idpf_get_ts_info(struct net_device *netdev,
16381647
struct ethtool_ts_info *info)
1648+
#endif /* HAVE_ETHTOOL_KERNEL_TS_INFO */
16391649
{
16401650
struct idpf_adapter *adapter = idpf_netdev_to_adapter(netdev);
16411651
struct idpf_vport *vport;

idpf/src/idpf_lib.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1799,7 +1799,7 @@ void idpf_tstamp_task(struct work_struct *work)
17991799

18001800
vport = container_of(work, struct idpf_vport, tstamp_task);
18011801

1802-
idpf_ptp_get_tx_tstamp(vport);
1802+
idpf_ptp_get_tx_tstamp_mb(vport);
18031803
}
18041804

18051805
/**

idpf/src/idpf_main.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ static int idpf_cfg_hw(struct idpf_adapter *adapter)
263263
return 0;
264264
}
265265

266+
static struct lock_class_key idpf_pf_init_ctrl_lock_key;
267+
static struct lock_class_key idpf_pf_work_lock_key;
268+
266269
/**
267270
* idpf_probe - Device initialization routine
268271
* @pdev: PCI device information struct
@@ -312,9 +315,24 @@ static int idpf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
312315
adapter->req_tx_splitq = true;
313316
adapter->req_rx_splitq = true;
314317

318+
mutex_init(&adapter->init_ctrl_lock);
319+
mutex_init(&adapter->vport_ctrl_lock);
320+
mutex_init(&adapter->vector_lock);
321+
mutex_init(&adapter->queue_lock);
322+
323+
INIT_DELAYED_WORK(&adapter->init_task, idpf_init_task);
324+
INIT_DELAYED_WORK(&adapter->serv_task, idpf_service_task);
325+
INIT_DELAYED_WORK(&adapter->mbx_task, idpf_mbx_task);
326+
INIT_DELAYED_WORK(&adapter->stats_task, idpf_statistics_task);
327+
INIT_DELAYED_WORK(&adapter->vc_event_task, idpf_vc_event_task);
328+
315329
switch (ent->device) {
316330
case IDPF_DEV_ID_PF:
317331
idpf_dev_ops_init(adapter);
332+
lockdep_set_class(&adapter->init_ctrl_lock,
333+
&idpf_pf_init_ctrl_lock_key);
334+
lockdep_init_map(&adapter->vc_event_task.work.lockdep_map,
335+
"idpf-PF-vc-work", &idpf_pf_work_lock_key, 0);
318336
break;
319337
case IDPF_DEV_ID_VF:
320338
idpf_vf_dev_ops_init(adapter);
@@ -439,16 +457,6 @@ static int idpf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
439457
adapter->adi_info.vdcm_init_ok = (adapter->dev_ops.vdcm_init &&
440458
adapter->dev_ops.vdcm_init(adapter->pdev) == 0);
441459
#endif /* CONFIG_VFIO_MDEV && HAVE_PASID_SUPPORT */
442-
mutex_init(&adapter->init_ctrl_lock);
443-
mutex_init(&adapter->vport_ctrl_lock);
444-
mutex_init(&adapter->vector_lock);
445-
mutex_init(&adapter->queue_lock);
446-
447-
INIT_DELAYED_WORK(&adapter->init_task, idpf_init_task);
448-
INIT_DELAYED_WORK(&adapter->serv_task, idpf_service_task);
449-
INIT_DELAYED_WORK(&adapter->mbx_task, idpf_mbx_task);
450-
INIT_DELAYED_WORK(&adapter->stats_task, idpf_statistics_task);
451-
INIT_DELAYED_WORK(&adapter->vc_event_task, idpf_vc_event_task);
452460

453461
adapter->dev_ops.reg_ops.reset_reg_init(adapter);
454462
set_bit(IDPF_HR_DRV_LOAD, adapter->flags);

idpf/src/idpf_ptp.c

Lines changed: 97 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -624,19 +624,20 @@ u64 idpf_ptp_tstamp_extend_32b_to_64b(u64 cached_phc_time, u32 in_timestamp)
624624
* time stored in the device private PTP structure as the basis for timestamp
625625
* extension.
626626
*/
627-
u64 idpf_ptp_extend_ts(struct idpf_adapter *adapter, u32 in_tstamp)
627+
u64 idpf_ptp_extend_ts(struct idpf_adapter *adapter, u64 in_tstamp)
628628
{
629629
unsigned long discard_time;
630-
u64 ticks;
630+
u32 tstamp;
631631

632632
discard_time = adapter->ptp.cached_phc_jiffies + msecs_to_jiffies(2000);
633633

634634
if (time_is_before_jiffies(discard_time))
635635
return 0;
636636

637-
ticks = idpf_ptp_tstamp_extend_32b_to_64b(adapter->ptp.cached_phc_time,
638-
in_tstamp);
639-
return ticks;
637+
tstamp = lower_32_bits(in_tstamp);
638+
639+
return idpf_ptp_tstamp_extend_32b_to_64b(adapter->ptp.cached_phc_time,
640+
tstamp);
640641
}
641642

642643
/**
@@ -654,6 +655,7 @@ s8 idpf_ptp_request_ts(struct idpf_vport *vport, struct sk_buff *skb)
654655
{
655656
struct idpf_ptp_tx_tstamp *ptp_tx_tstamp;
656657
struct list_head *head;
658+
unsigned long flags;
657659
u8 idx = -1;
658660

659661
if (!vport->tx_tstamp_caps)
@@ -665,24 +667,102 @@ s8 idpf_ptp_request_ts(struct idpf_vport *vport, struct sk_buff *skb)
665667
return idx;
666668

667669
/* Get the index from the free latches list */
668-
mutex_lock(&vport->tx_tstamp_caps->lock_free);
670+
spin_lock_irqsave(&vport->tx_tstamp_caps->lock_free, flags);
669671
ptp_tx_tstamp = list_first_entry(head, struct idpf_ptp_tx_tstamp,
670672
list_member);
671673
list_del(&ptp_tx_tstamp->list_member);
672-
mutex_unlock(&vport->tx_tstamp_caps->lock_free);
674+
spin_unlock_irqrestore(&vport->tx_tstamp_caps->lock_free, flags);
673675

674676
ptp_tx_tstamp->skb = skb_get(skb);
675677
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
676678

677679
/* Move the element to the used latches list */
678-
mutex_lock(&vport->tx_tstamp_caps->lock_in_use);
680+
spin_lock_irqsave(&vport->tx_tstamp_caps->lock_in_use, flags);
679681
list_add(&ptp_tx_tstamp->list_member,
680682
&vport->tx_tstamp_caps->latches_in_use);
681-
mutex_unlock(&vport->tx_tstamp_caps->lock_in_use);
683+
spin_unlock_irqrestore(&vport->tx_tstamp_caps->lock_in_use, flags);
682684

683685
return ptp_tx_tstamp->idx;
684686
}
685687

688+
/**
689+
* idpf_ptp_get_tx_tstamp - Read the Tx timestamp value
690+
* @vport: Virtual port structure
691+
*
692+
* Read the Tx timestamp value directly - through BAR registers - and provide
693+
* it back to the skb.
694+
*
695+
* Return: 0 on success, negative error code on failure.
696+
*/
697+
int idpf_ptp_get_tx_tstamp(struct idpf_vport *vport)
698+
{
699+
struct idpf_ptp_vport_tx_tstamp_caps *tx_tstamp_caps;
700+
u32 tstamp_lo, tstamp_hi, offset_lo, offset_hi;
701+
struct skb_shared_hwtstamps shhwtstamps = {};
702+
struct idpf_ptp_tx_tstamp *ptp_tx_tstamp;
703+
struct idpf_ptp_tx_tstamp_status *status;
704+
u64 tstamp, extended_tstamp;
705+
u8 tstamp_ns_lo_bit, valid;
706+
struct list_head *head;
707+
bool idx_found = false;
708+
unsigned long flags;
709+
u16 i;
710+
711+
tx_tstamp_caps = vport->tx_tstamp_caps;
712+
head = &tx_tstamp_caps->latches_in_use;
713+
714+
/* Find a proper idx on the used-latches list */
715+
spin_lock_irqsave(&tx_tstamp_caps->lock_in_use, flags);
716+
list_for_each_entry(ptp_tx_tstamp, head, list_member) {
717+
for (i = 0; i < tx_tstamp_caps->num_entries; i++) {
718+
status = &tx_tstamp_caps->tx_tstamp_status[i];
719+
if (status->skb == ptp_tx_tstamp->skb &&
720+
status->state == IDPF_PTP_REQUEST) {
721+
status->state = IDPF_PTP_READ_VALUE;
722+
list_del(&ptp_tx_tstamp->list_member);
723+
idx_found = true;
724+
break;
725+
}
726+
}
727+
728+
if (idx_found)
729+
break;
730+
}
731+
spin_unlock_irqrestore(&tx_tstamp_caps->lock_in_use, flags);
732+
733+
if (!idx_found)
734+
return -EACCES;
735+
736+
offset_lo = ptp_tx_tstamp->tx_latch_reg_offset_l;
737+
offset_hi = ptp_tx_tstamp->tx_latch_reg_offset_h;
738+
739+
tstamp_lo = readl(idpf_get_reg_addr(vport->adapter, offset_lo));
740+
tstamp_hi = readl(idpf_get_reg_addr(vport->adapter, offset_hi));
741+
tstamp = (u64)tstamp_hi << 32 | tstamp_lo;
742+
valid = tstamp & IDPF_PTP_VALID_BIT;
743+
744+
if (!valid)
745+
return -EIO;
746+
747+
/* Move tstamp value to skip ns part and the valid bit */
748+
tstamp_ns_lo_bit = tx_tstamp_caps->tstamp_ns_lo_bit;
749+
tstamp >>= tstamp_ns_lo_bit + 1;
750+
751+
extended_tstamp = idpf_ptp_extend_ts(vport->adapter, tstamp);
752+
753+
shhwtstamps.hwtstamp = ns_to_ktime(extended_tstamp);
754+
skb_tstamp_tx(ptp_tx_tstamp->skb, &shhwtstamps);
755+
dev_kfree_skb_any(ptp_tx_tstamp->skb);
756+
757+
/* Free the latch index */
758+
status->state = IDPF_PTP_FREE;
759+
spin_lock_irqsave(&tx_tstamp_caps->lock_free, flags);
760+
list_add(&ptp_tx_tstamp->list_member, &tx_tstamp_caps->latches_free);
761+
spin_unlock_irqrestore(&tx_tstamp_caps->lock_free, flags);
762+
763+
return 0;
764+
}
765+
686766
/**
687767
* idpf_set_rx_tstamp - Enable or disable Rx timestamping
688768
* @vport: Virtual port structure
@@ -694,7 +774,7 @@ static void idpf_ptp_set_rx_tstamp(struct idpf_vport *vport, bool on)
694774
u16 i;
695775

696776
access = vport->adapter->ptp.tx_tstamp_access;
697-
if (access != IDPF_PTP_MAILBOX)
777+
if (access == IDPF_PTP_NONE)
698778
return;
699779

700780
for (i = 0; i < vport->dflt_grp.q_grp.num_rxq; i++)
@@ -887,6 +967,7 @@ static void idpf_ptp_release_tstamp(struct idpf_adapter *adapter)
887967
{
888968
struct idpf_ptp_tx_tstamp *ptp_tx_tstamp, *tmp;
889969
struct list_head *head;
970+
unsigned long flags;
890971
int i;
891972

892973
idpf_for_each_vport(adapter, i) {
@@ -898,28 +979,28 @@ static void idpf_ptp_release_tstamp(struct idpf_adapter *adapter)
898979
cancel_work_sync(&vport->tstamp_task);
899980

900981
/* Remove list with free latches */
901-
mutex_lock(&vport->tx_tstamp_caps->lock_free);
982+
spin_lock_irqsave(&vport->tx_tstamp_caps->lock_free, flags);
902983

903984
head = &vport->tx_tstamp_caps->latches_free;
904985
list_for_each_entry_safe(ptp_tx_tstamp, tmp, head, list_member) {
905986
list_del(&ptp_tx_tstamp->list_member);
906987
kfree(ptp_tx_tstamp);
907988
}
908989

909-
mutex_unlock(&vport->tx_tstamp_caps->lock_free);
910-
mutex_destroy(&vport->tx_tstamp_caps->lock_free);
990+
spin_unlock_irqrestore(&vport->tx_tstamp_caps->lock_free,
991+
flags);
911992

912993
/* Remove list with latches in use */
913-
mutex_lock(&vport->tx_tstamp_caps->lock_in_use);
994+
spin_lock_irqsave(&vport->tx_tstamp_caps->lock_in_use, flags);
914995

915996
head = &vport->tx_tstamp_caps->latches_in_use;
916997
list_for_each_entry_safe(ptp_tx_tstamp, tmp, head, list_member) {
917998
list_del(&ptp_tx_tstamp->list_member);
918999
kfree(ptp_tx_tstamp);
9191000
}
9201001

921-
mutex_unlock(&vport->tx_tstamp_caps->lock_in_use);
922-
mutex_destroy(&vport->tx_tstamp_caps->lock_in_use);
1002+
spin_unlock_irqrestore(&vport->tx_tstamp_caps->lock_in_use,
1003+
flags);
9231004

9241005
kfree(vport->tx_tstamp_caps->tx_tstamp_status);
9251006
kfree(vport->tx_tstamp_caps);

idpf/src/idpf_ptp.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#include <linux/ptp_clock_kernel.h>
1111
#include <linux/ptp_classify.h>
1212

13+
#define IDPF_PTP_VALID_BIT BIT(0)
14+
1315
enum idpf_ptp_access {
1416
IDPF_PTP_NONE = 0,
1517
IDPF_PTP_DIRECT,
@@ -110,8 +112,8 @@ struct idpf_ptp_vport_tx_tstamp_caps {
110112
u32 vport_id;
111113
u16 num_entries;
112114
u8 tstamp_ns_lo_bit;
113-
struct mutex lock_in_use; /* lock to used latches list */
114-
struct mutex lock_free; /* lock to free latches list */
115+
spinlock_t lock_in_use; /* lock to used latches list */
116+
spinlock_t lock_free; /* lock to free latches list */
115117
struct list_head latches_free;
116118
struct list_head latches_in_use;
117119
struct idpf_ptp_tx_tstamp_status *tx_tstamp_status;
@@ -175,11 +177,12 @@ int idpf_ptp_get_cross_time(struct idpf_adapter *adapter,
175177
int idpf_ptp_set_dev_clk_time(struct idpf_adapter *adapter, u64 time);
176178
int idpf_ptp_adj_dev_clk_fine(struct idpf_adapter *adapter, u64 incval);
177179
int idpf_ptp_adj_dev_clk_time(struct idpf_adapter *adapter, s64 delta);
180+
int idpf_ptp_get_tx_tstamp_mb(struct idpf_vport *vport);
178181
int idpf_ptp_get_tx_tstamp(struct idpf_vport *vport);
179182
int idpf_ptp_get_ts_config(struct idpf_vport *vport, struct ifreq *ifr);
180183
int idpf_ptp_set_ts_config(struct idpf_vport *vport, struct ifreq *ifr);
181184
s8 idpf_ptp_request_ts(struct idpf_vport *vport, struct sk_buff *skb);
182-
u64 idpf_ptp_extend_ts(struct idpf_adapter *adapter, u32 in_tstamp);
185+
u64 idpf_ptp_extend_ts(struct idpf_adapter *adapter, u64 in_tstamp);
183186
u64 idpf_ptp_tstamp_extend_32b_to_64b(u64 cached_phc_time, u32 in_timestamp);
184187
#else /* IS_ENABLED(CONFIG_PTP_1588_CLOCK) */
185188
static inline int idpf_ptp_get_caps(struct idpf_adapter *adapter)
@@ -232,6 +235,11 @@ static inline int idpf_ptp_adj_dev_clk_time(struct idpf_adapter *adapter,
232235
return -EOPNOTSUPP;
233236
}
234237

238+
static inline int idpf_ptp_get_tx_tstamp_mb(struct idpf_vport *vport)
239+
{
240+
return -EOPNOTSUPP;
241+
}
242+
235243
static inline int idpf_ptp_get_tx_tstamp(struct idpf_vport *vport)
236244
{
237245
return -EOPNOTSUPP;
@@ -256,7 +264,7 @@ static inline s8 idpf_ptp_request_ts(struct idpf_vport *vport,
256264
}
257265

258266
static inline u64 idpf_ptp_extend_ts(struct idpf_adapter *adapter,
259-
u32 in_tstamp)
267+
u64 in_tstamp)
260268
{
261269
return 0;
262270
}
@@ -266,5 +274,6 @@ static inline u64 idpf_ptp_tstamp_extend_32b_to_64b(u64 cached_phc_time,
266274
{
267275
return 0;
268276
}
277+
269278
#endif /* IS_ENABLED(CONFIG_PTP_1588_CLOCK) */
270279
#endif /* _IDPF_PTP_H_ */

0 commit comments

Comments
 (0)