11f4d4ed6SAlexander Lobakin /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 20a7fb11cSYuval Mintz /* QLogic qed NIC Driver 3e8f1cb50SMintz, Yuval * Copyright (c) 2015-2017 QLogic Corporation 4663eacd8SAlexander Lobakin * Copyright (c) 2019-2020 Marvell International Ltd. 50a7fb11cSYuval Mintz */ 60a7fb11cSYuval Mintz 70a7fb11cSYuval Mintz #ifndef _QED_LL2_H 80a7fb11cSYuval Mintz #define _QED_LL2_H 90a7fb11cSYuval Mintz 100a7fb11cSYuval Mintz #include <linux/types.h> 110a7fb11cSYuval Mintz #include <linux/kernel.h> 120a7fb11cSYuval Mintz #include <linux/list.h> 130a7fb11cSYuval Mintz #include <linux/mutex.h> 140a7fb11cSYuval Mintz #include <linux/slab.h> 150a7fb11cSYuval Mintz #include <linux/spinlock.h> 160a7fb11cSYuval Mintz #include <linux/qed/qed_chain.h> 170a7fb11cSYuval Mintz #include <linux/qed/qed_ll2_if.h> 180a7fb11cSYuval Mintz #include "qed.h" 190a7fb11cSYuval Mintz #include "qed_hsi.h" 200a7fb11cSYuval Mintz #include "qed_sp.h" 210a7fb11cSYuval Mintz 220a7fb11cSYuval Mintz #define QED_MAX_NUM_OF_LL2_CONNECTIONS (4) 23997af5dfSMichal Kalderon /* LL2 queues handles will be split as follows: 24997af5dfSMichal Kalderon * first will be legacy queues, and then the ctx based queues. 25997af5dfSMichal Kalderon */ 26997af5dfSMichal Kalderon #define QED_MAX_NUM_OF_LL2_CONNS_PF (4) 27997af5dfSMichal Kalderon #define QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF (3) 28997af5dfSMichal Kalderon 29997af5dfSMichal Kalderon #define QED_MAX_NUM_OF_CTX_LL2_CONNS_PF \ 30997af5dfSMichal Kalderon (QED_MAX_NUM_OF_LL2_CONNS_PF - QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF) 31997af5dfSMichal Kalderon 32997af5dfSMichal Kalderon #define QED_LL2_LEGACY_CONN_BASE_PF 0 33997af5dfSMichal Kalderon #define QED_LL2_CTX_CONN_BASE_PF QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF 34997af5dfSMichal Kalderon 350a7fb11cSYuval Mintz struct qed_ll2_rx_packet { 360a7fb11cSYuval Mintz struct list_head list_entry; 370a7fb11cSYuval Mintz struct core_rx_bd_with_buff_len *rxq_bd; 380a7fb11cSYuval Mintz dma_addr_t rx_buf_addr; 390a7fb11cSYuval Mintz u16 buf_length; 400a7fb11cSYuval Mintz void *cookie; 410a7fb11cSYuval Mintz u8 placement_offset; 420a7fb11cSYuval Mintz u16 parse_flags; 430a7fb11cSYuval Mintz u16 packet_length; 440a7fb11cSYuval Mintz u16 vlan; 450a7fb11cSYuval Mintz u32 opaque_data[2]; 460a7fb11cSYuval Mintz }; 470a7fb11cSYuval Mintz 480a7fb11cSYuval Mintz struct qed_ll2_tx_packet { 490a7fb11cSYuval Mintz struct list_head list_entry; 500a7fb11cSYuval Mintz u16 bd_used; 510a7fb11cSYuval Mintz bool notify_fw; 520a7fb11cSYuval Mintz void *cookie; 53f5823fe6SMichal Kalderon /* Flexible Array of bds_set determined by max_bds_per_packet */ 540a7fb11cSYuval Mintz struct { 550a7fb11cSYuval Mintz struct core_tx_bd *txq_bd; 560a7fb11cSYuval Mintz dma_addr_t tx_frag; 570a7fb11cSYuval Mintz u16 frag_len; 58a93b6a2bSGustavo A. R. Silva } bds_set[]; 590a7fb11cSYuval Mintz }; 600a7fb11cSYuval Mintz 610a7fb11cSYuval Mintz struct qed_ll2_rx_queue { 620a7fb11cSYuval Mintz /* Lock protecting the Rx queue manipulation */ 630a7fb11cSYuval Mintz spinlock_t lock; 640a7fb11cSYuval Mintz struct qed_chain rxq_chain; 650a7fb11cSYuval Mintz struct qed_chain rcq_chain; 660a7fb11cSYuval Mintz u8 rx_sb_index; 67997af5dfSMichal Kalderon u8 ctx_based; 686a42b512SColin Ian King bool b_cb_registered; 690a7fb11cSYuval Mintz __le16 *p_fw_cons; 700a7fb11cSYuval Mintz struct list_head active_descq; 710a7fb11cSYuval Mintz struct list_head free_descq; 720a7fb11cSYuval Mintz struct list_head posting_descq; 730a7fb11cSYuval Mintz struct qed_ll2_rx_packet *descq_array; 740a7fb11cSYuval Mintz void __iomem *set_prod_addr; 75997af5dfSMichal Kalderon struct core_pwm_prod_update_data db_data; 760a7fb11cSYuval Mintz }; 770a7fb11cSYuval Mintz 780a7fb11cSYuval Mintz struct qed_ll2_tx_queue { 790a7fb11cSYuval Mintz /* Lock protecting the Tx queue manipulation */ 800a7fb11cSYuval Mintz spinlock_t lock; 810a7fb11cSYuval Mintz struct qed_chain txq_chain; 820a7fb11cSYuval Mintz u8 tx_sb_index; 836a42b512SColin Ian King bool b_cb_registered; 840a7fb11cSYuval Mintz __le16 *p_fw_cons; 850a7fb11cSYuval Mintz struct list_head active_descq; 860a7fb11cSYuval Mintz struct list_head free_descq; 870a7fb11cSYuval Mintz struct list_head sending_descq; 880a7fb11cSYuval Mintz u16 cur_completing_bd_idx; 890a7fb11cSYuval Mintz void __iomem *doorbell_addr; 90b78d5400SAriel Elior struct core_db_data db_msg; 910a7fb11cSYuval Mintz u16 bds_idx; 920a7fb11cSYuval Mintz u16 cur_send_frag_num; 930a7fb11cSYuval Mintz u16 cur_completing_frag_num; 940a7fb11cSYuval Mintz bool b_completing_packet; 95a93b6a2bSGustavo A. R. Silva void *descq_mem; /* memory for variable sized qed_ll2_tx_packet*/ 96a93b6a2bSGustavo A. R. Silva struct qed_ll2_tx_packet *cur_send_packet; 97a93b6a2bSGustavo A. R. Silva struct qed_ll2_tx_packet cur_completing_packet; 980a7fb11cSYuval Mintz }; 990a7fb11cSYuval Mintz 1000629a330SArnd Bergmann struct qed_ll2_info { 1010629a330SArnd Bergmann /* Lock protecting the state of LL2 */ 1020629a330SArnd Bergmann struct mutex mutex; 10313c54771SMintz, Yuval 10413c54771SMintz, Yuval struct qed_ll2_acquire_data_inputs input; 1050629a330SArnd Bergmann u32 cid; 1060629a330SArnd Bergmann u8 my_id; 1070629a330SArnd Bergmann u8 queue_id; 1080629a330SArnd Bergmann u8 tx_stats_id; 1090629a330SArnd Bergmann bool b_active; 11013c54771SMintz, Yuval enum core_tx_dest tx_dest; 1110a7fb11cSYuval Mintz u8 tx_stats_en; 112ed468ebeSMichal Kalderon bool main_func_queue; 113*eea03d18SGustavo A. R. Silva struct qed_ll2_cbs cbs; 1140a7fb11cSYuval Mintz struct qed_ll2_rx_queue rx_queue; 1150a7fb11cSYuval Mintz struct qed_ll2_tx_queue tx_queue; 1160a7fb11cSYuval Mintz }; 1170a7fb11cSYuval Mintz 118c6b7314dSAlexander Lobakin extern const struct qed_ll2_ops qed_ll2_ops_pass; 119c6b7314dSAlexander Lobakin 1200a7fb11cSYuval Mintz /** 12119198e4eSPrabhakar Kushwaha * qed_ll2_acquire_connection(): Allocate resources, 12219198e4eSPrabhakar Kushwaha * starts rx & tx (if relevant) queues pair. 12319198e4eSPrabhakar Kushwaha * Provides connecion handler as output 12419198e4eSPrabhakar Kushwaha * parameter. 1250a7fb11cSYuval Mintz * 12619198e4eSPrabhakar Kushwaha * @cxt: Pointer to the hw-function [opaque to some]. 12719198e4eSPrabhakar Kushwaha * @data: Describes connection parameters. 12813c54771SMintz, Yuval * 12919198e4eSPrabhakar Kushwaha * Return: Int. 1300a7fb11cSYuval Mintz */ 1310518c12fSMichal Kalderon int qed_ll2_acquire_connection(void *cxt, struct qed_ll2_acquire_data *data); 1320a7fb11cSYuval Mintz 1330a7fb11cSYuval Mintz /** 13419198e4eSPrabhakar Kushwaha * qed_ll2_establish_connection(): start previously allocated LL2 queues pair 1350a7fb11cSYuval Mintz * 13619198e4eSPrabhakar Kushwaha * @cxt: Pointer to the hw-function [opaque to some]. 13719198e4eSPrabhakar Kushwaha * @connection_handle: LL2 connection's handle obtained from 13819198e4eSPrabhakar Kushwaha * qed_ll2_require_connection. 1390a7fb11cSYuval Mintz * 14019198e4eSPrabhakar Kushwaha * Return: 0 on success, failure otherwise. 1410a7fb11cSYuval Mintz */ 1420518c12fSMichal Kalderon int qed_ll2_establish_connection(void *cxt, u8 connection_handle); 1430a7fb11cSYuval Mintz 1440a7fb11cSYuval Mintz /** 14519198e4eSPrabhakar Kushwaha * qed_ll2_post_rx_buffer(): Submit buffers to LL2 Rx queue. 1460a7fb11cSYuval Mintz * 14719198e4eSPrabhakar Kushwaha * @cxt: Pointer to the hw-function [opaque to some]. 14819198e4eSPrabhakar Kushwaha * @connection_handle: LL2 connection's handle obtained from 14919198e4eSPrabhakar Kushwaha * qed_ll2_require_connection. 15019198e4eSPrabhakar Kushwaha * @addr: RX (physical address) buffers to submit. 15119198e4eSPrabhakar Kushwaha * @buf_len: Buffer Len. 15219198e4eSPrabhakar Kushwaha * @cookie: Cookie. 15319198e4eSPrabhakar Kushwaha * @notify_fw: Produce corresponding Rx BD immediately. 1540a7fb11cSYuval Mintz * 15519198e4eSPrabhakar Kushwaha * Return: 0 on success, failure otherwise. 1560a7fb11cSYuval Mintz */ 1570518c12fSMichal Kalderon int qed_ll2_post_rx_buffer(void *cxt, 1580a7fb11cSYuval Mintz u8 connection_handle, 1590a7fb11cSYuval Mintz dma_addr_t addr, 1600a7fb11cSYuval Mintz u16 buf_len, void *cookie, u8 notify_fw); 1610a7fb11cSYuval Mintz 1620a7fb11cSYuval Mintz /** 16319198e4eSPrabhakar Kushwaha * qed_ll2_prepare_tx_packet(): Request for start Tx BD 1640a7fb11cSYuval Mintz * to prepare Tx packet submission to FW. 1650a7fb11cSYuval Mintz * 16619198e4eSPrabhakar Kushwaha * @cxt: Pointer to the hw-function [opaque to some]. 16719198e4eSPrabhakar Kushwaha * @connection_handle: Connection handle. 16819198e4eSPrabhakar Kushwaha * @pkt: Info regarding the tx packet. 16919198e4eSPrabhakar Kushwaha * @notify_fw: Issue doorbell to fw for this packet. 1700a7fb11cSYuval Mintz * 17119198e4eSPrabhakar Kushwaha * Return: 0 on success, failure otherwise. 1720a7fb11cSYuval Mintz */ 1730518c12fSMichal Kalderon int qed_ll2_prepare_tx_packet(void *cxt, 1740a7fb11cSYuval Mintz u8 connection_handle, 1757c7973b2SMintz, Yuval struct qed_ll2_tx_pkt_info *pkt, 1767c7973b2SMintz, Yuval bool notify_fw); 1770a7fb11cSYuval Mintz 1780a7fb11cSYuval Mintz /** 17919198e4eSPrabhakar Kushwaha * qed_ll2_release_connection(): Releases resources allocated for LL2 18019198e4eSPrabhakar Kushwaha * connection. 1810a7fb11cSYuval Mintz * 18219198e4eSPrabhakar Kushwaha * @cxt: Pointer to the hw-function [opaque to some]. 18319198e4eSPrabhakar Kushwaha * @connection_handle: LL2 connection's handle obtained from 18419198e4eSPrabhakar Kushwaha * qed_ll2_require_connection. 18519198e4eSPrabhakar Kushwaha * 18619198e4eSPrabhakar Kushwaha * Return: Void. 1870a7fb11cSYuval Mintz */ 1880518c12fSMichal Kalderon void qed_ll2_release_connection(void *cxt, u8 connection_handle); 1890a7fb11cSYuval Mintz 1900a7fb11cSYuval Mintz /** 19119198e4eSPrabhakar Kushwaha * qed_ll2_set_fragment_of_tx_packet(): Provides fragments to fill 1920a7fb11cSYuval Mintz * Tx BD of BDs requested by 1930a7fb11cSYuval Mintz * qed_ll2_prepare_tx_packet 1940a7fb11cSYuval Mintz * 19519198e4eSPrabhakar Kushwaha * @cxt: Pointer to the hw-function [opaque to some]. 19619198e4eSPrabhakar Kushwaha * @connection_handle: LL2 connection's handle obtained from 19719198e4eSPrabhakar Kushwaha * qed_ll2_require_connection. 19819198e4eSPrabhakar Kushwaha * @addr: Address. 19919198e4eSPrabhakar Kushwaha * @nbytes: Number of bytes. 2000a7fb11cSYuval Mintz * 20119198e4eSPrabhakar Kushwaha * Return: 0 on success, failure otherwise. 2020a7fb11cSYuval Mintz */ 2030518c12fSMichal Kalderon int qed_ll2_set_fragment_of_tx_packet(void *cxt, 2040a7fb11cSYuval Mintz u8 connection_handle, 2050a7fb11cSYuval Mintz dma_addr_t addr, u16 nbytes); 2060a7fb11cSYuval Mintz 2070a7fb11cSYuval Mintz /** 20819198e4eSPrabhakar Kushwaha * qed_ll2_terminate_connection(): Stops Tx/Rx queues 2090a7fb11cSYuval Mintz * 21019198e4eSPrabhakar Kushwaha * @cxt: Pointer to the hw-function [opaque to some]. 21119198e4eSPrabhakar Kushwaha * @connection_handle: LL2 connection's handle obtained from 21219198e4eSPrabhakar Kushwaha * qed_ll2_require_connection. 2130a7fb11cSYuval Mintz * 21419198e4eSPrabhakar Kushwaha * Return: 0 on success, failure otherwise. 2150a7fb11cSYuval Mintz */ 2160518c12fSMichal Kalderon int qed_ll2_terminate_connection(void *cxt, u8 connection_handle); 2170a7fb11cSYuval Mintz 2180a7fb11cSYuval Mintz /** 21919198e4eSPrabhakar Kushwaha * qed_ll2_get_stats(): Get LL2 queue's statistics 2200a7fb11cSYuval Mintz * 22119198e4eSPrabhakar Kushwaha * @cxt: Pointer to the hw-function [opaque to some]. 22219198e4eSPrabhakar Kushwaha * @connection_handle: LL2 connection's handle obtained from 22319198e4eSPrabhakar Kushwaha * qed_ll2_require_connection. 22419198e4eSPrabhakar Kushwaha * @p_stats: Pointer Status. 2250a7fb11cSYuval Mintz * 22619198e4eSPrabhakar Kushwaha * Return: 0 on success, failure otherwise. 2270a7fb11cSYuval Mintz */ 2280518c12fSMichal Kalderon int qed_ll2_get_stats(void *cxt, 2290a7fb11cSYuval Mintz u8 connection_handle, struct qed_ll2_stats *p_stats); 2300a7fb11cSYuval Mintz 2310a7fb11cSYuval Mintz /** 23219198e4eSPrabhakar Kushwaha * qed_ll2_alloc(): Allocates LL2 connections set. 2330a7fb11cSYuval Mintz * 23419198e4eSPrabhakar Kushwaha * @p_hwfn: HW device data. 2350a7fb11cSYuval Mintz * 23619198e4eSPrabhakar Kushwaha * Return: Int. 2370a7fb11cSYuval Mintz */ 2383587cb87STomer Tayar int qed_ll2_alloc(struct qed_hwfn *p_hwfn); 2390a7fb11cSYuval Mintz 2400a7fb11cSYuval Mintz /** 24119198e4eSPrabhakar Kushwaha * qed_ll2_setup(): Inits LL2 connections set. 2420a7fb11cSYuval Mintz * 24319198e4eSPrabhakar Kushwaha * @p_hwfn: HW device data. 24419198e4eSPrabhakar Kushwaha * 24519198e4eSPrabhakar Kushwaha * Return: Void. 2460a7fb11cSYuval Mintz * 2470a7fb11cSYuval Mintz */ 2483587cb87STomer Tayar void qed_ll2_setup(struct qed_hwfn *p_hwfn); 2490a7fb11cSYuval Mintz 2500a7fb11cSYuval Mintz /** 25119198e4eSPrabhakar Kushwaha * qed_ll2_free(): Releases LL2 connections set 2520a7fb11cSYuval Mintz * 25319198e4eSPrabhakar Kushwaha * @p_hwfn: HW device data. 25419198e4eSPrabhakar Kushwaha * 25519198e4eSPrabhakar Kushwaha * Return: Void. 2560a7fb11cSYuval Mintz * 2570a7fb11cSYuval Mintz */ 2583587cb87STomer Tayar void qed_ll2_free(struct qed_hwfn *p_hwfn); 2593587cb87STomer Tayar 2600a7fb11cSYuval Mintz #endif 261