165 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/* Copyright(c) 2013 - 2019 Intel Corporation. */3 4#ifndef _FM10K_TLV_H_5#define _FM10K_TLV_H_6 7/* forward declaration */8struct fm10k_msg_data;9 10#include "fm10k_type.h"11 12/* Message / Argument header format13 * 3 2 1 014 * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 015 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+16 * | Length | Flags | Type / ID |17 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+18 *19 * The message header format described here is used for messages that are20 * passed between the PF and the VF. To allow for messages larger then21 * mailbox size we will provide a message with the above header and it22 * will be segmented and transported to the mailbox to the other side where23 * it is reassembled. It contains the following fields:24 * Length: Length of the message in bytes excluding the message header25 * Flags: TBD26 * Type/ID: These will be the message/argument types we pass27 */28/* message data header */29#define FM10K_TLV_ID_SHIFT 030#define FM10K_TLV_ID_SIZE 1631#define FM10K_TLV_ID_MASK ((1u << FM10K_TLV_ID_SIZE) - 1)32#define FM10K_TLV_FLAGS_SHIFT 1633#define FM10K_TLV_FLAGS_MSG 0x134#define FM10K_TLV_FLAGS_SIZE 435#define FM10K_TLV_LEN_SHIFT 2036#define FM10K_TLV_LEN_SIZE 1237 38#define FM10K_TLV_HDR_LEN 4ul39#define FM10K_TLV_LEN_ALIGN_MASK \40 ((FM10K_TLV_HDR_LEN - 1) << FM10K_TLV_LEN_SHIFT)41#define FM10K_TLV_LEN_ALIGN(tlv) \42 (((tlv) + FM10K_TLV_LEN_ALIGN_MASK) & ~FM10K_TLV_LEN_ALIGN_MASK)43#define FM10K_TLV_DWORD_LEN(tlv) \44 ((u16)((FM10K_TLV_LEN_ALIGN(tlv)) >> (FM10K_TLV_LEN_SHIFT + 2)) + 1)45 46#define FM10K_TLV_RESULTS_MAX 3247 48enum fm10k_tlv_type {49 FM10K_TLV_NULL_STRING,50 FM10K_TLV_MAC_ADDR,51 FM10K_TLV_BOOL,52 FM10K_TLV_UNSIGNED,53 FM10K_TLV_SIGNED,54 FM10K_TLV_LE_STRUCT,55 FM10K_TLV_NESTED,56 FM10K_TLV_MAX_TYPE57};58 59#define FM10K_TLV_ERROR (~0u)60 61struct fm10k_tlv_attr {62 unsigned int id;63 enum fm10k_tlv_type type;64 u16 len;65};66 67#define FM10K_TLV_ATTR_NULL_STRING(id, len) { id, FM10K_TLV_NULL_STRING, len }68#define FM10K_TLV_ATTR_MAC_ADDR(id) { id, FM10K_TLV_MAC_ADDR, 6 }69#define FM10K_TLV_ATTR_BOOL(id) { id, FM10K_TLV_BOOL, 0 }70#define FM10K_TLV_ATTR_U8(id) { id, FM10K_TLV_UNSIGNED, 1 }71#define FM10K_TLV_ATTR_U16(id) { id, FM10K_TLV_UNSIGNED, 2 }72#define FM10K_TLV_ATTR_U32(id) { id, FM10K_TLV_UNSIGNED, 4 }73#define FM10K_TLV_ATTR_U64(id) { id, FM10K_TLV_UNSIGNED, 8 }74#define FM10K_TLV_ATTR_S8(id) { id, FM10K_TLV_SIGNED, 1 }75#define FM10K_TLV_ATTR_S16(id) { id, FM10K_TLV_SIGNED, 2 }76#define FM10K_TLV_ATTR_S32(id) { id, FM10K_TLV_SIGNED, 4 }77#define FM10K_TLV_ATTR_S64(id) { id, FM10K_TLV_SIGNED, 8 }78#define FM10K_TLV_ATTR_LE_STRUCT(id, len) { id, FM10K_TLV_LE_STRUCT, len }79#define FM10K_TLV_ATTR_NESTED(id) { id, FM10K_TLV_NESTED, 0 }80#define FM10K_TLV_ATTR_LAST { FM10K_TLV_ERROR, 0, 0 }81 82struct fm10k_msg_data {83 unsigned int id;84 const struct fm10k_tlv_attr *attr;85 s32 (*func)(struct fm10k_hw *, u32 **,86 struct fm10k_mbx_info *);87};88 89#define FM10K_MSG_HANDLER(id, attr, func) { id, attr, func }90 91s32 fm10k_tlv_msg_init(u32 *, u16);92s32 fm10k_tlv_attr_put_mac_vlan(u32 *, u16, const u8 *, u16);93s32 fm10k_tlv_attr_get_mac_vlan(u32 *, u8 *, u16 *);94s32 fm10k_tlv_attr_put_bool(u32 *, u16);95s32 fm10k_tlv_attr_put_value(u32 *, u16, s64, u32);96#define fm10k_tlv_attr_put_u8(msg, attr_id, val) \97 fm10k_tlv_attr_put_value(msg, attr_id, val, 1)98#define fm10k_tlv_attr_put_u16(msg, attr_id, val) \99 fm10k_tlv_attr_put_value(msg, attr_id, val, 2)100#define fm10k_tlv_attr_put_u32(msg, attr_id, val) \101 fm10k_tlv_attr_put_value(msg, attr_id, val, 4)102#define fm10k_tlv_attr_put_u64(msg, attr_id, val) \103 fm10k_tlv_attr_put_value(msg, attr_id, val, 8)104#define fm10k_tlv_attr_put_s8(msg, attr_id, val) \105 fm10k_tlv_attr_put_value(msg, attr_id, val, 1)106#define fm10k_tlv_attr_put_s16(msg, attr_id, val) \107 fm10k_tlv_attr_put_value(msg, attr_id, val, 2)108#define fm10k_tlv_attr_put_s32(msg, attr_id, val) \109 fm10k_tlv_attr_put_value(msg, attr_id, val, 4)110#define fm10k_tlv_attr_put_s64(msg, attr_id, val) \111 fm10k_tlv_attr_put_value(msg, attr_id, val, 8)112s32 fm10k_tlv_attr_get_value(u32 *, void *, u32);113#define fm10k_tlv_attr_get_u8(attr, ptr) \114 fm10k_tlv_attr_get_value(attr, ptr, sizeof(u8))115#define fm10k_tlv_attr_get_u16(attr, ptr) \116 fm10k_tlv_attr_get_value(attr, ptr, sizeof(u16))117#define fm10k_tlv_attr_get_u32(attr, ptr) \118 fm10k_tlv_attr_get_value(attr, ptr, sizeof(u32))119#define fm10k_tlv_attr_get_u64(attr, ptr) \120 fm10k_tlv_attr_get_value(attr, ptr, sizeof(u64))121#define fm10k_tlv_attr_get_s8(attr, ptr) \122 fm10k_tlv_attr_get_value(attr, ptr, sizeof(s8))123#define fm10k_tlv_attr_get_s16(attr, ptr) \124 fm10k_tlv_attr_get_value(attr, ptr, sizeof(s16))125#define fm10k_tlv_attr_get_s32(attr, ptr) \126 fm10k_tlv_attr_get_value(attr, ptr, sizeof(s32))127#define fm10k_tlv_attr_get_s64(attr, ptr) \128 fm10k_tlv_attr_get_value(attr, ptr, sizeof(s64))129s32 fm10k_tlv_attr_put_le_struct(u32 *, u16, const void *, u32);130s32 fm10k_tlv_attr_get_le_struct(u32 *, void *, u32);131s32 fm10k_tlv_msg_parse(struct fm10k_hw *, u32 *, struct fm10k_mbx_info *,132 const struct fm10k_msg_data *);133s32 fm10k_tlv_msg_error(struct fm10k_hw *hw, u32 **results,134 struct fm10k_mbx_info *);135 136#define FM10K_TLV_MSG_ID_TEST 0137 138enum fm10k_tlv_test_attr_id {139 FM10K_TEST_MSG_UNSET,140 FM10K_TEST_MSG_STRING,141 FM10K_TEST_MSG_MAC_ADDR,142 FM10K_TEST_MSG_U8,143 FM10K_TEST_MSG_U16,144 FM10K_TEST_MSG_U32,145 FM10K_TEST_MSG_U64,146 FM10K_TEST_MSG_S8,147 FM10K_TEST_MSG_S16,148 FM10K_TEST_MSG_S32,149 FM10K_TEST_MSG_S64,150 FM10K_TEST_MSG_LE_STRUCT,151 FM10K_TEST_MSG_NESTED,152 FM10K_TEST_MSG_RESULT,153 FM10K_TEST_MSG_MAX154};155 156extern const struct fm10k_tlv_attr fm10k_tlv_msg_test_attr[];157void fm10k_tlv_msg_test_create(u32 *, u32);158s32 fm10k_tlv_msg_test(struct fm10k_hw *, u32 **, struct fm10k_mbx_info *);159 160#define FM10K_TLV_MSG_TEST_HANDLER(func) \161 FM10K_MSG_HANDLER(FM10K_TLV_MSG_ID_TEST, fm10k_tlv_msg_test_attr, func)162#define FM10K_TLV_MSG_ERROR_HANDLER(func) \163 FM10K_MSG_HANDLER(FM10K_TLV_ERROR, NULL, func)164#endif /* _FM10K_MSG_H_ */165