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_dev_api.h (12814B)


      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_DEV_API_H
      8#define _QED_DEV_API_H
      9
     10#include <linux/types.h>
     11#include <linux/kernel.h>
     12#include <linux/slab.h>
     13#include <linux/qed/qed_chain.h>
     14#include <linux/qed/qed_if.h>
     15#include "qed_int.h"
     16
     17/**
     18 * qed_init_dp(): Initialize the debug level.
     19 *
     20 * @cdev: Qed dev pointer.
     21 * @dp_module: Module debug parameter.
     22 * @dp_level: Module debug level.
     23 *
     24 * Return: Void.
     25 */
     26void qed_init_dp(struct qed_dev *cdev,
     27		 u32 dp_module,
     28		 u8 dp_level);
     29
     30/**
     31 * qed_init_struct(): Initialize the device structure to
     32 *                    its defaults.
     33 *
     34 * @cdev: Qed dev pointer.
     35 *
     36 * Return: Void.
     37 */
     38void qed_init_struct(struct qed_dev *cdev);
     39
     40/**
     41 * qed_resc_free: Free device resources.
     42 *
     43 * @cdev: Qed dev pointer.
     44 *
     45 * Return: Void.
     46 */
     47void qed_resc_free(struct qed_dev *cdev);
     48
     49/**
     50 * qed_resc_alloc(): Alloc device resources.
     51 *
     52 * @cdev: Qed dev pointer.
     53 *
     54 * Return: Int.
     55 */
     56int qed_resc_alloc(struct qed_dev *cdev);
     57
     58/**
     59 * qed_resc_setup(): Setup device resources.
     60 *
     61 * @cdev: Qed dev pointer.
     62 *
     63 * Return: Void.
     64 */
     65void qed_resc_setup(struct qed_dev *cdev);
     66
     67enum qed_override_force_load {
     68	QED_OVERRIDE_FORCE_LOAD_NONE,
     69	QED_OVERRIDE_FORCE_LOAD_ALWAYS,
     70	QED_OVERRIDE_FORCE_LOAD_NEVER,
     71};
     72
     73struct qed_drv_load_params {
     74	/* Indicates whether the driver is running over a crash kernel.
     75	 * As part of the load request, this will be used for providing the
     76	 * driver role to the MFW.
     77	 * In case of a crash kernel over PDA - this should be set to false.
     78	 */
     79	bool is_crash_kernel;
     80
     81	/* The timeout value that the MFW should use when locking the engine for
     82	 * the driver load process.
     83	 * A value of '0' means the default value, and '255' means no timeout.
     84	 */
     85	u8 mfw_timeout_val;
     86#define QED_LOAD_REQ_LOCK_TO_DEFAULT    0
     87#define QED_LOAD_REQ_LOCK_TO_NONE       255
     88
     89	/* Avoid engine reset when first PF loads on it */
     90	bool avoid_eng_reset;
     91
     92	/* Allow overriding the default force load behavior */
     93	enum qed_override_force_load override_force_load;
     94};
     95
     96struct qed_hw_init_params {
     97	/* Tunneling parameters */
     98	struct qed_tunnel_info *p_tunn;
     99
    100	bool b_hw_start;
    101
    102	/* Interrupt mode [msix, inta, etc.] to use */
    103	enum qed_int_mode int_mode;
    104
    105	/* NPAR tx switching to be used for vports for tx-switching */
    106	bool allow_npar_tx_switch;
    107
    108	/* Binary fw data pointer in binary fw file */
    109	const u8 *bin_fw_data;
    110
    111	/* Driver load parameters */
    112	struct qed_drv_load_params *p_drv_load_params;
    113};
    114
    115/**
    116 * qed_hw_init(): Init Qed hardware.
    117 *
    118 * @cdev: Qed dev pointer.
    119 * @p_params: Pointers to params.
    120 *
    121 * Return: Int.
    122 */
    123int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params);
    124
    125/**
    126 * qed_hw_timers_stop_all(): Stop the timers HW block.
    127 *
    128 * @cdev: Qed dev pointer.
    129 *
    130 * Return: void.
    131 */
    132void qed_hw_timers_stop_all(struct qed_dev *cdev);
    133
    134/**
    135 * qed_hw_stop(): Stop Qed hardware.
    136 *
    137 * @cdev: Qed dev pointer.
    138 *
    139 * Return: int.
    140 */
    141int qed_hw_stop(struct qed_dev *cdev);
    142
    143/**
    144 * qed_hw_stop_fastpath(): Should be called incase
    145 *		           slowpath is still required for the device,
    146 *		           but fastpath is not.
    147 *
    148 * @cdev: Qed dev pointer.
    149 *
    150 * Return: Int.
    151 */
    152int qed_hw_stop_fastpath(struct qed_dev *cdev);
    153
    154/**
    155 * qed_hw_start_fastpath(): Restart fastpath traffic,
    156 *		            only if hw_stop_fastpath was called.
    157 *
    158 * @p_hwfn: HW device data.
    159 *
    160 * Return: Int.
    161 */
    162int qed_hw_start_fastpath(struct qed_hwfn *p_hwfn);
    163
    164/**
    165 * qed_hw_prepare(): Prepare Qed hardware.
    166 *
    167 * @cdev: Qed dev pointer.
    168 * @personality: Personality to initialize.
    169 *
    170 * Return: Int.
    171 */
    172int qed_hw_prepare(struct qed_dev *cdev,
    173		   int personality);
    174
    175/**
    176 * qed_hw_remove(): Remove Qed hardware.
    177 *
    178 * @cdev: Qed dev pointer.
    179 *
    180 * Return: Void.
    181 */
    182void qed_hw_remove(struct qed_dev *cdev);
    183
    184/**
    185 * qed_ptt_acquire(): Allocate a PTT window.
    186 *
    187 * @p_hwfn: HW device data.
    188 *
    189 * Return: struct qed_ptt.
    190 *
    191 * Should be called at the entry point to the driver (at the beginning of an
    192 * exported function).
    193 */
    194struct qed_ptt *qed_ptt_acquire(struct qed_hwfn *p_hwfn);
    195
    196/**
    197 * qed_ptt_release(): Release PTT Window.
    198 *
    199 * @p_hwfn: HW device data.
    200 * @p_ptt: P_ptt.
    201 *
    202 * Return: Void.
    203 *
    204 * Should be called at the end of a flow - at the end of the function that
    205 * acquired the PTT.
    206 */
    207void qed_ptt_release(struct qed_hwfn *p_hwfn,
    208		     struct qed_ptt *p_ptt);
    209void qed_reset_vport_stats(struct qed_dev *cdev);
    210
    211enum qed_dmae_address_type_t {
    212	QED_DMAE_ADDRESS_HOST_VIRT,
    213	QED_DMAE_ADDRESS_HOST_PHYS,
    214	QED_DMAE_ADDRESS_GRC
    215};
    216
    217/**
    218 * qed_dmae_host2grc(): Copy data from source addr to
    219 *                      dmae registers using the given ptt.
    220 *
    221 * @p_hwfn: HW device data.
    222 * @p_ptt: P_ptt.
    223 * @source_addr: Source address.
    224 * @grc_addr: GRC address (dmae_data_offset).
    225 * @size_in_dwords: Size.
    226 * @p_params: (default parameters will be used in case of NULL).
    227 *
    228 * Return: Int.
    229 */
    230int
    231qed_dmae_host2grc(struct qed_hwfn *p_hwfn,
    232		  struct qed_ptt *p_ptt,
    233		  u64 source_addr,
    234		  u32 grc_addr,
    235		  u32 size_in_dwords,
    236		  struct qed_dmae_params *p_params);
    237
    238 /**
    239 * qed_dmae_grc2host(): Read data from dmae data offset
    240 *                      to source address using the given ptt.
    241 *
    242 * @p_ptt: P_ptt.
    243 * @grc_addr: GRC address (dmae_data_offset).
    244 * @dest_addr: Destination Address.
    245 * @size_in_dwords: Size.
    246 * @p_params: (default parameters will be used in case of NULL).
    247 *
    248 * Return: Int.
    249 */
    250int qed_dmae_grc2host(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
    251		      u32 grc_addr, dma_addr_t dest_addr, u32 size_in_dwords,
    252		      struct qed_dmae_params *p_params);
    253
    254/**
    255 * qed_dmae_host2host(): Copy data from to source address
    256 *                       to a destination adrress (for SRIOV) using the given
    257 *                       ptt.
    258 *
    259 * @p_hwfn: HW device data.
    260 * @p_ptt: P_ptt.
    261 * @source_addr: Source address.
    262 * @dest_addr: Destination address.
    263 * @size_in_dwords: size.
    264 * @p_params: (default parameters will be used in case of NULL).
    265 *
    266 * Return: Int.
    267 */
    268int qed_dmae_host2host(struct qed_hwfn *p_hwfn,
    269		       struct qed_ptt *p_ptt,
    270		       dma_addr_t source_addr,
    271		       dma_addr_t dest_addr,
    272		       u32 size_in_dwords, struct qed_dmae_params *p_params);
    273
    274int qed_chain_alloc(struct qed_dev *cdev, struct qed_chain *chain,
    275		    struct qed_chain_init_params *params);
    276void qed_chain_free(struct qed_dev *cdev, struct qed_chain *chain);
    277
    278/**
    279 * qed_fw_l2_queue(): Get absolute L2 queue ID.
    280 *
    281 * @p_hwfn: HW device data.
    282 * @src_id: Relative to p_hwfn.
    283 * @dst_id: Absolute per engine.
    284 *
    285 * Return: Int.
    286 */
    287int qed_fw_l2_queue(struct qed_hwfn *p_hwfn,
    288		    u16 src_id,
    289		    u16 *dst_id);
    290
    291/**
    292 * qed_fw_vport(): Get absolute vport ID.
    293 *
    294 * @p_hwfn: HW device data.
    295 * @src_id: Relative to p_hwfn.
    296 * @dst_id: Absolute per engine.
    297 *
    298 * Return: Int.
    299 */
    300int qed_fw_vport(struct qed_hwfn *p_hwfn,
    301		 u8 src_id,
    302		 u8 *dst_id);
    303
    304/**
    305 * qed_fw_rss_eng(): Get absolute RSS engine ID.
    306 *
    307 * @p_hwfn: HW device data.
    308 * @src_id: Relative to p_hwfn.
    309 * @dst_id: Absolute per engine.
    310 *
    311 * Return: Int.
    312 */
    313int qed_fw_rss_eng(struct qed_hwfn *p_hwfn,
    314		   u8 src_id,
    315		   u8 *dst_id);
    316
    317/**
    318 * qed_llh_get_num_ppfid(): Return the allocated number of LLH filter
    319 *	                    banks that are allocated to the PF.
    320 *
    321 * @cdev: Qed dev pointer.
    322 *
    323 * Return: u8 Number of LLH filter banks.
    324 */
    325u8 qed_llh_get_num_ppfid(struct qed_dev *cdev);
    326
    327enum qed_eng {
    328	QED_ENG0,
    329	QED_ENG1,
    330	QED_BOTH_ENG,
    331};
    332
    333/**
    334 * qed_llh_set_ppfid_affinity(): Set the engine affinity for the given
    335 *	                         LLH filter bank.
    336 *
    337 * @cdev: Qed dev pointer.
    338 * @ppfid: Relative within the allocated ppfids ('0' is the default one).
    339 * @eng: Engine.
    340 *
    341 * Return: Int.
    342 */
    343int qed_llh_set_ppfid_affinity(struct qed_dev *cdev,
    344			       u8 ppfid, enum qed_eng eng);
    345
    346/**
    347 * qed_llh_set_roce_affinity(): Set the RoCE engine affinity.
    348 *
    349 * @cdev: Qed dev pointer.
    350 * @eng: Engine.
    351 *
    352 * Return: Int.
    353 */
    354int qed_llh_set_roce_affinity(struct qed_dev *cdev, enum qed_eng eng);
    355
    356/**
    357 * qed_llh_add_mac_filter(): Add a LLH MAC filter into the given filter
    358 *	                     bank.
    359 *
    360 * @cdev: Qed dev pointer.
    361 * @ppfid: Relative within the allocated ppfids ('0' is the default one).
    362 * @mac_addr: MAC to add.
    363 *
    364 * Return: Int.
    365 */
    366int qed_llh_add_mac_filter(struct qed_dev *cdev,
    367			   u8 ppfid, const u8 mac_addr[ETH_ALEN]);
    368
    369/**
    370 * qed_llh_remove_mac_filter(): Remove a LLH MAC filter from the given
    371 *	                        filter bank.
    372 *
    373 * @cdev: Qed dev pointer.
    374 * @ppfid: Ppfid.
    375 * @mac_addr: MAC to remove
    376 *
    377 * Return: Void.
    378 */
    379void qed_llh_remove_mac_filter(struct qed_dev *cdev,
    380			       u8 ppfid, u8 mac_addr[ETH_ALEN]);
    381
    382enum qed_llh_prot_filter_type_t {
    383	QED_LLH_FILTER_ETHERTYPE,
    384	QED_LLH_FILTER_TCP_SRC_PORT,
    385	QED_LLH_FILTER_TCP_DEST_PORT,
    386	QED_LLH_FILTER_TCP_SRC_AND_DEST_PORT,
    387	QED_LLH_FILTER_UDP_SRC_PORT,
    388	QED_LLH_FILTER_UDP_DEST_PORT,
    389	QED_LLH_FILTER_UDP_SRC_AND_DEST_PORT
    390};
    391
    392/**
    393 * qed_llh_add_protocol_filter(): Add a LLH protocol filter into the
    394 *	                          given filter bank.
    395 *
    396 * @cdev: Qed dev pointer.
    397 * @ppfid: Relative within the allocated ppfids ('0' is the default one).
    398 * @type: Type of filters and comparing.
    399 * @source_port_or_eth_type: Source port or ethertype to add.
    400 * @dest_port: Destination port to add.
    401 *
    402 * Return: Int.
    403 */
    404int
    405qed_llh_add_protocol_filter(struct qed_dev *cdev,
    406			    u8 ppfid,
    407			    enum qed_llh_prot_filter_type_t type,
    408			    u16 source_port_or_eth_type, u16 dest_port);
    409
    410/**
    411 * qed_llh_remove_protocol_filter(): Remove a LLH protocol filter from
    412 *	                             the given filter bank.
    413 *
    414 * @cdev: Qed dev pointer.
    415 * @ppfid: Relative within the allocated ppfids ('0' is the default one).
    416 * @type: Type of filters and comparing.
    417 * @source_port_or_eth_type: Source port or ethertype to add.
    418 * @dest_port: Destination port to add.
    419 */
    420void
    421qed_llh_remove_protocol_filter(struct qed_dev *cdev,
    422			       u8 ppfid,
    423			       enum qed_llh_prot_filter_type_t type,
    424			       u16 source_port_or_eth_type, u16 dest_port);
    425
    426/**
    427 * qed_final_cleanup(): Cleanup of previous driver remains prior to load.
    428 *
    429 * @p_hwfn: HW device data.
    430 * @p_ptt: P_ptt.
    431 * @id: For PF, engine-relative. For VF, PF-relative.
    432 * @is_vf: True iff cleanup is made for a VF.
    433 *
    434 * Return: Int.
    435 */
    436int qed_final_cleanup(struct qed_hwfn *p_hwfn,
    437		      struct qed_ptt *p_ptt, u16 id, bool is_vf);
    438
    439/**
    440 * qed_get_queue_coalesce(): Retrieve coalesce value for a given queue.
    441 *
    442 * @p_hwfn: HW device data.
    443 * @coal: Store coalesce value read from the hardware.
    444 * @handle: P_handle.
    445 *
    446 * Return: Int.
    447 **/
    448int qed_get_queue_coalesce(struct qed_hwfn *p_hwfn, u16 *coal, void *handle);
    449
    450/**
    451 * qed_set_queue_coalesce(): Configure coalesce parameters for Rx and
    452 *    Tx queue. The fact that we can configure coalescing to up to 511, but on
    453 *    varying accuracy [the bigger the value the less accurate] up to a mistake
    454 *    of 3usec for the highest values.
    455 *    While the API allows setting coalescing per-qid, all queues sharing a SB
    456 *    should be in same range [i.e., either 0-0x7f, 0x80-0xff or 0x100-0x1ff]
    457 *    otherwise configuration would break.
    458 *
    459 * @rx_coal: Rx Coalesce value in micro seconds.
    460 * @tx_coal: TX Coalesce value in micro seconds.
    461 * @p_handle: P_handle.
    462 *
    463 * Return: Int.
    464 **/
    465int
    466qed_set_queue_coalesce(u16 rx_coal, u16 tx_coal, void *p_handle);
    467
    468/**
    469 * qed_pglueb_set_pfid_enable(): Enable or disable PCI BUS MASTER.
    470 *
    471 * @p_hwfn: HW device data.
    472 * @p_ptt: P_ptt.
    473 * @b_enable: True/False.
    474 *
    475 * Return: Int.
    476 */
    477int qed_pglueb_set_pfid_enable(struct qed_hwfn *p_hwfn,
    478			       struct qed_ptt *p_ptt, bool b_enable);
    479
    480/**
    481 * qed_db_recovery_add(): add doorbell information to the doorbell
    482 *                    recovery mechanism.
    483 *
    484 * @cdev: Qed dev pointer.
    485 * @db_addr: Doorbell address.
    486 * @db_data: Address of where db_data is stored.
    487 * @db_width: Doorbell is 32b pr 64b.
    488 * @db_space: Doorbell recovery addresses are user or kernel space.
    489 *
    490 * Return: Int.
    491 */
    492int qed_db_recovery_add(struct qed_dev *cdev,
    493			void __iomem *db_addr,
    494			void *db_data,
    495			enum qed_db_rec_width db_width,
    496			enum qed_db_rec_space db_space);
    497
    498/**
    499 * qed_db_recovery_del() - remove doorbell information from the doorbell
    500 * recovery mechanism. db_data serves as key (db_addr is not unique).
    501 *
    502 * @cdev: Qed dev pointer.
    503 * @db_addr: doorbell address.
    504 * @db_data: address where db_data is stored. Serves as key for the
    505 *                  entry to delete.
    506 *
    507 * Return: Int.
    508 */
    509int qed_db_recovery_del(struct qed_dev *cdev,
    510			void __iomem *db_addr, void *db_data);
    511
    512const char *qed_hw_get_resc_name(enum qed_resources res_id);
    513#endif