cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hclge_ptp.c (14647B)


      1// SPDX-License-Identifier: GPL-2.0+
      2// Copyright (c) 2021 Hisilicon Limited.
      3
      4#include <linux/skbuff.h>
      5#include "hclge_main.h"
      6#include "hnae3.h"
      7
      8static int hclge_ptp_get_cycle(struct hclge_dev *hdev)
      9{
     10	struct hclge_ptp *ptp = hdev->ptp;
     11
     12	ptp->cycle.quo = readl(hdev->ptp->io_base + HCLGE_PTP_CYCLE_QUO_REG) &
     13			 HCLGE_PTP_CYCLE_QUO_MASK;
     14	ptp->cycle.numer = readl(hdev->ptp->io_base + HCLGE_PTP_CYCLE_NUM_REG);
     15	ptp->cycle.den = readl(hdev->ptp->io_base + HCLGE_PTP_CYCLE_DEN_REG);
     16
     17	if (ptp->cycle.den == 0) {
     18		dev_err(&hdev->pdev->dev, "invalid ptp cycle denominator!\n");
     19		return -EINVAL;
     20	}
     21
     22	return 0;
     23}
     24
     25static int hclge_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
     26{
     27	struct hclge_dev *hdev = hclge_ptp_get_hdev(ptp);
     28	struct hclge_ptp_cycle *cycle = &hdev->ptp->cycle;
     29	u64 adj_val, adj_base, diff;
     30	unsigned long flags;
     31	bool is_neg = false;
     32	u32 quo, numerator;
     33
     34	if (ppb < 0) {
     35		ppb = -ppb;
     36		is_neg = true;
     37	}
     38
     39	adj_base = (u64)cycle->quo * (u64)cycle->den + (u64)cycle->numer;
     40	adj_val = adj_base * ppb;
     41	diff = div_u64(adj_val, 1000000000ULL);
     42
     43	if (is_neg)
     44		adj_val = adj_base - diff;
     45	else
     46		adj_val = adj_base + diff;
     47
     48	/* This clock cycle is defined by three part: quotient, numerator
     49	 * and denominator. For example, 2.5ns, the quotient is 2,
     50	 * denominator is fixed to ptp->cycle.den, and numerator
     51	 * is 0.5 * ptp->cycle.den.
     52	 */
     53	quo = div_u64_rem(adj_val, cycle->den, &numerator);
     54
     55	spin_lock_irqsave(&hdev->ptp->lock, flags);
     56	writel(quo & HCLGE_PTP_CYCLE_QUO_MASK,
     57	       hdev->ptp->io_base + HCLGE_PTP_CYCLE_QUO_REG);
     58	writel(numerator, hdev->ptp->io_base + HCLGE_PTP_CYCLE_NUM_REG);
     59	writel(cycle->den, hdev->ptp->io_base + HCLGE_PTP_CYCLE_DEN_REG);
     60	writel(HCLGE_PTP_CYCLE_ADJ_EN,
     61	       hdev->ptp->io_base + HCLGE_PTP_CYCLE_CFG_REG);
     62	spin_unlock_irqrestore(&hdev->ptp->lock, flags);
     63
     64	return 0;
     65}
     66
     67bool hclge_ptp_set_tx_info(struct hnae3_handle *handle, struct sk_buff *skb)
     68{
     69	struct hclge_vport *vport = hclge_get_vport(handle);
     70	struct hclge_dev *hdev = vport->back;
     71	struct hclge_ptp *ptp = hdev->ptp;
     72
     73	if (!test_bit(HCLGE_PTP_FLAG_TX_EN, &ptp->flags) ||
     74	    test_and_set_bit(HCLGE_STATE_PTP_TX_HANDLING, &hdev->state)) {
     75		ptp->tx_skipped++;
     76		return false;
     77	}
     78
     79	ptp->tx_start = jiffies;
     80	ptp->tx_skb = skb_get(skb);
     81	ptp->tx_cnt++;
     82
     83	return true;
     84}
     85
     86void hclge_ptp_clean_tx_hwts(struct hclge_dev *hdev)
     87{
     88	struct sk_buff *skb = hdev->ptp->tx_skb;
     89	struct skb_shared_hwtstamps hwts;
     90	u32 hi, lo;
     91	u64 ns;
     92
     93	ns = readl(hdev->ptp->io_base + HCLGE_PTP_TX_TS_NSEC_REG) &
     94	     HCLGE_PTP_TX_TS_NSEC_MASK;
     95	lo = readl(hdev->ptp->io_base + HCLGE_PTP_TX_TS_SEC_L_REG);
     96	hi = readl(hdev->ptp->io_base + HCLGE_PTP_TX_TS_SEC_H_REG) &
     97	     HCLGE_PTP_TX_TS_SEC_H_MASK;
     98	hdev->ptp->last_tx_seqid = readl(hdev->ptp->io_base +
     99		HCLGE_PTP_TX_TS_SEQID_REG);
    100
    101	if (skb) {
    102		hdev->ptp->tx_skb = NULL;
    103		hdev->ptp->tx_cleaned++;
    104
    105		ns += (((u64)hi) << 32 | lo) * NSEC_PER_SEC;
    106		hwts.hwtstamp = ns_to_ktime(ns);
    107		skb_tstamp_tx(skb, &hwts);
    108		dev_kfree_skb_any(skb);
    109	}
    110
    111	clear_bit(HCLGE_STATE_PTP_TX_HANDLING, &hdev->state);
    112}
    113
    114void hclge_ptp_get_rx_hwts(struct hnae3_handle *handle, struct sk_buff *skb,
    115			   u32 nsec, u32 sec)
    116{
    117	struct hclge_vport *vport = hclge_get_vport(handle);
    118	struct hclge_dev *hdev = vport->back;
    119	unsigned long flags;
    120	u64 ns = nsec;
    121	u32 sec_h;
    122
    123	if (!test_bit(HCLGE_PTP_FLAG_RX_EN, &hdev->ptp->flags))
    124		return;
    125
    126	/* Since the BD does not have enough space for the higher 16 bits of
    127	 * second, and this part will not change frequently, so read it
    128	 * from register.
    129	 */
    130	spin_lock_irqsave(&hdev->ptp->lock, flags);
    131	sec_h = readl(hdev->ptp->io_base + HCLGE_PTP_CUR_TIME_SEC_H_REG);
    132	spin_unlock_irqrestore(&hdev->ptp->lock, flags);
    133
    134	ns += (((u64)sec_h) << HCLGE_PTP_SEC_H_OFFSET | sec) * NSEC_PER_SEC;
    135	skb_hwtstamps(skb)->hwtstamp = ns_to_ktime(ns);
    136	hdev->ptp->last_rx = jiffies;
    137	hdev->ptp->rx_cnt++;
    138}
    139
    140static int hclge_ptp_gettimex(struct ptp_clock_info *ptp, struct timespec64 *ts,
    141			      struct ptp_system_timestamp *sts)
    142{
    143	struct hclge_dev *hdev = hclge_ptp_get_hdev(ptp);
    144	unsigned long flags;
    145	u32 hi, lo;
    146	u64 ns;
    147
    148	spin_lock_irqsave(&hdev->ptp->lock, flags);
    149	ns = readl(hdev->ptp->io_base + HCLGE_PTP_CUR_TIME_NSEC_REG);
    150	hi = readl(hdev->ptp->io_base + HCLGE_PTP_CUR_TIME_SEC_H_REG);
    151	lo = readl(hdev->ptp->io_base + HCLGE_PTP_CUR_TIME_SEC_L_REG);
    152	spin_unlock_irqrestore(&hdev->ptp->lock, flags);
    153
    154	ns += (((u64)hi) << HCLGE_PTP_SEC_H_OFFSET | lo) * NSEC_PER_SEC;
    155	*ts = ns_to_timespec64(ns);
    156
    157	return 0;
    158}
    159
    160static int hclge_ptp_settime(struct ptp_clock_info *ptp,
    161			     const struct timespec64 *ts)
    162{
    163	struct hclge_dev *hdev = hclge_ptp_get_hdev(ptp);
    164	unsigned long flags;
    165
    166	spin_lock_irqsave(&hdev->ptp->lock, flags);
    167	writel(ts->tv_nsec, hdev->ptp->io_base + HCLGE_PTP_TIME_NSEC_REG);
    168	writel(ts->tv_sec >> HCLGE_PTP_SEC_H_OFFSET,
    169	       hdev->ptp->io_base + HCLGE_PTP_TIME_SEC_H_REG);
    170	writel(ts->tv_sec & HCLGE_PTP_SEC_L_MASK,
    171	       hdev->ptp->io_base + HCLGE_PTP_TIME_SEC_L_REG);
    172	/* synchronize the time of phc */
    173	writel(HCLGE_PTP_TIME_SYNC_EN,
    174	       hdev->ptp->io_base + HCLGE_PTP_TIME_SYNC_REG);
    175	spin_unlock_irqrestore(&hdev->ptp->lock, flags);
    176
    177	return 0;
    178}
    179
    180static int hclge_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
    181{
    182	struct hclge_dev *hdev = hclge_ptp_get_hdev(ptp);
    183	unsigned long flags;
    184	bool is_neg = false;
    185	u32 adj_val = 0;
    186
    187	if (delta < 0) {
    188		adj_val |= HCLGE_PTP_TIME_NSEC_NEG;
    189		delta = -delta;
    190		is_neg = true;
    191	}
    192
    193	if (delta > HCLGE_PTP_TIME_NSEC_MASK) {
    194		struct timespec64 ts;
    195		s64 ns;
    196
    197		hclge_ptp_gettimex(ptp, &ts, NULL);
    198		ns = timespec64_to_ns(&ts);
    199		ns = is_neg ? ns - delta : ns + delta;
    200		ts = ns_to_timespec64(ns);
    201		return hclge_ptp_settime(ptp, &ts);
    202	}
    203
    204	adj_val |= delta & HCLGE_PTP_TIME_NSEC_MASK;
    205
    206	spin_lock_irqsave(&hdev->ptp->lock, flags);
    207	writel(adj_val, hdev->ptp->io_base + HCLGE_PTP_TIME_NSEC_REG);
    208	writel(HCLGE_PTP_TIME_ADJ_EN,
    209	       hdev->ptp->io_base + HCLGE_PTP_TIME_ADJ_REG);
    210	spin_unlock_irqrestore(&hdev->ptp->lock, flags);
    211
    212	return 0;
    213}
    214
    215int hclge_ptp_get_cfg(struct hclge_dev *hdev, struct ifreq *ifr)
    216{
    217	if (!test_bit(HCLGE_STATE_PTP_EN, &hdev->state))
    218		return -EOPNOTSUPP;
    219
    220	return copy_to_user(ifr->ifr_data, &hdev->ptp->ts_cfg,
    221		sizeof(struct hwtstamp_config)) ? -EFAULT : 0;
    222}
    223
    224static int hclge_ptp_int_en(struct hclge_dev *hdev, bool en)
    225{
    226	struct hclge_ptp_int_cmd *req;
    227	struct hclge_desc desc;
    228	int ret;
    229
    230	req = (struct hclge_ptp_int_cmd *)desc.data;
    231	hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PTP_INT_EN, false);
    232	req->int_en = en ? 1 : 0;
    233
    234	ret = hclge_cmd_send(&hdev->hw, &desc, 1);
    235	if (ret)
    236		dev_err(&hdev->pdev->dev,
    237			"failed to %s ptp interrupt, ret = %d\n",
    238			en ? "enable" : "disable", ret);
    239
    240	return ret;
    241}
    242
    243int hclge_ptp_cfg_qry(struct hclge_dev *hdev, u32 *cfg)
    244{
    245	struct hclge_ptp_cfg_cmd *req;
    246	struct hclge_desc desc;
    247	int ret;
    248
    249	req = (struct hclge_ptp_cfg_cmd *)desc.data;
    250	hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PTP_MODE_CFG, true);
    251	ret = hclge_cmd_send(&hdev->hw, &desc, 1);
    252	if (ret) {
    253		dev_err(&hdev->pdev->dev,
    254			"failed to query ptp config, ret = %d\n", ret);
    255		return ret;
    256	}
    257
    258	*cfg = le32_to_cpu(req->cfg);
    259
    260	return 0;
    261}
    262
    263static int hclge_ptp_cfg(struct hclge_dev *hdev, u32 cfg)
    264{
    265	struct hclge_ptp_cfg_cmd *req;
    266	struct hclge_desc desc;
    267	int ret;
    268
    269	req = (struct hclge_ptp_cfg_cmd *)desc.data;
    270	hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PTP_MODE_CFG, false);
    271	req->cfg = cpu_to_le32(cfg);
    272	ret = hclge_cmd_send(&hdev->hw, &desc, 1);
    273	if (ret)
    274		dev_err(&hdev->pdev->dev,
    275			"failed to config ptp, ret = %d\n", ret);
    276
    277	return ret;
    278}
    279
    280static int hclge_ptp_set_tx_mode(struct hwtstamp_config *cfg,
    281				 unsigned long *flags, u32 *ptp_cfg)
    282{
    283	switch (cfg->tx_type) {
    284	case HWTSTAMP_TX_OFF:
    285		clear_bit(HCLGE_PTP_FLAG_TX_EN, flags);
    286		break;
    287	case HWTSTAMP_TX_ON:
    288		set_bit(HCLGE_PTP_FLAG_TX_EN, flags);
    289		*ptp_cfg |= HCLGE_PTP_TX_EN_B;
    290		break;
    291	default:
    292		return -ERANGE;
    293	}
    294
    295	return 0;
    296}
    297
    298static int hclge_ptp_set_rx_mode(struct hwtstamp_config *cfg,
    299				 unsigned long *flags, u32 *ptp_cfg)
    300{
    301	int rx_filter = cfg->rx_filter;
    302
    303	switch (cfg->rx_filter) {
    304	case HWTSTAMP_FILTER_NONE:
    305		clear_bit(HCLGE_PTP_FLAG_RX_EN, flags);
    306		break;
    307	case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
    308	case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
    309	case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
    310		set_bit(HCLGE_PTP_FLAG_RX_EN, flags);
    311		*ptp_cfg |= HCLGE_PTP_RX_EN_B;
    312		*ptp_cfg |= HCLGE_PTP_UDP_FULL_TYPE << HCLGE_PTP_UDP_EN_SHIFT;
    313		rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
    314		break;
    315	case HWTSTAMP_FILTER_PTP_V2_EVENT:
    316	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
    317	case HWTSTAMP_FILTER_PTP_V2_SYNC:
    318	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
    319	case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
    320	case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
    321	case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
    322	case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
    323	case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
    324		set_bit(HCLGE_PTP_FLAG_RX_EN, flags);
    325		*ptp_cfg |= HCLGE_PTP_RX_EN_B;
    326		*ptp_cfg |= HCLGE_PTP_UDP_FULL_TYPE << HCLGE_PTP_UDP_EN_SHIFT;
    327		*ptp_cfg |= HCLGE_PTP_MSG1_V2_DEFAULT << HCLGE_PTP_MSG1_SHIFT;
    328		*ptp_cfg |= HCLGE_PTP_MSG0_V2_EVENT << HCLGE_PTP_MSG0_SHIFT;
    329		*ptp_cfg |= HCLGE_PTP_MSG_TYPE_V2 << HCLGE_PTP_MSG_TYPE_SHIFT;
    330		rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
    331		break;
    332	case HWTSTAMP_FILTER_ALL:
    333	default:
    334		return -ERANGE;
    335	}
    336
    337	cfg->rx_filter = rx_filter;
    338
    339	return 0;
    340}
    341
    342static int hclge_ptp_set_ts_mode(struct hclge_dev *hdev,
    343				 struct hwtstamp_config *cfg)
    344{
    345	unsigned long flags = hdev->ptp->flags;
    346	u32 ptp_cfg = 0;
    347	int ret;
    348
    349	if (test_bit(HCLGE_PTP_FLAG_EN, &hdev->ptp->flags))
    350		ptp_cfg |= HCLGE_PTP_EN_B;
    351
    352	ret = hclge_ptp_set_tx_mode(cfg, &flags, &ptp_cfg);
    353	if (ret)
    354		return ret;
    355
    356	ret = hclge_ptp_set_rx_mode(cfg, &flags, &ptp_cfg);
    357	if (ret)
    358		return ret;
    359
    360	ret = hclge_ptp_cfg(hdev, ptp_cfg);
    361	if (ret)
    362		return ret;
    363
    364	hdev->ptp->flags = flags;
    365	hdev->ptp->ptp_cfg = ptp_cfg;
    366
    367	return 0;
    368}
    369
    370int hclge_ptp_set_cfg(struct hclge_dev *hdev, struct ifreq *ifr)
    371{
    372	struct hwtstamp_config cfg;
    373	int ret;
    374
    375	if (!test_bit(HCLGE_STATE_PTP_EN, &hdev->state)) {
    376		dev_err(&hdev->pdev->dev, "phc is unsupported\n");
    377		return -EOPNOTSUPP;
    378	}
    379
    380	if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
    381		return -EFAULT;
    382
    383	ret = hclge_ptp_set_ts_mode(hdev, &cfg);
    384	if (ret)
    385		return ret;
    386
    387	hdev->ptp->ts_cfg = cfg;
    388
    389	return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0;
    390}
    391
    392int hclge_ptp_get_ts_info(struct hnae3_handle *handle,
    393			  struct ethtool_ts_info *info)
    394{
    395	struct hclge_vport *vport = hclge_get_vport(handle);
    396	struct hclge_dev *hdev = vport->back;
    397
    398	if (!test_bit(HCLGE_STATE_PTP_EN, &hdev->state)) {
    399		dev_err(&hdev->pdev->dev, "phc is unsupported\n");
    400		return -EOPNOTSUPP;
    401	}
    402
    403	info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
    404				SOF_TIMESTAMPING_RX_SOFTWARE |
    405				SOF_TIMESTAMPING_SOFTWARE |
    406				SOF_TIMESTAMPING_TX_HARDWARE |
    407				SOF_TIMESTAMPING_RX_HARDWARE |
    408				SOF_TIMESTAMPING_RAW_HARDWARE;
    409
    410	if (hdev->ptp->clock)
    411		info->phc_index = ptp_clock_index(hdev->ptp->clock);
    412	else
    413		info->phc_index = -1;
    414
    415	info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON);
    416
    417	info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
    418			   BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
    419			   BIT(HWTSTAMP_FILTER_PTP_V2_L2_SYNC) |
    420			   BIT(HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ);
    421
    422	info->rx_filters |= BIT(HWTSTAMP_FILTER_PTP_V1_L4_SYNC) |
    423			    BIT(HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) |
    424			    BIT(HWTSTAMP_FILTER_PTP_V2_EVENT) |
    425			    BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
    426			    BIT(HWTSTAMP_FILTER_PTP_V2_SYNC) |
    427			    BIT(HWTSTAMP_FILTER_PTP_V2_L4_SYNC) |
    428			    BIT(HWTSTAMP_FILTER_PTP_V2_DELAY_REQ) |
    429			    BIT(HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ);
    430
    431	return 0;
    432}
    433
    434static int hclge_ptp_create_clock(struct hclge_dev *hdev)
    435{
    436	struct hclge_ptp *ptp;
    437
    438	ptp = devm_kzalloc(&hdev->pdev->dev, sizeof(*ptp), GFP_KERNEL);
    439	if (!ptp)
    440		return -ENOMEM;
    441
    442	ptp->hdev = hdev;
    443	snprintf(ptp->info.name, sizeof(ptp->info.name), "%s",
    444		 HCLGE_DRIVER_NAME);
    445	ptp->info.owner = THIS_MODULE;
    446	ptp->info.max_adj = HCLGE_PTP_CYCLE_ADJ_MAX;
    447	ptp->info.n_ext_ts = 0;
    448	ptp->info.pps = 0;
    449	ptp->info.adjfreq = hclge_ptp_adjfreq;
    450	ptp->info.adjtime = hclge_ptp_adjtime;
    451	ptp->info.gettimex64 = hclge_ptp_gettimex;
    452	ptp->info.settime64 = hclge_ptp_settime;
    453
    454	ptp->info.n_alarm = 0;
    455	ptp->clock = ptp_clock_register(&ptp->info, &hdev->pdev->dev);
    456	if (IS_ERR(ptp->clock)) {
    457		dev_err(&hdev->pdev->dev,
    458			"%d failed to register ptp clock, ret = %ld\n",
    459			ptp->info.n_alarm, PTR_ERR(ptp->clock));
    460		return -ENODEV;
    461	} else if (!ptp->clock) {
    462		dev_err(&hdev->pdev->dev, "failed to register ptp clock\n");
    463		return -ENODEV;
    464	}
    465
    466	spin_lock_init(&ptp->lock);
    467	ptp->io_base = hdev->hw.hw.io_base + HCLGE_PTP_REG_OFFSET;
    468	ptp->ts_cfg.rx_filter = HWTSTAMP_FILTER_NONE;
    469	ptp->ts_cfg.tx_type = HWTSTAMP_TX_OFF;
    470	hdev->ptp = ptp;
    471
    472	return 0;
    473}
    474
    475static void hclge_ptp_destroy_clock(struct hclge_dev *hdev)
    476{
    477	ptp_clock_unregister(hdev->ptp->clock);
    478	hdev->ptp->clock = NULL;
    479	devm_kfree(&hdev->pdev->dev, hdev->ptp);
    480	hdev->ptp = NULL;
    481}
    482
    483int hclge_ptp_init(struct hclge_dev *hdev)
    484{
    485	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
    486	struct timespec64 ts;
    487	int ret;
    488
    489	if (!test_bit(HNAE3_DEV_SUPPORT_PTP_B, ae_dev->caps))
    490		return 0;
    491
    492	if (!hdev->ptp) {
    493		ret = hclge_ptp_create_clock(hdev);
    494		if (ret)
    495			return ret;
    496
    497		ret = hclge_ptp_get_cycle(hdev);
    498		if (ret)
    499			return ret;
    500	}
    501
    502	ret = hclge_ptp_int_en(hdev, true);
    503	if (ret)
    504		goto out;
    505
    506	set_bit(HCLGE_PTP_FLAG_EN, &hdev->ptp->flags);
    507	ret = hclge_ptp_adjfreq(&hdev->ptp->info, 0);
    508	if (ret) {
    509		dev_err(&hdev->pdev->dev,
    510			"failed to init freq, ret = %d\n", ret);
    511		goto out;
    512	}
    513
    514	ret = hclge_ptp_set_ts_mode(hdev, &hdev->ptp->ts_cfg);
    515	if (ret) {
    516		dev_err(&hdev->pdev->dev,
    517			"failed to init ts mode, ret = %d\n", ret);
    518		goto out;
    519	}
    520
    521	ktime_get_real_ts64(&ts);
    522	ret = hclge_ptp_settime(&hdev->ptp->info, &ts);
    523	if (ret) {
    524		dev_err(&hdev->pdev->dev,
    525			"failed to init ts time, ret = %d\n", ret);
    526		goto out;
    527	}
    528
    529	set_bit(HCLGE_STATE_PTP_EN, &hdev->state);
    530	dev_info(&hdev->pdev->dev, "phc initializes ok!\n");
    531
    532	return 0;
    533
    534out:
    535	hclge_ptp_destroy_clock(hdev);
    536
    537	return ret;
    538}
    539
    540void hclge_ptp_uninit(struct hclge_dev *hdev)
    541{
    542	struct hclge_ptp *ptp = hdev->ptp;
    543
    544	if (!ptp)
    545		return;
    546
    547	hclge_ptp_int_en(hdev, false);
    548	clear_bit(HCLGE_STATE_PTP_EN, &hdev->state);
    549	clear_bit(HCLGE_PTP_FLAG_EN, &ptp->flags);
    550	ptp->ts_cfg.rx_filter = HWTSTAMP_FILTER_NONE;
    551	ptp->ts_cfg.tx_type = HWTSTAMP_TX_OFF;
    552
    553	if (hclge_ptp_set_ts_mode(hdev, &ptp->ts_cfg))
    554		dev_err(&hdev->pdev->dev, "failed to disable phc\n");
    555
    556	if (ptp->tx_skb) {
    557		struct sk_buff *skb = ptp->tx_skb;
    558
    559		ptp->tx_skb = NULL;
    560		dev_kfree_skb_any(skb);
    561	}
    562
    563	hclge_ptp_destroy_clock(hdev);
    564}