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