176 lines · c
1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */2 3#ifndef _FUN_QEUEUE_H4#define _FUN_QEUEUE_H5 6#include <linux/interrupt.h>7#include <linux/io.h>8 9struct device;10struct fun_dev;11struct fun_queue;12struct fun_cqe_info;13struct fun_rsp_common;14 15typedef void (*cq_callback_t)(struct fun_queue *funq, void *data, void *msg,16 const struct fun_cqe_info *info);17 18struct fun_rq_info {19 dma_addr_t dma;20 struct page *page;21};22 23/* A queue group consisting of an SQ, a CQ, and an optional RQ. */24struct fun_queue {25 struct fun_dev *fdev;26 spinlock_t sq_lock;27 28 dma_addr_t cq_dma_addr;29 dma_addr_t sq_dma_addr;30 dma_addr_t rq_dma_addr;31 32 u32 __iomem *cq_db;33 u32 __iomem *sq_db;34 u32 __iomem *rq_db;35 36 void *cqes;37 void *sq_cmds;38 struct fun_eprq_rqbuf *rqes;39 struct fun_rq_info *rq_info;40 41 u32 cqid;42 u32 sqid;43 u32 rqid;44 45 u32 cq_depth;46 u32 sq_depth;47 u32 rq_depth;48 49 u16 cq_head;50 u16 sq_tail;51 u16 rq_tail;52 53 u8 cqe_size_log2;54 u8 sqe_size_log2;55 56 u16 cqe_info_offset;57 58 u16 rq_buf_idx;59 int rq_buf_offset;60 u16 num_rqe_to_fill;61 62 u8 cq_intcoal_usec;63 u8 cq_intcoal_nentries;64 u8 sq_intcoal_usec;65 u8 sq_intcoal_nentries;66 67 u16 cq_flags;68 u16 sq_flags;69 u16 rq_flags;70 71 /* SQ head writeback */72 u16 sq_comp;73 74 volatile __be64 *sq_head;75 76 cq_callback_t cq_cb;77 void *cb_data;78 79 irq_handler_t irq_handler;80 void *irq_data;81 s16 cq_vector;82 u8 cq_phase;83 84 /* I/O q index */85 u16 qid;86 87 char irqname[24];88};89 90static inline void *fun_sqe_at(const struct fun_queue *funq, unsigned int pos)91{92 return funq->sq_cmds + (pos << funq->sqe_size_log2);93}94 95static inline void funq_sq_post_tail(struct fun_queue *funq, u16 tail)96{97 if (++tail == funq->sq_depth)98 tail = 0;99 funq->sq_tail = tail;100 writel(tail, funq->sq_db);101}102 103static inline struct fun_cqe_info *funq_cqe_info(const struct fun_queue *funq,104 void *cqe)105{106 return cqe + funq->cqe_info_offset;107}108 109static inline void funq_rq_post(struct fun_queue *funq)110{111 writel(funq->rq_tail, funq->rq_db);112}113 114struct fun_queue_alloc_req {115 u8 cqe_size_log2;116 u8 sqe_size_log2;117 118 u16 cq_flags;119 u16 sq_flags;120 u16 rq_flags;121 122 u32 cq_depth;123 u32 sq_depth;124 u32 rq_depth;125 126 u8 cq_intcoal_usec;127 u8 cq_intcoal_nentries;128 u8 sq_intcoal_usec;129 u8 sq_intcoal_nentries;130};131 132int fun_sq_create(struct fun_dev *fdev, u16 flags, u32 sqid, u32 cqid,133 u8 sqe_size_log2, u32 sq_depth, dma_addr_t dma_addr,134 u8 coal_nentries, u8 coal_usec, u32 irq_num,135 u32 scan_start_id, u32 scan_end_id,136 u32 rq_buf_size_log2, u32 *sqidp, u32 __iomem **dbp);137int fun_cq_create(struct fun_dev *fdev, u16 flags, u32 cqid, u32 rqid,138 u8 cqe_size_log2, u32 cq_depth, dma_addr_t dma_addr,139 u16 headroom, u16 tailroom, u8 coal_nentries, u8 coal_usec,140 u32 irq_num, u32 scan_start_id, u32 scan_end_id,141 u32 *cqidp, u32 __iomem **dbp);142void *fun_alloc_ring_mem(struct device *dma_dev, size_t depth,143 size_t hw_desc_sz, size_t sw_desc_size, bool wb,144 int numa_node, dma_addr_t *dma_addr, void **sw_va,145 volatile __be64 **wb_va);146void fun_free_ring_mem(struct device *dma_dev, size_t depth, size_t hw_desc_sz,147 bool wb, void *hw_va, dma_addr_t dma_addr, void *sw_va);148 149#define fun_destroy_sq(fdev, sqid) \150 fun_res_destroy((fdev), FUN_ADMIN_OP_EPSQ, 0, (sqid))151#define fun_destroy_cq(fdev, cqid) \152 fun_res_destroy((fdev), FUN_ADMIN_OP_EPCQ, 0, (cqid))153 154struct fun_queue *fun_alloc_queue(struct fun_dev *fdev, int qid,155 const struct fun_queue_alloc_req *req);156void fun_free_queue(struct fun_queue *funq);157 158static inline void fun_set_cq_callback(struct fun_queue *funq, cq_callback_t cb,159 void *cb_data)160{161 funq->cq_cb = cb;162 funq->cb_data = cb_data;163}164 165int fun_create_rq(struct fun_queue *funq);166int fun_create_queue(struct fun_queue *funq);167 168void fun_free_irq(struct fun_queue *funq);169int fun_request_irq(struct fun_queue *funq, const char *devname,170 irq_handler_t handler, void *data);171 172unsigned int __fun_process_cq(struct fun_queue *funq, unsigned int max);173unsigned int fun_process_cq(struct fun_queue *funq, unsigned int max);174 175#endif /* _FUN_QEUEUE_H */176