1*8ada2c1cSShachar Raindel /* 2*8ada2c1cSShachar Raindel * Copyright (c) 2014 Mellanox Technologies. All rights reserved. 3*8ada2c1cSShachar Raindel * 4*8ada2c1cSShachar Raindel * This software is available to you under a choice of one of two 5*8ada2c1cSShachar Raindel * licenses. You may choose to be licensed under the terms of the GNU 6*8ada2c1cSShachar Raindel * General Public License (GPL) Version 2, available from the file 7*8ada2c1cSShachar Raindel * COPYING in the main directory of this source tree, or the 8*8ada2c1cSShachar Raindel * OpenIB.org BSD license below: 9*8ada2c1cSShachar Raindel * 10*8ada2c1cSShachar Raindel * Redistribution and use in source and binary forms, with or 11*8ada2c1cSShachar Raindel * without modification, are permitted provided that the following 12*8ada2c1cSShachar Raindel * conditions are met: 13*8ada2c1cSShachar Raindel * 14*8ada2c1cSShachar Raindel * - Redistributions of source code must retain the above 15*8ada2c1cSShachar Raindel * copyright notice, this list of conditions and the following 16*8ada2c1cSShachar Raindel * disclaimer. 17*8ada2c1cSShachar Raindel * 18*8ada2c1cSShachar Raindel * - Redistributions in binary form must reproduce the above 19*8ada2c1cSShachar Raindel * copyright notice, this list of conditions and the following 20*8ada2c1cSShachar Raindel * disclaimer in the documentation and/or other materials 21*8ada2c1cSShachar Raindel * provided with the distribution. 22*8ada2c1cSShachar Raindel * 23*8ada2c1cSShachar Raindel * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24*8ada2c1cSShachar Raindel * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25*8ada2c1cSShachar Raindel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26*8ada2c1cSShachar Raindel * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27*8ada2c1cSShachar Raindel * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28*8ada2c1cSShachar Raindel * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29*8ada2c1cSShachar Raindel * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30*8ada2c1cSShachar Raindel * SOFTWARE. 31*8ada2c1cSShachar Raindel */ 32*8ada2c1cSShachar Raindel 33*8ada2c1cSShachar Raindel #ifndef IB_UMEM_ODP_H 34*8ada2c1cSShachar Raindel #define IB_UMEM_ODP_H 35*8ada2c1cSShachar Raindel 36*8ada2c1cSShachar Raindel #include <rdma/ib_umem.h> 37*8ada2c1cSShachar Raindel 38*8ada2c1cSShachar Raindel struct ib_umem_odp { 39*8ada2c1cSShachar Raindel /* 40*8ada2c1cSShachar Raindel * An array of the pages included in the on-demand paging umem. 41*8ada2c1cSShachar Raindel * Indices of pages that are currently not mapped into the device will 42*8ada2c1cSShachar Raindel * contain NULL. 43*8ada2c1cSShachar Raindel */ 44*8ada2c1cSShachar Raindel struct page **page_list; 45*8ada2c1cSShachar Raindel /* 46*8ada2c1cSShachar Raindel * An array of the same size as page_list, with DMA addresses mapped 47*8ada2c1cSShachar Raindel * for pages the pages in page_list. The lower two bits designate 48*8ada2c1cSShachar Raindel * access permissions. See ODP_READ_ALLOWED_BIT and 49*8ada2c1cSShachar Raindel * ODP_WRITE_ALLOWED_BIT. 50*8ada2c1cSShachar Raindel */ 51*8ada2c1cSShachar Raindel dma_addr_t *dma_list; 52*8ada2c1cSShachar Raindel /* 53*8ada2c1cSShachar Raindel * The umem_mutex protects the page_list and dma_list fields of an ODP 54*8ada2c1cSShachar Raindel * umem, allowing only a single thread to map/unmap pages. 55*8ada2c1cSShachar Raindel */ 56*8ada2c1cSShachar Raindel struct mutex umem_mutex; 57*8ada2c1cSShachar Raindel void *private; /* for the HW driver to use. */ 58*8ada2c1cSShachar Raindel }; 59*8ada2c1cSShachar Raindel 60*8ada2c1cSShachar Raindel #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 61*8ada2c1cSShachar Raindel 62*8ada2c1cSShachar Raindel int ib_umem_odp_get(struct ib_ucontext *context, struct ib_umem *umem); 63*8ada2c1cSShachar Raindel 64*8ada2c1cSShachar Raindel void ib_umem_odp_release(struct ib_umem *umem); 65*8ada2c1cSShachar Raindel 66*8ada2c1cSShachar Raindel /* 67*8ada2c1cSShachar Raindel * The lower 2 bits of the DMA address signal the R/W permissions for 68*8ada2c1cSShachar Raindel * the entry. To upgrade the permissions, provide the appropriate 69*8ada2c1cSShachar Raindel * bitmask to the map_dma_pages function. 70*8ada2c1cSShachar Raindel * 71*8ada2c1cSShachar Raindel * Be aware that upgrading a mapped address might result in change of 72*8ada2c1cSShachar Raindel * the DMA address for the page. 73*8ada2c1cSShachar Raindel */ 74*8ada2c1cSShachar Raindel #define ODP_READ_ALLOWED_BIT (1<<0ULL) 75*8ada2c1cSShachar Raindel #define ODP_WRITE_ALLOWED_BIT (1<<1ULL) 76*8ada2c1cSShachar Raindel 77*8ada2c1cSShachar Raindel #define ODP_DMA_ADDR_MASK (~(ODP_READ_ALLOWED_BIT | ODP_WRITE_ALLOWED_BIT)) 78*8ada2c1cSShachar Raindel 79*8ada2c1cSShachar Raindel int ib_umem_odp_map_dma_pages(struct ib_umem *umem, u64 start_offset, u64 bcnt, 80*8ada2c1cSShachar Raindel u64 access_mask, unsigned long current_seq); 81*8ada2c1cSShachar Raindel 82*8ada2c1cSShachar Raindel void ib_umem_odp_unmap_dma_pages(struct ib_umem *umem, u64 start_offset, 83*8ada2c1cSShachar Raindel u64 bound); 84*8ada2c1cSShachar Raindel 85*8ada2c1cSShachar Raindel #else /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */ 86*8ada2c1cSShachar Raindel 87*8ada2c1cSShachar Raindel static inline int ib_umem_odp_get(struct ib_ucontext *context, 88*8ada2c1cSShachar Raindel struct ib_umem *umem) 89*8ada2c1cSShachar Raindel { 90*8ada2c1cSShachar Raindel return -EINVAL; 91*8ada2c1cSShachar Raindel } 92*8ada2c1cSShachar Raindel 93*8ada2c1cSShachar Raindel static inline void ib_umem_odp_release(struct ib_umem *umem) {} 94*8ada2c1cSShachar Raindel 95*8ada2c1cSShachar Raindel #endif /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */ 96*8ada2c1cSShachar Raindel 97*8ada2c1cSShachar Raindel #endif /* IB_UMEM_ODP_H */ 98