xref: /dpdk/drivers/net/sfc/sfc_nic_dma_dp.h (revision 3037e6cf3ddec72a4091b5f023301152a0640900)
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 Galaktionov sfc_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