131 lines
3.7 KiB
C
131 lines
3.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/* Copyright (C) 2023 Intel Corporation */
|
|
|
|
#ifndef _IDPF_CONTROLQ_H_
|
|
#define _IDPF_CONTROLQ_H_
|
|
|
|
#include <linux/slab.h>
|
|
|
|
#include "idpf_controlq_api.h"
|
|
|
|
/* Maximum buffer length for all control queue types */
|
|
#define IDPF_CTLQ_MAX_BUF_LEN 4096
|
|
|
|
#define IDPF_CTLQ_DESC(R, i) \
|
|
(&(((struct idpf_ctlq_desc *)((R)->desc_ring.va))[i]))
|
|
|
|
#define IDPF_CTLQ_DESC_UNUSED(R) \
|
|
((u16)((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->ring_size) + \
|
|
(R)->next_to_clean - (R)->next_to_use - 1))
|
|
|
|
/* Control Queue default settings */
|
|
#define IDPF_CTRL_SQ_CMD_TIMEOUT 250 /* msecs */
|
|
|
|
struct idpf_ctlq_desc {
|
|
/* Control queue descriptor flags */
|
|
__le16 flags;
|
|
/* Control queue message opcode */
|
|
__le16 opcode;
|
|
__le16 datalen; /* 0 for direct commands */
|
|
union {
|
|
__le16 ret_val;
|
|
__le16 pfid_vfid;
|
|
#define IDPF_CTLQ_DESC_VF_ID_S 0
|
|
#define IDPF_CTLQ_DESC_VF_ID_M (0x7FF << IDPF_CTLQ_DESC_VF_ID_S)
|
|
#define IDPF_CTLQ_DESC_PF_ID_S 11
|
|
#define IDPF_CTLQ_DESC_PF_ID_M (0x1F << IDPF_CTLQ_DESC_PF_ID_S)
|
|
};
|
|
|
|
/* Virtchnl message opcode and virtchnl descriptor type
|
|
* v_opcode=[27:0], v_dtype=[31:28]
|
|
*/
|
|
__le32 v_opcode_dtype;
|
|
/* Virtchnl return value */
|
|
__le32 v_retval;
|
|
union {
|
|
struct {
|
|
__le32 param0;
|
|
__le32 param1;
|
|
__le32 param2;
|
|
__le32 param3;
|
|
} direct;
|
|
struct {
|
|
__le32 param0;
|
|
__le16 sw_cookie;
|
|
/* Virtchnl flags */
|
|
__le16 v_flags;
|
|
__le32 addr_high;
|
|
__le32 addr_low;
|
|
} indirect;
|
|
u8 raw[16];
|
|
} params;
|
|
};
|
|
|
|
/* Flags sub-structure
|
|
* |0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10 |11 |12 |13 |14 |15 |
|
|
* |DD |CMP|ERR| * RSV * |FTYPE | *RSV* |RD |VFC|BUF| HOST_ID |
|
|
*/
|
|
/* command flags and offsets */
|
|
#define IDPF_CTLQ_FLAG_DD_S 0
|
|
#define IDPF_CTLQ_FLAG_CMP_S 1
|
|
#define IDPF_CTLQ_FLAG_ERR_S 2
|
|
#define IDPF_CTLQ_FLAG_FTYPE_S 6
|
|
#define IDPF_CTLQ_FLAG_RD_S 10
|
|
#define IDPF_CTLQ_FLAG_VFC_S 11
|
|
#define IDPF_CTLQ_FLAG_BUF_S 12
|
|
#define IDPF_CTLQ_FLAG_HOST_ID_S 13
|
|
|
|
#define IDPF_CTLQ_FLAG_DD BIT(IDPF_CTLQ_FLAG_DD_S) /* 0x1 */
|
|
#define IDPF_CTLQ_FLAG_CMP BIT(IDPF_CTLQ_FLAG_CMP_S) /* 0x2 */
|
|
#define IDPF_CTLQ_FLAG_ERR BIT(IDPF_CTLQ_FLAG_ERR_S) /* 0x4 */
|
|
#define IDPF_CTLQ_FLAG_FTYPE_VM BIT(IDPF_CTLQ_FLAG_FTYPE_S) /* 0x40 */
|
|
#define IDPF_CTLQ_FLAG_FTYPE_PF BIT(IDPF_CTLQ_FLAG_FTYPE_S + 1) /* 0x80 */
|
|
#define IDPF_CTLQ_FLAG_RD BIT(IDPF_CTLQ_FLAG_RD_S) /* 0x400 */
|
|
#define IDPF_CTLQ_FLAG_VFC BIT(IDPF_CTLQ_FLAG_VFC_S) /* 0x800 */
|
|
#define IDPF_CTLQ_FLAG_BUF BIT(IDPF_CTLQ_FLAG_BUF_S) /* 0x1000 */
|
|
|
|
/* Host ID is a special field that has 3b and not a 1b flag */
|
|
#define IDPF_CTLQ_FLAG_HOST_ID_M MAKE_MASK(0x7000UL, IDPF_CTLQ_FLAG_HOST_ID_S)
|
|
|
|
struct idpf_mbxq_desc {
|
|
u8 pad[8]; /* CTLQ flags/opcode/len/retval fields */
|
|
u32 chnl_opcode; /* avoid confusion with desc->opcode */
|
|
u32 chnl_retval; /* ditto for desc->retval */
|
|
u32 pf_vf_id; /* used by CP when sending to PF */
|
|
};
|
|
|
|
/* Define the driver hardware struct to replace other control structs as needed
|
|
* Align to ctlq_hw_info
|
|
*/
|
|
struct idpf_hw {
|
|
void __iomem *hw_addr;
|
|
resource_size_t hw_addr_len;
|
|
|
|
struct idpf_adapter *back;
|
|
|
|
/* control queue - send and receive */
|
|
struct idpf_ctlq_info *asq;
|
|
struct idpf_ctlq_info *arq;
|
|
|
|
/* pci info */
|
|
u16 device_id;
|
|
u16 vendor_id;
|
|
u16 subsystem_device_id;
|
|
u16 subsystem_vendor_id;
|
|
u8 revision_id;
|
|
bool adapter_stopped;
|
|
|
|
struct list_head cq_list_head;
|
|
};
|
|
|
|
int idpf_ctlq_alloc_ring_res(struct idpf_hw *hw,
|
|
struct idpf_ctlq_info *cq);
|
|
|
|
void idpf_ctlq_dealloc_ring_res(struct idpf_hw *hw, struct idpf_ctlq_info *cq);
|
|
|
|
/* prototype for functions used for dynamic memory allocation */
|
|
void *idpf_alloc_dma_mem(struct idpf_hw *hw, struct idpf_dma_mem *mem,
|
|
u64 size);
|
|
void idpf_free_dma_mem(struct idpf_hw *hw, struct idpf_dma_mem *mem);
|
|
#endif /* _IDPF_CONTROLQ_H_ */
|