linux/drivers/staging/most/core.h
<<
>>
Prefs
   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
  14struct module;
  15struct interface_private;
  16
  17/**
  18 * Interface type
  19 */
  20enum 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 */
  35enum most_channel_direction {
  36        MOST_CH_RX = 1 << 0,
  37        MOST_CH_TX = 1 << 1,
  38};
  39
  40/**
  41 * Channel data type.
  42 */
  43enum 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
  50enum mbo_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 */
  95struct 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 */
 123struct 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 extra_len;
 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 */
 176struct 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 mbo_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 */
 231struct 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#define to_most_interface(d) container_of(d, struct most_interface, dev)
 255
 256/**
 257 * struct core_component - identifies a loadable component for the mostcore
 258 * @list: list_head
 259 * @name: component name
 260 * @probe_channel: function for core to notify driver about channel connection
 261 * @disconnect_channel: callback function to disconnect a certain channel
 262 * @rx_completion: completion handler for received packets
 263 * @tx_completion: completion handler for transmitted packets
 264 */
 265struct core_component {
 266        struct list_head list;
 267        const char *name;
 268        int (*probe_channel)(struct most_interface *iface, int channel_idx,
 269                             struct most_channel_config *cfg, char *name,
 270                             char *param);
 271        int (*disconnect_channel)(struct most_interface *iface,
 272                                  int channel_idx);
 273        int (*rx_completion)(struct mbo *mbo);
 274        int (*tx_completion)(struct most_interface *iface, int channel_idx);
 275        int (*cfg_complete)(void);
 276};
 277
 278/**
 279 * most_register_interface - Registers instance of the interface.
 280 * @iface: Pointer to the interface instance description.
 281 *
 282 * Returns a pointer to the kobject of the generated instance.
 283 *
 284 * Note: HDM has to ensure that any reference held on the kobj is
 285 * released before deregistering the interface.
 286 */
 287int most_register_interface(struct most_interface *iface);
 288
 289/**
 290 * Deregisters instance of the interface.
 291 * @intf_instance Pointer to the interface instance description.
 292 */
 293void most_deregister_interface(struct most_interface *iface);
 294void most_submit_mbo(struct mbo *mbo);
 295
 296/**
 297 * most_stop_enqueue - prevents core from enqueing MBOs
 298 * @iface: pointer to interface
 299 * @channel_idx: channel index
 300 */
 301void most_stop_enqueue(struct most_interface *iface, int channel_idx);
 302
 303/**
 304 * most_resume_enqueue - allow core to enqueue MBOs again
 305 * @iface: pointer to interface
 306 * @channel_idx: channel index
 307 *
 308 * This clears the enqueue halt flag and enqueues all MBOs currently
 309 * in wait fifo.
 310 */
 311void most_resume_enqueue(struct most_interface *iface, int channel_idx);
 312int most_register_component(struct core_component *comp);
 313int most_deregister_component(struct core_component *comp);
 314struct mbo *most_get_mbo(struct most_interface *iface, int channel_idx,
 315                         struct core_component *comp);
 316void most_put_mbo(struct mbo *mbo);
 317int channel_has_mbo(struct most_interface *iface, int channel_idx,
 318                    struct core_component *comp);
 319int most_start_channel(struct most_interface *iface, int channel_idx,
 320                       struct core_component *comp);
 321int most_stop_channel(struct most_interface *iface, int channel_idx,
 322                      struct core_component *comp);
 323int __init configfs_init(void);
 324int most_register_configfs_subsys(struct core_component *comp);
 325void most_deregister_configfs_subsys(struct core_component *comp);
 326int most_add_link(char *mdev, char *mdev_ch, char *comp_name, char *link_name,
 327                  char *comp_param);
 328int most_remove_link(char *mdev, char *mdev_ch, char *comp_name);
 329int most_set_cfg_buffer_size(char *mdev, char *mdev_ch, u16 val);
 330int most_set_cfg_subbuffer_size(char *mdev, char *mdev_ch, u16 val);
 331int most_set_cfg_dbr_size(char *mdev, char *mdev_ch, u16 val);
 332int most_set_cfg_num_buffers(char *mdev, char *mdev_ch, u16 val);
 333int most_set_cfg_datatype(char *mdev, char *mdev_ch, char *buf);
 334int most_set_cfg_direction(char *mdev, char *mdev_ch, char *buf);
 335int most_set_cfg_packets_xact(char *mdev, char *mdev_ch, u16 val);
 336int most_cfg_complete(char *comp_name);
 337void most_interface_register_notify(const char *mdev_name);
 338#endif /* MOST_CORE_H_ */
 339