2013-09-10 07:38:16 +04:00
/*
* Copyright ( c ) 2013 , Cisco Systems , Inc . All rights reserved .
*
2015-09-30 23:34:00 +03:00
* This software is available to you under a choice of one of two
* licenses . You may choose to be licensed under the terms of the GNU
* General Public License ( GPL ) Version 2 , available from the file
* COPYING in the main directory of this source tree , or the
* BSD license below :
*
* Redistribution and use in source and binary forms , with or
* without modification , are permitted provided that the following
* conditions are met :
*
* - Redistributions of source code must retain the above
* copyright notice , this list of conditions and the following
* disclaimer .
*
* - Redistributions in binary form must reproduce the above
* copyright notice , this list of conditions and the following
* disclaimer in the documentation and / or other materials
* provided with the distribution .
2013-09-10 07:38:16 +04:00
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND ,
* EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN
* ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
*
*/
# ifndef USNIC_UIOM_H_
# define USNIC_UIOM_H_
# include <linux/list.h>
# include <linux/scatterlist.h>
# include "usnic_uiom_interval_tree.h"
2018-06-13 20:19:42 +03:00
struct ib_ucontext ;
2013-09-10 07:38:16 +04:00
# define USNIC_UIOM_READ (1)
# define USNIC_UIOM_WRITE (2)
# define USNIC_UIOM_MAX_PD_CNT (1000)
# define USNIC_UIOM_MAX_MR_CNT (1000000)
# define USNIC_UIOM_MAX_MR_SIZE (~0UL)
# define USNIC_UIOM_PAGE_SIZE (PAGE_SIZE)
struct usnic_uiom_dev {
struct device * dev ;
struct list_head link ;
} ;
struct usnic_uiom_pd {
struct iommu_domain * domain ;
spinlock_t lock ;
2017-09-09 02:15:08 +03:00
struct rb_root_cached root ;
2013-09-10 07:38:16 +04:00
struct list_head devs ;
int dev_cnt ;
} ;
struct usnic_uiom_reg {
struct usnic_uiom_pd * pd ;
unsigned long va ;
size_t length ;
int offset ;
int page_size ;
int writable ;
struct list_head chunk_list ;
struct work_struct work ;
2018-09-16 20:44:46 +03:00
struct mm_struct * owning_mm ;
2013-09-10 07:38:16 +04:00
} ;
struct usnic_uiom_chunk {
struct list_head list ;
int nents ;
2023-09-29 21:04:26 +03:00
struct scatterlist page_list [ ] __counted_by ( nents ) ;
2013-09-10 07:38:16 +04:00
} ;
2022-04-05 17:35:59 +03:00
struct usnic_uiom_pd * usnic_uiom_alloc_pd ( struct device * dev ) ;
2013-09-10 07:38:16 +04:00
void usnic_uiom_dealloc_pd ( struct usnic_uiom_pd * pd ) ;
int usnic_uiom_attach_dev_to_pd ( struct usnic_uiom_pd * pd , struct device * dev ) ;
void usnic_uiom_detach_dev_from_pd ( struct usnic_uiom_pd * pd ,
struct device * dev ) ;
struct device * * usnic_uiom_get_dev_list ( struct usnic_uiom_pd * pd ) ;
void usnic_uiom_free_dev_list ( struct device * * devs ) ;
struct usnic_uiom_reg * usnic_uiom_reg_get ( struct usnic_uiom_pd * pd ,
unsigned long addr , size_t size ,
int access , int dmasync ) ;
2019-03-31 19:10:06 +03:00
void usnic_uiom_reg_release ( struct usnic_uiom_reg * uiomr ) ;
2013-09-10 07:38:16 +04:00
# endif /* USNIC_UIOM_H_ */