common/cnxk: update to v1.16 ucc codes
[dpdk.git] / drivers / common / octeontx2 / otx2_dev.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4
5 #ifndef _OTX2_DEV_H
6 #define _OTX2_DEV_H
7
8 #include <rte_bus_pci.h>
9
10 #include "otx2_common.h"
11 #include "otx2_irq.h"
12 #include "otx2_mbox.h"
13 #include "otx2_mempool.h"
14
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)
22 #define otx2_dev_is_sdp(dev)    (dev->sdp_link)
23
24 #define otx2_dev_is_vf_or_sdp(dev)                              \
25         (otx2_dev_is_vf(dev) || otx2_dev_is_sdp(dev))
26
27 #define otx2_dev_is_A0(dev)                                     \
28         ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x0) &&     \
29          (RVU_PCI_REV_MINOR(otx2_dev_revid(dev)) == 0x0))
30 #define otx2_dev_is_Ax(dev)                                     \
31         ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x0))
32
33 #define otx2_dev_is_95xx_A0(dev)                                \
34         ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x0) &&     \
35          (RVU_PCI_REV_MINOR(otx2_dev_revid(dev)) == 0x0) &&     \
36          (RVU_PCI_REV_MIDR_ID(otx2_dev_revid(dev)) == 0x1))
37 #define otx2_dev_is_95xx_Ax(dev)                                \
38         ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x0) &&     \
39          (RVU_PCI_REV_MIDR_ID(otx2_dev_revid(dev)) == 0x1))
40
41 #define otx2_dev_is_96xx_A0(dev)                                \
42         ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x0) &&     \
43          (RVU_PCI_REV_MINOR(otx2_dev_revid(dev)) == 0x0) &&     \
44          (RVU_PCI_REV_MIDR_ID(otx2_dev_revid(dev)) == 0x0))
45 #define otx2_dev_is_96xx_Ax(dev)                                \
46         ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x0) &&     \
47          (RVU_PCI_REV_MIDR_ID(otx2_dev_revid(dev)) == 0x0))
48
49 #define otx2_dev_is_96xx_Cx(dev)                                \
50         ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x2) &&     \
51          (RVU_PCI_REV_MIDR_ID(otx2_dev_revid(dev)) == 0x0))
52
53 #define otx2_dev_is_96xx_C0(dev)                                \
54         ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x2) &&     \
55          (RVU_PCI_REV_MINOR(otx2_dev_revid(dev)) == 0x0) &&     \
56          (RVU_PCI_REV_MIDR_ID(otx2_dev_revid(dev)) == 0x0))
57
58 #define otx2_dev_is_98xx(dev)                                   \
59          (RVU_PCI_REV_MIDR_ID(otx2_dev_revid(dev)) == 0x3)
60
61 struct otx2_dev;
62
63 /* Link status update callback */
64 typedef void (*otx2_link_status_update_t)(struct otx2_dev *dev,
65                                    struct cgx_link_user_info *link);
66 /* PTP info callback */
67 typedef int (*otx2_ptp_info_t)(struct otx2_dev *dev, bool ptp_en);
68 /* Link status get callback */
69 typedef void (*otx2_link_status_get_t)(struct otx2_dev *dev,
70                                    struct cgx_link_user_info *link);
71
72 struct otx2_dev_ops {
73         otx2_link_status_update_t link_status_update;
74         otx2_ptp_info_t ptp_info_update;
75         otx2_link_status_get_t link_status_get;
76 };
77
78 #define OTX2_DEV                                        \
79         int node __rte_cache_aligned;                   \
80         uint16_t pf;                                    \
81         int16_t vf;                                     \
82         uint16_t pf_func;                               \
83         uint8_t mbox_active;                            \
84         bool drv_inited;                                \
85         uint64_t active_vfs[MAX_VFPF_DWORD_BITS];       \
86         uintptr_t bar2;                                 \
87         uintptr_t bar4;                                 \
88         struct otx2_mbox mbox_local;                    \
89         struct otx2_mbox mbox_up;                       \
90         struct otx2_mbox mbox_vfpf;                     \
91         struct otx2_mbox mbox_vfpf_up;                  \
92         otx2_intr_t intr;                               \
93         int timer_set;  /* ~0 : no alarm handling */    \
94         uint64_t hwcap;                                 \
95         struct otx2_npa_lf npalf;                       \
96         struct otx2_mbox *mbox;                         \
97         uint16_t maxvf;                                 \
98         const struct otx2_dev_ops *ops
99
100 struct otx2_dev {
101         OTX2_DEV;
102 };
103
104 __rte_internal
105 int otx2_dev_priv_init(struct rte_pci_device *pci_dev, void *otx2_dev);
106
107 /* Common dev init and fini routines */
108
109 static __rte_always_inline int
110 otx2_dev_init(struct rte_pci_device *pci_dev, void *otx2_dev)
111 {
112         struct otx2_dev *dev = otx2_dev;
113         uint8_t rev_id;
114         int rc;
115
116         rc = rte_pci_read_config(pci_dev, &rev_id,
117                                  1, RVU_PCI_REVISION_ID);
118         if (rc != 1) {
119                 otx2_err("Failed to read pci revision id, rc=%d", rc);
120                 return rc;
121         }
122
123         dev->hwcap = rev_id;
124         return otx2_dev_priv_init(pci_dev, otx2_dev);
125 }
126
127 __rte_internal
128 void otx2_dev_fini(struct rte_pci_device *pci_dev, void *otx2_dev);
129 __rte_internal
130 int otx2_dev_active_vfs(void *otx2_dev);
131
132 #define RVU_PFVF_PF_SHIFT       10
133 #define RVU_PFVF_PF_MASK        0x3F
134 #define RVU_PFVF_FUNC_SHIFT     0
135 #define RVU_PFVF_FUNC_MASK      0x3FF
136
137 static inline int
138 otx2_get_vf(uint16_t pf_func)
139 {
140         return (((pf_func >> RVU_PFVF_FUNC_SHIFT) & RVU_PFVF_FUNC_MASK) - 1);
141 }
142
143 static inline int
144 otx2_get_pf(uint16_t pf_func)
145 {
146         return (pf_func >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
147 }
148
149 static inline int
150 otx2_pfvf_func(int pf, int vf)
151 {
152         return (pf << RVU_PFVF_PF_SHIFT) | ((vf << RVU_PFVF_FUNC_SHIFT) + 1);
153 }
154
155 static inline int
156 otx2_is_afvf(uint16_t pf_func)
157 {
158         return !(pf_func & ~RVU_PFVF_FUNC_MASK);
159 }
160
161 #endif /* _OTX2_DEV_H */