18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Header file for FPGA Accelerated Function Unit (AFU) Driver 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2017-2018 Intel Corporation, Inc. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Authors: 88c2ecf20Sopenharmony_ci * Wu Hao <hao.wu@intel.com> 98c2ecf20Sopenharmony_ci * Xiao Guangrong <guangrong.xiao@linux.intel.com> 108c2ecf20Sopenharmony_ci * Joseph Grecco <joe.grecco@intel.com> 118c2ecf20Sopenharmony_ci * Enno Luebbers <enno.luebbers@intel.com> 128c2ecf20Sopenharmony_ci * Tim Whisonant <tim.whisonant@intel.com> 138c2ecf20Sopenharmony_ci * Ananda Ravuri <ananda.ravuri@intel.com> 148c2ecf20Sopenharmony_ci * Henry Mitchel <henry.mitchel@intel.com> 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#ifndef __DFL_AFU_H 188c2ecf20Sopenharmony_ci#define __DFL_AFU_H 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <linux/mm.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#include "dfl.h" 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/** 258c2ecf20Sopenharmony_ci * struct dfl_afu_mmio_region - afu mmio region data structure 268c2ecf20Sopenharmony_ci * 278c2ecf20Sopenharmony_ci * @index: region index. 288c2ecf20Sopenharmony_ci * @flags: region flags (access permission). 298c2ecf20Sopenharmony_ci * @size: region size. 308c2ecf20Sopenharmony_ci * @offset: region offset from start of the device fd. 318c2ecf20Sopenharmony_ci * @phys: region's physical address. 328c2ecf20Sopenharmony_ci * @node: node to add to afu feature dev's region list. 338c2ecf20Sopenharmony_ci */ 348c2ecf20Sopenharmony_cistruct dfl_afu_mmio_region { 358c2ecf20Sopenharmony_ci u32 index; 368c2ecf20Sopenharmony_ci u32 flags; 378c2ecf20Sopenharmony_ci u64 size; 388c2ecf20Sopenharmony_ci u64 offset; 398c2ecf20Sopenharmony_ci u64 phys; 408c2ecf20Sopenharmony_ci struct list_head node; 418c2ecf20Sopenharmony_ci}; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci/** 448c2ecf20Sopenharmony_ci * struct fpga_afu_dma_region - afu DMA region data structure 458c2ecf20Sopenharmony_ci * 468c2ecf20Sopenharmony_ci * @user_addr: region userspace virtual address. 478c2ecf20Sopenharmony_ci * @length: region length. 488c2ecf20Sopenharmony_ci * @iova: region IO virtual address. 498c2ecf20Sopenharmony_ci * @pages: ptr to pages of this region. 508c2ecf20Sopenharmony_ci * @node: rb tree node. 518c2ecf20Sopenharmony_ci * @in_use: flag to indicate if this region is in_use. 528c2ecf20Sopenharmony_ci */ 538c2ecf20Sopenharmony_cistruct dfl_afu_dma_region { 548c2ecf20Sopenharmony_ci u64 user_addr; 558c2ecf20Sopenharmony_ci u64 length; 568c2ecf20Sopenharmony_ci u64 iova; 578c2ecf20Sopenharmony_ci struct page **pages; 588c2ecf20Sopenharmony_ci struct rb_node node; 598c2ecf20Sopenharmony_ci bool in_use; 608c2ecf20Sopenharmony_ci}; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci/** 638c2ecf20Sopenharmony_ci * struct dfl_afu - afu device data structure 648c2ecf20Sopenharmony_ci * 658c2ecf20Sopenharmony_ci * @region_cur_offset: current region offset from start to the device fd. 668c2ecf20Sopenharmony_ci * @num_regions: num of mmio regions. 678c2ecf20Sopenharmony_ci * @regions: the mmio region linked list of this afu feature device. 688c2ecf20Sopenharmony_ci * @dma_regions: root of dma regions rb tree. 698c2ecf20Sopenharmony_ci * @num_umsgs: num of umsgs. 708c2ecf20Sopenharmony_ci * @pdata: afu platform device's pdata. 718c2ecf20Sopenharmony_ci */ 728c2ecf20Sopenharmony_cistruct dfl_afu { 738c2ecf20Sopenharmony_ci u64 region_cur_offset; 748c2ecf20Sopenharmony_ci int num_regions; 758c2ecf20Sopenharmony_ci u8 num_umsgs; 768c2ecf20Sopenharmony_ci struct list_head regions; 778c2ecf20Sopenharmony_ci struct rb_root dma_regions; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci struct dfl_feature_platform_data *pdata; 808c2ecf20Sopenharmony_ci}; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci/* hold pdata->lock when call __afu_port_enable/disable */ 838c2ecf20Sopenharmony_civoid __afu_port_enable(struct platform_device *pdev); 848c2ecf20Sopenharmony_ciint __afu_port_disable(struct platform_device *pdev); 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_civoid afu_mmio_region_init(struct dfl_feature_platform_data *pdata); 878c2ecf20Sopenharmony_ciint afu_mmio_region_add(struct dfl_feature_platform_data *pdata, 888c2ecf20Sopenharmony_ci u32 region_index, u64 region_size, u64 phys, u32 flags); 898c2ecf20Sopenharmony_civoid afu_mmio_region_destroy(struct dfl_feature_platform_data *pdata); 908c2ecf20Sopenharmony_ciint afu_mmio_region_get_by_index(struct dfl_feature_platform_data *pdata, 918c2ecf20Sopenharmony_ci u32 region_index, 928c2ecf20Sopenharmony_ci struct dfl_afu_mmio_region *pregion); 938c2ecf20Sopenharmony_ciint afu_mmio_region_get_by_offset(struct dfl_feature_platform_data *pdata, 948c2ecf20Sopenharmony_ci u64 offset, u64 size, 958c2ecf20Sopenharmony_ci struct dfl_afu_mmio_region *pregion); 968c2ecf20Sopenharmony_civoid afu_dma_region_init(struct dfl_feature_platform_data *pdata); 978c2ecf20Sopenharmony_civoid afu_dma_region_destroy(struct dfl_feature_platform_data *pdata); 988c2ecf20Sopenharmony_ciint afu_dma_map_region(struct dfl_feature_platform_data *pdata, 998c2ecf20Sopenharmony_ci u64 user_addr, u64 length, u64 *iova); 1008c2ecf20Sopenharmony_ciint afu_dma_unmap_region(struct dfl_feature_platform_data *pdata, u64 iova); 1018c2ecf20Sopenharmony_cistruct dfl_afu_dma_region * 1028c2ecf20Sopenharmony_ciafu_dma_region_find(struct dfl_feature_platform_data *pdata, 1038c2ecf20Sopenharmony_ci u64 iova, u64 size); 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ciextern const struct dfl_feature_ops port_err_ops; 1068c2ecf20Sopenharmony_ciextern const struct dfl_feature_id port_err_id_table[]; 1078c2ecf20Sopenharmony_ciextern const struct attribute_group port_err_group; 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci#endif /* __DFL_AFU_H */ 110