octep_ctrl_mbox.h (5430B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* Marvell Octeon EP (EndPoint) Ethernet Driver 3 * 4 * Copyright (C) 2020 Marvell. 5 * 6 */ 7 #ifndef __OCTEP_CTRL_MBOX_H__ 8#define __OCTEP_CTRL_MBOX_H__ 9 10/* barmem structure 11 * |===========================================| 12 * |Info (16 + 120 + 120 = 256 bytes) | 13 * |-------------------------------------------| 14 * |magic number (8 bytes) | 15 * |bar memory size (4 bytes) | 16 * |reserved (4 bytes) | 17 * |-------------------------------------------| 18 * |host version (8 bytes) | 19 * |host status (8 bytes) | 20 * |host reserved (104 bytes) | 21 * |-------------------------------------------| 22 * |fw version (8 bytes) | 23 * |fw status (8 bytes) | 24 * |fw reserved (104 bytes) | 25 * |===========================================| 26 * |Host to Fw Queue info (16 bytes) | 27 * |-------------------------------------------| 28 * |producer index (4 bytes) | 29 * |consumer index (4 bytes) | 30 * |element size (4 bytes) | 31 * |element count (4 bytes) | 32 * |===========================================| 33 * |Fw to Host Queue info (16 bytes) | 34 * |-------------------------------------------| 35 * |producer index (4 bytes) | 36 * |consumer index (4 bytes) | 37 * |element size (4 bytes) | 38 * |element count (4 bytes) | 39 * |===========================================| 40 * |Host to Fw Queue | 41 * |-------------------------------------------| 42 * |((elem_sz + hdr(8 bytes)) * elem_cnt) bytes| 43 * |===========================================| 44 * |===========================================| 45 * |Fw to Host Queue | 46 * |-------------------------------------------| 47 * |((elem_sz + hdr(8 bytes)) * elem_cnt) bytes| 48 * |===========================================| 49 */ 50 51#define OCTEP_CTRL_MBOX_MAGIC_NUMBER 0xdeaddeadbeefbeefull 52 53/* Size of mbox info in bytes */ 54#define OCTEP_CTRL_MBOX_INFO_SZ 256 55/* Size of mbox host to target queue info in bytes */ 56#define OCTEP_CTRL_MBOX_H2FQ_INFO_SZ 16 57/* Size of mbox target to host queue info in bytes */ 58#define OCTEP_CTRL_MBOX_F2HQ_INFO_SZ 16 59/* Size of mbox queue in bytes */ 60#define OCTEP_CTRL_MBOX_Q_SZ(sz, cnt) (((sz) + 8) * (cnt)) 61/* Size of mbox in bytes */ 62#define OCTEP_CTRL_MBOX_SZ(hsz, hcnt, fsz, fcnt) (OCTEP_CTRL_MBOX_INFO_SZ + \ 63 OCTEP_CTRL_MBOX_H2FQ_INFO_SZ + \ 64 OCTEP_CTRL_MBOX_F2HQ_INFO_SZ + \ 65 OCTEP_CTRL_MBOX_Q_SZ(hsz, hcnt) + \ 66 OCTEP_CTRL_MBOX_Q_SZ(fsz, fcnt)) 67 68/* Valid request message */ 69#define OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ BIT(0) 70/* Valid response message */ 71#define OCTEP_CTRL_MBOX_MSG_HDR_FLAG_RESP BIT(1) 72/* Valid notification, no response required */ 73#define OCTEP_CTRL_MBOX_MSG_HDR_FLAG_NOTIFY BIT(2) 74 75enum octep_ctrl_mbox_status { 76 OCTEP_CTRL_MBOX_STATUS_INVALID = 0, 77 OCTEP_CTRL_MBOX_STATUS_INIT, 78 OCTEP_CTRL_MBOX_STATUS_READY, 79 OCTEP_CTRL_MBOX_STATUS_UNINIT 80}; 81 82/* mbox message */ 83union octep_ctrl_mbox_msg_hdr { 84 u64 word0; 85 struct { 86 /* OCTEP_CTRL_MBOX_MSG_HDR_FLAG_* */ 87 u32 flags; 88 /* size of message in words excluding header */ 89 u32 sizew; 90 }; 91}; 92 93/* mbox message */ 94struct octep_ctrl_mbox_msg { 95 /* mbox transaction header */ 96 union octep_ctrl_mbox_msg_hdr hdr; 97 /* pointer to message buffer */ 98 void *msg; 99}; 100 101/* Mbox queue */ 102struct octep_ctrl_mbox_q { 103 /* q element size, should be aligned to unsigned long */ 104 u16 elem_sz; 105 /* q element count, should be power of 2 */ 106 u16 elem_cnt; 107 /* q mask */ 108 u16 mask; 109 /* producer address in bar mem */ 110 u8 __iomem *hw_prod; 111 /* consumer address in bar mem */ 112 u8 __iomem *hw_cons; 113 /* q base address in bar mem */ 114 u8 __iomem *hw_q; 115}; 116 117struct octep_ctrl_mbox { 118 /* host driver version */ 119 u64 version; 120 /* size of bar memory */ 121 u32 barmem_sz; 122 /* pointer to BAR memory */ 123 u8 __iomem *barmem; 124 /* user context for callback, can be null */ 125 void *user_ctx; 126 /* callback handler for processing request, called from octep_ctrl_mbox_recv */ 127 int (*process_req)(void *user_ctx, struct octep_ctrl_mbox_msg *msg); 128 /* host-to-fw queue */ 129 struct octep_ctrl_mbox_q h2fq; 130 /* fw-to-host queue */ 131 struct octep_ctrl_mbox_q f2hq; 132 /* lock for h2fq */ 133 struct mutex h2fq_lock; 134 /* lock for f2hq */ 135 struct mutex f2hq_lock; 136}; 137 138/* Initialize control mbox. 139 * 140 * @param mbox: non-null pointer to struct octep_ctrl_mbox. 141 * 142 * return value: 0 on success, -errno on failure. 143 */ 144int octep_ctrl_mbox_init(struct octep_ctrl_mbox *mbox); 145 146/* Send mbox message. 147 * 148 * @param mbox: non-null pointer to struct octep_ctrl_mbox. 149 * 150 * return value: 0 on success, -errno on failure. 151 */ 152int octep_ctrl_mbox_send(struct octep_ctrl_mbox *mbox, struct octep_ctrl_mbox_msg *msg); 153 154/* Retrieve mbox message. 155 * 156 * @param mbox: non-null pointer to struct octep_ctrl_mbox. 157 * 158 * return value: 0 on success, -errno on failure. 159 */ 160int octep_ctrl_mbox_recv(struct octep_ctrl_mbox *mbox, struct octep_ctrl_mbox_msg *msg); 161 162/* Uninitialize control mbox. 163 * 164 * @param ep: non-null pointer to struct octep_ctrl_mbox. 165 * 166 * return value: 0 on success, -errno on failure. 167 */ 168int octep_ctrl_mbox_uninit(struct octep_ctrl_mbox *mbox); 169 170#endif /* __OCTEP_CTRL_MBOX_H__ */