Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Header file for FPGA Accelerated Function Unit (AFU) Driver
0004  *
0005  * Copyright (C) 2017-2018 Intel Corporation, Inc.
0006  *
0007  * Authors:
0008  *     Wu Hao <hao.wu@intel.com>
0009  *     Xiao Guangrong <guangrong.xiao@linux.intel.com>
0010  *     Joseph Grecco <joe.grecco@intel.com>
0011  *     Enno Luebbers <enno.luebbers@intel.com>
0012  *     Tim Whisonant <tim.whisonant@intel.com>
0013  *     Ananda Ravuri <ananda.ravuri@intel.com>
0014  *     Henry Mitchel <henry.mitchel@intel.com>
0015  */
0016 
0017 #ifndef __DFL_AFU_H
0018 #define __DFL_AFU_H
0019 
0020 #include <linux/mm.h>
0021 
0022 #include "dfl.h"
0023 
0024 /**
0025  * struct dfl_afu_mmio_region - afu mmio region data structure
0026  *
0027  * @index: region index.
0028  * @flags: region flags (access permission).
0029  * @size: region size.
0030  * @offset: region offset from start of the device fd.
0031  * @phys: region's physical address.
0032  * @node: node to add to afu feature dev's region list.
0033  */
0034 struct dfl_afu_mmio_region {
0035     u32 index;
0036     u32 flags;
0037     u64 size;
0038     u64 offset;
0039     u64 phys;
0040     struct list_head node;
0041 };
0042 
0043 /**
0044  * struct fpga_afu_dma_region - afu DMA region data structure
0045  *
0046  * @user_addr: region userspace virtual address.
0047  * @length: region length.
0048  * @iova: region IO virtual address.
0049  * @pages: ptr to pages of this region.
0050  * @node: rb tree node.
0051  * @in_use: flag to indicate if this region is in_use.
0052  */
0053 struct dfl_afu_dma_region {
0054     u64 user_addr;
0055     u64 length;
0056     u64 iova;
0057     struct page **pages;
0058     struct rb_node node;
0059     bool in_use;
0060 };
0061 
0062 /**
0063  * struct dfl_afu - afu device data structure
0064  *
0065  * @region_cur_offset: current region offset from start to the device fd.
0066  * @num_regions: num of mmio regions.
0067  * @regions: the mmio region linked list of this afu feature device.
0068  * @dma_regions: root of dma regions rb tree.
0069  * @num_umsgs: num of umsgs.
0070  * @pdata: afu platform device's pdata.
0071  */
0072 struct dfl_afu {
0073     u64 region_cur_offset;
0074     int num_regions;
0075     u8 num_umsgs;
0076     struct list_head regions;
0077     struct rb_root dma_regions;
0078 
0079     struct dfl_feature_platform_data *pdata;
0080 };
0081 
0082 /* hold pdata->lock when call __afu_port_enable/disable */
0083 int __afu_port_enable(struct platform_device *pdev);
0084 int __afu_port_disable(struct platform_device *pdev);
0085 
0086 void afu_mmio_region_init(struct dfl_feature_platform_data *pdata);
0087 int afu_mmio_region_add(struct dfl_feature_platform_data *pdata,
0088             u32 region_index, u64 region_size, u64 phys, u32 flags);
0089 void afu_mmio_region_destroy(struct dfl_feature_platform_data *pdata);
0090 int afu_mmio_region_get_by_index(struct dfl_feature_platform_data *pdata,
0091                  u32 region_index,
0092                  struct dfl_afu_mmio_region *pregion);
0093 int afu_mmio_region_get_by_offset(struct dfl_feature_platform_data *pdata,
0094                   u64 offset, u64 size,
0095                   struct dfl_afu_mmio_region *pregion);
0096 void afu_dma_region_init(struct dfl_feature_platform_data *pdata);
0097 void afu_dma_region_destroy(struct dfl_feature_platform_data *pdata);
0098 int afu_dma_map_region(struct dfl_feature_platform_data *pdata,
0099                u64 user_addr, u64 length, u64 *iova);
0100 int afu_dma_unmap_region(struct dfl_feature_platform_data *pdata, u64 iova);
0101 struct dfl_afu_dma_region *
0102 afu_dma_region_find(struct dfl_feature_platform_data *pdata,
0103             u64 iova, u64 size);
0104 
0105 extern const struct dfl_feature_ops port_err_ops;
0106 extern const struct dfl_feature_id port_err_id_table[];
0107 extern const struct attribute_group port_err_group;
0108 
0109 #endif /* __DFL_AFU_H */