1266b0663SKrzysztof Zdziarski /* SPDX-License-Identifier: BSD-3-Clause */ 2*ded037e6SHareshx Sankar Raj /* Copyright(c) 2007-2025 Intel Corporation */ 3266b0663SKrzysztof Zdziarski #ifndef ADF_PFVF_MSG_H 4266b0663SKrzysztof Zdziarski #define ADF_PFVF_MSG_H 5266b0663SKrzysztof Zdziarski 6266b0663SKrzysztof Zdziarski /* 7266b0663SKrzysztof Zdziarski * PF<->VF Gen2 Messaging format 8266b0663SKrzysztof Zdziarski * 9266b0663SKrzysztof Zdziarski * The PF has an array of 32-bit PF2VF registers, one for each VF. The 10266b0663SKrzysztof Zdziarski * PF can access all these registers while each VF can access only the one 11266b0663SKrzysztof Zdziarski * register associated with that particular VF. 12266b0663SKrzysztof Zdziarski * 13266b0663SKrzysztof Zdziarski * The register functionally is split into two parts: 14266b0663SKrzysztof Zdziarski * The bottom half is for PF->VF messages. In particular when the first 15266b0663SKrzysztof Zdziarski * bit of this register (bit 0) gets set an interrupt will be triggered 16266b0663SKrzysztof Zdziarski * in the respective VF. 17266b0663SKrzysztof Zdziarski * The top half is for VF->PF messages. In particular when the first bit 18266b0663SKrzysztof Zdziarski * of this half of register (bit 16) gets set an interrupt will be triggered 19266b0663SKrzysztof Zdziarski * in the PF. 20266b0663SKrzysztof Zdziarski * 21266b0663SKrzysztof Zdziarski * The remaining bits within this register are available to encode messages. 22266b0663SKrzysztof Zdziarski * and implement a collision control mechanism to prevent concurrent use of 23266b0663SKrzysztof Zdziarski * the PF2VF register by both the PF and VF. 24266b0663SKrzysztof Zdziarski * 25266b0663SKrzysztof Zdziarski * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 26266b0663SKrzysztof Zdziarski * _______________________________________________ 27266b0663SKrzysztof Zdziarski * | | | | | | | | | | | | | | | | | 28266b0663SKrzysztof Zdziarski * +-----------------------------------------------+ 29266b0663SKrzysztof Zdziarski * \___________________________/ \_________/ ^ ^ 30266b0663SKrzysztof Zdziarski * ^ ^ | | 31266b0663SKrzysztof Zdziarski * | | | VF2PF Int 32266b0663SKrzysztof Zdziarski * | | Message Origin 33266b0663SKrzysztof Zdziarski * | Message Type 34266b0663SKrzysztof Zdziarski * Message-specific Data/Reserved 35266b0663SKrzysztof Zdziarski * 36266b0663SKrzysztof Zdziarski * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 37266b0663SKrzysztof Zdziarski * _______________________________________________ 38266b0663SKrzysztof Zdziarski * | | | | | | | | | | | | | | | | | 39266b0663SKrzysztof Zdziarski * +-----------------------------------------------+ 40266b0663SKrzysztof Zdziarski * \___________________________/ \_________/ ^ ^ 41266b0663SKrzysztof Zdziarski * ^ ^ | | 42266b0663SKrzysztof Zdziarski * | | | PF2VF Int 43266b0663SKrzysztof Zdziarski * | | Message Origin 44266b0663SKrzysztof Zdziarski * | Message Type 45266b0663SKrzysztof Zdziarski * Message-specific Data/Reserved 46266b0663SKrzysztof Zdziarski * 47266b0663SKrzysztof Zdziarski * Message Origin (Should always be 1) 48266b0663SKrzysztof Zdziarski * A legacy out-of-tree QAT driver allowed for a set of messages not supported 49266b0663SKrzysztof Zdziarski * by this driver; these had a Msg Origin of 0 and are ignored by this driver. 50266b0663SKrzysztof Zdziarski * 51266b0663SKrzysztof Zdziarski * When a PF or VF attempts to send a message in the lower or upper 16 bits, 52266b0663SKrzysztof Zdziarski * respectively, the other 16 bits are written to first with a defined 53266b0663SKrzysztof Zdziarski * IN_USE_BY pattern as part of a collision control scheme (see function 54266b0663SKrzysztof Zdziarski * adf_gen2_pfvf_send() in adf_pf2vf_msg.c). 55266b0663SKrzysztof Zdziarski * 56266b0663SKrzysztof Zdziarski * 57266b0663SKrzysztof Zdziarski * PF<->VF Gen4 Messaging format 58266b0663SKrzysztof Zdziarski * 59266b0663SKrzysztof Zdziarski * Similarly to the gen2 messaging format, 32-bit long registers are used for 60266b0663SKrzysztof Zdziarski * communication between PF and VFs. However, each VF and PF share a pair of 61266b0663SKrzysztof Zdziarski * 32-bits register to avoid collisions: one for PV to VF messages and one 62266b0663SKrzysztof Zdziarski * for VF to PF messages. 63266b0663SKrzysztof Zdziarski * 64266b0663SKrzysztof Zdziarski * Both the Interrupt bit and the Message Origin bit retain the same position 65266b0663SKrzysztof Zdziarski * and meaning, although non-system messages are now deprecated and not 66266b0663SKrzysztof Zdziarski * expected. 67266b0663SKrzysztof Zdziarski * 68266b0663SKrzysztof Zdziarski * 31 30 9 8 7 6 5 4 3 2 1 0 69266b0663SKrzysztof Zdziarski * _______________________________________________ 70266b0663SKrzysztof Zdziarski * | | | . . . | | | | | | | | | | | 71266b0663SKrzysztof Zdziarski * +-----------------------------------------------+ 72266b0663SKrzysztof Zdziarski * \_____________________/ \_______________/ ^ ^ 73266b0663SKrzysztof Zdziarski * ^ ^ | | 74266b0663SKrzysztof Zdziarski * | | | PF/VF Int 75266b0663SKrzysztof Zdziarski * | | Message Origin 76266b0663SKrzysztof Zdziarski * | Message Type 77266b0663SKrzysztof Zdziarski * Message-specific Data/Reserved 78266b0663SKrzysztof Zdziarski * 79266b0663SKrzysztof Zdziarski * For both formats, the message reception is acknowledged by lowering the 80266b0663SKrzysztof Zdziarski * interrupt bit on the register where the message was sent. 81266b0663SKrzysztof Zdziarski */ 82266b0663SKrzysztof Zdziarski 83266b0663SKrzysztof Zdziarski /* PFVF message common bits */ 84266b0663SKrzysztof Zdziarski #define ADF_PFVF_INT BIT(0) 85266b0663SKrzysztof Zdziarski #define ADF_PFVF_MSGORIGIN_SYSTEM BIT(1) 86266b0663SKrzysztof Zdziarski 87266b0663SKrzysztof Zdziarski /* Different generations have different CSR layouts, use this struct 88266b0663SKrzysztof Zdziarski * to abstract these differences away 89266b0663SKrzysztof Zdziarski */ 90266b0663SKrzysztof Zdziarski struct pfvf_message { 91266b0663SKrzysztof Zdziarski u8 type; 92266b0663SKrzysztof Zdziarski u32 data; 93266b0663SKrzysztof Zdziarski }; 94266b0663SKrzysztof Zdziarski 95266b0663SKrzysztof Zdziarski /* PF->VF messages */ 96266b0663SKrzysztof Zdziarski enum pf2vf_msgtype { 97266b0663SKrzysztof Zdziarski ADF_PF2VF_MSGTYPE_RESTARTING = 0x01, 98266b0663SKrzysztof Zdziarski ADF_PF2VF_MSGTYPE_VERSION_RESP = 0x02, 99266b0663SKrzysztof Zdziarski ADF_PF2VF_MSGTYPE_BLKMSG_RESP = 0x03, 100*ded037e6SHareshx Sankar Raj ADF_PF2VF_MSGTYPE_FATAL_ERROR = 0x04, 101266b0663SKrzysztof Zdziarski /* Values from 0x10 are Gen4 specific, message type is only 4 bits in 102266b0663SKrzysztof Zdziarski Gen2 devices. */ 103266b0663SKrzysztof Zdziarski ADF_PF2VF_MSGTYPE_RP_RESET_RESP = 0x10, 104266b0663SKrzysztof Zdziarski }; 105266b0663SKrzysztof Zdziarski 106266b0663SKrzysztof Zdziarski /* VF->PF messages */ 107266b0663SKrzysztof Zdziarski enum vf2pf_msgtype { 108266b0663SKrzysztof Zdziarski ADF_VF2PF_MSGTYPE_INIT = 0x03, 109266b0663SKrzysztof Zdziarski ADF_VF2PF_MSGTYPE_SHUTDOWN = 0x04, 110266b0663SKrzysztof Zdziarski ADF_VF2PF_MSGTYPE_VERSION_REQ = 0x05, 111266b0663SKrzysztof Zdziarski ADF_VF2PF_MSGTYPE_COMPAT_VER_REQ = 0x06, 112266b0663SKrzysztof Zdziarski ADF_VF2PF_MSGTYPE_LARGE_BLOCK_REQ = 0x07, 113266b0663SKrzysztof Zdziarski ADF_VF2PF_MSGTYPE_MEDIUM_BLOCK_REQ = 0x08, 114266b0663SKrzysztof Zdziarski ADF_VF2PF_MSGTYPE_SMALL_BLOCK_REQ = 0x09, 115*ded037e6SHareshx Sankar Raj ADF_VF2PF_MSGTYPE_RESTARTING_COMPLETE = 0x0a, 116266b0663SKrzysztof Zdziarski /* Values from 0x10 are Gen4 specific, message type is only 4 bits in 117266b0663SKrzysztof Zdziarski Gen2 devices. */ 118266b0663SKrzysztof Zdziarski ADF_VF2PF_MSGTYPE_RP_RESET = 0x10, 119266b0663SKrzysztof Zdziarski }; 120266b0663SKrzysztof Zdziarski 121266b0663SKrzysztof Zdziarski /* VF/PF compatibility version. */ 122266b0663SKrzysztof Zdziarski enum pfvf_compatibility_version { 123266b0663SKrzysztof Zdziarski /* Support for extended capabilities */ 124266b0663SKrzysztof Zdziarski ADF_PFVF_COMPAT_CAPABILITIES = 0x02, 125266b0663SKrzysztof Zdziarski /* In-use pattern cleared by receiver */ 126266b0663SKrzysztof Zdziarski ADF_PFVF_COMPAT_FAST_ACK = 0x03, 127266b0663SKrzysztof Zdziarski /* Ring to service mapping support for non-standard mappings */ 128266b0663SKrzysztof Zdziarski ADF_PFVF_COMPAT_RING_TO_SVC_MAP = 0x04, 129*ded037e6SHareshx Sankar Raj /* Fallback compat */ 130*ded037e6SHareshx Sankar Raj ADF_PFVF_COMPAT_FALLBACK = 0x05, 131266b0663SKrzysztof Zdziarski /* Reference to the latest version */ 132*ded037e6SHareshx Sankar Raj ADF_PFVF_COMPAT_THIS_VERSION = 0x05, 133266b0663SKrzysztof Zdziarski }; 134266b0663SKrzysztof Zdziarski 135266b0663SKrzysztof Zdziarski /* PF->VF Version Response */ 136266b0663SKrzysztof Zdziarski #define ADF_PF2VF_VERSION_RESP_VERS_MASK GENMASK(7, 0) 137266b0663SKrzysztof Zdziarski #define ADF_PF2VF_VERSION_RESP_RESULT_MASK GENMASK(9, 8) 138266b0663SKrzysztof Zdziarski 139266b0663SKrzysztof Zdziarski enum pf2vf_compat_response { 140266b0663SKrzysztof Zdziarski ADF_PF2VF_VF_COMPATIBLE = 0x01, 141266b0663SKrzysztof Zdziarski ADF_PF2VF_VF_INCOMPATIBLE = 0x02, 142266b0663SKrzysztof Zdziarski ADF_PF2VF_VF_COMPAT_UNKNOWN = 0x03, 143266b0663SKrzysztof Zdziarski }; 144266b0663SKrzysztof Zdziarski 145266b0663SKrzysztof Zdziarski enum ring_reset_result { 146266b0663SKrzysztof Zdziarski RPRESET_SUCCESS = 0x00, 147266b0663SKrzysztof Zdziarski RPRESET_NOT_SUPPORTED = 0x01, 148266b0663SKrzysztof Zdziarski RPRESET_INVAL_BANK = 0x02, 149266b0663SKrzysztof Zdziarski RPRESET_TIMEOUT = 0x03, 150266b0663SKrzysztof Zdziarski }; 151266b0663SKrzysztof Zdziarski 152266b0663SKrzysztof Zdziarski #define ADF_VF2PF_RNG_RESET_RP_MASK GENMASK(1, 0) 153266b0663SKrzysztof Zdziarski #define ADF_VF2PF_RNG_RESET_RSVD_MASK GENMASK(25, 2) 154266b0663SKrzysztof Zdziarski 155266b0663SKrzysztof Zdziarski /* PF->VF Block Responses */ 156266b0663SKrzysztof Zdziarski #define ADF_PF2VF_BLKMSG_RESP_TYPE_MASK GENMASK(1, 0) 157266b0663SKrzysztof Zdziarski #define ADF_PF2VF_BLKMSG_RESP_DATA_MASK GENMASK(9, 2) 158266b0663SKrzysztof Zdziarski 159266b0663SKrzysztof Zdziarski enum pf2vf_blkmsg_resp_type { 160266b0663SKrzysztof Zdziarski ADF_PF2VF_BLKMSG_RESP_TYPE_DATA = 0x00, 161266b0663SKrzysztof Zdziarski ADF_PF2VF_BLKMSG_RESP_TYPE_CRC = 0x01, 162266b0663SKrzysztof Zdziarski ADF_PF2VF_BLKMSG_RESP_TYPE_ERROR = 0x02, 163266b0663SKrzysztof Zdziarski }; 164266b0663SKrzysztof Zdziarski 165266b0663SKrzysztof Zdziarski /* PF->VF Block Error Code */ 166266b0663SKrzysztof Zdziarski enum pf2vf_blkmsg_error { 167266b0663SKrzysztof Zdziarski ADF_PF2VF_INVALID_BLOCK_TYPE = 0x00, 168266b0663SKrzysztof Zdziarski ADF_PF2VF_INVALID_BYTE_NUM_REQ = 0x01, 169266b0663SKrzysztof Zdziarski ADF_PF2VF_PAYLOAD_TRUNCATED = 0x02, 170266b0663SKrzysztof Zdziarski ADF_PF2VF_UNSPECIFIED_ERROR = 0x03, 171266b0663SKrzysztof Zdziarski }; 172266b0663SKrzysztof Zdziarski 173266b0663SKrzysztof Zdziarski /* VF->PF Block Requests */ 174266b0663SKrzysztof Zdziarski #define ADF_VF2PF_LARGE_BLOCK_TYPE_MASK GENMASK(1, 0) 175266b0663SKrzysztof Zdziarski #define ADF_VF2PF_LARGE_BLOCK_BYTE_MASK GENMASK(8, 2) 176266b0663SKrzysztof Zdziarski #define ADF_VF2PF_MEDIUM_BLOCK_TYPE_MASK GENMASK(2, 0) 177266b0663SKrzysztof Zdziarski #define ADF_VF2PF_MEDIUM_BLOCK_BYTE_MASK GENMASK(8, 3) 178266b0663SKrzysztof Zdziarski #define ADF_VF2PF_SMALL_BLOCK_TYPE_MASK GENMASK(3, 0) 179266b0663SKrzysztof Zdziarski #define ADF_VF2PF_SMALL_BLOCK_BYTE_MASK GENMASK(8, 4) 180266b0663SKrzysztof Zdziarski #define ADF_VF2PF_BLOCK_CRC_REQ_MASK BIT(9) 181266b0663SKrzysztof Zdziarski 182266b0663SKrzysztof Zdziarski /* PF->VF Block Request Types 183266b0663SKrzysztof Zdziarski * 0..15 - 32 byte message 184266b0663SKrzysztof Zdziarski * 16..23 - 64 byte message 185266b0663SKrzysztof Zdziarski * 24..27 - 128 byte message 186266b0663SKrzysztof Zdziarski */ 187266b0663SKrzysztof Zdziarski enum vf2pf_blkmsg_req_type { 188266b0663SKrzysztof Zdziarski ADF_VF2PF_BLKMSG_REQ_CAP_SUMMARY = 0x02, 189266b0663SKrzysztof Zdziarski ADF_VF2PF_BLKMSG_REQ_RING_SVC_MAP = 0x03, 190266b0663SKrzysztof Zdziarski }; 191266b0663SKrzysztof Zdziarski 192266b0663SKrzysztof Zdziarski #define ADF_VF2PF_SMALL_BLOCK_TYPE_MAX \ 193266b0663SKrzysztof Zdziarski (FIELD_MAX(ADF_VF2PF_SMALL_BLOCK_TYPE_MASK)) 194266b0663SKrzysztof Zdziarski 195266b0663SKrzysztof Zdziarski #define ADF_VF2PF_MEDIUM_BLOCK_TYPE_MAX \ 196266b0663SKrzysztof Zdziarski (FIELD_MAX(ADF_VF2PF_MEDIUM_BLOCK_TYPE_MASK) + \ 197266b0663SKrzysztof Zdziarski ADF_VF2PF_SMALL_BLOCK_TYPE_MAX + 1) 198266b0663SKrzysztof Zdziarski 199266b0663SKrzysztof Zdziarski #define ADF_VF2PF_LARGE_BLOCK_TYPE_MAX \ 200266b0663SKrzysztof Zdziarski (FIELD_MAX(ADF_VF2PF_LARGE_BLOCK_TYPE_MASK) + \ 201266b0663SKrzysztof Zdziarski ADF_VF2PF_MEDIUM_BLOCK_TYPE_MAX) 202266b0663SKrzysztof Zdziarski 203266b0663SKrzysztof Zdziarski #define ADF_VF2PF_SMALL_BLOCK_BYTE_MAX \ 204266b0663SKrzysztof Zdziarski FIELD_MAX(ADF_VF2PF_SMALL_BLOCK_BYTE_MASK) 205266b0663SKrzysztof Zdziarski 206266b0663SKrzysztof Zdziarski #define ADF_VF2PF_MEDIUM_BLOCK_BYTE_MAX \ 207266b0663SKrzysztof Zdziarski FIELD_MAX(ADF_VF2PF_MEDIUM_BLOCK_BYTE_MASK) 208266b0663SKrzysztof Zdziarski 209266b0663SKrzysztof Zdziarski #define ADF_VF2PF_LARGE_BLOCK_BYTE_MAX \ 210266b0663SKrzysztof Zdziarski FIELD_MAX(ADF_VF2PF_LARGE_BLOCK_BYTE_MASK) 211266b0663SKrzysztof Zdziarski 212266b0663SKrzysztof Zdziarski struct pfvf_blkmsg_header { 213266b0663SKrzysztof Zdziarski u8 version; 214266b0663SKrzysztof Zdziarski u8 payload_size; 215266b0663SKrzysztof Zdziarski } __packed; 216266b0663SKrzysztof Zdziarski 217266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_HEADER_SIZE (sizeof(struct pfvf_blkmsg_header)) 218266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_PAYLOAD_SIZE(blkmsg) \ 219266b0663SKrzysztof Zdziarski (sizeof(blkmsg) - ADF_PFVF_BLKMSG_HEADER_SIZE) 220266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_MSG_SIZE(blkmsg) \ 221266b0663SKrzysztof Zdziarski (ADF_PFVF_BLKMSG_HEADER_SIZE + (blkmsg)->hdr.payload_size) 222266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_MSG_MAX_SIZE 128 223266b0663SKrzysztof Zdziarski 224266b0663SKrzysztof Zdziarski /* PF->VF Block message header bytes */ 225266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_VER_BYTE 0 226266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_LEN_BYTE 1 227266b0663SKrzysztof Zdziarski 228266b0663SKrzysztof Zdziarski /* PF/VF Capabilities message values */ 229266b0663SKrzysztof Zdziarski enum blkmsg_capabilities_versions { 230266b0663SKrzysztof Zdziarski ADF_PFVF_CAPABILITIES_V1_VERSION = 0x01, 231266b0663SKrzysztof Zdziarski ADF_PFVF_CAPABILITIES_V2_VERSION = 0x02, 232266b0663SKrzysztof Zdziarski ADF_PFVF_CAPABILITIES_V3_VERSION = 0x03, 233266b0663SKrzysztof Zdziarski }; 234266b0663SKrzysztof Zdziarski 235266b0663SKrzysztof Zdziarski struct capabilities_v1 { 236266b0663SKrzysztof Zdziarski struct pfvf_blkmsg_header hdr; 237266b0663SKrzysztof Zdziarski u32 ext_dc_caps; 238266b0663SKrzysztof Zdziarski } __packed; 239266b0663SKrzysztof Zdziarski 240266b0663SKrzysztof Zdziarski struct capabilities_v2 { 241266b0663SKrzysztof Zdziarski struct pfvf_blkmsg_header hdr; 242266b0663SKrzysztof Zdziarski u32 ext_dc_caps; 243266b0663SKrzysztof Zdziarski u32 capabilities; 244266b0663SKrzysztof Zdziarski } __packed; 245266b0663SKrzysztof Zdziarski 246266b0663SKrzysztof Zdziarski struct capabilities_v3 { 247266b0663SKrzysztof Zdziarski struct pfvf_blkmsg_header hdr; 248266b0663SKrzysztof Zdziarski u32 ext_dc_caps; 249266b0663SKrzysztof Zdziarski u32 capabilities; 250266b0663SKrzysztof Zdziarski u32 frequency; 251266b0663SKrzysztof Zdziarski } __packed; 252266b0663SKrzysztof Zdziarski 253266b0663SKrzysztof Zdziarski /* PF/VF Ring to service mapping values */ 254266b0663SKrzysztof Zdziarski enum blkmsg_ring_to_svc_versions { 255266b0663SKrzysztof Zdziarski ADF_PFVF_RING_TO_SVC_VERSION = 0x01, 256266b0663SKrzysztof Zdziarski }; 257266b0663SKrzysztof Zdziarski 258266b0663SKrzysztof Zdziarski struct ring_to_svc_map_v1 { 259266b0663SKrzysztof Zdziarski struct pfvf_blkmsg_header hdr; 260266b0663SKrzysztof Zdziarski u16 map; 261266b0663SKrzysztof Zdziarski } __packed; 262266b0663SKrzysztof Zdziarski 263266b0663SKrzysztof Zdziarski #endif /* ADF_PFVF_MSG_H */ 264