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

qed_ll2.h (7075B)


      1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
      2/* QLogic qed NIC Driver
      3 * Copyright (c) 2015-2017  QLogic Corporation
      4 * Copyright (c) 2019-2020 Marvell International Ltd.
      5 */
      6
      7#ifndef _QED_LL2_H
      8#define _QED_LL2_H
      9
     10#include <linux/types.h>
     11#include <linux/kernel.h>
     12#include <linux/list.h>
     13#include <linux/mutex.h>
     14#include <linux/slab.h>
     15#include <linux/spinlock.h>
     16#include <linux/qed/qed_chain.h>
     17#include <linux/qed/qed_ll2_if.h>
     18#include "qed.h"
     19#include "qed_hsi.h"
     20#include "qed_sp.h"
     21
     22#define QED_MAX_NUM_OF_LL2_CONNECTIONS                    (4)
     23/* LL2 queues handles will be split as follows:
     24 * first will be legacy queues, and then the ctx based queues.
     25 */
     26#define QED_MAX_NUM_OF_LL2_CONNS_PF            (4)
     27#define QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF   (3)
     28
     29#define QED_MAX_NUM_OF_CTX_LL2_CONNS_PF	\
     30	(QED_MAX_NUM_OF_LL2_CONNS_PF - QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF)
     31
     32#define QED_LL2_LEGACY_CONN_BASE_PF     0
     33#define QED_LL2_CTX_CONN_BASE_PF        QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF
     34
     35struct qed_ll2_rx_packet {
     36	struct list_head list_entry;
     37	struct core_rx_bd_with_buff_len *rxq_bd;
     38	dma_addr_t rx_buf_addr;
     39	u16 buf_length;
     40	void *cookie;
     41	u8 placement_offset;
     42	u16 parse_flags;
     43	u16 packet_length;
     44	u16 vlan;
     45	u32 opaque_data[2];
     46};
     47
     48struct qed_ll2_tx_packet {
     49	struct list_head list_entry;
     50	u16 bd_used;
     51	bool notify_fw;
     52	void *cookie;
     53	/* Flexible Array of bds_set determined by max_bds_per_packet */
     54	struct {
     55		struct core_tx_bd *txq_bd;
     56		dma_addr_t tx_frag;
     57		u16 frag_len;
     58	} bds_set[];
     59};
     60
     61struct qed_ll2_rx_queue {
     62	/* Lock protecting the Rx queue manipulation */
     63	spinlock_t lock;
     64	struct qed_chain rxq_chain;
     65	struct qed_chain rcq_chain;
     66	u8 rx_sb_index;
     67	u8 ctx_based;
     68	bool b_cb_registered;
     69	__le16 *p_fw_cons;
     70	struct list_head active_descq;
     71	struct list_head free_descq;
     72	struct list_head posting_descq;
     73	struct qed_ll2_rx_packet *descq_array;
     74	void __iomem *set_prod_addr;
     75	struct core_pwm_prod_update_data db_data;
     76};
     77
     78struct qed_ll2_tx_queue {
     79	/* Lock protecting the Tx queue manipulation */
     80	spinlock_t lock;
     81	struct qed_chain txq_chain;
     82	u8 tx_sb_index;
     83	bool b_cb_registered;
     84	__le16 *p_fw_cons;
     85	struct list_head active_descq;
     86	struct list_head free_descq;
     87	struct list_head sending_descq;
     88	u16 cur_completing_bd_idx;
     89	void __iomem *doorbell_addr;
     90	struct core_db_data db_msg;
     91	u16 bds_idx;
     92	u16 cur_send_frag_num;
     93	u16 cur_completing_frag_num;
     94	bool b_completing_packet;
     95	void *descq_mem; /* memory for variable sized qed_ll2_tx_packet*/
     96	struct qed_ll2_tx_packet *cur_send_packet;
     97	struct qed_ll2_tx_packet cur_completing_packet;
     98};
     99
    100struct qed_ll2_info {
    101	/* Lock protecting the state of LL2 */
    102	struct mutex mutex;
    103
    104	struct qed_ll2_acquire_data_inputs input;
    105	u32 cid;
    106	u8 my_id;
    107	u8 queue_id;
    108	u8 tx_stats_id;
    109	bool b_active;
    110	enum core_tx_dest tx_dest;
    111	u8 tx_stats_en;
    112	bool main_func_queue;
    113	struct qed_ll2_rx_queue rx_queue;
    114	struct qed_ll2_tx_queue tx_queue;
    115	struct qed_ll2_cbs cbs;
    116};
    117
    118extern const struct qed_ll2_ops qed_ll2_ops_pass;
    119
    120/**
    121 * qed_ll2_acquire_connection(): Allocate resources,
    122 *                               starts rx & tx (if relevant) queues pair.
    123 *                               Provides connecion handler as output
    124 *                               parameter.
    125 *
    126 * @cxt: Pointer to the hw-function [opaque to some].
    127 * @data: Describes connection parameters.
    128 *
    129 * Return: Int.
    130 */
    131int qed_ll2_acquire_connection(void *cxt, struct qed_ll2_acquire_data *data);
    132
    133/**
    134 * qed_ll2_establish_connection(): start previously allocated LL2 queues pair
    135 *
    136 * @cxt: Pointer to the hw-function [opaque to some].
    137 * @connection_handle: LL2 connection's handle obtained from
    138 *                     qed_ll2_require_connection.
    139 *
    140 * Return: 0 on success, failure otherwise.
    141 */
    142int qed_ll2_establish_connection(void *cxt, u8 connection_handle);
    143
    144/**
    145 * qed_ll2_post_rx_buffer(): Submit buffers to LL2 Rx queue.
    146 *
    147 * @cxt: Pointer to the hw-function [opaque to some].
    148 * @connection_handle: LL2 connection's handle obtained from
    149 *                     qed_ll2_require_connection.
    150 * @addr: RX (physical address) buffers to submit.
    151 * @buf_len: Buffer Len.
    152 * @cookie: Cookie.
    153 * @notify_fw: Produce corresponding Rx BD immediately.
    154 *
    155 * Return: 0 on success, failure otherwise.
    156 */
    157int qed_ll2_post_rx_buffer(void *cxt,
    158			   u8 connection_handle,
    159			   dma_addr_t addr,
    160			   u16 buf_len, void *cookie, u8 notify_fw);
    161
    162/**
    163 * qed_ll2_prepare_tx_packet(): Request for start Tx BD
    164 *				to prepare Tx packet submission to FW.
    165 *
    166 * @cxt: Pointer to the hw-function [opaque to some].
    167 * @connection_handle: Connection handle.
    168 * @pkt: Info regarding the tx packet.
    169 * @notify_fw: Issue doorbell to fw for this packet.
    170 *
    171 * Return: 0 on success, failure otherwise.
    172 */
    173int qed_ll2_prepare_tx_packet(void *cxt,
    174			      u8 connection_handle,
    175			      struct qed_ll2_tx_pkt_info *pkt,
    176			      bool notify_fw);
    177
    178/**
    179 * qed_ll2_release_connection(): Releases resources allocated for LL2
    180 *                               connection.
    181 *
    182 * @cxt: Pointer to the hw-function [opaque to some].
    183 * @connection_handle: LL2 connection's handle obtained from
    184 *                     qed_ll2_require_connection.
    185 *
    186 * Return: Void.
    187 */
    188void qed_ll2_release_connection(void *cxt, u8 connection_handle);
    189
    190/**
    191 * qed_ll2_set_fragment_of_tx_packet(): Provides fragments to fill
    192 *                                      Tx BD of BDs requested by
    193 *                                      qed_ll2_prepare_tx_packet
    194 *
    195 * @cxt: Pointer to the hw-function [opaque to some].
    196 * @connection_handle: LL2 connection's handle obtained from
    197 *                     qed_ll2_require_connection.
    198 * @addr: Address.
    199 * @nbytes: Number of bytes.
    200 *
    201 * Return: 0 on success, failure otherwise.
    202 */
    203int qed_ll2_set_fragment_of_tx_packet(void *cxt,
    204				      u8 connection_handle,
    205				      dma_addr_t addr, u16 nbytes);
    206
    207/**
    208 * qed_ll2_terminate_connection(): Stops Tx/Rx queues
    209 *
    210 * @cxt: Pointer to the hw-function [opaque to some].
    211 * @connection_handle: LL2 connection's handle obtained from
    212 *                    qed_ll2_require_connection.
    213 *
    214 * Return: 0 on success, failure otherwise.
    215 */
    216int qed_ll2_terminate_connection(void *cxt, u8 connection_handle);
    217
    218/**
    219 * qed_ll2_get_stats(): Get LL2 queue's statistics
    220 *
    221 * @cxt: Pointer to the hw-function [opaque to some].
    222 * @connection_handle: LL2 connection's handle obtained from
    223 *                    qed_ll2_require_connection.
    224 * @p_stats: Pointer Status.
    225 *
    226 * Return: 0 on success, failure otherwise.
    227 */
    228int qed_ll2_get_stats(void *cxt,
    229		      u8 connection_handle, struct qed_ll2_stats *p_stats);
    230
    231/**
    232 * qed_ll2_alloc(): Allocates LL2 connections set.
    233 *
    234 * @p_hwfn: HW device data.
    235 *
    236 * Return: Int.
    237 */
    238int qed_ll2_alloc(struct qed_hwfn *p_hwfn);
    239
    240/**
    241 * qed_ll2_setup(): Inits LL2 connections set.
    242 *
    243 * @p_hwfn: HW device data.
    244 *
    245 * Return: Void.
    246 *
    247 */
    248void qed_ll2_setup(struct qed_hwfn *p_hwfn);
    249
    250/**
    251 * qed_ll2_free(): Releases LL2 connections set
    252 *
    253 * @p_hwfn: HW device data.
    254 *
    255 * Return: Void.
    256 *
    257 */
    258void qed_ll2_free(struct qed_hwfn *p_hwfn);
    259
    260#endif