195eaa71cSShai Brandes /* SPDX-License-Identifier: BSD-3-Clause */ 295eaa71cSShai Brandes /* Copyright (c) Amazon.com, Inc. or its affiliates. 39ba7981eSJan Medala * All rights reserved. 49ba7981eSJan Medala */ 59ba7981eSJan Medala 69ba7981eSJan Medala #ifndef DPDK_ENA_COM_ENA_PLAT_DPDK_H_ 79ba7981eSJan Medala #define DPDK_ENA_COM_ENA_PLAT_DPDK_H_ 89ba7981eSJan Medala 99ba7981eSJan Medala #include <stdbool.h> 109ba7981eSJan Medala #include <stdlib.h> 119ba7981eSJan Medala #include <pthread.h> 129ba7981eSJan Medala #include <stdint.h> 13b2b02edeSMichal Krawczyk #include <inttypes.h> 149ba7981eSJan Medala #include <string.h> 159ba7981eSJan Medala #include <errno.h> 169ba7981eSJan Medala 17850e1bb1SMichal Krawczyk #include <ethdev_driver.h> 189ba7981eSJan Medala #include <rte_atomic.h> 199ba7981eSJan Medala #include <rte_branch_prediction.h> 209ba7981eSJan Medala #include <rte_cycles.h> 21fcbf1e14SJerin Jacob #include <rte_io.h> 229ba7981eSJan Medala #include <rte_log.h> 239ba7981eSJan Medala #include <rte_malloc.h> 249ba7981eSJan Medala #include <rte_memzone.h> 25b68309beSRafal Kozik #include <rte_prefetch.h> 269ba7981eSJan Medala #include <rte_spinlock.h> 279ba7981eSJan Medala 289ba7981eSJan Medala #include <sys/time.h> 299ba7981eSJan Medala 309ba7981eSJan Medala typedef uint64_t u64; 319ba7981eSJan Medala typedef uint32_t u32; 329ba7981eSJan Medala typedef uint16_t u16; 339ba7981eSJan Medala typedef uint8_t u8; 349ba7981eSJan Medala 35ac2fd8a5SMichal Krawczyk typedef struct rte_eth_dev ena_netdev; 369ba7981eSJan Medala typedef uint64_t dma_addr_t; 377c0a233eSAmit Bernstein 38b990c617SDaniel Mrzyglod #ifndef ETIME 39b990c617SDaniel Mrzyglod #define ETIME ETIMEDOUT 40b990c617SDaniel Mrzyglod #endif 419ba7981eSJan Medala 42c8a1898fSShai Brandes #define ENA_PRIu64 PRIu64 439ba7981eSJan Medala #define ena_atomic32_t rte_atomic32_t 440e72dbf2SJan Medala #define ena_mem_handle_t const struct rte_memzone * 459ba7981eSJan Medala 466dcee7cdSJan Medala #define SZ_256 (256U) 476dcee7cdSJan Medala #define SZ_4K (4096U) 489ba7981eSJan Medala 499ba7981eSJan Medala #define ENA_COM_OK 0 509ba7981eSJan Medala #define ENA_COM_NO_MEM -ENOMEM 519ba7981eSJan Medala #define ENA_COM_INVAL -EINVAL 529ba7981eSJan Medala #define ENA_COM_NO_SPACE -ENOSPC 539ba7981eSJan Medala #define ENA_COM_NO_DEVICE -ENODEV 549ba7981eSJan Medala #define ENA_COM_TIMER_EXPIRED -ETIME 559ba7981eSJan Medala #define ENA_COM_FAULT -EFAULT 566dcee7cdSJan Medala #define ENA_COM_TRY_AGAIN -EAGAIN 573adcba9aSMichal Krawczyk #define ENA_COM_UNSUPPORTED -EOPNOTSUPP 5805cffdcfSMichal Krawczyk #define ENA_COM_EIO -EIO 59f73f53f7SShai Brandes #define ENA_COM_DEVICE_BUSY -EBUSY 609ba7981eSJan Medala 619ba7981eSJan Medala #define ____cacheline_aligned __rte_cache_aligned 629ba7981eSJan Medala 63f73f53f7SShai Brandes #define ENA_CDESC_RING_SIZE_ALIGNMENT (1 << 12) /* 4K */ 64f73f53f7SShai Brandes 655ec22f97SMichal Krawczyk #define ENA_MSLEEP(x) rte_delay_us_sleep(x * 1000) 660c84e048SMichal Krawczyk #define ENA_USLEEP(x) rte_delay_us_sleep(x) 675ec22f97SMichal Krawczyk #define ENA_UDELAY(x) rte_delay_us_block(x) 689ba7981eSJan Medala 696dcee7cdSJan Medala #define ENA_TOUCH(x) ((void)(x)) 70966764d0SStephen Hemminger 719ba7981eSJan Medala #define wmb rte_wmb 72b68309beSRafal Kozik #define rmb rte_rmb 739ba7981eSJan Medala #define mb rte_mb 74b68309beSRafal Kozik #define mmiowb rte_io_wmb 759ba7981eSJan Medala #define __iomem 769ba7981eSJan Medala 77072b9f2bSStanislaw Kardach #ifndef READ_ONCE 78072b9f2bSStanislaw Kardach #define READ_ONCE(var) (*((volatile typeof(var) *)(&(var)))) 79072b9f2bSStanislaw Kardach #endif 80072b9f2bSStanislaw Kardach 81072b9f2bSStanislaw Kardach #define READ_ONCE8(var) READ_ONCE(var) 82072b9f2bSStanislaw Kardach #define READ_ONCE16(var) READ_ONCE(var) 83072b9f2bSStanislaw Kardach #define READ_ONCE32(var) READ_ONCE(var) 84072b9f2bSStanislaw Kardach 859ba7981eSJan Medala #define US_PER_S 1000000 869ba7981eSJan Medala #define ENA_GET_SYSTEM_USECS() \ 879ba7981eSJan Medala (rte_get_timer_cycles() * US_PER_S / rte_get_timer_hz()) 889ba7981eSJan Medala 896f1c9df9SStephen Hemminger extern int ena_logtype_com; 909ba7981eSJan Medala 918478f502SMichal Krawczyk #define ENA_MAX_T(type, x, y) RTE_MAX((type)(x), (type)(y)) 928478f502SMichal Krawczyk #define ENA_MAX32(x, y) ENA_MAX_T(uint32_t, (x), (y)) 938478f502SMichal Krawczyk #define ENA_MAX16(x, y) ENA_MAX_T(uint16_t, (x), (y)) 948478f502SMichal Krawczyk #define ENA_MAX8(x, y) ENA_MAX_T(uint8_t, (x), (y)) 958478f502SMichal Krawczyk #define ENA_MIN_T(type, x, y) RTE_MIN((type)(x), (type)(y)) 968478f502SMichal Krawczyk #define ENA_MIN32(x, y) ENA_MIN_T(uint32_t, (x), (y)) 978478f502SMichal Krawczyk #define ENA_MIN16(x, y) ENA_MIN_T(uint16_t, (x), (y)) 988478f502SMichal Krawczyk #define ENA_MIN8(x, y) ENA_MIN_T(uint8_t, (x), (y)) 999ba7981eSJan Medala 1007544aee8SRafal Kozik #define BITS_PER_LONG_LONG (__SIZEOF_LONG_LONG__ * 8) 1019ba7981eSJan Medala #define U64_C(x) x ## ULL 102f73f53f7SShai Brandes #define BIT(nr) RTE_BIT32(nr) 103f73f53f7SShai Brandes #define BIT64(nr) RTE_BIT64(nr) 1049ba7981eSJan Medala #define BITS_PER_LONG (__SIZEOF_LONG__ * 8) 1059ba7981eSJan Medala #define GENMASK(h, l) (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) 1067544aee8SRafal Kozik #define GENMASK_ULL(h, l) (((~0ULL) - (1ULL << (l)) + 1) & \ 1077544aee8SRafal Kozik (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h)))) 1089ba7981eSJan Medala 109*fd51012dSAndre Muezerie #define ena_trc_log(dev, level, fmt, ...) \ 110ac2fd8a5SMichal Krawczyk ( \ 111ac2fd8a5SMichal Krawczyk ENA_TOUCH(dev), \ 1126f1c9df9SStephen Hemminger rte_log(RTE_LOG_ ## level, ena_logtype_com, \ 113*fd51012dSAndre Muezerie "[ENA_COM: %s]" fmt, __func__, ##__VA_ARGS__) \ 114ac2fd8a5SMichal Krawczyk ) 1156f1c9df9SStephen Hemminger 116eea9fc6aSShai Brandes #if (defined RTE_ETHDEV_DEBUG_TX) || (defined RTE_ETHDEV_DEBUG_RX) 117eea9fc6aSShai Brandes #define ena_trc_dbg(dev, format, ...) ena_trc_log(dev, DEBUG, format, ##__VA_ARGS__) 118eea9fc6aSShai Brandes #else 119eea9fc6aSShai Brandes #define ena_trc_dbg(dev, format, ...) 120eea9fc6aSShai Brandes #endif 121*fd51012dSAndre Muezerie #define ena_trc_info(dev, format, ...) ena_trc_log(dev, INFO, format, ##__VA_ARGS__) 122*fd51012dSAndre Muezerie #define ena_trc_warn(dev, format, ...) ena_trc_log(dev, WARNING, format, ##__VA_ARGS__) 123*fd51012dSAndre Muezerie #define ena_trc_err(dev, format, ...) ena_trc_log(dev, ERR, format, ##__VA_ARGS__) 1249ba7981eSJan Medala 125*fd51012dSAndre Muezerie #define ENA_WARN(cond, dev, format, ...) \ 1263adcba9aSMichal Krawczyk do { \ 1273adcba9aSMichal Krawczyk if (unlikely(cond)) { \ 128ac2fd8a5SMichal Krawczyk ena_trc_err(dev, \ 1293adcba9aSMichal Krawczyk "Warn failed on %s:%s:%d:" format, \ 130*fd51012dSAndre Muezerie __FILE__, __func__, __LINE__, ##__VA_ARGS__); \ 1313adcba9aSMichal Krawczyk } \ 1323adcba9aSMichal Krawczyk } while (0) 1333adcba9aSMichal Krawczyk 1349ba7981eSJan Medala /* Spinlock related methods */ 1359ba7981eSJan Medala #define ena_spinlock_t rte_spinlock_t 1367c0a233eSAmit Bernstein #define ENA_SPINLOCK_INIT(spinlock) rte_spinlock_init(&(spinlock)) 1379ba7981eSJan Medala #define ENA_SPINLOCK_LOCK(spinlock, flags) \ 13893998f3cSTyler Retzlaff __extension__ ({(void)(flags); rte_spinlock_lock(&(spinlock)); }) 1399ba7981eSJan Medala #define ENA_SPINLOCK_UNLOCK(spinlock, flags) \ 14093998f3cSTyler Retzlaff __extension__ ({(void)(flags); rte_spinlock_unlock(&(spinlock)); }) 1417c0a233eSAmit Bernstein #define ENA_SPINLOCK_DESTROY(spinlock) ((void)(spinlock)) 1429ba7981eSJan Medala 143072b9f2bSStanislaw Kardach typedef struct { 144072b9f2bSStanislaw Kardach pthread_cond_t cond; 145072b9f2bSStanislaw Kardach pthread_mutex_t mutex; 146072b9f2bSStanislaw Kardach uint8_t flag; 147072b9f2bSStanislaw Kardach } ena_wait_event_t; 1489ba7981eSJan Medala 149072b9f2bSStanislaw Kardach #define ENA_WAIT_EVENT_INIT(waitevent) \ 1509ba7981eSJan Medala do { \ 151072b9f2bSStanislaw Kardach ena_wait_event_t *_we = &(waitevent); \ 152072b9f2bSStanislaw Kardach pthread_mutex_init(&_we->mutex, NULL); \ 153072b9f2bSStanislaw Kardach pthread_cond_init(&_we->cond, NULL); \ 154072b9f2bSStanislaw Kardach _we->flag = 0; \ 1559ba7981eSJan Medala } while (0) 1569ba7981eSJan Medala 1579ba7981eSJan Medala #define ENA_WAIT_EVENT_WAIT(waitevent, timeout) \ 1589ba7981eSJan Medala do { \ 159072b9f2bSStanislaw Kardach ena_wait_event_t *_we = &(waitevent); \ 160072b9f2bSStanislaw Kardach typeof(timeout) _tmo = (timeout); \ 161072b9f2bSStanislaw Kardach int ret = 0; \ 1629ba7981eSJan Medala struct timespec wait; \ 1639ba7981eSJan Medala struct timeval now; \ 1649ba7981eSJan Medala unsigned long timeout_us; \ 1659ba7981eSJan Medala gettimeofday(&now, NULL); \ 166072b9f2bSStanislaw Kardach wait.tv_sec = now.tv_sec + _tmo / 1000000UL; \ 167072b9f2bSStanislaw Kardach timeout_us = _tmo % 1000000UL; \ 1689ba7981eSJan Medala wait.tv_nsec = (now.tv_usec + timeout_us) * 1000UL; \ 169072b9f2bSStanislaw Kardach pthread_mutex_lock(&_we->mutex); \ 170072b9f2bSStanislaw Kardach while (ret == 0 && !_we->flag) { \ 171072b9f2bSStanislaw Kardach ret = pthread_cond_timedwait(&_we->cond, \ 172072b9f2bSStanislaw Kardach &_we->mutex, &wait); \ 173072b9f2bSStanislaw Kardach } \ 174072b9f2bSStanislaw Kardach /* Asserts only if not working on ena_wait_event_t */ \ 175072b9f2bSStanislaw Kardach if (unlikely(ret != 0 && ret != ETIMEDOUT)) \ 176072b9f2bSStanislaw Kardach ena_trc_err(NULL, \ 177072b9f2bSStanislaw Kardach "Invalid wait event. pthread ret: %d\n", ret); \ 178072b9f2bSStanislaw Kardach else if (unlikely(ret == ETIMEDOUT)) \ 179072b9f2bSStanislaw Kardach ena_trc_err(NULL, \ 180072b9f2bSStanislaw Kardach "Timeout waiting for " #waitevent "\n"); \ 181072b9f2bSStanislaw Kardach _we->flag = 0; \ 182072b9f2bSStanislaw Kardach pthread_mutex_unlock(&_we->mutex); \ 1839ba7981eSJan Medala } while (0) 184072b9f2bSStanislaw Kardach #define ENA_WAIT_EVENT_SIGNAL(waitevent) \ 185072b9f2bSStanislaw Kardach do { \ 186072b9f2bSStanislaw Kardach ena_wait_event_t *_we = &(waitevent); \ 187072b9f2bSStanislaw Kardach pthread_mutex_lock(&_we->mutex); \ 188072b9f2bSStanislaw Kardach _we->flag = 1; \ 189072b9f2bSStanislaw Kardach pthread_cond_signal(&_we->cond); \ 190072b9f2bSStanislaw Kardach pthread_mutex_unlock(&_we->mutex); \ 191072b9f2bSStanislaw Kardach } while (0) 1929ba7981eSJan Medala /* pthread condition doesn't need to be rearmed after usage */ 1939ba7981eSJan Medala #define ENA_WAIT_EVENT_CLEAR(...) 194072b9f2bSStanislaw Kardach #define ENA_WAIT_EVENT_DESTROY(waitevent) ((void)(waitevent)) 1959ba7981eSJan Medala 1969ba7981eSJan Medala #define ENA_MIGHT_SLEEP() 1979ba7981eSJan Medala 198b2b02edeSMichal Krawczyk #define ena_time_t uint64_t 199f73f53f7SShai Brandes #define ena_time_high_res_t uint64_t 200f73f53f7SShai Brandes 201f73f53f7SShai Brandes /* Note that high resolution timers are not used by the ENA PMD for now. 202f73f53f7SShai Brandes * Although these macro definitions compile, it shall fail the 203f73f53f7SShai Brandes * compilation in case the unimplemented API is called prematurely. 204f73f53f7SShai Brandes */ 205f73f53f7SShai Brandes #define ENA_TIME_EXPIRE(timeout) ((timeout) < rte_get_timer_cycles()) 206f73f53f7SShai Brandes #define ENA_TIME_EXPIRE_HIGH_RES(timeout) (RTE_SET_USED(timeout), 0) 207f73f53f7SShai Brandes #define ENA_TIME_INIT_HIGH_RES() 0 208f73f53f7SShai Brandes #define ENA_TIME_COMPARE_HIGH_RES(time1, time2) (RTE_SET_USED(time1), RTE_SET_USED(time2), 0) 2093adcba9aSMichal Krawczyk #define ENA_GET_SYSTEM_TIMEOUT(timeout_us) \ 2107c0a233eSAmit Bernstein ((timeout_us) * rte_get_timer_hz() / 1000000 + rte_get_timer_cycles()) 211f73f53f7SShai Brandes #define ENA_GET_SYSTEM_TIMEOUT_HIGH_RES(current_time, timeout_us) \ 212f73f53f7SShai Brandes (RTE_SET_USED(current_time), RTE_SET_USED(timeout_us), 0) 213f73f53f7SShai Brandes #define ENA_GET_SYSTEM_TIME_HIGH_RES() 0 2143adcba9aSMichal Krawczyk 215850e1bb1SMichal Krawczyk const struct rte_memzone * 216850e1bb1SMichal Krawczyk ena_mem_alloc_coherent(struct rte_eth_dev_data *data, size_t size, 217850e1bb1SMichal Krawczyk int socket_id, unsigned int alignment, void **virt_addr, 218850e1bb1SMichal Krawczyk dma_addr_t *phys_addr); 2193adcba9aSMichal Krawczyk 2204be6bc7fSMichal Krawczyk #define ENA_MEM_ALLOC_COHERENT_ALIGNED( \ 2217c0a233eSAmit Bernstein dmadev, size, virt, phys, mem_handle, alignment) \ 2229ba7981eSJan Medala do { \ 223850e1bb1SMichal Krawczyk void *virt_addr; \ 224850e1bb1SMichal Krawczyk dma_addr_t phys_addr; \ 225850e1bb1SMichal Krawczyk (mem_handle) = ena_mem_alloc_coherent((dmadev), (size), \ 226850e1bb1SMichal Krawczyk SOCKET_ID_ANY, (alignment), &virt_addr, &phys_addr); \ 227850e1bb1SMichal Krawczyk (virt) = virt_addr; \ 228850e1bb1SMichal Krawczyk (phys) = phys_addr; \ 2297c0a233eSAmit Bernstein } while (0) 2307c0a233eSAmit Bernstein #define ENA_MEM_ALLOC_COHERENT(dmadev, size, virt, phys, mem_handle) \ 2317c0a233eSAmit Bernstein ENA_MEM_ALLOC_COHERENT_ALIGNED(dmadev, size, virt, phys, \ 2327c0a233eSAmit Bernstein mem_handle, RTE_CACHE_LINE_SIZE) 2337c0a233eSAmit Bernstein #define ENA_MEM_FREE_COHERENT(dmadev, size, virt, phys, mem_handle) \ 23493998f3cSTyler Retzlaff __extension__ ({ ENA_TOUCH(size); ENA_TOUCH(phys); ENA_TOUCH(dmadev); \ 2357c0a233eSAmit Bernstein rte_memzone_free(mem_handle); }) 2367c0a233eSAmit Bernstein 2377c0a233eSAmit Bernstein #define ENA_MEM_ALLOC_COHERENT_NODE_ALIGNED( \ 2380e9fe0a4SShai Brandes dmadev, size, virt, phys, mem_handle, node, alignment) \ 2397c0a233eSAmit Bernstein do { \ 240850e1bb1SMichal Krawczyk void *virt_addr; \ 241850e1bb1SMichal Krawczyk dma_addr_t phys_addr; \ 242850e1bb1SMichal Krawczyk (mem_handle) = ena_mem_alloc_coherent((dmadev), (size), \ 243850e1bb1SMichal Krawczyk (node), (alignment), &virt_addr, &phys_addr); \ 244850e1bb1SMichal Krawczyk (virt) = virt_addr; \ 245850e1bb1SMichal Krawczyk (phys) = phys_addr; \ 2463d3edc26SJan Medala } while (0) 2474be6bc7fSMichal Krawczyk #define ENA_MEM_ALLOC_COHERENT_NODE( \ 2480e9fe0a4SShai Brandes dmadev, size, virt, phys, mem_handle, node) \ 2497c0a233eSAmit Bernstein ENA_MEM_ALLOC_COHERENT_NODE_ALIGNED(dmadev, size, virt, phys, \ 2500e9fe0a4SShai Brandes mem_handle, node, RTE_CACHE_LINE_SIZE) 2510e9fe0a4SShai Brandes #define ENA_MEM_ALLOC_NODE(dmadev, size, virt, node) \ 2523d3edc26SJan Medala do { \ 2530e9fe0a4SShai Brandes ENA_TOUCH(dmadev); \ 2549f32c7e7SRafal Kozik virt = rte_zmalloc_socket(NULL, size, 0, node); \ 2553d3edc26SJan Medala } while (0) 2563d3edc26SJan Medala 2579ba7981eSJan Medala #define ENA_MEM_ALLOC(dmadev, size) rte_zmalloc(NULL, size, 1) 258b2b02edeSMichal Krawczyk #define ENA_MEM_FREE(dmadev, ptr, size) \ 25993998f3cSTyler Retzlaff __extension__ ({ ENA_TOUCH(dmadev); ENA_TOUCH(size); rte_free(ptr); }) 2609ba7981eSJan Medala 261b68309beSRafal Kozik #define ENA_DB_SYNC(mem_handle) ((void)mem_handle) 262b68309beSRafal Kozik 2633adcba9aSMichal Krawczyk #define ENA_REG_WRITE32(bus, value, reg) \ 26493998f3cSTyler Retzlaff __extension__ ({ (void)(bus); rte_write32((value), (reg)); }) 265b68309beSRafal Kozik #define ENA_REG_WRITE32_RELAXED(bus, value, reg) \ 26693998f3cSTyler Retzlaff __extension__ ({ (void)(bus); rte_write32_relaxed((value), (reg)); }) 2673adcba9aSMichal Krawczyk #define ENA_REG_READ32(bus, reg) \ 26893998f3cSTyler Retzlaff __extension__ ({ (void)(bus); rte_read32_relaxed((reg)); }) 2699ba7981eSJan Medala 2709ba7981eSJan Medala #define ATOMIC32_INC(i32_ptr) rte_atomic32_inc(i32_ptr) 2719ba7981eSJan Medala #define ATOMIC32_DEC(i32_ptr) rte_atomic32_dec(i32_ptr) 2729ba7981eSJan Medala #define ATOMIC32_SET(i32_ptr, val) rte_atomic32_set(i32_ptr, val) 2739ba7981eSJan Medala #define ATOMIC32_READ(i32_ptr) rte_atomic32_read(i32_ptr) 2749ba7981eSJan Medala 2759ba7981eSJan Medala #define msleep(x) rte_delay_us(x * 1000) 2769ba7981eSJan Medala #define udelay(x) rte_delay_us(x) 2779ba7981eSJan Medala 278b68309beSRafal Kozik #define dma_rmb() rmb() 279b68309beSRafal Kozik 2809ba7981eSJan Medala #define MAX_ERRNO 4095 2819ba7981eSJan Medala #define IS_ERR(x) (((unsigned long)x) >= (unsigned long)-MAX_ERRNO) 2829ba7981eSJan Medala #define ERR_PTR(error) ((void *)(long)error) 2839ba7981eSJan Medala #define PTR_ERR(error) ((long)(void *)error) 2849ba7981eSJan Medala #define might_sleep() 2859ba7981eSJan Medala 286b68309beSRafal Kozik #define prefetch(x) rte_prefetch0(x) 287eb357d5fSMichal Krawczyk #define prefetchw(x) rte_prefetch0_write(x) 288b68309beSRafal Kozik 2893adcba9aSMichal Krawczyk #define lower_32_bits(x) ((uint32_t)(x)) 2903adcba9aSMichal Krawczyk #define upper_32_bits(x) ((uint32_t)(((x) >> 16) >> 16)) 2913adcba9aSMichal Krawczyk 292b68309beSRafal Kozik #define ENA_GET_SYSTEM_TIMEOUT(timeout_us) \ 2937c0a233eSAmit Bernstein ((timeout_us) * rte_get_timer_hz() / 1000000 + rte_get_timer_cycles()) 29404a6a3e6SMichal Krawczyk #define ENA_WAIT_EVENTS_DESTROY(admin_queue) ((void)(admin_queue)) 295b68309beSRafal Kozik 296b68309beSRafal Kozik /* The size must be 8 byte align */ 297b68309beSRafal Kozik #define ENA_MEMCPY_TO_DEVICE_64(dst, src, size) \ 298b68309beSRafal Kozik do { \ 299b68309beSRafal Kozik int count, i; \ 300b68309beSRafal Kozik uint64_t *to = (uint64_t *)(dst); \ 301b68309beSRafal Kozik const uint64_t *from = (const uint64_t *)(src); \ 302b68309beSRafal Kozik count = (size) / 8; \ 303b68309beSRafal Kozik for (i = 0; i < count; i++, from++, to++) \ 304b68309beSRafal Kozik rte_write64_relaxed(*from, to); \ 305b68309beSRafal Kozik } while(0) 306b68309beSRafal Kozik 307b68309beSRafal Kozik #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) 308b68309beSRafal Kozik 3096e585db6SMichal Krawczyk #define ENA_FFS(x) ffs(x) 3106e585db6SMichal Krawczyk 311086c6b66SMichal Krawczyk void ena_rss_key_fill(void *key, size_t size); 312086c6b66SMichal Krawczyk 313086c6b66SMichal Krawczyk #define ENA_RSS_FILL_KEY(key, size) ena_rss_key_fill(key, size) 314086c6b66SMichal Krawczyk 315d2138b23SMichal Krawczyk #define ENA_INTR_INITIAL_TX_INTERVAL_USECS_PLAT 0 316f73f53f7SShai Brandes #define ENA_INTR_INITIAL_RX_INTERVAL_USECS_PLAT 0 317b2b02edeSMichal Krawczyk 318d2138b23SMichal Krawczyk #include "ena_includes.h" 319f73f53f7SShai Brandes 320f73f53f7SShai Brandes #define ENA_BITS_PER_U64(bitmap) (ena_bits_per_u64(bitmap)) 321f73f53f7SShai Brandes 322f73f53f7SShai Brandes #define ENA_FIELD_GET(value, mask, offset) (((value) & (mask)) >> (offset)) 323368cbe96SShai Brandes #define ENA_FIELD_PREP(value, mask, offset) (((value) << (offset)) & (mask)) 324368cbe96SShai Brandes 325368cbe96SShai Brandes #define ENA_ZERO_SHIFT 0 326f73f53f7SShai Brandes 327f73f53f7SShai Brandes static __rte_always_inline int ena_bits_per_u64(uint64_t bitmap) 328f73f53f7SShai Brandes { 329f73f53f7SShai Brandes int count = 0; 330f73f53f7SShai Brandes 331f73f53f7SShai Brandes while (bitmap) { 332f73f53f7SShai Brandes bitmap &= (bitmap - 1); 333f73f53f7SShai Brandes count++; 334f73f53f7SShai Brandes } 335f73f53f7SShai Brandes 336f73f53f7SShai Brandes return count; 337f73f53f7SShai Brandes } 338f73f53f7SShai Brandes 3394b0bf936SShai Brandes #define ENA_ADMIN_OS_DPDK 3 340f73f53f7SShai Brandes 3419ba7981eSJan Medala #endif /* DPDK_ENA_COM_ENA_PLAT_DPDK_H_ */ 342