dfl-afu.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Header file for FPGA Accelerated Function Unit (AFU) Driver
  4. *
  5. * Copyright (C) 2017-2018 Intel Corporation, Inc.
  6. *
  7. * Authors:
  8. * Wu Hao <hao.wu@intel.com>
  9. * Xiao Guangrong <guangrong.xiao@linux.intel.com>
  10. * Joseph Grecco <joe.grecco@intel.com>
  11. * Enno Luebbers <enno.luebbers@intel.com>
  12. * Tim Whisonant <tim.whisonant@intel.com>
  13. * Ananda Ravuri <ananda.ravuri@intel.com>
  14. * Henry Mitchel <henry.mitchel@intel.com>
  15. */
  16. #ifndef __DFL_AFU_H
  17. #define __DFL_AFU_H
  18. #include <linux/mm.h>
  19. #include "dfl.h"
  20. /**
  21. * struct dfl_afu_mmio_region - afu mmio region data structure
  22. *
  23. * @index: region index.
  24. * @flags: region flags (access permission).
  25. * @size: region size.
  26. * @offset: region offset from start of the device fd.
  27. * @phys: region's physical address.
  28. * @node: node to add to afu feature dev's region list.
  29. */
  30. struct dfl_afu_mmio_region {
  31. u32 index;
  32. u32 flags;
  33. u64 size;
  34. u64 offset;
  35. u64 phys;
  36. struct list_head node;
  37. };
  38. /**
  39. * struct fpga_afu_dma_region - afu DMA region data structure
  40. *
  41. * @user_addr: region userspace virtual address.
  42. * @length: region length.
  43. * @iova: region IO virtual address.
  44. * @pages: ptr to pages of this region.
  45. * @node: rb tree node.
  46. * @in_use: flag to indicate if this region is in_use.
  47. */
  48. struct dfl_afu_dma_region {
  49. u64 user_addr;
  50. u64 length;
  51. u64 iova;
  52. struct page **pages;
  53. struct rb_node node;
  54. bool in_use;
  55. };
  56. /**
  57. * struct dfl_afu - afu device data structure
  58. *
  59. * @region_cur_offset: current region offset from start to the device fd.
  60. * @num_regions: num of mmio regions.
  61. * @regions: the mmio region linked list of this afu feature device.
  62. * @dma_regions: root of dma regions rb tree.
  63. * @num_umsgs: num of umsgs.
  64. * @pdata: afu platform device's pdata.
  65. */
  66. struct dfl_afu {
  67. u64 region_cur_offset;
  68. int num_regions;
  69. u8 num_umsgs;
  70. struct list_head regions;
  71. struct rb_root dma_regions;
  72. struct dfl_feature_platform_data *pdata;
  73. };
  74. /* hold pdata->lock when call __afu_port_enable/disable */
  75. void __afu_port_enable(struct platform_device *pdev);
  76. int __afu_port_disable(struct platform_device *pdev);
  77. void afu_mmio_region_init(struct dfl_feature_platform_data *pdata);
  78. int afu_mmio_region_add(struct dfl_feature_platform_data *pdata,
  79. u32 region_index, u64 region_size, u64 phys, u32 flags);
  80. void afu_mmio_region_destroy(struct dfl_feature_platform_data *pdata);
  81. int afu_mmio_region_get_by_index(struct dfl_feature_platform_data *pdata,
  82. u32 region_index,
  83. struct dfl_afu_mmio_region *pregion);
  84. int afu_mmio_region_get_by_offset(struct dfl_feature_platform_data *pdata,
  85. u64 offset, u64 size,
  86. struct dfl_afu_mmio_region *pregion);
  87. void afu_dma_region_init(struct dfl_feature_platform_data *pdata);
  88. void afu_dma_region_destroy(struct dfl_feature_platform_data *pdata);
  89. int afu_dma_map_region(struct dfl_feature_platform_data *pdata,
  90. u64 user_addr, u64 length, u64 *iova);
  91. int afu_dma_unmap_region(struct dfl_feature_platform_data *pdata, u64 iova);
  92. struct dfl_afu_dma_region *
  93. afu_dma_region_find(struct dfl_feature_platform_data *pdata,
  94. u64 iova, u64 size);
  95. extern const struct dfl_feature_ops port_err_ops;
  96. extern const struct dfl_feature_id port_err_id_table[];
  97. extern const struct attribute_group port_err_group;
  98. #endif /* __DFL_AFU_H */