1fe56b9e6SYuval Mintz /* QLogic qed NIC Driver 2fe56b9e6SYuval Mintz * Copyright (c) 2015 QLogic Corporation 3fe56b9e6SYuval Mintz * 4fe56b9e6SYuval Mintz * This software is available under the terms of the GNU General Public License 5fe56b9e6SYuval Mintz * (GPL) Version 2, available from the file COPYING in the main directory of 6fe56b9e6SYuval Mintz * this source tree. 7fe56b9e6SYuval Mintz */ 8fe56b9e6SYuval Mintz 9fe56b9e6SYuval Mintz #ifndef _QED_DEV_API_H 10fe56b9e6SYuval Mintz #define _QED_DEV_API_H 11fe56b9e6SYuval Mintz 12fe56b9e6SYuval Mintz #include <linux/types.h> 13fe56b9e6SYuval Mintz #include <linux/kernel.h> 14fe56b9e6SYuval Mintz #include <linux/slab.h> 15fe56b9e6SYuval Mintz #include <linux/qed/qed_chain.h> 16fe56b9e6SYuval Mintz #include <linux/qed/qed_if.h> 17fe56b9e6SYuval Mintz #include "qed_int.h" 18fe56b9e6SYuval Mintz 19fe56b9e6SYuval Mintz /** 20fe56b9e6SYuval Mintz * @brief qed_init_dp - initialize the debug level 21fe56b9e6SYuval Mintz * 22fe56b9e6SYuval Mintz * @param cdev 23fe56b9e6SYuval Mintz * @param dp_module 24fe56b9e6SYuval Mintz * @param dp_level 25fe56b9e6SYuval Mintz */ 26fe56b9e6SYuval Mintz void qed_init_dp(struct qed_dev *cdev, 27fe56b9e6SYuval Mintz u32 dp_module, 28fe56b9e6SYuval Mintz u8 dp_level); 29fe56b9e6SYuval Mintz 30fe56b9e6SYuval Mintz /** 31fe56b9e6SYuval Mintz * @brief qed_init_struct - initialize the device structure to 32fe56b9e6SYuval Mintz * its defaults 33fe56b9e6SYuval Mintz * 34fe56b9e6SYuval Mintz * @param cdev 35fe56b9e6SYuval Mintz */ 36fe56b9e6SYuval Mintz void qed_init_struct(struct qed_dev *cdev); 37fe56b9e6SYuval Mintz 38fe56b9e6SYuval Mintz /** 39fe56b9e6SYuval Mintz * @brief qed_resc_free - 40fe56b9e6SYuval Mintz * 41fe56b9e6SYuval Mintz * @param cdev 42fe56b9e6SYuval Mintz */ 43fe56b9e6SYuval Mintz void qed_resc_free(struct qed_dev *cdev); 44fe56b9e6SYuval Mintz 45fe56b9e6SYuval Mintz /** 46fe56b9e6SYuval Mintz * @brief qed_resc_alloc - 47fe56b9e6SYuval Mintz * 48fe56b9e6SYuval Mintz * @param cdev 49fe56b9e6SYuval Mintz * 50fe56b9e6SYuval Mintz * @return int 51fe56b9e6SYuval Mintz */ 52fe56b9e6SYuval Mintz int qed_resc_alloc(struct qed_dev *cdev); 53fe56b9e6SYuval Mintz 54fe56b9e6SYuval Mintz /** 55fe56b9e6SYuval Mintz * @brief qed_resc_setup - 56fe56b9e6SYuval Mintz * 57fe56b9e6SYuval Mintz * @param cdev 58fe56b9e6SYuval Mintz */ 59fe56b9e6SYuval Mintz void qed_resc_setup(struct qed_dev *cdev); 60fe56b9e6SYuval Mintz 61fe56b9e6SYuval Mintz /** 62fe56b9e6SYuval Mintz * @brief qed_hw_init - 63fe56b9e6SYuval Mintz * 64fe56b9e6SYuval Mintz * @param cdev 65464f6645SManish Chopra * @param p_tunn 66fe56b9e6SYuval Mintz * @param b_hw_start 67fe56b9e6SYuval Mintz * @param int_mode - interrupt mode [msix, inta, etc.] to use. 68fe56b9e6SYuval Mintz * @param allow_npar_tx_switch - npar tx switching to be used 69fe56b9e6SYuval Mintz * for vports configured for tx-switching. 70fe56b9e6SYuval Mintz * @param bin_fw_data - binary fw data pointer in binary fw file. 71fe56b9e6SYuval Mintz * Pass NULL if not using binary fw file. 72fe56b9e6SYuval Mintz * 73fe56b9e6SYuval Mintz * @return int 74fe56b9e6SYuval Mintz */ 75fe56b9e6SYuval Mintz int qed_hw_init(struct qed_dev *cdev, 76464f6645SManish Chopra struct qed_tunn_start_params *p_tunn, 77fe56b9e6SYuval Mintz bool b_hw_start, 78fe56b9e6SYuval Mintz enum qed_int_mode int_mode, 79fe56b9e6SYuval Mintz bool allow_npar_tx_switch, 80fe56b9e6SYuval Mintz const u8 *bin_fw_data); 81fe56b9e6SYuval Mintz 82fe56b9e6SYuval Mintz /** 838c925c44SYuval Mintz * @brief qed_hw_timers_stop_all - stop the timers HW block 848c925c44SYuval Mintz * 858c925c44SYuval Mintz * @param cdev 868c925c44SYuval Mintz * 878c925c44SYuval Mintz * @return void 888c925c44SYuval Mintz */ 898c925c44SYuval Mintz void qed_hw_timers_stop_all(struct qed_dev *cdev); 908c925c44SYuval Mintz 918c925c44SYuval Mintz /** 92fe56b9e6SYuval Mintz * @brief qed_hw_stop - 93fe56b9e6SYuval Mintz * 94fe56b9e6SYuval Mintz * @param cdev 95fe56b9e6SYuval Mintz * 96fe56b9e6SYuval Mintz * @return int 97fe56b9e6SYuval Mintz */ 98fe56b9e6SYuval Mintz int qed_hw_stop(struct qed_dev *cdev); 99fe56b9e6SYuval Mintz 100fe56b9e6SYuval Mintz /** 101cee4d264SManish Chopra * @brief qed_hw_stop_fastpath -should be called incase 102cee4d264SManish Chopra * slowpath is still required for the device, 103cee4d264SManish Chopra * but fastpath is not. 104cee4d264SManish Chopra * 105cee4d264SManish Chopra * @param cdev 106cee4d264SManish Chopra * 107cee4d264SManish Chopra */ 108cee4d264SManish Chopra void qed_hw_stop_fastpath(struct qed_dev *cdev); 109cee4d264SManish Chopra 110cee4d264SManish Chopra /** 111cee4d264SManish Chopra * @brief qed_hw_start_fastpath -restart fastpath traffic, 112cee4d264SManish Chopra * only if hw_stop_fastpath was called 113cee4d264SManish Chopra * 114cee4d264SManish Chopra * @param cdev 115cee4d264SManish Chopra * 116cee4d264SManish Chopra */ 117cee4d264SManish Chopra void qed_hw_start_fastpath(struct qed_hwfn *p_hwfn); 118cee4d264SManish Chopra 119cee4d264SManish Chopra /** 120fe56b9e6SYuval Mintz * @brief qed_hw_reset - 121fe56b9e6SYuval Mintz * 122fe56b9e6SYuval Mintz * @param cdev 123fe56b9e6SYuval Mintz * 124fe56b9e6SYuval Mintz * @return int 125fe56b9e6SYuval Mintz */ 126fe56b9e6SYuval Mintz int qed_hw_reset(struct qed_dev *cdev); 127fe56b9e6SYuval Mintz 128fe56b9e6SYuval Mintz /** 129fe56b9e6SYuval Mintz * @brief qed_hw_prepare - 130fe56b9e6SYuval Mintz * 131fe56b9e6SYuval Mintz * @param cdev 132fe56b9e6SYuval Mintz * @param personality - personality to initialize 133fe56b9e6SYuval Mintz * 134fe56b9e6SYuval Mintz * @return int 135fe56b9e6SYuval Mintz */ 136fe56b9e6SYuval Mintz int qed_hw_prepare(struct qed_dev *cdev, 137fe56b9e6SYuval Mintz int personality); 138fe56b9e6SYuval Mintz 139fe56b9e6SYuval Mintz /** 140fe56b9e6SYuval Mintz * @brief qed_hw_remove - 141fe56b9e6SYuval Mintz * 142fe56b9e6SYuval Mintz * @param cdev 143fe56b9e6SYuval Mintz */ 144fe56b9e6SYuval Mintz void qed_hw_remove(struct qed_dev *cdev); 145fe56b9e6SYuval Mintz 146fe56b9e6SYuval Mintz /** 147fe56b9e6SYuval Mintz * @brief qed_ptt_acquire - Allocate a PTT window 148fe56b9e6SYuval Mintz * 149fe56b9e6SYuval Mintz * Should be called at the entry point to the driver (at the beginning of an 150fe56b9e6SYuval Mintz * exported function) 151fe56b9e6SYuval Mintz * 152fe56b9e6SYuval Mintz * @param p_hwfn 153fe56b9e6SYuval Mintz * 154fe56b9e6SYuval Mintz * @return struct qed_ptt 155fe56b9e6SYuval Mintz */ 156fe56b9e6SYuval Mintz struct qed_ptt *qed_ptt_acquire(struct qed_hwfn *p_hwfn); 157fe56b9e6SYuval Mintz 158fe56b9e6SYuval Mintz /** 159fe56b9e6SYuval Mintz * @brief qed_ptt_release - Release PTT Window 160fe56b9e6SYuval Mintz * 161fe56b9e6SYuval Mintz * Should be called at the end of a flow - at the end of the function that 162fe56b9e6SYuval Mintz * acquired the PTT. 163fe56b9e6SYuval Mintz * 164fe56b9e6SYuval Mintz * 165fe56b9e6SYuval Mintz * @param p_hwfn 166fe56b9e6SYuval Mintz * @param p_ptt 167fe56b9e6SYuval Mintz */ 168fe56b9e6SYuval Mintz void qed_ptt_release(struct qed_hwfn *p_hwfn, 169fe56b9e6SYuval Mintz struct qed_ptt *p_ptt); 1709df2ed04SManish Chopra void qed_reset_vport_stats(struct qed_dev *cdev); 171fe56b9e6SYuval Mintz 172fe56b9e6SYuval Mintz enum qed_dmae_address_type_t { 173fe56b9e6SYuval Mintz QED_DMAE_ADDRESS_HOST_VIRT, 174fe56b9e6SYuval Mintz QED_DMAE_ADDRESS_HOST_PHYS, 175fe56b9e6SYuval Mintz QED_DMAE_ADDRESS_GRC 176fe56b9e6SYuval Mintz }; 177fe56b9e6SYuval Mintz 178fe56b9e6SYuval Mintz /* value of flags If QED_DMAE_FLAG_RW_REPL_SRC flag is set and the 179fe56b9e6SYuval Mintz * source is a block of length DMAE_MAX_RW_SIZE and the 180fe56b9e6SYuval Mintz * destination is larger, the source block will be duplicated as 181fe56b9e6SYuval Mintz * many times as required to fill the destination block. This is 182fe56b9e6SYuval Mintz * used mostly to write a zeroed buffer to destination address 183fe56b9e6SYuval Mintz * using DMA 184fe56b9e6SYuval Mintz */ 185fe56b9e6SYuval Mintz #define QED_DMAE_FLAG_RW_REPL_SRC 0x00000001 18637bff2b9SYuval Mintz #define QED_DMAE_FLAG_VF_SRC 0x00000002 18737bff2b9SYuval Mintz #define QED_DMAE_FLAG_VF_DST 0x00000004 188fe56b9e6SYuval Mintz #define QED_DMAE_FLAG_COMPLETION_DST 0x00000008 189fe56b9e6SYuval Mintz 190fe56b9e6SYuval Mintz struct qed_dmae_params { 191fe56b9e6SYuval Mintz u32 flags; /* consists of QED_DMAE_FLAG_* values */ 19237bff2b9SYuval Mintz u8 src_vfid; 19337bff2b9SYuval Mintz u8 dst_vfid; 194fe56b9e6SYuval Mintz }; 195fe56b9e6SYuval Mintz 196fe56b9e6SYuval Mintz /** 197fe56b9e6SYuval Mintz * @brief qed_dmae_host2grc - copy data from source addr to 198fe56b9e6SYuval Mintz * dmae registers using the given ptt 199fe56b9e6SYuval Mintz * 200fe56b9e6SYuval Mintz * @param p_hwfn 201fe56b9e6SYuval Mintz * @param p_ptt 202fe56b9e6SYuval Mintz * @param source_addr 203fe56b9e6SYuval Mintz * @param grc_addr (dmae_data_offset) 204fe56b9e6SYuval Mintz * @param size_in_dwords 205fe56b9e6SYuval Mintz * @param flags (one of the flags defined above) 206fe56b9e6SYuval Mintz */ 207fe56b9e6SYuval Mintz int 208fe56b9e6SYuval Mintz qed_dmae_host2grc(struct qed_hwfn *p_hwfn, 209fe56b9e6SYuval Mintz struct qed_ptt *p_ptt, 210fe56b9e6SYuval Mintz u64 source_addr, 211fe56b9e6SYuval Mintz u32 grc_addr, 212fe56b9e6SYuval Mintz u32 size_in_dwords, 213fe56b9e6SYuval Mintz u32 flags); 214fe56b9e6SYuval Mintz 215fe56b9e6SYuval Mintz /** 21637bff2b9SYuval Mintz * @brief qed_dmae_host2host - copy data from to source address 21737bff2b9SYuval Mintz * to a destination adress (for SRIOV) using the given ptt 21837bff2b9SYuval Mintz * 21937bff2b9SYuval Mintz * @param p_hwfn 22037bff2b9SYuval Mintz * @param p_ptt 22137bff2b9SYuval Mintz * @param source_addr 22237bff2b9SYuval Mintz * @param dest_addr 22337bff2b9SYuval Mintz * @param size_in_dwords 22437bff2b9SYuval Mintz * @param params 22537bff2b9SYuval Mintz */ 22637bff2b9SYuval Mintz int qed_dmae_host2host(struct qed_hwfn *p_hwfn, 22737bff2b9SYuval Mintz struct qed_ptt *p_ptt, 22837bff2b9SYuval Mintz dma_addr_t source_addr, 22937bff2b9SYuval Mintz dma_addr_t dest_addr, 23037bff2b9SYuval Mintz u32 size_in_dwords, struct qed_dmae_params *p_params); 23137bff2b9SYuval Mintz 23237bff2b9SYuval Mintz /** 233fe56b9e6SYuval Mintz * @brief qed_chain_alloc - Allocate and initialize a chain 234fe56b9e6SYuval Mintz * 235fe56b9e6SYuval Mintz * @param p_hwfn 236fe56b9e6SYuval Mintz * @param intended_use 237fe56b9e6SYuval Mintz * @param mode 238fe56b9e6SYuval Mintz * @param num_elems 239fe56b9e6SYuval Mintz * @param elem_size 240fe56b9e6SYuval Mintz * @param p_chain 241fe56b9e6SYuval Mintz * 242fe56b9e6SYuval Mintz * @return int 243fe56b9e6SYuval Mintz */ 244fe56b9e6SYuval Mintz int 245fe56b9e6SYuval Mintz qed_chain_alloc(struct qed_dev *cdev, 246fe56b9e6SYuval Mintz enum qed_chain_use_mode intended_use, 247fe56b9e6SYuval Mintz enum qed_chain_mode mode, 248fe56b9e6SYuval Mintz u16 num_elems, 249fe56b9e6SYuval Mintz size_t elem_size, 250fe56b9e6SYuval Mintz struct qed_chain *p_chain); 251fe56b9e6SYuval Mintz 252fe56b9e6SYuval Mintz /** 253fe56b9e6SYuval Mintz * @brief qed_chain_free - Free chain DMA memory 254fe56b9e6SYuval Mintz * 255fe56b9e6SYuval Mintz * @param p_hwfn 256fe56b9e6SYuval Mintz * @param p_chain 257fe56b9e6SYuval Mintz */ 258fe56b9e6SYuval Mintz void qed_chain_free(struct qed_dev *cdev, 259fe56b9e6SYuval Mintz struct qed_chain *p_chain); 260fe56b9e6SYuval Mintz 261fe56b9e6SYuval Mintz /** 262cee4d264SManish Chopra * @@brief qed_fw_l2_queue - Get absolute L2 queue ID 263cee4d264SManish Chopra * 264cee4d264SManish Chopra * @param p_hwfn 265cee4d264SManish Chopra * @param src_id - relative to p_hwfn 266cee4d264SManish Chopra * @param dst_id - absolute per engine 267cee4d264SManish Chopra * 268cee4d264SManish Chopra * @return int 269cee4d264SManish Chopra */ 270cee4d264SManish Chopra int qed_fw_l2_queue(struct qed_hwfn *p_hwfn, 271cee4d264SManish Chopra u16 src_id, 272cee4d264SManish Chopra u16 *dst_id); 273cee4d264SManish Chopra 274cee4d264SManish Chopra /** 275cee4d264SManish Chopra * @@brief qed_fw_vport - Get absolute vport ID 276cee4d264SManish Chopra * 277cee4d264SManish Chopra * @param p_hwfn 278cee4d264SManish Chopra * @param src_id - relative to p_hwfn 279cee4d264SManish Chopra * @param dst_id - absolute per engine 280cee4d264SManish Chopra * 281cee4d264SManish Chopra * @return int 282cee4d264SManish Chopra */ 283cee4d264SManish Chopra int qed_fw_vport(struct qed_hwfn *p_hwfn, 284cee4d264SManish Chopra u8 src_id, 285cee4d264SManish Chopra u8 *dst_id); 286cee4d264SManish Chopra 287cee4d264SManish Chopra /** 288cee4d264SManish Chopra * @@brief qed_fw_rss_eng - Get absolute RSS engine ID 289cee4d264SManish Chopra * 290cee4d264SManish Chopra * @param p_hwfn 291cee4d264SManish Chopra * @param src_id - relative to p_hwfn 292cee4d264SManish Chopra * @param dst_id - absolute per engine 293cee4d264SManish Chopra * 294cee4d264SManish Chopra * @return int 295cee4d264SManish Chopra */ 296cee4d264SManish Chopra int qed_fw_rss_eng(struct qed_hwfn *p_hwfn, 297cee4d264SManish Chopra u8 src_id, 298cee4d264SManish Chopra u8 *dst_id); 299cee4d264SManish Chopra 300cee4d264SManish Chopra /** 301fe56b9e6SYuval Mintz * *@brief Cleanup of previous driver remains prior to load 302fe56b9e6SYuval Mintz * 303fe56b9e6SYuval Mintz * @param p_hwfn 304fe56b9e6SYuval Mintz * @param p_ptt 305fe56b9e6SYuval Mintz * @param id - For PF, engine-relative. For VF, PF-relative. 3060b55e27dSYuval Mintz * @param is_vf - true iff cleanup is made for a VF. 307fe56b9e6SYuval Mintz * 308fe56b9e6SYuval Mintz * @return int 309fe56b9e6SYuval Mintz */ 310fe56b9e6SYuval Mintz int qed_final_cleanup(struct qed_hwfn *p_hwfn, 3110b55e27dSYuval Mintz struct qed_ptt *p_ptt, u16 id, bool is_vf); 312fe56b9e6SYuval Mintz 313fe56b9e6SYuval Mintz #endif 314