cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

most.h (12491B)


      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 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 */
     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 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 */
    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/**
    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 */
    263struct 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 */
    286int 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 */
    292void most_deregister_interface(struct most_interface *iface);
    293void 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 */
    300void 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 */
    310void most_resume_enqueue(struct most_interface *iface, int channel_idx);
    311int most_register_component(struct most_component *comp);
    312int most_deregister_component(struct most_component *comp);
    313struct mbo *most_get_mbo(struct most_interface *iface, int channel_idx,
    314			 struct most_component *comp);
    315void most_put_mbo(struct mbo *mbo);
    316int channel_has_mbo(struct most_interface *iface, int channel_idx,
    317		    struct most_component *comp);
    318int most_start_channel(struct most_interface *iface, int channel_idx,
    319		       struct most_component *comp);
    320int most_stop_channel(struct most_interface *iface, int channel_idx,
    321		      struct most_component *comp);
    322int __init configfs_init(void);
    323int most_register_configfs_subsys(struct most_component *comp);
    324void most_deregister_configfs_subsys(struct most_component *comp);
    325int most_add_link(char *mdev, char *mdev_ch, char *comp_name, char *link_name,
    326		  char *comp_param);
    327int most_remove_link(char *mdev, char *mdev_ch, char *comp_name);
    328int most_set_cfg_buffer_size(char *mdev, char *mdev_ch, u16 val);
    329int most_set_cfg_subbuffer_size(char *mdev, char *mdev_ch, u16 val);
    330int most_set_cfg_dbr_size(char *mdev, char *mdev_ch, u16 val);
    331int most_set_cfg_num_buffers(char *mdev, char *mdev_ch, u16 val);
    332int most_set_cfg_datatype(char *mdev, char *mdev_ch, char *buf);
    333int most_set_cfg_direction(char *mdev, char *mdev_ch, char *buf);
    334int most_set_cfg_packets_xact(char *mdev, char *mdev_ch, u16 val);
    335int most_cfg_complete(char *comp_name);
    336void most_interface_register_notify(const char *mdev_name);
    337#endif /* MOST_CORE_H_ */