18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 28c2ecf20Sopenharmony_ci/* QLogic qed NIC Driver 38c2ecf20Sopenharmony_ci * Copyright (c) 2015-2017 QLogic Corporation 48c2ecf20Sopenharmony_ci * Copyright (c) 2019-2020 Marvell International Ltd. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef _QED_LL2_H 88c2ecf20Sopenharmony_ci#define _QED_LL2_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/types.h> 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/list.h> 138c2ecf20Sopenharmony_ci#include <linux/mutex.h> 148c2ecf20Sopenharmony_ci#include <linux/slab.h> 158c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 168c2ecf20Sopenharmony_ci#include <linux/qed/qed_chain.h> 178c2ecf20Sopenharmony_ci#include <linux/qed/qed_ll2_if.h> 188c2ecf20Sopenharmony_ci#include "qed.h" 198c2ecf20Sopenharmony_ci#include "qed_hsi.h" 208c2ecf20Sopenharmony_ci#include "qed_sp.h" 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define QED_MAX_NUM_OF_LL2_CONNECTIONS (4) 238c2ecf20Sopenharmony_ci/* LL2 queues handles will be split as follows: 248c2ecf20Sopenharmony_ci * first will be legacy queues, and then the ctx based queues. 258c2ecf20Sopenharmony_ci */ 268c2ecf20Sopenharmony_ci#define QED_MAX_NUM_OF_LL2_CONNS_PF (4) 278c2ecf20Sopenharmony_ci#define QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF (3) 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define QED_MAX_NUM_OF_CTX_LL2_CONNS_PF \ 308c2ecf20Sopenharmony_ci (QED_MAX_NUM_OF_LL2_CONNS_PF - QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF) 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define QED_LL2_LEGACY_CONN_BASE_PF 0 338c2ecf20Sopenharmony_ci#define QED_LL2_CTX_CONN_BASE_PF QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistruct qed_ll2_rx_packet { 378c2ecf20Sopenharmony_ci struct list_head list_entry; 388c2ecf20Sopenharmony_ci struct core_rx_bd_with_buff_len *rxq_bd; 398c2ecf20Sopenharmony_ci dma_addr_t rx_buf_addr; 408c2ecf20Sopenharmony_ci u16 buf_length; 418c2ecf20Sopenharmony_ci void *cookie; 428c2ecf20Sopenharmony_ci u8 placement_offset; 438c2ecf20Sopenharmony_ci u16 parse_flags; 448c2ecf20Sopenharmony_ci u16 packet_length; 458c2ecf20Sopenharmony_ci u16 vlan; 468c2ecf20Sopenharmony_ci u32 opaque_data[2]; 478c2ecf20Sopenharmony_ci}; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cistruct qed_ll2_tx_packet { 508c2ecf20Sopenharmony_ci struct list_head list_entry; 518c2ecf20Sopenharmony_ci u16 bd_used; 528c2ecf20Sopenharmony_ci bool notify_fw; 538c2ecf20Sopenharmony_ci void *cookie; 548c2ecf20Sopenharmony_ci /* Flexible Array of bds_set determined by max_bds_per_packet */ 558c2ecf20Sopenharmony_ci struct { 568c2ecf20Sopenharmony_ci struct core_tx_bd *txq_bd; 578c2ecf20Sopenharmony_ci dma_addr_t tx_frag; 588c2ecf20Sopenharmony_ci u16 frag_len; 598c2ecf20Sopenharmony_ci } bds_set[]; 608c2ecf20Sopenharmony_ci}; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_cistruct qed_ll2_rx_queue { 638c2ecf20Sopenharmony_ci /* Lock protecting the Rx queue manipulation */ 648c2ecf20Sopenharmony_ci spinlock_t lock; 658c2ecf20Sopenharmony_ci struct qed_chain rxq_chain; 668c2ecf20Sopenharmony_ci struct qed_chain rcq_chain; 678c2ecf20Sopenharmony_ci u8 rx_sb_index; 688c2ecf20Sopenharmony_ci u8 ctx_based; 698c2ecf20Sopenharmony_ci bool b_cb_registered; 708c2ecf20Sopenharmony_ci __le16 *p_fw_cons; 718c2ecf20Sopenharmony_ci struct list_head active_descq; 728c2ecf20Sopenharmony_ci struct list_head free_descq; 738c2ecf20Sopenharmony_ci struct list_head posting_descq; 748c2ecf20Sopenharmony_ci struct qed_ll2_rx_packet *descq_array; 758c2ecf20Sopenharmony_ci void __iomem *set_prod_addr; 768c2ecf20Sopenharmony_ci struct core_pwm_prod_update_data db_data; 778c2ecf20Sopenharmony_ci}; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cistruct qed_ll2_tx_queue { 808c2ecf20Sopenharmony_ci /* Lock protecting the Tx queue manipulation */ 818c2ecf20Sopenharmony_ci spinlock_t lock; 828c2ecf20Sopenharmony_ci struct qed_chain txq_chain; 838c2ecf20Sopenharmony_ci u8 tx_sb_index; 848c2ecf20Sopenharmony_ci bool b_cb_registered; 858c2ecf20Sopenharmony_ci __le16 *p_fw_cons; 868c2ecf20Sopenharmony_ci struct list_head active_descq; 878c2ecf20Sopenharmony_ci struct list_head free_descq; 888c2ecf20Sopenharmony_ci struct list_head sending_descq; 898c2ecf20Sopenharmony_ci u16 cur_completing_bd_idx; 908c2ecf20Sopenharmony_ci void __iomem *doorbell_addr; 918c2ecf20Sopenharmony_ci struct core_db_data db_msg; 928c2ecf20Sopenharmony_ci u16 bds_idx; 938c2ecf20Sopenharmony_ci u16 cur_send_frag_num; 948c2ecf20Sopenharmony_ci u16 cur_completing_frag_num; 958c2ecf20Sopenharmony_ci bool b_completing_packet; 968c2ecf20Sopenharmony_ci void *descq_mem; /* memory for variable sized qed_ll2_tx_packet*/ 978c2ecf20Sopenharmony_ci struct qed_ll2_tx_packet *cur_send_packet; 988c2ecf20Sopenharmony_ci struct qed_ll2_tx_packet cur_completing_packet; 998c2ecf20Sopenharmony_ci}; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_cistruct qed_ll2_info { 1028c2ecf20Sopenharmony_ci /* Lock protecting the state of LL2 */ 1038c2ecf20Sopenharmony_ci struct mutex mutex; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci struct qed_ll2_acquire_data_inputs input; 1068c2ecf20Sopenharmony_ci u32 cid; 1078c2ecf20Sopenharmony_ci u8 my_id; 1088c2ecf20Sopenharmony_ci u8 queue_id; 1098c2ecf20Sopenharmony_ci u8 tx_stats_id; 1108c2ecf20Sopenharmony_ci bool b_active; 1118c2ecf20Sopenharmony_ci enum core_tx_dest tx_dest; 1128c2ecf20Sopenharmony_ci u8 tx_stats_en; 1138c2ecf20Sopenharmony_ci bool main_func_queue; 1148c2ecf20Sopenharmony_ci struct qed_ll2_cbs cbs; 1158c2ecf20Sopenharmony_ci struct qed_ll2_rx_queue rx_queue; 1168c2ecf20Sopenharmony_ci struct qed_ll2_tx_queue tx_queue; 1178c2ecf20Sopenharmony_ci}; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ciextern const struct qed_ll2_ops qed_ll2_ops_pass; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci/** 1228c2ecf20Sopenharmony_ci * @brief qed_ll2_acquire_connection - allocate resources, 1238c2ecf20Sopenharmony_ci * starts rx & tx (if relevant) queues pair. Provides 1248c2ecf20Sopenharmony_ci * connecion handler as output parameter. 1258c2ecf20Sopenharmony_ci * 1268c2ecf20Sopenharmony_ci * 1278c2ecf20Sopenharmony_ci * @param cxt - pointer to the hw-function [opaque to some] 1288c2ecf20Sopenharmony_ci * @param data - describes connection parameters 1298c2ecf20Sopenharmony_ci * @return int 1308c2ecf20Sopenharmony_ci */ 1318c2ecf20Sopenharmony_ciint qed_ll2_acquire_connection(void *cxt, struct qed_ll2_acquire_data *data); 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci/** 1348c2ecf20Sopenharmony_ci * @brief qed_ll2_establish_connection - start previously 1358c2ecf20Sopenharmony_ci * allocated LL2 queues pair 1368c2ecf20Sopenharmony_ci * 1378c2ecf20Sopenharmony_ci * @param cxt - pointer to the hw-function [opaque to some] 1388c2ecf20Sopenharmony_ci * @param p_ptt 1398c2ecf20Sopenharmony_ci * @param connection_handle LL2 connection's handle obtained from 1408c2ecf20Sopenharmony_ci * qed_ll2_require_connection 1418c2ecf20Sopenharmony_ci * 1428c2ecf20Sopenharmony_ci * @return 0 on success, failure otherwise 1438c2ecf20Sopenharmony_ci */ 1448c2ecf20Sopenharmony_ciint qed_ll2_establish_connection(void *cxt, u8 connection_handle); 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci/** 1478c2ecf20Sopenharmony_ci * @brief qed_ll2_post_rx_buffers - submit buffers to LL2 Rx queue. 1488c2ecf20Sopenharmony_ci * 1498c2ecf20Sopenharmony_ci * @param cxt - pointer to the hw-function [opaque to some] 1508c2ecf20Sopenharmony_ci * @param connection_handle LL2 connection's handle obtained from 1518c2ecf20Sopenharmony_ci * qed_ll2_require_connection 1528c2ecf20Sopenharmony_ci * @param addr rx (physical address) buffers to submit 1538c2ecf20Sopenharmony_ci * @param cookie 1548c2ecf20Sopenharmony_ci * @param notify_fw produce corresponding Rx BD immediately 1558c2ecf20Sopenharmony_ci * 1568c2ecf20Sopenharmony_ci * @return 0 on success, failure otherwise 1578c2ecf20Sopenharmony_ci */ 1588c2ecf20Sopenharmony_ciint qed_ll2_post_rx_buffer(void *cxt, 1598c2ecf20Sopenharmony_ci u8 connection_handle, 1608c2ecf20Sopenharmony_ci dma_addr_t addr, 1618c2ecf20Sopenharmony_ci u16 buf_len, void *cookie, u8 notify_fw); 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci/** 1648c2ecf20Sopenharmony_ci * @brief qed_ll2_prepare_tx_packet - request for start Tx BD 1658c2ecf20Sopenharmony_ci * to prepare Tx packet submission to FW. 1668c2ecf20Sopenharmony_ci * 1678c2ecf20Sopenharmony_ci * @param cxt - pointer to the hw-function [opaque to some] 1688c2ecf20Sopenharmony_ci * @param connection_handle 1698c2ecf20Sopenharmony_ci * @param pkt - info regarding the tx packet 1708c2ecf20Sopenharmony_ci * @param notify_fw - issue doorbell to fw for this packet 1718c2ecf20Sopenharmony_ci * 1728c2ecf20Sopenharmony_ci * @return 0 on success, failure otherwise 1738c2ecf20Sopenharmony_ci */ 1748c2ecf20Sopenharmony_ciint qed_ll2_prepare_tx_packet(void *cxt, 1758c2ecf20Sopenharmony_ci u8 connection_handle, 1768c2ecf20Sopenharmony_ci struct qed_ll2_tx_pkt_info *pkt, 1778c2ecf20Sopenharmony_ci bool notify_fw); 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci/** 1808c2ecf20Sopenharmony_ci * @brief qed_ll2_release_connection - releases resources 1818c2ecf20Sopenharmony_ci * allocated for LL2 connection 1828c2ecf20Sopenharmony_ci * 1838c2ecf20Sopenharmony_ci * @param cxt - pointer to the hw-function [opaque to some] 1848c2ecf20Sopenharmony_ci * @param connection_handle LL2 connection's handle obtained from 1858c2ecf20Sopenharmony_ci * qed_ll2_require_connection 1868c2ecf20Sopenharmony_ci */ 1878c2ecf20Sopenharmony_civoid qed_ll2_release_connection(void *cxt, u8 connection_handle); 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci/** 1908c2ecf20Sopenharmony_ci * @brief qed_ll2_set_fragment_of_tx_packet - provides fragments to fill 1918c2ecf20Sopenharmony_ci * Tx BD of BDs requested by 1928c2ecf20Sopenharmony_ci * qed_ll2_prepare_tx_packet 1938c2ecf20Sopenharmony_ci * 1948c2ecf20Sopenharmony_ci * @param cxt - pointer to the hw-function [opaque to some] 1958c2ecf20Sopenharmony_ci * @param connection_handle LL2 connection's handle 1968c2ecf20Sopenharmony_ci * obtained from 1978c2ecf20Sopenharmony_ci * qed_ll2_require_connection 1988c2ecf20Sopenharmony_ci * @param addr 1998c2ecf20Sopenharmony_ci * @param nbytes 2008c2ecf20Sopenharmony_ci * 2018c2ecf20Sopenharmony_ci * @return 0 on success, failure otherwise 2028c2ecf20Sopenharmony_ci */ 2038c2ecf20Sopenharmony_ciint qed_ll2_set_fragment_of_tx_packet(void *cxt, 2048c2ecf20Sopenharmony_ci u8 connection_handle, 2058c2ecf20Sopenharmony_ci dma_addr_t addr, u16 nbytes); 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci/** 2088c2ecf20Sopenharmony_ci * @brief qed_ll2_terminate_connection - stops Tx/Rx queues 2098c2ecf20Sopenharmony_ci * 2108c2ecf20Sopenharmony_ci * 2118c2ecf20Sopenharmony_ci * @param cxt - pointer to the hw-function [opaque to some] 2128c2ecf20Sopenharmony_ci * @param connection_handle LL2 connection's handle 2138c2ecf20Sopenharmony_ci * obtained from 2148c2ecf20Sopenharmony_ci * qed_ll2_require_connection 2158c2ecf20Sopenharmony_ci * 2168c2ecf20Sopenharmony_ci * @return 0 on success, failure otherwise 2178c2ecf20Sopenharmony_ci */ 2188c2ecf20Sopenharmony_ciint qed_ll2_terminate_connection(void *cxt, u8 connection_handle); 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci/** 2218c2ecf20Sopenharmony_ci * @brief qed_ll2_get_stats - get LL2 queue's statistics 2228c2ecf20Sopenharmony_ci * 2238c2ecf20Sopenharmony_ci * 2248c2ecf20Sopenharmony_ci * @param cxt - pointer to the hw-function [opaque to some] 2258c2ecf20Sopenharmony_ci * @param connection_handle LL2 connection's handle obtained from 2268c2ecf20Sopenharmony_ci * qed_ll2_require_connection 2278c2ecf20Sopenharmony_ci * @param p_stats 2288c2ecf20Sopenharmony_ci * 2298c2ecf20Sopenharmony_ci * @return 0 on success, failure otherwise 2308c2ecf20Sopenharmony_ci */ 2318c2ecf20Sopenharmony_ciint qed_ll2_get_stats(void *cxt, 2328c2ecf20Sopenharmony_ci u8 connection_handle, struct qed_ll2_stats *p_stats); 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci/** 2358c2ecf20Sopenharmony_ci * @brief qed_ll2_alloc - Allocates LL2 connections set 2368c2ecf20Sopenharmony_ci * 2378c2ecf20Sopenharmony_ci * @param p_hwfn 2388c2ecf20Sopenharmony_ci * 2398c2ecf20Sopenharmony_ci * @return int 2408c2ecf20Sopenharmony_ci */ 2418c2ecf20Sopenharmony_ciint qed_ll2_alloc(struct qed_hwfn *p_hwfn); 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci/** 2448c2ecf20Sopenharmony_ci * @brief qed_ll2_setup - Inits LL2 connections set 2458c2ecf20Sopenharmony_ci * 2468c2ecf20Sopenharmony_ci * @param p_hwfn 2478c2ecf20Sopenharmony_ci * 2488c2ecf20Sopenharmony_ci */ 2498c2ecf20Sopenharmony_civoid qed_ll2_setup(struct qed_hwfn *p_hwfn); 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci/** 2528c2ecf20Sopenharmony_ci * @brief qed_ll2_free - Releases LL2 connections set 2538c2ecf20Sopenharmony_ci * 2548c2ecf20Sopenharmony_ci * @param p_hwfn 2558c2ecf20Sopenharmony_ci * 2568c2ecf20Sopenharmony_ci */ 2578c2ecf20Sopenharmony_civoid qed_ll2_free(struct qed_hwfn *p_hwfn); 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_ci#endif 260