| 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | /* |
| 3 | * most.h - API for component and adapter drivers |
| 4 | * |
| 5 | * Copyright (C) 2013-2015, Microchip Technology Germany II GmbH & Co. KG |
| 6 | */ |
| 7 | |
| 8 | #ifndef __MOST_CORE_H__ |
| 9 | #define __MOST_CORE_H__ |
| 10 | |
| 11 | #include <linux/types.h> |
| 12 | #include <linux/device.h> |
| 13 | |
| 14 | struct module; |
| 15 | struct interface_private; |
| 16 | |
| 17 | /** |
| 18 | * Interface type |
| 19 | */ |
| 20 | enum most_interface_type { |
| 21 | ITYPE_LOOPBACK = 1, |
| 22 | ITYPE_I2C, |
| 23 | ITYPE_I2S, |
| 24 | ITYPE_TSI, |
| 25 | ITYPE_HBI, |
| 26 | ITYPE_MEDIALB_DIM, |
| 27 | ITYPE_MEDIALB_DIM2, |
| 28 | ITYPE_USB, |
| 29 | ITYPE_PCIE |
| 30 | }; |
| 31 | |
| 32 | /** |
| 33 | * Channel direction. |
| 34 | */ |
| 35 | enum most_channel_direction { |
| 36 | MOST_CH_RX = 1 << 0, |
| 37 | MOST_CH_TX = 1 << 1, |
| 38 | }; |
| 39 | |
| 40 | /** |
| 41 | * Channel data type. |
| 42 | */ |
| 43 | enum most_channel_data_type { |
| 44 | MOST_CH_CONTROL = 1 << 0, |
| 45 | MOST_CH_ASYNC = 1 << 1, |
| 46 | MOST_CH_ISOC = 1 << 2, |
| 47 | MOST_CH_SYNC = 1 << 5, |
| 48 | }; |
| 49 | |
| 50 | enum most_status_flags { |
| 51 | /* MBO was processed successfully (data was send or received )*/ |
| 52 | MBO_SUCCESS = 0, |
| 53 | /* The MBO contains wrong or missing information. */ |
| 54 | MBO_E_INVAL, |
| 55 | /* MBO was completed as HDM Channel will be closed */ |
| 56 | MBO_E_CLOSE, |
| 57 | }; |
| 58 | |
| 59 | /** |
| 60 | * struct most_channel_capability - Channel capability |
| 61 | * @direction: Supported channel directions. |
| 62 | * The value is bitwise OR-combination of the values from the |
| 63 | * enumeration most_channel_direction. Zero is allowed value and means |
| 64 | * "channel may not be used". |
| 65 | * @data_type: Supported channel data types. |
| 66 | * The value is bitwise OR-combination of the values from the |
| 67 | * enumeration most_channel_data_type. Zero is allowed value and means |
| 68 | * "channel may not be used". |
| 69 | * @num_buffers_packet: Maximum number of buffers supported by this channel |
| 70 | * for packet data types (Async,Control,QoS) |
| 71 | * @buffer_size_packet: Maximum buffer size supported by this channel |
| 72 | * for packet data types (Async,Control,QoS) |
| 73 | * @num_buffers_streaming: Maximum number of buffers supported by this channel |
| 74 | * for streaming data types (Sync,AV Packetized) |
| 75 | * @buffer_size_streaming: Maximum buffer size supported by this channel |
| 76 | * for streaming data types (Sync,AV Packetized) |
| 77 | * @name_suffix: Optional suffix providean by an HDM that is attached to the |
| 78 | * regular channel name. |
| 79 | * |
| 80 | * Describes the capabilities of a MOST channel like supported Data Types |
| 81 | * and directions. This information is provided by an HDM for the MostCore. |
| 82 | * |
| 83 | * The Core creates read only sysfs attribute files in |
| 84 | * /sys/devices/most/mdev#/<channel>/ with the |
| 85 | * following attributes: |
| 86 | * -available_directions |
| 87 | * -available_datatypes |
| 88 | * -number_of_packet_buffers |
| 89 | * -number_of_stream_buffers |
| 90 | * -size_of_packet_buffer |
| 91 | * -size_of_stream_buffer |
| 92 | * where content of each file is a string with all supported properties of this |
| 93 | * very channel attribute. |
| 94 | */ |
| 95 | struct most_channel_capability { |
| 96 | u16 direction; |
| 97 | u16 data_type; |
| 98 | u16 num_buffers_packet; |
| 99 | u16 buffer_size_packet; |
| 100 | u16 num_buffers_streaming; |
| 101 | u16 buffer_size_streaming; |
| 102 | const char *name_suffix; |
| 103 | }; |
| 104 | |
| 105 | /** |
| 106 | * struct most_channel_config - stores channel configuration |
| 107 | * @direction: direction of the channel |
| 108 | * @data_type: data type travelling over this channel |
| 109 | * @num_buffers: number of buffers |
| 110 | * @buffer_size: size of a buffer for AIM. |
| 111 | * Buffer size may be cutted down by HDM in a configure callback |
| 112 | * to match to a given interface and channel type. |
| 113 | * @extra_len: additional buffer space for internal HDM purposes like padding. |
| 114 | * May be set by HDM in a configure callback if needed. |
| 115 | * @subbuffer_size: size of a subbuffer |
| 116 | * @packets_per_xact: number of MOST frames that are packet inside one USB |
| 117 | * packet. This is USB specific |
| 118 | * |
| 119 | * Describes the configuration for a MOST channel. This information is |
| 120 | * provided from the MostCore to a HDM (like the Medusa PCIe Interface) as a |
| 121 | * parameter of the "configure" function call. |
| 122 | */ |
| 123 | struct most_channel_config { |
| 124 | enum most_channel_direction direction; |
| 125 | enum most_channel_data_type data_type; |
| 126 | u16 num_buffers; |
| 127 | u16 buffer_size; |
| 128 | u16 ; |
| 129 | u16 subbuffer_size; |
| 130 | u16 packets_per_xact; |
| 131 | u16 dbr_size; |
| 132 | }; |
| 133 | |
| 134 | /* |
| 135 | * struct mbo - MOST Buffer Object. |
| 136 | * @context: context for core completion handler |
| 137 | * @priv: private data for HDM |
| 138 | * |
| 139 | * public: documented fields that are used for the communications |
| 140 | * between MostCore and HDMs |
| 141 | * |
| 142 | * @list: list head for use by the mbo's current owner |
| 143 | * @ifp: (in) associated interface instance |
| 144 | * @num_buffers_ptr: amount of pool buffers |
| 145 | * @hdm_channel_id: (in) HDM channel instance |
| 146 | * @virt_address: (in) kernel virtual address of the buffer |
| 147 | * @bus_address: (in) bus address of the buffer |
| 148 | * @buffer_length: (in) buffer payload length |
| 149 | * @processed_length: (out) processed length |
| 150 | * @status: (out) transfer status |
| 151 | * @complete: (in) completion routine |
| 152 | * |
| 153 | * The core allocates and initializes the MBO. |
| 154 | * |
| 155 | * The HDM receives MBO for transfer from the core with the call to enqueue(). |
| 156 | * The HDM copies the data to- or from the buffer depending on configured |
| 157 | * channel direction, set "processed_length" and "status" and completes |
| 158 | * the transfer procedure by calling the completion routine. |
| 159 | * |
| 160 | * Finally, the MBO is being deallocated or recycled for further |
| 161 | * transfers of the same or a different HDM. |
| 162 | * |
| 163 | * Directions of usage: |
| 164 | * The core driver should never access any MBO fields (even if marked |
| 165 | * as "public") while the MBO is owned by an HDM. The ownership starts with |
| 166 | * the call of enqueue() and ends with the call of its complete() routine. |
| 167 | * |
| 168 | * II. |
| 169 | * Every HDM attached to the core driver _must_ ensure that it returns any MBO |
| 170 | * it owns (due to a previous call to enqueue() by the core driver) before it |
| 171 | * de-registers an interface or gets unloaded from the kernel. If this direction |
| 172 | * is violated memory leaks will occur, since the core driver does _not_ track |
| 173 | * MBOs it is currently not in control of. |
| 174 | * |
| 175 | */ |
| 176 | struct mbo { |
| 177 | void *context; |
| 178 | void *priv; |
| 179 | struct list_head list; |
| 180 | struct most_interface *ifp; |
| 181 | int *num_buffers_ptr; |
| 182 | u16 hdm_channel_id; |
| 183 | void *virt_address; |
| 184 | dma_addr_t bus_address; |
| 185 | u16 buffer_length; |
| 186 | u16 processed_length; |
| 187 | enum most_status_flags status; |
| 188 | void (*complete)(struct mbo *mbo); |
| 189 | }; |
| 190 | |
| 191 | /** |
| 192 | * Interface instance description. |
| 193 | * |
| 194 | * Describes an interface of a MOST device the core driver is bound to. |
| 195 | * This structure is allocated and initialized in the HDM. MostCore may not |
| 196 | * modify this structure. |
| 197 | * |
| 198 | * @dev: the actual device |
| 199 | * @mod: module |
| 200 | * @interface Interface type. \sa most_interface_type. |
| 201 | * @description PRELIMINARY. |
| 202 | * Unique description of the device instance from point of view of the |
| 203 | * interface in free text form (ASCII). |
| 204 | * It may be a hexadecimal presentation of the memory address for the MediaLB |
| 205 | * IP or USB device ID with USB properties for USB interface, etc. |
| 206 | * @num_channels Number of channels and size of the channel_vector. |
| 207 | * @channel_vector Properties of the channels. |
| 208 | * Array index represents channel ID by the driver. |
| 209 | * @configure Callback to change data type for the channel of the |
| 210 | * interface instance. May be zero if the instance of the interface is not |
| 211 | * configurable. Parameter channel_config describes direction and data |
| 212 | * type for the channel, configured by the higher level. The content of |
| 213 | * @enqueue Delivers MBO to the HDM for processing. |
| 214 | * After HDM completes Rx- or Tx- operation the processed MBO shall |
| 215 | * be returned back to the MostCore using completion routine. |
| 216 | * The reason to get the MBO delivered from the MostCore after the channel |
| 217 | * is poisoned is the re-opening of the channel by the application. |
| 218 | * In this case the HDM shall hold MBOs and service the channel as usual. |
| 219 | * The HDM must be able to hold at least one MBO for each channel. |
| 220 | * The callback returns a negative value on error, otherwise 0. |
| 221 | * @poison_channel Informs HDM about closing the channel. The HDM shall |
| 222 | * cancel all transfers and synchronously or asynchronously return |
| 223 | * all enqueued for this channel MBOs using the completion routine. |
| 224 | * The callback returns a negative value on error, otherwise 0. |
| 225 | * @request_netinfo: triggers retrieving of network info from the HDM by |
| 226 | * means of "Message exchange over MDP/MEP" |
| 227 | * The call of the function request_netinfo with the parameter on_netinfo as |
| 228 | * NULL prohibits use of the previously obtained function pointer. |
| 229 | * @priv Private field used by mostcore to store context information. |
| 230 | */ |
| 231 | struct most_interface { |
| 232 | struct device *dev; |
| 233 | struct device *driver_dev; |
| 234 | struct module *mod; |
| 235 | enum most_interface_type interface; |
| 236 | const char *description; |
| 237 | unsigned int num_channels; |
| 238 | struct most_channel_capability *channel_vector; |
| 239 | void *(*dma_alloc)(struct mbo *mbo, u32 size); |
| 240 | void (*dma_free)(struct mbo *mbo, u32 size); |
| 241 | int (*configure)(struct most_interface *iface, int channel_idx, |
| 242 | struct most_channel_config *channel_config); |
| 243 | int (*enqueue)(struct most_interface *iface, int channel_idx, |
| 244 | struct mbo *mbo); |
| 245 | int (*poison_channel)(struct most_interface *iface, int channel_idx); |
| 246 | void (*request_netinfo)(struct most_interface *iface, int channel_idx, |
| 247 | void (*on_netinfo)(struct most_interface *iface, |
| 248 | unsigned char link_stat, |
| 249 | unsigned char *mac_addr)); |
| 250 | void *priv; |
| 251 | struct interface_private *p; |
| 252 | }; |
| 253 | |
| 254 | /** |
| 255 | * struct most_component - identifies a loadable component for the mostcore |
| 256 | * @list: list_head |
| 257 | * @name: component name |
| 258 | * @probe_channel: function for core to notify driver about channel connection |
| 259 | * @disconnect_channel: callback function to disconnect a certain channel |
| 260 | * @rx_completion: completion handler for received packets |
| 261 | * @tx_completion: completion handler for transmitted packets |
| 262 | */ |
| 263 | struct most_component { |
| 264 | struct list_head list; |
| 265 | const char *name; |
| 266 | struct module *mod; |
| 267 | int (*probe_channel)(struct most_interface *iface, int channel_idx, |
| 268 | struct most_channel_config *cfg, char *name, |
| 269 | char *param); |
| 270 | int (*disconnect_channel)(struct most_interface *iface, |
| 271 | int channel_idx); |
| 272 | int (*rx_completion)(struct mbo *mbo); |
| 273 | int (*tx_completion)(struct most_interface *iface, int channel_idx); |
| 274 | int (*cfg_complete)(void); |
| 275 | }; |
| 276 | |
| 277 | /** |
| 278 | * most_register_interface - Registers instance of the interface. |
| 279 | * @iface: Pointer to the interface instance description. |
| 280 | * |
| 281 | * Returns a pointer to the kobject of the generated instance. |
| 282 | * |
| 283 | * Note: HDM has to ensure that any reference held on the kobj is |
| 284 | * released before deregistering the interface. |
| 285 | */ |
| 286 | int most_register_interface(struct most_interface *iface); |
| 287 | |
| 288 | /** |
| 289 | * Deregisters instance of the interface. |
| 290 | * @intf_instance Pointer to the interface instance description. |
| 291 | */ |
| 292 | void most_deregister_interface(struct most_interface *iface); |
| 293 | void most_submit_mbo(struct mbo *mbo); |
| 294 | |
| 295 | /** |
| 296 | * most_stop_enqueue - prevents core from enqueing MBOs |
| 297 | * @iface: pointer to interface |
| 298 | * @channel_idx: channel index |
| 299 | */ |
| 300 | void most_stop_enqueue(struct most_interface *iface, int channel_idx); |
| 301 | |
| 302 | /** |
| 303 | * most_resume_enqueue - allow core to enqueue MBOs again |
| 304 | * @iface: pointer to interface |
| 305 | * @channel_idx: channel index |
| 306 | * |
| 307 | * This clears the enqueue halt flag and enqueues all MBOs currently |
| 308 | * in wait fifo. |
| 309 | */ |
| 310 | void most_resume_enqueue(struct most_interface *iface, int channel_idx); |
| 311 | int most_register_component(struct most_component *comp); |
| 312 | int most_deregister_component(struct most_component *comp); |
| 313 | struct mbo *most_get_mbo(struct most_interface *iface, int channel_idx, |
| 314 | struct most_component *comp); |
| 315 | void most_put_mbo(struct mbo *mbo); |
| 316 | int channel_has_mbo(struct most_interface *iface, int channel_idx, |
| 317 | struct most_component *comp); |
| 318 | int most_start_channel(struct most_interface *iface, int channel_idx, |
| 319 | struct most_component *comp); |
| 320 | int most_stop_channel(struct most_interface *iface, int channel_idx, |
| 321 | struct most_component *comp); |
| 322 | int __init configfs_init(void); |
| 323 | int most_register_configfs_subsys(struct most_component *comp); |
| 324 | void most_deregister_configfs_subsys(struct most_component *comp); |
| 325 | int most_add_link(char *mdev, char *mdev_ch, char *comp_name, char *link_name, |
| 326 | char *comp_param); |
| 327 | int most_remove_link(char *mdev, char *mdev_ch, char *comp_name); |
| 328 | int most_set_cfg_buffer_size(char *mdev, char *mdev_ch, u16 val); |
| 329 | int most_set_cfg_subbuffer_size(char *mdev, char *mdev_ch, u16 val); |
| 330 | int most_set_cfg_dbr_size(char *mdev, char *mdev_ch, u16 val); |
| 331 | int most_set_cfg_num_buffers(char *mdev, char *mdev_ch, u16 val); |
| 332 | int most_set_cfg_datatype(char *mdev, char *mdev_ch, char *buf); |
| 333 | int most_set_cfg_direction(char *mdev, char *mdev_ch, char *buf); |
| 334 | int most_set_cfg_packets_xact(char *mdev, char *mdev_ch, u16 val); |
| 335 | int most_cfg_complete(char *comp_name); |
| 336 | void most_interface_register_notify(const char *mdev_name); |
| 337 | #endif /* MOST_CORE_H_ */ |
| 338 | |