common/octeontx2: add FLR IRQ handler
[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
14 /* Common HWCAP flags. Use from LSB bits */
15 #define OTX2_HWCAP_F_VF         BIT_ULL(0) /* VF device */
16 #define otx2_dev_is_vf(dev)     (dev->hwcap & OTX2_HWCAP_F_VF)
17 #define otx2_dev_is_pf(dev)     (!(dev->hwcap & OTX2_HWCAP_F_VF))
18 #define otx2_dev_is_lbk(dev)    ((dev->hwcap & OTX2_HWCAP_F_VF) && \
19                                  (dev->tx_chan_base < 0x700))
20
21 #define OTX2_HWCAP_F_A0         BIT_ULL(1) /* A0 device */
22 #define otx2_dev_is_A0(dev)     (dev->hwcap & OTX2_HWCAP_F_A0)
23
24 struct otx2_dev;
25
26 /* Link status callback */
27 typedef void (*otx2_link_status_t)(struct otx2_dev *dev,
28                                    struct cgx_link_user_info *link);
29 /* PTP info callback */
30 typedef int (*otx2_ptp_info_t)(struct otx2_dev *dev, bool ptp_en);
31
32 struct otx2_dev_ops {
33         otx2_link_status_t link_status_update;
34         otx2_ptp_info_t ptp_info_update;
35 };
36
37 #define OTX2_DEV                                        \
38         int node __rte_cache_aligned;                   \
39         uint16_t pf;                                    \
40         int16_t vf;                                     \
41         uint16_t pf_func;                               \
42         uint8_t mbox_active;                            \
43         bool drv_inited;                                \
44         uint64_t active_vfs[MAX_VFPF_DWORD_BITS];       \
45         uintptr_t bar2;                                 \
46         uintptr_t bar4;                                 \
47         struct otx2_mbox mbox_local;                    \
48         struct otx2_mbox mbox_up;                       \
49         struct otx2_mbox mbox_vfpf;                     \
50         struct otx2_mbox mbox_vfpf_up;                  \
51         otx2_intr_t intr;                               \
52         int timer_set;  /* ~0 : no alarm handling */    \
53         uint64_t hwcap;                                 \
54         struct otx2_npa_lf npalf;                       \
55         struct otx2_mbox *mbox;                         \
56         uint16_t maxvf;                                 \
57         const struct otx2_dev_ops *ops
58
59 struct otx2_dev {
60         OTX2_DEV;
61 };
62
63 int otx2_dev_init(struct rte_pci_device *pci_dev, void *otx2_dev);
64 void otx2_dev_fini(struct rte_pci_device *pci_dev, void *otx2_dev);
65 int otx2_dev_active_vfs(void *otx2_dev);
66
67 #define RVU_PFVF_PF_SHIFT       10
68 #define RVU_PFVF_PF_MASK        0x3F
69 #define RVU_PFVF_FUNC_SHIFT     0
70 #define RVU_PFVF_FUNC_MASK      0x3FF
71
72 static inline int
73 otx2_get_vf(uint16_t pf_func)
74 {
75         return (((pf_func >> RVU_PFVF_FUNC_SHIFT) & RVU_PFVF_FUNC_MASK) - 1);
76 }
77
78 static inline int
79 otx2_get_pf(uint16_t pf_func)
80 {
81         return (pf_func >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
82 }
83
84 static inline int
85 otx2_pfvf_func(int pf, int vf)
86 {
87         return (pf << RVU_PFVF_PF_SHIFT) | ((vf << RVU_PFVF_FUNC_SHIFT) + 1);
88 }
89
90 static inline int
91 otx2_is_afvf(uint16_t pf_func)
92 {
93         return !(pf_func & ~RVU_PFVF_FUNC_MASK);
94 }
95
96 #endif /* _OTX2_DEV_H */