xref: /dpdk/drivers/common/cnxk/roc_nix_ptp.c (revision 8f98e3ec)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4 
5 #include "roc_api.h"
6 #include "roc_priv.h"
7 
8 #define PTP_FREQ_ADJUST (1 << 9)
9 
10 static inline struct mbox *
get_mbox(struct roc_nix * roc_nix)11 get_mbox(struct roc_nix *roc_nix)
12 {
13 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
14 	struct dev *dev = &nix->dev;
15 
16 	return dev->mbox;
17 }
18 
19 int
roc_nix_ptp_rx_ena_dis(struct roc_nix * roc_nix,int enable)20 roc_nix_ptp_rx_ena_dis(struct roc_nix *roc_nix, int enable)
21 {
22 	struct mbox *mbox = get_mbox(roc_nix);
23 
24 	if (roc_nix_is_vf_or_sdp(roc_nix) || roc_nix_is_lbk(roc_nix))
25 		return NIX_ERR_PARAM;
26 
27 	if (enable)
28 		mbox_alloc_msg_cgx_ptp_rx_enable(mbox);
29 	else
30 		mbox_alloc_msg_cgx_ptp_rx_disable(mbox);
31 
32 	return mbox_process(mbox);
33 }
34 
35 int
roc_nix_ptp_tx_ena_dis(struct roc_nix * roc_nix,int enable)36 roc_nix_ptp_tx_ena_dis(struct roc_nix *roc_nix, int enable)
37 {
38 	struct mbox *mbox = get_mbox(roc_nix);
39 
40 	if (roc_nix_is_vf_or_sdp(roc_nix) || roc_nix_is_lbk(roc_nix))
41 		return NIX_ERR_PARAM;
42 
43 	if (enable)
44 		mbox_alloc_msg_nix_lf_ptp_tx_enable(mbox);
45 	else
46 		mbox_alloc_msg_nix_lf_ptp_tx_disable(mbox);
47 
48 	return mbox_process(mbox);
49 }
50 
51 int
roc_nix_ptp_clock_read(struct roc_nix * roc_nix,uint64_t * clock,uint64_t * tsc,uint8_t is_pmu)52 roc_nix_ptp_clock_read(struct roc_nix *roc_nix, uint64_t *clock, uint64_t *tsc,
53 		       uint8_t is_pmu)
54 {
55 	struct mbox *mbox = get_mbox(roc_nix);
56 	struct ptp_req *req;
57 	struct ptp_rsp *rsp;
58 	int rc = -ENOSPC;
59 
60 	req = mbox_alloc_msg_ptp_op(mbox);
61 	if (req == NULL)
62 		return rc;
63 	req->op = PTP_OP_GET_CLOCK;
64 	req->is_pmu = is_pmu;
65 	rc = mbox_process_msg(mbox, (void *)&rsp);
66 	if (rc)
67 		return rc;
68 
69 	if (clock)
70 		*clock = rsp->clk;
71 
72 	if (tsc)
73 		*tsc = rsp->tsc;
74 
75 	return 0;
76 }
77 
78 int
roc_nix_ptp_sync_time_adjust(struct roc_nix * roc_nix,int64_t delta)79 roc_nix_ptp_sync_time_adjust(struct roc_nix *roc_nix, int64_t delta)
80 {
81 	struct mbox *mbox = get_mbox(roc_nix);
82 	struct ptp_req *req;
83 	struct ptp_rsp *rsp;
84 	int rc = -ENOSPC;
85 
86 	if (roc_nix_is_vf_or_sdp(roc_nix) || roc_nix_is_lbk(roc_nix))
87 		return NIX_ERR_PARAM;
88 
89 	if ((delta <= -PTP_FREQ_ADJUST) || (delta >= PTP_FREQ_ADJUST))
90 		return NIX_ERR_INVALID_RANGE;
91 
92 	req = mbox_alloc_msg_ptp_op(mbox);
93 	if (req == NULL)
94 		return rc;
95 	req->op = PTP_OP_ADJFINE;
96 	req->scaled_ppm = delta;
97 
98 	return mbox_process_msg(mbox, (void *)&rsp);
99 }
100 
101 int
roc_nix_ptp_info_cb_register(struct roc_nix * roc_nix,ptp_info_update_t ptp_update)102 roc_nix_ptp_info_cb_register(struct roc_nix *roc_nix,
103 			     ptp_info_update_t ptp_update)
104 {
105 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
106 	struct dev *dev = &nix->dev;
107 
108 	if (ptp_update == NULL)
109 		return NIX_ERR_PARAM;
110 
111 	dev->ops->ptp_info_update = (ptp_info_t)ptp_update;
112 	return 0;
113 }
114 
115 void
roc_nix_ptp_info_cb_unregister(struct roc_nix * roc_nix)116 roc_nix_ptp_info_cb_unregister(struct roc_nix *roc_nix)
117 {
118 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
119 	struct dev *dev = &nix->dev;
120 
121 	dev->ops->ptp_info_update = NULL;
122 }
123 
124 bool
roc_nix_ptp_is_enable(struct roc_nix * roc_nix)125 roc_nix_ptp_is_enable(struct roc_nix *roc_nix)
126 {
127 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
128 
129 	return nix->ptp_en;
130 }
131