1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
4 #ifndef _ROC_NIX_INL_H_
5 #define _ROC_NIX_INL_H_
8 #define ROC_NIX_INL_ONF_IPSEC_INB_HW_SZ \
9 PLT_ALIGN(sizeof(struct roc_onf_ipsec_inb_sa), ROC_ALIGN)
10 /* ONF INB SW reserved area */
11 #define ROC_NIX_INL_ONF_IPSEC_INB_SW_RSVD 384
12 #define ROC_NIX_INL_ONF_IPSEC_INB_SA_SZ \
13 (ROC_NIX_INL_ONF_IPSEC_INB_HW_SZ + ROC_NIX_INL_ONF_IPSEC_INB_SW_RSVD)
14 #define ROC_NIX_INL_ONF_IPSEC_INB_SA_SZ_LOG2 9
16 /* ONF OUTB HW area */
17 #define ROC_NIX_INL_ONF_IPSEC_OUTB_HW_SZ \
18 PLT_ALIGN(sizeof(struct roc_onf_ipsec_outb_sa), ROC_ALIGN)
19 /* ONF OUTB SW reserved area */
20 #define ROC_NIX_INL_ONF_IPSEC_OUTB_SW_RSVD 128
21 #define ROC_NIX_INL_ONF_IPSEC_OUTB_SA_SZ \
22 (ROC_NIX_INL_ONF_IPSEC_OUTB_HW_SZ + ROC_NIX_INL_ONF_IPSEC_OUTB_SW_RSVD)
23 #define ROC_NIX_INL_ONF_IPSEC_OUTB_SA_SZ_LOG2 8
26 #define ROC_NIX_INL_OT_IPSEC_INB_HW_SZ \
27 PLT_ALIGN(sizeof(struct roc_ot_ipsec_inb_sa), ROC_ALIGN)
28 /* OT INB SW reserved area */
29 #define ROC_NIX_INL_OT_IPSEC_INB_SW_RSVD 128
30 #define ROC_NIX_INL_OT_IPSEC_INB_SA_SZ \
31 (ROC_NIX_INL_OT_IPSEC_INB_HW_SZ + ROC_NIX_INL_OT_IPSEC_INB_SW_RSVD)
32 #define ROC_NIX_INL_OT_IPSEC_INB_SA_SZ_LOG2 10
35 #define ROC_NIX_INL_OT_IPSEC_OUTB_HW_SZ \
36 PLT_ALIGN(sizeof(struct roc_ot_ipsec_outb_sa), ROC_ALIGN)
37 /* OT OUTB SW reserved area */
38 #define ROC_NIX_INL_OT_IPSEC_OUTB_SW_RSVD 128
39 #define ROC_NIX_INL_OT_IPSEC_OUTB_SA_SZ \
40 (ROC_NIX_INL_OT_IPSEC_OUTB_HW_SZ + ROC_NIX_INL_OT_IPSEC_OUTB_SW_RSVD)
41 #define ROC_NIX_INL_OT_IPSEC_OUTB_SA_SZ_LOG2 9
43 /* Alignment of SA Base */
44 #define ROC_NIX_INL_SA_BASE_ALIGN BIT_ULL(16)
46 static inline struct roc_onf_ipsec_inb_sa *
47 roc_nix_inl_onf_ipsec_inb_sa(uintptr_t base, uint64_t idx)
49 uint64_t off = idx << ROC_NIX_INL_ONF_IPSEC_INB_SA_SZ_LOG2;
51 return PLT_PTR_ADD(base, off);
54 static inline struct roc_onf_ipsec_outb_sa *
55 roc_nix_inl_onf_ipsec_outb_sa(uintptr_t base, uint64_t idx)
57 uint64_t off = idx << ROC_NIX_INL_ONF_IPSEC_OUTB_SA_SZ_LOG2;
59 return PLT_PTR_ADD(base, off);
63 roc_nix_inl_onf_ipsec_inb_sa_sw_rsvd(void *sa)
65 return PLT_PTR_ADD(sa, ROC_NIX_INL_ONF_IPSEC_INB_HW_SZ);
69 roc_nix_inl_onf_ipsec_outb_sa_sw_rsvd(void *sa)
71 return PLT_PTR_ADD(sa, ROC_NIX_INL_ONF_IPSEC_OUTB_HW_SZ);
74 static inline struct roc_ot_ipsec_inb_sa *
75 roc_nix_inl_ot_ipsec_inb_sa(uintptr_t base, uint64_t idx)
77 uint64_t off = idx << ROC_NIX_INL_OT_IPSEC_INB_SA_SZ_LOG2;
79 return PLT_PTR_ADD(base, off);
82 static inline struct roc_ot_ipsec_outb_sa *
83 roc_nix_inl_ot_ipsec_outb_sa(uintptr_t base, uint64_t idx)
85 uint64_t off = idx << ROC_NIX_INL_OT_IPSEC_OUTB_SA_SZ_LOG2;
87 return PLT_PTR_ADD(base, off);
91 roc_nix_inl_ot_ipsec_inb_sa_sw_rsvd(void *sa)
93 return PLT_PTR_ADD(sa, ROC_NIX_INL_OT_IPSEC_INB_HW_SZ);
97 roc_nix_inl_ot_ipsec_outb_sa_sw_rsvd(void *sa)
99 return PLT_PTR_ADD(sa, ROC_NIX_INL_OT_IPSEC_OUTB_HW_SZ);
102 /* Inline device SSO Work callback */
103 typedef void (*roc_nix_inl_sso_work_cb_t)(uint64_t *gw, void *args);
105 struct roc_nix_inl_dev {
106 /* Input parameters */
107 struct plt_pci_device *pci_dev;
108 uint16_t ipsec_in_max_spi;
110 bool is_multi_channel;
114 /* End of input parameters */
116 #define ROC_NIX_INL_MEM_SZ (1280)
117 uint8_t reserved[ROC_NIX_INL_MEM_SZ] __plt_cache_aligned;
118 } __plt_cache_aligned;
120 /* NIX Inline Device API */
121 int __roc_api roc_nix_inl_dev_init(struct roc_nix_inl_dev *roc_inl_dev);
122 int __roc_api roc_nix_inl_dev_fini(struct roc_nix_inl_dev *roc_inl_dev);
123 void __roc_api roc_nix_inl_dev_dump(struct roc_nix_inl_dev *roc_inl_dev);
124 bool __roc_api roc_nix_inl_dev_is_probed(void);
125 void __roc_api roc_nix_inl_dev_lock(void);
126 void __roc_api roc_nix_inl_dev_unlock(void);
128 /* NIX Inline Inbound API */
129 int __roc_api roc_nix_inl_inb_init(struct roc_nix *roc_nix);
130 int __roc_api roc_nix_inl_inb_fini(struct roc_nix *roc_nix);
131 bool __roc_api roc_nix_inl_inb_is_enabled(struct roc_nix *roc_nix);
132 uintptr_t __roc_api roc_nix_inl_inb_sa_base_get(struct roc_nix *roc_nix,
134 uint32_t __roc_api roc_nix_inl_inb_sa_max_spi(struct roc_nix *roc_nix,
136 uint32_t __roc_api roc_nix_inl_inb_sa_sz(struct roc_nix *roc_nix,
138 uintptr_t __roc_api roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix,
139 bool inl_dev_sa, uint32_t spi);
140 void __roc_api roc_nix_inb_mode_set(struct roc_nix *roc_nix, bool use_inl_dev);
141 int __roc_api roc_nix_inl_dev_rq_get(struct roc_nix_rq *rq);
142 int __roc_api roc_nix_inl_dev_rq_put(struct roc_nix_rq *rq);
143 bool __roc_api roc_nix_inb_is_with_inl_dev(struct roc_nix *roc_nix);
144 struct roc_nix_rq *__roc_api roc_nix_inl_dev_rq(void);
145 int __roc_api roc_nix_inl_inb_tag_update(struct roc_nix *roc_nix,
146 uint32_t tag_const, uint8_t tt);
147 uint64_t __roc_api roc_nix_inl_dev_rq_limit_get(void);
149 /* NIX Inline Outbound API */
150 int __roc_api roc_nix_inl_outb_init(struct roc_nix *roc_nix);
151 int __roc_api roc_nix_inl_outb_fini(struct roc_nix *roc_nix);
152 bool __roc_api roc_nix_inl_outb_is_enabled(struct roc_nix *roc_nix);
153 uintptr_t __roc_api roc_nix_inl_outb_sa_base_get(struct roc_nix *roc_nix);
154 struct roc_cpt_lf *__roc_api
155 roc_nix_inl_outb_lf_base_get(struct roc_nix *roc_nix);
156 uint16_t __roc_api roc_nix_inl_outb_sso_pffunc_get(struct roc_nix *roc_nix);
157 int __roc_api roc_nix_inl_cb_register(roc_nix_inl_sso_work_cb_t cb, void *args);
158 int __roc_api roc_nix_inl_cb_unregister(roc_nix_inl_sso_work_cb_t cb,
160 /* NIX Inline/Outbound API */
161 enum roc_nix_inl_sa_sync_op {
162 ROC_NIX_INL_SA_OP_FLUSH,
163 ROC_NIX_INL_SA_OP_FLUSH_INVAL,
164 ROC_NIX_INL_SA_OP_RELOAD,
167 int __roc_api roc_nix_inl_sa_sync(struct roc_nix *roc_nix, void *sa, bool inb,
168 enum roc_nix_inl_sa_sync_op op);
170 #endif /* _ROC_NIX_INL_H_ */