1*3037e6cfSViacheslav Galaktionov /* SPDX-License-Identifier: BSD-3-Clause 2*3037e6cfSViacheslav Galaktionov * Copyright(c) 2021 Xilinx, Inc. 3*3037e6cfSViacheslav Galaktionov */ 4*3037e6cfSViacheslav Galaktionov 5*3037e6cfSViacheslav Galaktionov #ifndef _SFC_NIC_DMA_DP_H 6*3037e6cfSViacheslav Galaktionov #define _SFC_NIC_DMA_DP_H 7*3037e6cfSViacheslav Galaktionov 8*3037e6cfSViacheslav Galaktionov #include <rte_common.h> 9*3037e6cfSViacheslav Galaktionov 10*3037e6cfSViacheslav Galaktionov #ifdef __cplusplus 11*3037e6cfSViacheslav Galaktionov extern "C" { 12*3037e6cfSViacheslav Galaktionov #endif 13*3037e6cfSViacheslav Galaktionov 14*3037e6cfSViacheslav Galaktionov #define SFC_NIC_DMA_REGIONS_MAX 2 15*3037e6cfSViacheslav Galaktionov 16*3037e6cfSViacheslav Galaktionov struct sfc_nic_dma_region { 17*3037e6cfSViacheslav Galaktionov rte_iova_t nic_base; 18*3037e6cfSViacheslav Galaktionov rte_iova_t trgt_base; 19*3037e6cfSViacheslav Galaktionov rte_iova_t trgt_end; 20*3037e6cfSViacheslav Galaktionov }; 21*3037e6cfSViacheslav Galaktionov 22*3037e6cfSViacheslav Galaktionov /** Driver cache for NIC DMA regions */ 23*3037e6cfSViacheslav Galaktionov struct sfc_nic_dma_info { 24*3037e6cfSViacheslav Galaktionov struct sfc_nic_dma_region regions[SFC_NIC_DMA_REGIONS_MAX]; 25*3037e6cfSViacheslav Galaktionov unsigned int nb_regions; 26*3037e6cfSViacheslav Galaktionov }; 27*3037e6cfSViacheslav Galaktionov 28*3037e6cfSViacheslav Galaktionov static inline rte_iova_t sfc_nic_dma_map(const struct sfc_nic_dma_info * nic_dma_info,rte_iova_t trgt_addr,size_t len)29*3037e6cfSViacheslav Galaktionovsfc_nic_dma_map(const struct sfc_nic_dma_info *nic_dma_info, 30*3037e6cfSViacheslav Galaktionov rte_iova_t trgt_addr, size_t len) 31*3037e6cfSViacheslav Galaktionov { 32*3037e6cfSViacheslav Galaktionov unsigned int i; 33*3037e6cfSViacheslav Galaktionov 34*3037e6cfSViacheslav Galaktionov for (i = 0; i < nic_dma_info->nb_regions; i++) { 35*3037e6cfSViacheslav Galaktionov const struct sfc_nic_dma_region *region; 36*3037e6cfSViacheslav Galaktionov 37*3037e6cfSViacheslav Galaktionov region = &nic_dma_info->regions[i]; 38*3037e6cfSViacheslav Galaktionov /* 39*3037e6cfSViacheslav Galaktionov * Do not sum trgt_addr and len to avoid overflow 40*3037e6cfSViacheslav Galaktionov * checking. 41*3037e6cfSViacheslav Galaktionov */ 42*3037e6cfSViacheslav Galaktionov if (region->trgt_base <= trgt_addr && 43*3037e6cfSViacheslav Galaktionov trgt_addr <= region->trgt_end && 44*3037e6cfSViacheslav Galaktionov len <= region->trgt_end - trgt_addr) { 45*3037e6cfSViacheslav Galaktionov return region->nic_base + 46*3037e6cfSViacheslav Galaktionov (trgt_addr - region->trgt_base); 47*3037e6cfSViacheslav Galaktionov } 48*3037e6cfSViacheslav Galaktionov } 49*3037e6cfSViacheslav Galaktionov 50*3037e6cfSViacheslav Galaktionov return RTE_BAD_IOVA; 51*3037e6cfSViacheslav Galaktionov } 52*3037e6cfSViacheslav Galaktionov 53*3037e6cfSViacheslav Galaktionov #ifdef __cplusplus 54*3037e6cfSViacheslav Galaktionov } 55*3037e6cfSViacheslav Galaktionov #endif 56*3037e6cfSViacheslav Galaktionov 57*3037e6cfSViacheslav Galaktionov #endif /* _SFC_NIC_DMA_DP_H */ 58