1*e6550b3eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
25df6d737SAbhijeet Joglekar /*
35df6d737SAbhijeet Joglekar * Copyright 2008 Cisco Systems, Inc. All rights reserved.
45df6d737SAbhijeet Joglekar * Copyright 2007 Nuova Systems, Inc. All rights reserved.
55df6d737SAbhijeet Joglekar */
65df6d737SAbhijeet Joglekar #ifndef _CQ_DESC_H_
75df6d737SAbhijeet Joglekar #define _CQ_DESC_H_
85df6d737SAbhijeet Joglekar
95df6d737SAbhijeet Joglekar /*
105df6d737SAbhijeet Joglekar * Completion queue descriptor types
115df6d737SAbhijeet Joglekar */
125df6d737SAbhijeet Joglekar enum cq_desc_types {
135df6d737SAbhijeet Joglekar CQ_DESC_TYPE_WQ_ENET = 0,
145df6d737SAbhijeet Joglekar CQ_DESC_TYPE_DESC_COPY = 1,
155df6d737SAbhijeet Joglekar CQ_DESC_TYPE_WQ_EXCH = 2,
165df6d737SAbhijeet Joglekar CQ_DESC_TYPE_RQ_ENET = 3,
175df6d737SAbhijeet Joglekar CQ_DESC_TYPE_RQ_FCP = 4,
185df6d737SAbhijeet Joglekar };
195df6d737SAbhijeet Joglekar
205df6d737SAbhijeet Joglekar /* Completion queue descriptor: 16B
215df6d737SAbhijeet Joglekar *
225df6d737SAbhijeet Joglekar * All completion queues have this basic layout. The
235df6d737SAbhijeet Joglekar * type_specfic area is unique for each completion
245df6d737SAbhijeet Joglekar * queue type.
255df6d737SAbhijeet Joglekar */
265df6d737SAbhijeet Joglekar struct cq_desc {
275df6d737SAbhijeet Joglekar __le16 completed_index;
285df6d737SAbhijeet Joglekar __le16 q_number;
295df6d737SAbhijeet Joglekar u8 type_specfic[11];
305df6d737SAbhijeet Joglekar u8 type_color;
315df6d737SAbhijeet Joglekar };
325df6d737SAbhijeet Joglekar
335df6d737SAbhijeet Joglekar #define CQ_DESC_TYPE_BITS 4
345df6d737SAbhijeet Joglekar #define CQ_DESC_TYPE_MASK ((1 << CQ_DESC_TYPE_BITS) - 1)
355df6d737SAbhijeet Joglekar #define CQ_DESC_COLOR_MASK 1
365df6d737SAbhijeet Joglekar #define CQ_DESC_COLOR_SHIFT 7
375df6d737SAbhijeet Joglekar #define CQ_DESC_Q_NUM_BITS 10
385df6d737SAbhijeet Joglekar #define CQ_DESC_Q_NUM_MASK ((1 << CQ_DESC_Q_NUM_BITS) - 1)
395df6d737SAbhijeet Joglekar #define CQ_DESC_COMP_NDX_BITS 12
405df6d737SAbhijeet Joglekar #define CQ_DESC_COMP_NDX_MASK ((1 << CQ_DESC_COMP_NDX_BITS) - 1)
415df6d737SAbhijeet Joglekar
cq_desc_dec(const struct cq_desc * desc_arg,u8 * type,u8 * color,u16 * q_number,u16 * completed_index)425df6d737SAbhijeet Joglekar static inline void cq_desc_dec(const struct cq_desc *desc_arg,
435df6d737SAbhijeet Joglekar u8 *type, u8 *color, u16 *q_number, u16 *completed_index)
445df6d737SAbhijeet Joglekar {
455df6d737SAbhijeet Joglekar const struct cq_desc *desc = desc_arg;
465df6d737SAbhijeet Joglekar const u8 type_color = desc->type_color;
475df6d737SAbhijeet Joglekar
485df6d737SAbhijeet Joglekar *color = (type_color >> CQ_DESC_COLOR_SHIFT) & CQ_DESC_COLOR_MASK;
495df6d737SAbhijeet Joglekar
505df6d737SAbhijeet Joglekar /*
515df6d737SAbhijeet Joglekar * Make sure color bit is read from desc *before* other fields
525df6d737SAbhijeet Joglekar * are read from desc. Hardware guarantees color bit is last
535df6d737SAbhijeet Joglekar * bit (byte) written. Adding the rmb() prevents the compiler
545df6d737SAbhijeet Joglekar * and/or CPU from reordering the reads which would potentially
555df6d737SAbhijeet Joglekar * result in reading stale values.
565df6d737SAbhijeet Joglekar */
575df6d737SAbhijeet Joglekar
585df6d737SAbhijeet Joglekar rmb();
595df6d737SAbhijeet Joglekar
605df6d737SAbhijeet Joglekar *type = type_color & CQ_DESC_TYPE_MASK;
615df6d737SAbhijeet Joglekar *q_number = le16_to_cpu(desc->q_number) & CQ_DESC_Q_NUM_MASK;
625df6d737SAbhijeet Joglekar *completed_index = le16_to_cpu(desc->completed_index) &
635df6d737SAbhijeet Joglekar CQ_DESC_COMP_NDX_MASK;
645df6d737SAbhijeet Joglekar }
655df6d737SAbhijeet Joglekar
665df6d737SAbhijeet Joglekar #endif /* _CQ_DESC_H_ */
67