1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
|
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(C) 2021 Marvell.
*/
#ifndef _ROC_PLATFORM_H_
#define _ROC_PLATFORM_H_
#include <rte_compat.h>
#include <rte_alarm.h>
#include <rte_bitmap.h>
#include <bus_pci_driver.h>
#include <rte_byteorder.h>
#include <rte_common.h>
#include <rte_cycles.h>
#include <rte_ether.h>
#include <rte_interrupts.h>
#include <rte_io.h>
#include <rte_lcore.h>
#include <rte_log.h>
#include <rte_malloc.h>
#include <rte_memzone.h>
#include <rte_pci.h>
#include <rte_seqcount.h>
#include <rte_spinlock.h>
#include <rte_string_fns.h>
#include <rte_tailq.h>
#include <rte_telemetry.h>
#include "eal_filesystem.h"
#include "roc_bits.h"
#if defined(__ARM_FEATURE_SVE)
#define PLT_CPU_FEATURE_PREAMBLE \
".arch_extension crc\n" \
".arch_extension lse\n" \
".arch_extension sve\n"
#else
#define PLT_CPU_FEATURE_PREAMBLE \
".arch_extension crc\n" \
".arch_extension lse\n"
#endif
#define PLT_ASSERT RTE_ASSERT
#define PLT_VERIFY RTE_VERIFY
#define PLT_MEMZONE_NAMESIZE RTE_MEMZONE_NAMESIZE
#define PLT_PTR_ADD RTE_PTR_ADD
#define PLT_PTR_SUB RTE_PTR_SUB
#define PLT_PTR_DIFF RTE_PTR_DIFF
#define PLT_MAX_RXTX_INTR_VEC_ID RTE_MAX_RXTX_INTR_VEC_ID
#define PLT_INTR_VEC_RXTX_OFFSET RTE_INTR_VEC_RXTX_OFFSET
#define PLT_MIN RTE_MIN
#define PLT_MAX RTE_MAX
#define PLT_DIM RTE_DIM
#define PLT_SET_USED RTE_SET_USED
#define PLT_SWAP RTE_SWAP
#define PLT_STATIC_ASSERT(s) _Static_assert(s, #s)
#define PLT_ALIGN RTE_ALIGN
#define PLT_ALIGN_MUL_CEIL RTE_ALIGN_MUL_CEIL
#define PLT_MODEL_MZ_NAME "roc_model_mz"
#define PLT_CACHE_LINE_SIZE RTE_CACHE_LINE_SIZE
#define BITMASK_ULL GENMASK_ULL
#define PLT_ALIGN_CEIL RTE_ALIGN_CEIL
#define PLT_ALIGN_FLOOR RTE_ALIGN_FLOOR
#define PLT_INIT RTE_INIT
#define PLT_MAX_ETHPORTS RTE_MAX_ETHPORTS
#define PLT_TAILQ_FOREACH_SAFE RTE_TAILQ_FOREACH_SAFE
#ifndef PLT_ETHER_ADDR_LEN
#define PLT_ETHER_ADDR_LEN RTE_ETHER_ADDR_LEN
#endif
#define PLT_DISABLE_TEMPLATE_FUNC 0
#if PLT_DISABLE_TEMPLATE_FUNC
#ifndef CNXK_DIS_TMPLT_FUNC
#define CNXK_DIS_TMPLT_FUNC
#endif
#endif
/* Cast to specific datatypes */
#define PLT_PTR_CAST(val) ((void *)(val))
#define PLT_U64_CAST(val) ((uint64_t)(val))
#define PLT_U32_CAST(val) ((uint32_t)(val))
#define PLT_U16_CAST(val) ((uint16_t)(val))
/* Add / Sub pointer with scalar and cast to uint64_t */
#define PLT_PTR_ADD_U64_CAST(__ptr, __x) PLT_U64_CAST(PLT_PTR_ADD(__ptr, __x))
#define PLT_PTR_SUB_U64_CAST(__ptr, __x) PLT_U64_CAST(PLT_PTR_SUB(__ptr, __x))
/** Divide ceil */
#define PLT_DIV_CEIL(x, y) \
__extension__ ({ \
__typeof(x) __x = x; \
__typeof(y) __y = y; \
(__x + __y - 1) / __y; \
})
#define __plt_cache_aligned __rte_cache_aligned
#define __plt_always_inline __rte_always_inline
#define __plt_packed_begin __rte_packed_begin
#define __plt_packed_end __rte_packed_end
#define __plt_unused __rte_unused
#define __roc_api __rte_internal
#define plt_iova_t rte_iova_t
#define plt_pci_addr rte_pci_addr
#define plt_pci_device rte_pci_device
#define plt_pci_read_config rte_pci_read_config
#define plt_pci_find_ext_capability rte_pci_find_ext_capability
#define plt_sysfs_value_parse eal_parse_sysfs_value
#define plt_log2_u32 rte_log2_u32
#define plt_cpu_to_be_16 rte_cpu_to_be_16
#define plt_be_to_cpu_16 rte_be_to_cpu_16
#define plt_cpu_to_be_32 rte_cpu_to_be_32
#define plt_be_to_cpu_32 rte_be_to_cpu_32
#define plt_cpu_to_be_64 rte_cpu_to_be_64
#define plt_be_to_cpu_64 rte_be_to_cpu_64
#define __plt_aligned __rte_aligned
#define plt_align32pow2 rte_align32pow2
#define plt_align64pow2 rte_align64pow2
#define plt_align32prevpow2 rte_align32prevpow2
#define plt_bitmap rte_bitmap
#define plt_bitmap_init rte_bitmap_init
#define plt_bitmap_reset rte_bitmap_reset
#define plt_bitmap_free rte_bitmap_free
#define plt_bitmap_clear rte_bitmap_clear
#define plt_bitmap_set rte_bitmap_set
#define plt_bitmap_get rte_bitmap_get
#define plt_bitmap_scan_init __rte_bitmap_scan_init
#define plt_bitmap_scan rte_bitmap_scan
#define plt_bitmap_get_memory_footprint rte_bitmap_get_memory_footprint
#define plt_spinlock_t rte_spinlock_t
#define plt_spinlock_init rte_spinlock_init
#define plt_spinlock_lock rte_spinlock_lock
#define plt_spinlock_unlock rte_spinlock_unlock
#define plt_spinlock_trylock rte_spinlock_trylock
#define plt_seqcount_t rte_seqcount_t
#define plt_seqcount_init rte_seqcount_init
#define plt_seqcount_read_begin rte_seqcount_read_begin
#define plt_seqcount_read_retry rte_seqcount_read_retry
#define plt_seqcount_write_begin rte_seqcount_write_begin
#define plt_seqcount_write_end rte_seqcount_write_end
#define plt_thread_t rte_thread_t
#define plt_intr_callback_register rte_intr_callback_register
#define plt_intr_callback_unregister rte_intr_callback_unregister
#define plt_intr_disable rte_intr_disable
#define plt_thread_is_intr rte_thread_is_intr
#define plt_intr_callback_fn rte_intr_callback_fn
#define plt_thread_create_control rte_thread_create_internal_control
#define plt_thread_join rte_thread_join
static inline bool
plt_thread_is_valid(plt_thread_t thr)
{
return thr.opaque_id ? true : false;
}
#define plt_intr_efd_counter_size_get rte_intr_efd_counter_size_get
#define plt_intr_efd_counter_size_set rte_intr_efd_counter_size_set
#define plt_intr_vec_list_index_get rte_intr_vec_list_index_get
#define plt_intr_vec_list_index_set rte_intr_vec_list_index_set
#define plt_intr_vec_list_alloc rte_intr_vec_list_alloc
#define plt_intr_vec_list_free rte_intr_vec_list_free
#define plt_intr_fd_set rte_intr_fd_set
#define plt_intr_fd_get rte_intr_fd_get
#define plt_intr_dev_fd_get rte_intr_dev_fd_get
#define plt_intr_dev_fd_set rte_intr_dev_fd_set
#define plt_intr_type_get rte_intr_type_get
#define plt_intr_type_set rte_intr_type_set
#define plt_intr_instance_alloc rte_intr_instance_alloc
#define plt_intr_instance_dup rte_intr_instance_dup
#define plt_intr_instance_free rte_intr_instance_free
#define plt_intr_event_list_update rte_intr_event_list_update
#define plt_intr_max_intr_get rte_intr_max_intr_get
#define plt_intr_max_intr_set rte_intr_max_intr_set
#define plt_intr_nb_efd_get rte_intr_nb_efd_get
#define plt_intr_nb_efd_set rte_intr_nb_efd_set
#define plt_intr_nb_intr_get rte_intr_nb_intr_get
#define plt_intr_nb_intr_set rte_intr_nb_intr_set
#define plt_intr_efds_index_get rte_intr_efds_index_get
#define plt_intr_efds_index_set rte_intr_efds_index_set
#define plt_intr_elist_index_get rte_intr_elist_index_get
#define plt_intr_elist_index_set rte_intr_elist_index_set
#define plt_is_aligned rte_is_aligned
#define plt_alarm_set rte_eal_alarm_set
#define plt_alarm_cancel rte_eal_alarm_cancel
#define plt_intr_handle rte_intr_handle
#define plt_zmalloc(sz, align) rte_zmalloc("cnxk", sz, align)
#define plt_realloc rte_realloc
#define plt_free rte_free
#define plt_read64(addr) rte_read64_relaxed((volatile void *)(addr))
#define plt_write64(val, addr) \
rte_write64_relaxed((val), (volatile void *)(addr))
#define plt_read32(addr) rte_read32_relaxed((volatile void *)(addr))
#define plt_write32(val, addr) \
rte_write32_relaxed((val), (volatile void *)(addr))
#define plt_wmb() rte_wmb()
#define plt_rmb() rte_rmb()
#define plt_io_wmb() rte_io_wmb()
#define plt_io_rmb() rte_io_rmb()
#define plt_atomic_thread_fence rte_atomic_thread_fence
#define plt_atomic_store_explicit rte_atomic_store_explicit
#define plt_atomic_load_explicit rte_atomic_load_explicit
#define plt_memory_order_release rte_memory_order_release
#define plt_memory_order_acquire rte_memory_order_acquire
#define plt_memory_order_relaxed rte_memory_order_relaxed
#define plt_bit_relaxed_get32 rte_bit_relaxed_get32
#define plt_bit_relaxed_set32 rte_bit_relaxed_set32
#define plt_bit_relaxed_clear32 rte_bit_relaxed_clear32
#define plt_bit_relaxed_get64 rte_bit_relaxed_get64
#define plt_bit_relaxed_set64 rte_bit_relaxed_set64
#define plt_bit_relaxed_clear64 rte_bit_relaxed_clear64
#define plt_popcount32 rte_popcount32
#define plt_popcount64 rte_popcount64
#define plt_clz32 rte_clz32
#define plt_ctz64 rte_ctz64
#define plt_mmap mmap
#define PLT_PROT_READ PROT_READ
#define PLT_PROT_WRITE PROT_WRITE
#define PLT_MAP_SHARED MAP_SHARED
#define plt_memzone rte_memzone
#define plt_memzone_lookup rte_memzone_lookup
#define plt_memzone_reserve_cache_align(name, sz) \
rte_memzone_reserve_aligned(name, sz, 0, 0, RTE_CACHE_LINE_SIZE)
#define plt_memzone_free rte_memzone_free
#define plt_memzone_reserve_aligned(name, len, flags, align) \
rte_memzone_reserve_aligned((name), (len), 0, (flags), (align))
#define plt_tsc_hz rte_get_tsc_hz
#define plt_tsc_cycles rte_get_tsc_cycles
#define plt_delay_ms rte_delay_ms
#define plt_delay_us rte_delay_us
#define plt_lcore_id rte_lcore_id
#define plt_strlcpy rte_strlcpy
#define PLT_TEL_INT_VAL RTE_TEL_INT_VAL
#define PLT_TEL_STRING_VAL RTE_TEL_STRING_VAL
#define plt_tel_data rte_tel_data
#define plt_tel_data_start_array rte_tel_data_start_array
#define plt_tel_data_add_array_int rte_tel_data_add_array_int
#define plt_tel_data_add_array_string rte_tel_data_add_array_string
#define plt_tel_data_start_dict rte_tel_data_start_dict
#define plt_tel_data_add_dict_int rte_tel_data_add_dict_int
#define plt_tel_data_add_dict_ptr(d, n, v) \
rte_tel_data_add_dict_uint(d, n, (uint64_t)v)
#define plt_tel_data_add_dict_string rte_tel_data_add_dict_string
#define plt_tel_data_add_dict_u64 rte_tel_data_add_dict_uint
#define plt_telemetry_register_cmd rte_telemetry_register_cmd
#define __plt_atomic __rte_atomic
/* Log */
extern int cnxk_logtype_base;
#define RTE_LOGTYPE_base cnxk_logtype_base
extern int cnxk_logtype_mbox;
#define RTE_LOGTYPE_mbox cnxk_logtype_mbox
extern int cnxk_logtype_cpt;
#define RTE_LOGTYPE_cpt cnxk_logtype_cpt
extern int cnxk_logtype_ml;
#define RTE_LOGTYPE_ml cnxk_logtype_ml
extern int cnxk_logtype_npa;
#define RTE_LOGTYPE_npa cnxk_logtype_npa
extern int cnxk_logtype_nix;
#define RTE_LOGTYPE_nix cnxk_logtype_nix
extern int cnxk_logtype_npc;
#define RTE_LOGTYPE_npc cnxk_logtype_npc
extern int cnxk_logtype_sso;
#define RTE_LOGTYPE_sso cnxk_logtype_sso
extern int cnxk_logtype_tim;
#define RTE_LOGTYPE_tim cnxk_logtype_tim
extern int cnxk_logtype_tm;
#define RTE_LOGTYPE_tm cnxk_logtype_tm
extern int cnxk_logtype_ree;
#define RTE_LOGTYPE_ree cnxk_logtype_ree
extern int cnxk_logtype_dpi;
#define RTE_LOGTYPE_dpi cnxk_logtype_dpi
extern int cnxk_logtype_rep;
#define RTE_LOGTYPE_rep cnxk_logtype_rep
extern int cnxk_logtype_esw;
#define RTE_LOGTYPE_esw cnxk_logtype_esw
#define RTE_LOGTYPE_CNXK cnxk_logtype_base
#define plt_err(...) \
RTE_LOG_LINE_PREFIX(ERR, CNXK, "%s():%u ", __func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
#define plt_info(...) RTE_LOG_LINE(INFO, CNXK, __VA_ARGS__)
#define plt_warn(...) RTE_LOG_LINE(WARNING, CNXK, __VA_ARGS__)
#define plt_print(...) RTE_LOG_LINE(INFO, CNXK, __VA_ARGS__)
#define plt_dump(fmt, ...) fprintf(stderr, fmt "\n", ##__VA_ARGS__)
#define plt_dump_no_nl(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
/**
* Log debug message if given subsystem logging is enabled.
*/
#define plt_dbg(subsystem, ...) \
RTE_LOG_LINE_PREFIX(DEBUG, subsystem, "%s():%u ", __func__ RTE_LOG_COMMA __LINE__, \
__VA_ARGS__)
#define plt_base_dbg(fmt, ...) plt_dbg(base, fmt, ##__VA_ARGS__)
#define plt_cpt_dbg(fmt, ...) plt_dbg(cpt, fmt, ##__VA_ARGS__)
#define plt_mbox_dbg(fmt, ...) plt_dbg(mbox, fmt, ##__VA_ARGS__)
#define plt_ml_dbg(fmt, ...) plt_dbg(ml, fmt, ##__VA_ARGS__)
#define plt_npa_dbg(fmt, ...) plt_dbg(npa, fmt, ##__VA_ARGS__)
#define plt_nix_dbg(fmt, ...) plt_dbg(nix, fmt, ##__VA_ARGS__)
#define plt_npc_dbg(fmt, ...) plt_dbg(npc, fmt, ##__VA_ARGS__)
#define plt_sso_dbg(fmt, ...) plt_dbg(sso, fmt, ##__VA_ARGS__)
#define plt_tim_dbg(fmt, ...) plt_dbg(tim, fmt, ##__VA_ARGS__)
#define plt_tm_dbg(fmt, ...) plt_dbg(tm, fmt, ##__VA_ARGS__)
#define plt_ree_dbg(fmt, ...) plt_dbg(ree, fmt, ##__VA_ARGS__)
#define plt_dpi_dbg(fmt, ...) plt_dbg(dpi, fmt, ##__VA_ARGS__)
#define plt_rep_dbg(fmt, ...) plt_dbg(rep, fmt, ##__VA_ARGS__)
#define plt_esw_dbg(fmt, ...) plt_dbg(esw, fmt, ##__VA_ARGS__)
/* Datapath logs */
#define plt_dp_err(...) \
RTE_LOG_DP_LINE_PREFIX(ERR, CNXK, "%s():%u ", __func__ RTE_LOG_COMMA __LINE__, \
__VA_ARGS__)
#define plt_dp_info(...) \
RTE_LOG_DP_LINE_PREFIX(INFO, CNXK, "%s():%u ", __func__ RTE_LOG_COMMA __LINE__, \
__VA_ARGS__)
#define plt_dp_dbg(...) \
RTE_LOG_DP_LINE_PREFIX(DEBUG, CNXK, "%s():%u ", __func__ RTE_LOG_COMMA __LINE__, \
__VA_ARGS__)
#ifdef __cplusplus
#define CNXK_PCI_ID(subsystem_dev, dev) \
{ \
RTE_CLASS_ANY_ID, PCI_VENDOR_ID_CAVIUM, (dev), RTE_PCI_ANY_ID, \
(subsystem_dev), \
}
#else
#define CNXK_PCI_ID(subsystem_dev, dev) \
{ \
.class_id = RTE_CLASS_ANY_ID, \
.vendor_id = PCI_VENDOR_ID_CAVIUM, .device_id = (dev), \
.subsystem_vendor_id = RTE_PCI_ANY_ID, \
.subsystem_device_id = (subsystem_dev), \
}
#endif
int plt_irq_register(struct plt_intr_handle *intr_handle, plt_intr_callback_fn cb, void *data,
unsigned int vec);
void plt_irq_unregister(struct plt_intr_handle *intr_handle, plt_intr_callback_fn cb, void *data,
unsigned int vec);
int plt_irq_reconfigure(struct plt_intr_handle *intr_handle, uint16_t max_intr);
int plt_irq_disable(struct plt_intr_handle *intr_handle);
/* Device memory does not support unaligned access, instruct compiler to
* not optimize the memory access when working with mailbox memory.
*/
#ifndef __io
#define __io volatile
#endif
__rte_internal
int roc_plt_init(void);
__rte_internal
uint16_t roc_plt_control_lmt_id_get(void);
__rte_internal
uint16_t roc_plt_lmt_validate(void);
/* Init callbacks */
typedef int (*roc_plt_init_cb_t)(void);
int __roc_api roc_plt_init_cb_register(roc_plt_init_cb_t cb);
static inline const void *
plt_lmt_region_reserve_aligned(const char *name, size_t len, uint32_t align)
{
/* To ensure returned memory is physically contiguous, bounding
* the start and end address in 2M range.
*/
return rte_memzone_reserve_bounded(name, len, SOCKET_ID_ANY,
RTE_MEMZONE_IOVA_CONTIG,
align, RTE_PGSIZE_2M);
}
#endif /* _ROC_PLATFORM_H_ */
|