1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
8 #include <rte_bus_pci.h>
10 #include "otx2_common.h"
12 #include "otx2_mbox.h"
13 #include "otx2_mempool.h"
15 /* Common HWCAP flags. Use from LSB bits */
16 #define OTX2_HWCAP_F_VF BIT_ULL(8) /* VF device */
17 #define otx2_dev_is_vf(dev) (dev->hwcap & OTX2_HWCAP_F_VF)
18 #define otx2_dev_is_pf(dev) (!(dev->hwcap & OTX2_HWCAP_F_VF))
19 #define otx2_dev_is_lbk(dev) ((dev->hwcap & OTX2_HWCAP_F_VF) && \
20 (dev->tx_chan_base < 0x700))
21 #define otx2_dev_revid(dev) (dev->hwcap & 0xFF)
23 #define otx2_dev_is_A0(dev) \
24 ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x0) && \
25 (RVU_PCI_REV_MINOR(otx2_dev_revid(dev)) == 0x0))
26 #define otx2_dev_is_Ax(dev) \
27 ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x0))
31 /* Link status callback */
32 typedef void (*otx2_link_status_t)(struct otx2_dev *dev,
33 struct cgx_link_user_info *link);
34 /* PTP info callback */
35 typedef int (*otx2_ptp_info_t)(struct otx2_dev *dev, bool ptp_en);
38 otx2_link_status_t link_status_update;
39 otx2_ptp_info_t ptp_info_update;
43 int node __rte_cache_aligned; \
47 uint8_t mbox_active; \
49 uint64_t active_vfs[MAX_VFPF_DWORD_BITS]; \
52 struct otx2_mbox mbox_local; \
53 struct otx2_mbox mbox_up; \
54 struct otx2_mbox mbox_vfpf; \
55 struct otx2_mbox mbox_vfpf_up; \
57 int timer_set; /* ~0 : no alarm handling */ \
59 struct otx2_npa_lf npalf; \
60 struct otx2_mbox *mbox; \
62 const struct otx2_dev_ops *ops
68 int otx2_dev_priv_init(struct rte_pci_device *pci_dev, void *otx2_dev);
70 /* Common dev init and fini routines */
72 static __rte_always_inline int
73 otx2_dev_init(struct rte_pci_device *pci_dev, void *otx2_dev)
75 struct otx2_dev *dev = otx2_dev;
79 rc = rte_pci_read_config(pci_dev, &rev_id,
80 1, RVU_PCI_REVISION_ID);
82 otx2_err("Failed to read pci revision id, rc=%d", rc);
86 if (pci_dev->id.subsystem_device_id == PCI_SUBSYS_DEVID_96XX_95XX)
91 return otx2_dev_priv_init(pci_dev, otx2_dev);
94 void otx2_dev_fini(struct rte_pci_device *pci_dev, void *otx2_dev);
95 int otx2_dev_active_vfs(void *otx2_dev);
97 #define RVU_PFVF_PF_SHIFT 10
98 #define RVU_PFVF_PF_MASK 0x3F
99 #define RVU_PFVF_FUNC_SHIFT 0
100 #define RVU_PFVF_FUNC_MASK 0x3FF
103 otx2_get_vf(uint16_t pf_func)
105 return (((pf_func >> RVU_PFVF_FUNC_SHIFT) & RVU_PFVF_FUNC_MASK) - 1);
109 otx2_get_pf(uint16_t pf_func)
111 return (pf_func >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
115 otx2_pfvf_func(int pf, int vf)
117 return (pf << RVU_PFVF_PF_SHIFT) | ((vf << RVU_PFVF_FUNC_SHIFT) + 1);
121 otx2_is_afvf(uint16_t pf_func)
123 return !(pf_func & ~RVU_PFVF_FUNC_MASK);
126 #endif /* _OTX2_DEV_H */