File Index
Files and directories
Sign in
FILE

hinic_hw_wq.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/huawei/hinic/hinic_hw_wq.h C
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Huawei HiNIC PCI Express Linux driver
  4 * Copyright(c) 2017 Huawei Technologies Co., Ltd
  5 */
  6
  7#ifndef HINIC_HW_WQ_H
  8#define HINIC_HW_WQ_H
  9
 10#include <linux/types.h>
 11#include <linux/semaphore.h>
 12#include <linux/atomic.h>
 13
 14#include "hinic_hw_if.h"
 15#include "hinic_hw_wqe.h"
 16
 17struct hinic_free_block {
 18	int     page_idx;
 19	int     block_idx;
 20};
 21
 22struct hinic_wq {
 23	struct hinic_hwif       *hwif;
 24
 25	int             page_idx;
 26	int             block_idx;
 27
 28	u16             wqebb_size;
 29	u32             wq_page_size;
 30	u16             q_depth;
 31	u16             max_wqe_size;
 32	u16             num_wqebbs_per_page;
 33	u16		wqebbs_per_page_shift;
 34	u16		wqebb_size_shift;
 35	/* The addresses are 64 bit in the HW */
 36	u64             block_paddr;
 37	void            **shadow_block_vaddr;
 38	u64             *block_vaddr;
 39
 40	int             num_q_pages;
 41	u8              *shadow_wqe;
 42	u16             *shadow_idx;
 43
 44	atomic_t        cons_idx;
 45	atomic_t        prod_idx;
 46	atomic_t        delta;
 47	u16             mask;
 48};
 49
 50struct hinic_wqs {
 51	struct hinic_hwif       *hwif;
 52	int                     num_pages;
 53
 54	/* The addresses are 64 bit in the HW */
 55	u64                     *page_paddr;
 56	u64                     **page_vaddr;
 57	void                    ***shadow_page_vaddr;
 58
 59	struct hinic_free_block *free_blocks;
 60	int                     alloc_blk_pos;
 61	int                     return_blk_pos;
 62	int                     num_free_blks;
 63
 64	/* Lock for getting a free block from the WQ set */
 65	struct semaphore        alloc_blocks_lock;
 66};
 67
 68struct hinic_cmdq_pages {
 69	/* The addresses are 64 bit in the HW */
 70	u64                     page_paddr;
 71	u64                     *page_vaddr;
 72	void                    **shadow_page_vaddr;
 73
 74	struct hinic_hwif       *hwif;
 75};
 76
 77int hinic_wqs_cmdq_alloc(struct hinic_cmdq_pages *cmdq_pages,
 78			 struct hinic_wq *wq, struct hinic_hwif *hwif,
 79			 int cmdq_blocks, u16 wqebb_size, u32 wq_page_size,
 80			 u16 q_depth, u16 max_wqe_size);
 81
 82void hinic_wqs_cmdq_free(struct hinic_cmdq_pages *cmdq_pages,
 83			 struct hinic_wq *wq, int cmdq_blocks);
 84
 85int hinic_wqs_alloc(struct hinic_wqs *wqs, int num_wqs,
 86		    struct hinic_hwif *hwif);
 87
 88void hinic_wqs_free(struct hinic_wqs *wqs);
 89
 90int hinic_wq_allocate(struct hinic_wqs *wqs, struct hinic_wq *wq,
 91		      u16 wqebb_size, u32 wq_page_size, u16 q_depth,
 92		      u16 max_wqe_size);
 93
 94void hinic_wq_free(struct hinic_wqs *wqs, struct hinic_wq *wq);
 95
 96struct hinic_hw_wqe *hinic_get_wqe(struct hinic_wq *wq, unsigned int wqe_size,
 97				   u16 *prod_idx);
 98
 99void hinic_return_wqe(struct hinic_wq *wq, unsigned int wqe_size);
100
101void hinic_put_wqe(struct hinic_wq *wq, unsigned int wqe_size);
102
103struct hinic_hw_wqe *hinic_read_wqe(struct hinic_wq *wq, unsigned int wqe_size,
104				    u16 *cons_idx);
105
106struct hinic_hw_wqe *hinic_read_wqe_direct(struct hinic_wq *wq, u16 cons_idx);
107
108void hinic_write_wqe(struct hinic_wq *wq, struct hinic_hw_wqe *wqe,
109		     unsigned int wqe_size);
110
111#endif
~/ Read-only file preview.