11f4d4ed6SAlexander Lobakin /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
21d6cff4fSYuval Mintz /* QLogic qed NIC Driver
3e8f1cb50SMintz, Yuval  * Copyright (c) 2015-2017  QLogic Corporation
4663eacd8SAlexander Lobakin  * Copyright (c) 2019-2020 Marvell International Ltd.
51d6cff4fSYuval Mintz  */
61d6cff4fSYuval Mintz 
71d6cff4fSYuval Mintz #ifndef _QED_OOO_H
81d6cff4fSYuval Mintz #define _QED_OOO_H
91d6cff4fSYuval Mintz #include <linux/types.h>
101d6cff4fSYuval Mintz #include <linux/list.h>
111d6cff4fSYuval Mintz #include <linux/slab.h>
121d6cff4fSYuval Mintz #include "qed.h"
131d6cff4fSYuval Mintz 
141d6cff4fSYuval Mintz #define QED_MAX_NUM_ISLES	256
151d6cff4fSYuval Mintz #define QED_MAX_NUM_OOO_HISTORY_ENTRIES	512
161d6cff4fSYuval Mintz 
171d6cff4fSYuval Mintz #define QED_OOO_LEFT_BUF	0
181d6cff4fSYuval Mintz #define QED_OOO_RIGHT_BUF	1
191d6cff4fSYuval Mintz 
201d6cff4fSYuval Mintz struct qed_ooo_buffer {
211d6cff4fSYuval Mintz 	struct list_head list_entry;
221d6cff4fSYuval Mintz 	void *rx_buffer_virt_addr;
231d6cff4fSYuval Mintz 	dma_addr_t rx_buffer_phys_addr;
241d6cff4fSYuval Mintz 	u32 rx_buffer_size;
251d6cff4fSYuval Mintz 	u16 packet_length;
261d6cff4fSYuval Mintz 	u16 parse_flags;
271d6cff4fSYuval Mintz 	u16 vlan;
281d6cff4fSYuval Mintz 	u8 placement_offset;
291d6cff4fSYuval Mintz };
301d6cff4fSYuval Mintz 
311d6cff4fSYuval Mintz struct qed_ooo_isle {
321d6cff4fSYuval Mintz 	struct list_head list_entry;
331d6cff4fSYuval Mintz 	struct list_head buffers_list;
341d6cff4fSYuval Mintz };
351d6cff4fSYuval Mintz 
361d6cff4fSYuval Mintz struct qed_ooo_archipelago {
371d6cff4fSYuval Mintz 	struct list_head isles_list;
381d6cff4fSYuval Mintz };
391d6cff4fSYuval Mintz 
401d6cff4fSYuval Mintz struct qed_ooo_history {
411d6cff4fSYuval Mintz 	struct ooo_opaque *p_cqes;
421d6cff4fSYuval Mintz 	u32 head_idx;
431d6cff4fSYuval Mintz 	u32 num_of_cqes;
441d6cff4fSYuval Mintz };
451d6cff4fSYuval Mintz 
461d6cff4fSYuval Mintz struct qed_ooo_info {
471d6cff4fSYuval Mintz 	struct list_head free_buffers_list;
481d6cff4fSYuval Mintz 	struct list_head ready_buffers_list;
491d6cff4fSYuval Mintz 	struct list_head free_isles_list;
501d6cff4fSYuval Mintz 	struct qed_ooo_archipelago *p_archipelagos_mem;
511d6cff4fSYuval Mintz 	struct qed_ooo_isle *p_isles_mem;
521d6cff4fSYuval Mintz 	struct qed_ooo_history ooo_history;
531d6cff4fSYuval Mintz 	u32 cur_isles_number;
541d6cff4fSYuval Mintz 	u32 max_isles_number;
551d6cff4fSYuval Mintz 	u32 gen_isles_number;
561eec2437SMichal Kalderon 	u16 max_num_archipelagos;
571eec2437SMichal Kalderon 	u16 cid_base;
581d6cff4fSYuval Mintz };
591d6cff4fSYuval Mintz 
60f436baf3SMichal Kalderon #if IS_ENABLED(CONFIG_QED_OOO)
611d6cff4fSYuval Mintz void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
621d6cff4fSYuval Mintz 				struct qed_ooo_info *p_ooo_info,
631d6cff4fSYuval Mintz 				struct ooo_opaque *p_cqe);
641d6cff4fSYuval Mintz 
653587cb87STomer Tayar int qed_ooo_alloc(struct qed_hwfn *p_hwfn);
663587cb87STomer Tayar 
673587cb87STomer Tayar void qed_ooo_setup(struct qed_hwfn *p_hwfn);
683587cb87STomer Tayar 
693587cb87STomer Tayar void qed_ooo_free(struct qed_hwfn *p_hwfn);
701d6cff4fSYuval Mintz 
711d6cff4fSYuval Mintz void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
721d6cff4fSYuval Mintz 				      struct qed_ooo_info *p_ooo_info,
731d6cff4fSYuval Mintz 				      u32 cid);
741d6cff4fSYuval Mintz 
751d6cff4fSYuval Mintz void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
761d6cff4fSYuval Mintz 			       struct qed_ooo_info *p_ooo_info);
771d6cff4fSYuval Mintz 
781d6cff4fSYuval Mintz void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
791d6cff4fSYuval Mintz 			     struct qed_ooo_info *p_ooo_info,
801d6cff4fSYuval Mintz 			     struct qed_ooo_buffer *p_buffer);
811d6cff4fSYuval Mintz 
821d6cff4fSYuval Mintz struct qed_ooo_buffer *
831d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
841d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info);
851d6cff4fSYuval Mintz 
861d6cff4fSYuval Mintz void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
871d6cff4fSYuval Mintz 			      struct qed_ooo_info *p_ooo_info,
881d6cff4fSYuval Mintz 			      struct qed_ooo_buffer *p_buffer, u8 on_tail);
891d6cff4fSYuval Mintz 
901d6cff4fSYuval Mintz struct qed_ooo_buffer *
911d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
921d6cff4fSYuval Mintz 			 struct qed_ooo_info *p_ooo_info);
931d6cff4fSYuval Mintz 
941d6cff4fSYuval Mintz void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
951d6cff4fSYuval Mintz 			  struct qed_ooo_info *p_ooo_info,
961d6cff4fSYuval Mintz 			  u32 cid, u8 drop_isle, u8 drop_size);
971d6cff4fSYuval Mintz 
981d6cff4fSYuval Mintz void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
991d6cff4fSYuval Mintz 			  struct qed_ooo_info *p_ooo_info,
1001d6cff4fSYuval Mintz 			  u32 cid,
1011d6cff4fSYuval Mintz 			  u8 ooo_isle, struct qed_ooo_buffer *p_buffer);
1021d6cff4fSYuval Mintz 
1031d6cff4fSYuval Mintz void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
1041d6cff4fSYuval Mintz 			    struct qed_ooo_info *p_ooo_info,
1051d6cff4fSYuval Mintz 			    u32 cid,
1061d6cff4fSYuval Mintz 			    u8 ooo_isle,
1071d6cff4fSYuval Mintz 			    struct qed_ooo_buffer *p_buffer, u8 buffer_side);
1081d6cff4fSYuval Mintz 
1091d6cff4fSYuval Mintz void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
1101d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info, u32 cid,
1111d6cff4fSYuval Mintz 			u8 left_isle);
1121d6cff4fSYuval Mintz #else /* IS_ENABLED(CONFIG_QED_ISCSI) */
qed_ooo_save_history_entry(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info,struct ooo_opaque * p_cqe)1131d6cff4fSYuval Mintz static inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
1141d6cff4fSYuval Mintz 					      struct qed_ooo_info *p_ooo_info,
1151d6cff4fSYuval Mintz 					      struct ooo_opaque *p_cqe) {}
1161d6cff4fSYuval Mintz 
qed_ooo_alloc(struct qed_hwfn * p_hwfn)1173587cb87STomer Tayar static inline int qed_ooo_alloc(struct qed_hwfn *p_hwfn)
1183587cb87STomer Tayar {
1193587cb87STomer Tayar 	return -EINVAL;
1203587cb87STomer Tayar }
1213587cb87STomer Tayar 
qed_ooo_setup(struct qed_hwfn * p_hwfn)1223587cb87STomer Tayar static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn) {}
1233587cb87STomer Tayar 
qed_ooo_free(struct qed_hwfn * p_hwfn)1243587cb87STomer Tayar static inline void qed_ooo_free(struct qed_hwfn *p_hwfn) {}
1251d6cff4fSYuval Mintz 
1261d6cff4fSYuval Mintz static inline void
qed_ooo_release_connection_isles(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info,u32 cid)1271d6cff4fSYuval Mintz qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
1281d6cff4fSYuval Mintz 				 struct qed_ooo_info *p_ooo_info,
1291d6cff4fSYuval Mintz 				 u32 cid) {}
1301d6cff4fSYuval Mintz 
qed_ooo_release_all_isles(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info)1311d6cff4fSYuval Mintz static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
1321d6cff4fSYuval Mintz 					     struct qed_ooo_info *p_ooo_info)
1331d6cff4fSYuval Mintz 					     {}
1341d6cff4fSYuval Mintz 
qed_ooo_put_free_buffer(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info,struct qed_ooo_buffer * p_buffer)1351d6cff4fSYuval Mintz static inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
1361d6cff4fSYuval Mintz 					   struct qed_ooo_info *p_ooo_info,
1371d6cff4fSYuval Mintz 					   struct qed_ooo_buffer *p_buffer) {}
1381d6cff4fSYuval Mintz 
1391d6cff4fSYuval Mintz static inline struct qed_ooo_buffer *
qed_ooo_get_free_buffer(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info)1401d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
1411d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info) { return NULL; }
1421d6cff4fSYuval Mintz 
qed_ooo_put_ready_buffer(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info,struct qed_ooo_buffer * p_buffer,u8 on_tail)1431d6cff4fSYuval Mintz static inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
1441d6cff4fSYuval Mintz 					    struct qed_ooo_info *p_ooo_info,
1451d6cff4fSYuval Mintz 					    struct qed_ooo_buffer *p_buffer,
1461d6cff4fSYuval Mintz 					    u8 on_tail) {}
1471d6cff4fSYuval Mintz 
1481d6cff4fSYuval Mintz static inline struct qed_ooo_buffer *
qed_ooo_get_ready_buffer(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info)1491d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
1501d6cff4fSYuval Mintz 			 struct qed_ooo_info *p_ooo_info) { return NULL; }
1511d6cff4fSYuval Mintz 
qed_ooo_delete_isles(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info,u32 cid,u8 drop_isle,u8 drop_size)1521d6cff4fSYuval Mintz static inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
1531d6cff4fSYuval Mintz 					struct qed_ooo_info *p_ooo_info,
1541d6cff4fSYuval Mintz 					u32 cid, u8 drop_isle, u8 drop_size) {}
1551d6cff4fSYuval Mintz 
qed_ooo_add_new_isle(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info,u32 cid,u8 ooo_isle,struct qed_ooo_buffer * p_buffer)1561d6cff4fSYuval Mintz static inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
1571d6cff4fSYuval Mintz 					struct qed_ooo_info *p_ooo_info,
1581d6cff4fSYuval Mintz 					u32 cid, u8 ooo_isle,
1591d6cff4fSYuval Mintz 					struct qed_ooo_buffer *p_buffer) {}
1601d6cff4fSYuval Mintz 
qed_ooo_add_new_buffer(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info,u32 cid,u8 ooo_isle,struct qed_ooo_buffer * p_buffer,u8 buffer_side)1611d6cff4fSYuval Mintz static inline void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
1621d6cff4fSYuval Mintz 					  struct qed_ooo_info *p_ooo_info,
1631d6cff4fSYuval Mintz 					  u32 cid, u8 ooo_isle,
1641d6cff4fSYuval Mintz 					  struct qed_ooo_buffer *p_buffer,
1651d6cff4fSYuval Mintz 					  u8 buffer_side) {}
1661d6cff4fSYuval Mintz 
qed_ooo_join_isles(struct qed_hwfn * p_hwfn,struct qed_ooo_info * p_ooo_info,u32 cid,u8 left_isle)1671d6cff4fSYuval Mintz static inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
1681d6cff4fSYuval Mintz 				      struct qed_ooo_info *p_ooo_info, u32 cid,
1691d6cff4fSYuval Mintz 				      u8 left_isle) {}
1701d6cff4fSYuval Mintz #endif /* IS_ENABLED(CONFIG_QED_ISCSI) */
1711d6cff4fSYuval Mintz 
1721d6cff4fSYuval Mintz #endif
173