Commit ad8e66a4 authored by Vadim Fedorenko's avatar Vadim Fedorenko Committed by Paolo Abeni
Browse files

eth: fbnic: add initial PHC support



Create PHC device and provide callbacks needed for ptp_clock device.

Signed-off-by: default avatarVadim Fedorenko <vadfed@meta.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent be65bfc9
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -18,4 +18,5 @@ fbnic-y := fbnic_devlink.o \
	   fbnic_phylink.o \
	   fbnic_rpc.o \
	   fbnic_tlv.o \
	   fbnic_txrx.o
	   fbnic_txrx.o \
	   fbnic_time.o
+11 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@

#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/ptp_clock_kernel.h>
#include <linux/types.h>
#include <linux/workqueue.h>

@@ -49,6 +50,16 @@ struct fbnic_dev {
	/* Number of TCQs/RCQs available on hardware */
	u16 max_num_queues;

	/* Lock protecting writes to @time_high, @time_offset of fbnic_netdev,
	 * and the HW time CSR machinery.
	 */
	spinlock_t time_lock;
	/* Externally accessible PTP clock, may be NULL */
	struct ptp_clock *ptp;
	struct ptp_clock_info ptp_info;
	/* Last @time_high refresh time in jiffies (to catch stalls) */
	unsigned long last_read;

	/* Local copy of hardware statistics */
	struct fbnic_hw_stats hw_stats;
};
+38 −0
Original line number Diff line number Diff line
@@ -413,6 +413,44 @@ enum {
#define FBNIC_TMI_DROP_CTRL		0x04401		/* 0x11004 */
#define FBNIC_TMI_DROP_CTRL_EN			CSR_BIT(0)
#define FBNIC_CSR_END_TMI		0x0443f	/* CSR section delimiter */

/* Precision Time Protocol Registers */
#define FBNIC_CSR_START_PTP		0x04800 /* CSR section delimiter */
#define FBNIC_PTP_REG_BASE		0x04800		/* 0x12000 */

#define FBNIC_PTP_CTRL			0x04800		/* 0x12000 */
#define FBNIC_PTP_CTRL_EN			CSR_BIT(0)
#define FBNIC_PTP_CTRL_MONO_EN			CSR_BIT(4)
#define FBNIC_PTP_CTRL_TQS_OUT_EN		CSR_BIT(8)
#define FBNIC_PTP_CTRL_MAC_OUT_IVAL		CSR_GENMASK(16, 12)
#define FBNIC_PTP_CTRL_TICK_IVAL		CSR_GENMASK(23, 20)

#define FBNIC_PTP_ADJUST		0x04801		/* 0x12004 */
#define FBNIC_PTP_ADJUST_INIT			CSR_BIT(0)
#define FBNIC_PTP_ADJUST_SUB_NUDGE		CSR_BIT(8)
#define FBNIC_PTP_ADJUST_ADD_NUDGE		CSR_BIT(16)
#define FBNIC_PTP_ADJUST_ADDEND_SET		CSR_BIT(24)

#define FBNIC_PTP_INIT_HI		0x04802		/* 0x12008 */
#define FBNIC_PTP_INIT_LO		0x04803		/* 0x1200c */

#define FBNIC_PTP_NUDGE_NS		0x04804		/* 0x12010 */
#define FBNIC_PTP_NUDGE_SUBNS		0x04805		/* 0x12014 */

#define FBNIC_PTP_ADD_VAL_NS		0x04806		/* 0x12018 */
#define FBNIC_PTP_ADD_VAL_NS_MASK		CSR_GENMASK(15, 0)
#define FBNIC_PTP_ADD_VAL_SUBNS		0x04807	/* 0x1201c */

#define FBNIC_PTP_CTR_VAL_HI		0x04808		/* 0x12020 */
#define FBNIC_PTP_CTR_VAL_LO		0x04809		/* 0x12024 */

#define FBNIC_PTP_MONO_PTP_CTR_HI	0x0480a		/* 0x12028 */
#define FBNIC_PTP_MONO_PTP_CTR_LO	0x0480b		/* 0x1202c */

#define FBNIC_PTP_CDC_FIFO_STATUS	0x0480c		/* 0x12030 */
#define FBNIC_PTP_SPARE			0x0480d		/* 0x12034 */
#define FBNIC_CSR_END_PTP		0x0480d /* CSR section delimiter */

/* Rx Buffer Registers */
#define FBNIC_CSR_START_RXB		0x08000	/* CSR section delimiter */
enum {
+9 −2
Original line number Diff line number Diff line
@@ -42,18 +42,24 @@ int __fbnic_open(struct fbnic_net *fbn)
		goto free_resources;
	}

	err = fbnic_fw_init_heartbeat(fbd, false);
	err = fbnic_time_start(fbn);
	if (err)
		goto release_ownership;

	err = fbnic_fw_init_heartbeat(fbd, false);
	if (err)
		goto time_stop;

	err = fbnic_pcs_irq_enable(fbd);
	if (err)
		goto release_ownership;
		goto time_stop;
	/* Pull the BMC config and initialize the RPC */
	fbnic_bmc_rpc_init(fbd);
	fbnic_rss_reinit(fbd, fbn);

	return 0;
time_stop:
	fbnic_time_stop(fbn);
release_ownership:
	fbnic_fw_xmit_ownership_msg(fbn->fbd, false);
free_resources:
@@ -82,6 +88,7 @@ static int fbnic_stop(struct net_device *netdev)
	fbnic_down(fbn);
	fbnic_pcs_irq_disable(fbn->fbd);

	fbnic_time_stop(fbn);
	fbnic_fw_xmit_ownership_msg(fbn->fbd, false);

	fbnic_free_resources(fbn);
+15 −0
Original line number Diff line number Diff line
@@ -33,6 +33,15 @@ struct fbnic_net {
	u8 fec;
	u8 link_mode;

	/* Cached top bits of the HW time counter for 40b -> 64b conversion */
	u32 time_high;
	/* Protect readers of @time_offset, writers take @time_lock. */
	struct u64_stats_sync time_seq;
	/* Offset in ns between free running NIC PHC and time set via PTP
	 * clock callbacks
	 */
	s64 time_offset;

	u16 num_tx_queues;
	u16 num_rx_queues;

@@ -60,6 +69,12 @@ void fbnic_reset_queues(struct fbnic_net *fbn,
			unsigned int tx, unsigned int rx);
void fbnic_set_ethtool_ops(struct net_device *dev);

int fbnic_ptp_setup(struct fbnic_dev *fbd);
void fbnic_ptp_destroy(struct fbnic_dev *fbd);
void fbnic_time_init(struct fbnic_net *fbn);
int fbnic_time_start(struct fbnic_net *fbn);
void fbnic_time_stop(struct fbnic_net *fbn);

void __fbnic_set_rx_mode(struct net_device *netdev);
void fbnic_clear_rx_mode(struct net_device *netdev);

Loading