1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2018 Intel Corporation 3 */ 4 5 #ifndef _IFPGA_FEATURE_DEV_H_ 6 #define _IFPGA_FEATURE_DEV_H_ 7 8 #include "ifpga_hw.h" 9 10 struct feature_driver { 11 u64 id; 12 const char *name; 13 struct ifpga_feature_ops *ops; 14 }; 15 16 /** 17 * FEATURE_DRV - macro used to describe a specific feature driver 18 */ 19 #define FEATURE_DRV(n, s, p) \ 20 .id = (n), .name = (s), .ops = (p) 21 22 static inline struct ifpga_port_hw * 23 get_port(struct ifpga_hw *hw, u32 port_id) 24 { 25 if (!is_valid_port_id(hw, port_id)) 26 return NULL; 27 28 return &hw->port[port_id]; 29 } 30 31 #define ifpga_for_each_fme_feature(hw, feature) \ 32 TAILQ_FOREACH(feature, &hw->feature_list, next) 33 34 #define ifpga_for_each_port_feature(port, feature) \ 35 TAILQ_FOREACH(feature, &port->feature_list, next) 36 37 static inline struct ifpga_feature * 38 get_fme_feature_by_id(struct ifpga_fme_hw *fme, u64 id) 39 { 40 struct ifpga_feature *feature; 41 42 ifpga_for_each_fme_feature(fme, feature) { 43 if (feature->id == id) 44 return feature; 45 } 46 47 return NULL; 48 } 49 50 static inline struct ifpga_feature * 51 get_port_feature_by_id(struct ifpga_port_hw *port, u64 id) 52 { 53 struct ifpga_feature *feature; 54 55 ifpga_for_each_port_feature(port, feature) { 56 if (feature->id == id) 57 return feature; 58 } 59 60 return NULL; 61 } 62 63 static inline struct ifpga_feature * 64 get_feature_by_id(struct ifpga_feature_list *list, u64 id) 65 { 66 struct ifpga_feature *feature; 67 68 TAILQ_FOREACH(feature, list, next) 69 if (feature->id == id) 70 return feature; 71 72 return NULL; 73 } 74 75 static inline void * 76 get_fme_feature_ioaddr_by_index(struct ifpga_fme_hw *fme, int index) 77 { 78 struct ifpga_feature *feature = 79 get_feature_by_id(&fme->feature_list, index); 80 81 return feature ? feature->addr : NULL; 82 } 83 84 static inline void * 85 get_port_feature_ioaddr_by_index(struct ifpga_port_hw *port, int index) 86 { 87 struct ifpga_feature *feature = 88 get_feature_by_id(&port->feature_list, index); 89 90 return feature ? feature->addr : NULL; 91 } 92 93 static inline bool 94 is_fme_feature_present(struct ifpga_fme_hw *fme, int index) 95 { 96 return !!get_fme_feature_ioaddr_by_index(fme, index); 97 } 98 99 static inline bool 100 is_port_feature_present(struct ifpga_port_hw *port, int index) 101 { 102 return !!get_port_feature_ioaddr_by_index(port, index); 103 } 104 105 int fpga_get_afu_uuid(struct ifpga_port_hw *port, struct uuid *uuid); 106 107 int __fpga_port_disable(struct ifpga_port_hw *port); 108 void __fpga_port_enable(struct ifpga_port_hw *port); 109 110 static inline int fpga_port_disable(struct ifpga_port_hw *port) 111 { 112 int ret; 113 114 spinlock_lock(&port->lock); 115 ret = __fpga_port_disable(port); 116 spinlock_unlock(&port->lock); 117 return ret; 118 } 119 120 static inline int fpga_port_enable(struct ifpga_port_hw *port) 121 { 122 spinlock_lock(&port->lock); 123 __fpga_port_enable(port); 124 spinlock_unlock(&port->lock); 125 126 return 0; 127 } 128 129 static inline int __fpga_port_reset(struct ifpga_port_hw *port) 130 { 131 int ret; 132 133 ret = __fpga_port_disable(port); 134 if (ret) 135 return ret; 136 137 __fpga_port_enable(port); 138 139 return 0; 140 } 141 142 static inline int fpga_port_reset(struct ifpga_port_hw *port) 143 { 144 int ret; 145 146 spinlock_lock(&port->lock); 147 ret = __fpga_port_reset(port); 148 spinlock_unlock(&port->lock); 149 return ret; 150 } 151 152 int do_pr(struct ifpga_hw *hw, u32 port_id, const char *buffer, u32 size, 153 u64 *status); 154 155 int fme_get_prop(struct ifpga_fme_hw *fme, struct feature_prop *prop); 156 int fme_set_prop(struct ifpga_fme_hw *fme, struct feature_prop *prop); 157 int fme_set_irq(struct ifpga_fme_hw *fme, u32 feature_id, void *irq_set); 158 159 int fme_hw_init(struct ifpga_fme_hw *fme); 160 void fme_hw_uinit(struct ifpga_fme_hw *fme); 161 void port_hw_uinit(struct ifpga_port_hw *port); 162 int port_hw_init(struct ifpga_port_hw *port); 163 int port_clear_error(struct ifpga_port_hw *port); 164 void port_err_mask(struct ifpga_port_hw *port, bool mask); 165 int port_err_clear(struct ifpga_port_hw *port, u64 err); 166 167 extern struct ifpga_feature_ops fme_hdr_ops; 168 extern struct ifpga_feature_ops fme_thermal_mgmt_ops; 169 extern struct ifpga_feature_ops fme_power_mgmt_ops; 170 extern struct ifpga_feature_ops fme_global_err_ops; 171 extern struct ifpga_feature_ops fme_pr_mgmt_ops; 172 extern struct ifpga_feature_ops fme_global_iperf_ops; 173 extern struct ifpga_feature_ops fme_global_dperf_ops; 174 extern struct ifpga_feature_ops fme_hssi_eth_ops; 175 extern struct ifpga_feature_ops fme_emif_ops; 176 extern struct ifpga_feature_ops fme_spi_master_ops; 177 extern struct ifpga_feature_ops fme_i2c_master_ops; 178 extern struct ifpga_feature_ops fme_eth_group_ops; 179 extern struct ifpga_feature_ops fme_nios_spi_master_ops; 180 181 int port_get_prop(struct ifpga_port_hw *port, struct feature_prop *prop); 182 int port_set_prop(struct ifpga_port_hw *port, struct feature_prop *prop); 183 184 /* This struct is used when parsing uafu irq_set */ 185 struct fpga_uafu_irq_set { 186 u32 start; 187 u32 count; 188 s32 *evtfds; 189 }; 190 191 int port_set_irq(struct ifpga_port_hw *port, u32 feature_id, void *irq_set); 192 const char *get_fme_feature_name(unsigned int id); 193 const char *get_port_feature_name(unsigned int id); 194 195 extern struct ifpga_feature_ops ifpga_rawdev_port_hdr_ops; 196 extern struct ifpga_feature_ops ifpga_rawdev_port_error_ops; 197 extern struct ifpga_feature_ops ifpga_rawdev_port_stp_ops; 198 extern struct ifpga_feature_ops ifpga_rawdev_port_uint_ops; 199 extern struct ifpga_feature_ops ifpga_rawdev_port_afu_ops; 200 201 /* help functions for feature ops */ 202 int fpga_msix_set_block(struct ifpga_feature *feature, unsigned int start, 203 unsigned int count, s32 *fds); 204 205 /* FME network function ops*/ 206 int fme_mgr_read_mac_rom(struct ifpga_fme_hw *fme, int offset, 207 void *buf, int size); 208 int fme_mgr_write_mac_rom(struct ifpga_fme_hw *fme, int offset, 209 void *buf, int size); 210 int fme_mgr_get_eth_group_nums(struct ifpga_fme_hw *fme); 211 int fme_mgr_get_eth_group_info(struct ifpga_fme_hw *fme, 212 u8 group_id, struct opae_eth_group_info *info); 213 int fme_mgr_eth_group_read_reg(struct ifpga_fme_hw *fme, u8 group_id, 214 u8 type, u8 index, u16 addr, u32 *data); 215 int fme_mgr_eth_group_write_reg(struct ifpga_fme_hw *fme, u8 group_id, 216 u8 type, u8 index, u16 addr, u32 data); 217 int fme_mgr_get_retimer_info(struct ifpga_fme_hw *fme, 218 struct opae_retimer_info *info); 219 int fme_mgr_get_retimer_status(struct ifpga_fme_hw *fme, 220 struct opae_retimer_status *status); 221 #endif /* _IFPGA_FEATURE_DEV_H_ */ 222