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