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

dpseci.h (10652B)


      1/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
      2/*
      3 * Copyright 2013-2016 Freescale Semiconductor Inc.
      4 * Copyright 2017-2018 NXP
      5 */
      6#ifndef _DPSECI_H_
      7#define _DPSECI_H_
      8
      9/*
     10 * Data Path SEC Interface API
     11 * Contains initialization APIs and runtime control APIs for DPSECI
     12 */
     13
     14struct fsl_mc_io;
     15
     16/**
     17 * General DPSECI macros
     18 */
     19
     20/**
     21 * Maximum number of Tx/Rx queues per DPSECI object
     22 */
     23#define DPSECI_MAX_QUEUE_NUM		16
     24
     25/**
     26 * All queues considered; see dpseci_set_rx_queue()
     27 */
     28#define DPSECI_ALL_QUEUES	(u8)(-1)
     29
     30int dpseci_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpseci_id,
     31		u16 *token);
     32
     33int dpseci_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
     34
     35/**
     36 * Enable the Congestion Group support
     37 */
     38#define DPSECI_OPT_HAS_CG		0x000020
     39
     40/**
     41 * struct dpseci_cfg - Structure representing DPSECI configuration
     42 * @options: Any combination of the following flags:
     43 *		DPSECI_OPT_HAS_CG
     44 * @num_tx_queues: num of queues towards the SEC
     45 * @num_rx_queues: num of queues back from the SEC
     46 * @priorities: Priorities for the SEC hardware processing;
     47 *		each place in the array is the priority of the tx queue
     48 *		towards the SEC;
     49 *		valid priorities are configured with values 1-8;
     50 */
     51struct dpseci_cfg {
     52	u32 options;
     53	u8 num_tx_queues;
     54	u8 num_rx_queues;
     55	u8 priorities[DPSECI_MAX_QUEUE_NUM];
     56};
     57
     58int dpseci_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
     59
     60int dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
     61
     62int dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
     63
     64int dpseci_is_enabled(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
     65		      int *en);
     66
     67/**
     68 * struct dpseci_attr - Structure representing DPSECI attributes
     69 * @id: DPSECI object ID
     70 * @num_tx_queues: number of queues towards the SEC
     71 * @num_rx_queues: number of queues back from the SEC
     72 * @options: any combination of the following flags:
     73 *		DPSECI_OPT_HAS_CG
     74 */
     75struct dpseci_attr {
     76	int id;
     77	u8 num_tx_queues;
     78	u8 num_rx_queues;
     79	u32 options;
     80};
     81
     82int dpseci_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
     83			  struct dpseci_attr *attr);
     84
     85/**
     86 * enum dpseci_dest - DPSECI destination types
     87 * @DPSECI_DEST_NONE: Unassigned destination; The queue is set in parked mode
     88 *	and does not generate FQDAN notifications; user is expected to dequeue
     89 *	from the queue based on polling or other user-defined method
     90 * @DPSECI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN
     91 *	notifications to the specified DPIO; user is expected to dequeue from
     92 *	the queue only after notification is received
     93 * @DPSECI_DEST_DPCON: The queue is set in schedule mode and does not generate
     94 *	FQDAN notifications, but is connected to the specified DPCON object;
     95 *	user is expected to dequeue from the DPCON channel
     96 */
     97enum dpseci_dest {
     98	DPSECI_DEST_NONE = 0,
     99	DPSECI_DEST_DPIO,
    100	DPSECI_DEST_DPCON
    101};
    102
    103/**
    104 * struct dpseci_dest_cfg - Structure representing DPSECI destination parameters
    105 * @dest_type: Destination type
    106 * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type
    107 * @priority: Priority selection within the DPIO or DPCON channel; valid values
    108 *	are 0-1 or 0-7, depending on the number of priorities in that channel;
    109 *	not relevant for 'DPSECI_DEST_NONE' option
    110 */
    111struct dpseci_dest_cfg {
    112	enum dpseci_dest dest_type;
    113	int dest_id;
    114	u8 priority;
    115};
    116
    117/**
    118 * DPSECI queue modification options
    119 */
    120
    121/**
    122 * Select to modify the user's context associated with the queue
    123 */
    124#define DPSECI_QUEUE_OPT_USER_CTX		0x00000001
    125
    126/**
    127 * Select to modify the queue's destination
    128 */
    129#define DPSECI_QUEUE_OPT_DEST			0x00000002
    130
    131/**
    132 * Select to modify the queue's order preservation
    133 */
    134#define DPSECI_QUEUE_OPT_ORDER_PRESERVATION	0x00000004
    135
    136/**
    137 * struct dpseci_rx_queue_cfg - DPSECI RX queue configuration
    138 * @options: Flags representing the suggested modifications to the queue;
    139 *	Use any combination of 'DPSECI_QUEUE_OPT_<X>' flags
    140 * @order_preservation_en: order preservation configuration for the rx queue
    141 * valid only if 'DPSECI_QUEUE_OPT_ORDER_PRESERVATION' is contained in 'options'
    142 * @user_ctx: User context value provided in the frame descriptor of each
    143 *	dequeued frame;	valid only if 'DPSECI_QUEUE_OPT_USER_CTX' is contained
    144 *	in 'options'
    145 * @dest_cfg: Queue destination parameters; valid only if
    146 *	'DPSECI_QUEUE_OPT_DEST' is contained in 'options'
    147 */
    148struct dpseci_rx_queue_cfg {
    149	u32 options;
    150	int order_preservation_en;
    151	u64 user_ctx;
    152	struct dpseci_dest_cfg dest_cfg;
    153};
    154
    155int dpseci_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
    156			u8 queue, const struct dpseci_rx_queue_cfg *cfg);
    157
    158/**
    159 * struct dpseci_rx_queue_attr - Structure representing attributes of Rx queues
    160 * @user_ctx: User context value provided in the frame descriptor of each
    161 *	dequeued frame
    162 * @order_preservation_en: Status of the order preservation configuration on the
    163 *	queue
    164 * @dest_cfg: Queue destination configuration
    165 * @fqid: Virtual FQID value to be used for dequeue operations
    166 */
    167struct dpseci_rx_queue_attr {
    168	u64 user_ctx;
    169	int order_preservation_en;
    170	struct dpseci_dest_cfg dest_cfg;
    171	u32 fqid;
    172};
    173
    174int dpseci_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
    175			u8 queue, struct dpseci_rx_queue_attr *attr);
    176
    177/**
    178 * struct dpseci_tx_queue_attr - Structure representing attributes of Tx queues
    179 * @fqid: Virtual FQID to be used for sending frames to SEC hardware
    180 * @priority: SEC hardware processing priority for the queue
    181 */
    182struct dpseci_tx_queue_attr {
    183	u32 fqid;
    184	u8 priority;
    185};
    186
    187int dpseci_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
    188			u8 queue, struct dpseci_tx_queue_attr *attr);
    189
    190/**
    191 * struct dpseci_sec_attr - Structure representing attributes of the SEC
    192 *	hardware accelerator
    193 * @ip_id: ID for SEC
    194 * @major_rev: Major revision number for SEC
    195 * @minor_rev: Minor revision number for SEC
    196 * @era: SEC Era
    197 * @deco_num: The number of copies of the DECO that are implemented in this
    198 *	version of SEC
    199 * @zuc_auth_acc_num: The number of copies of ZUCA that are implemented in this
    200 *	version of SEC
    201 * @zuc_enc_acc_num: The number of copies of ZUCE that are implemented in this
    202 *	version of SEC
    203 * @snow_f8_acc_num: The number of copies of the SNOW-f8 module that are
    204 *	implemented in this version of SEC
    205 * @snow_f9_acc_num: The number of copies of the SNOW-f9 module that are
    206 *	implemented in this version of SEC
    207 * @crc_acc_num: The number of copies of the CRC module that are implemented in
    208 *	this version of SEC
    209 * @pk_acc_num:  The number of copies of the Public Key module that are
    210 *	implemented in this version of SEC
    211 * @kasumi_acc_num: The number of copies of the Kasumi module that are
    212 *	implemented in this version of SEC
    213 * @rng_acc_num: The number of copies of the Random Number Generator that are
    214 *	implemented in this version of SEC
    215 * @md_acc_num: The number of copies of the MDHA (Hashing module) that are
    216 *	implemented in this version of SEC
    217 * @arc4_acc_num: The number of copies of the ARC4 module that are implemented
    218 *	in this version of SEC
    219 * @des_acc_num: The number of copies of the DES module that are implemented in
    220 *	this version of SEC
    221 * @aes_acc_num: The number of copies of the AES module that are implemented in
    222 *	this version of SEC
    223 * @ccha_acc_num: The number of copies of the ChaCha20 module that are
    224 *	implemented in this version of SEC.
    225 * @ptha_acc_num: The number of copies of the Poly1305 module that are
    226 *	implemented in this version of SEC.
    227 **/
    228struct dpseci_sec_attr {
    229	u16 ip_id;
    230	u8 major_rev;
    231	u8 minor_rev;
    232	u8 era;
    233	u8 deco_num;
    234	u8 zuc_auth_acc_num;
    235	u8 zuc_enc_acc_num;
    236	u8 snow_f8_acc_num;
    237	u8 snow_f9_acc_num;
    238	u8 crc_acc_num;
    239	u8 pk_acc_num;
    240	u8 kasumi_acc_num;
    241	u8 rng_acc_num;
    242	u8 md_acc_num;
    243	u8 arc4_acc_num;
    244	u8 des_acc_num;
    245	u8 aes_acc_num;
    246	u8 ccha_acc_num;
    247	u8 ptha_acc_num;
    248};
    249
    250int dpseci_get_sec_attr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
    251			struct dpseci_sec_attr *attr);
    252
    253int dpseci_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags,
    254			   u16 *major_ver, u16 *minor_ver);
    255
    256/**
    257 * enum dpseci_congestion_unit - DPSECI congestion units
    258 * @DPSECI_CONGESTION_UNIT_BYTES: bytes units
    259 * @DPSECI_CONGESTION_UNIT_FRAMES: frames units
    260 */
    261enum dpseci_congestion_unit {
    262	DPSECI_CONGESTION_UNIT_BYTES = 0,
    263	DPSECI_CONGESTION_UNIT_FRAMES
    264};
    265
    266/**
    267 * CSCN message is written to message_iova once entering a
    268 * congestion state (see 'threshold_entry')
    269 */
    270#define DPSECI_CGN_MODE_WRITE_MEM_ON_ENTER		0x00000001
    271
    272/**
    273 * CSCN message is written to message_iova once exiting a
    274 * congestion state (see 'threshold_exit')
    275 */
    276#define DPSECI_CGN_MODE_WRITE_MEM_ON_EXIT		0x00000002
    277
    278/**
    279 * CSCN write will attempt to allocate into a cache (coherent write);
    280 * valid only if 'DPSECI_CGN_MODE_WRITE_MEM_<X>' is selected
    281 */
    282#define DPSECI_CGN_MODE_COHERENT_WRITE			0x00000004
    283
    284/**
    285 * if 'dpseci_dest_cfg.dest_type != DPSECI_DEST_NONE' CSCN message is sent to
    286 * DPIO/DPCON's WQ channel once entering a congestion state
    287 * (see 'threshold_entry')
    288 */
    289#define DPSECI_CGN_MODE_NOTIFY_DEST_ON_ENTER		0x00000008
    290
    291/**
    292 * if 'dpseci_dest_cfg.dest_type != DPSECI_DEST_NONE' CSCN message is sent to
    293 * DPIO/DPCON's WQ channel once exiting a congestion state
    294 * (see 'threshold_exit')
    295 */
    296#define DPSECI_CGN_MODE_NOTIFY_DEST_ON_EXIT		0x00000010
    297
    298/**
    299 * if 'dpseci_dest_cfg.dest_type != DPSECI_DEST_NONE' when the CSCN is written
    300 * to the sw-portal's DQRR, the DQRI interrupt is asserted immediately
    301 * (if enabled)
    302 */
    303#define DPSECI_CGN_MODE_INTR_COALESCING_DISABLED	0x00000020
    304
    305/**
    306 * struct dpseci_congestion_notification_cfg - congestion notification
    307 *	configuration
    308 * @units: units type
    309 * @threshold_entry: above this threshold we enter a congestion state.
    310 *	set it to '0' to disable it
    311 * @threshold_exit: below this threshold we exit the congestion state.
    312 * @message_ctx: The context that will be part of the CSCN message
    313 * @message_iova: I/O virtual address (must be in DMA-able memory),
    314 *	must be 16B aligned;
    315 * @dest_cfg: CSCN can be send to either DPIO or DPCON WQ channel
    316 * @notification_mode: Mask of available options; use 'DPSECI_CGN_MODE_<X>'
    317 *	values
    318 */
    319struct dpseci_congestion_notification_cfg {
    320	enum dpseci_congestion_unit units;
    321	u32 threshold_entry;
    322	u32 threshold_exit;
    323	u64 message_ctx;
    324	u64 message_iova;
    325	struct dpseci_dest_cfg dest_cfg;
    326	u16 notification_mode;
    327};
    328
    329int dpseci_set_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags,
    330	u16 token, const struct dpseci_congestion_notification_cfg *cfg);
    331
    332int dpseci_get_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags,
    333	u16 token, struct dpseci_congestion_notification_cfg *cfg);
    334
    335#endif /* _DPSECI_H_ */