115847933SSatish Kharat /* SPDX-License-Identifier: GPL-2.0-only */ 215847933SSatish Kharat /* Copyright 2025 Cisco Systems, Inc. All rights reserved. */ 315847933SSatish Kharat 415847933SSatish Kharat #ifndef _ENIC_MBOX_H_ 515847933SSatish Kharat #define _ENIC_MBOX_H_ 615847933SSatish Kharat 715847933SSatish Kharat #include <linux/bits.h> 815847933SSatish Kharat #include <linux/types.h> 915847933SSatish Kharat 1015847933SSatish Kharat /* 1115847933SSatish Kharat * Mailbox protocol for PF-VF communication over the admin channel. 1215847933SSatish Kharat * 1315847933SSatish Kharat * Even numbers are requests, odd numbers are replies/acks. 1415847933SSatish Kharat * The prefix indicates the initiator: VF_ = VF-initiated, PF_ = PF-initiated. 1515847933SSatish Kharat */ 1615847933SSatish Kharat enum enic_mbox_msg_type { 1715847933SSatish Kharat ENIC_MBOX_VF_CAPABILITY_REQUEST = 0, 1815847933SSatish Kharat ENIC_MBOX_VF_CAPABILITY_REPLY = 1, 1915847933SSatish Kharat ENIC_MBOX_VF_REGISTER_REQUEST = 2, 2015847933SSatish Kharat ENIC_MBOX_VF_REGISTER_REPLY = 3, 2115847933SSatish Kharat ENIC_MBOX_VF_UNREGISTER_REQUEST = 4, 2215847933SSatish Kharat ENIC_MBOX_VF_UNREGISTER_REPLY = 5, 2315847933SSatish Kharat ENIC_MBOX_PF_LINK_STATE_NOTIF = 6, 2415847933SSatish Kharat ENIC_MBOX_PF_LINK_STATE_ACK = 7, 2515847933SSatish Kharat ENIC_MBOX_MAX 2615847933SSatish Kharat }; 2715847933SSatish Kharat 2815847933SSatish Kharat struct enic_mbox_hdr { 2915847933SSatish Kharat __le16 src_vnic_id; 3015847933SSatish Kharat __le16 dst_vnic_id; 3115847933SSatish Kharat u8 msg_type; 3215847933SSatish Kharat u8 flags; 3315847933SSatish Kharat __le16 msg_len; 3415847933SSatish Kharat __le64 msg_num; 3515847933SSatish Kharat }; 3615847933SSatish Kharat 3715847933SSatish Kharat struct enic_mbox_generic_reply { 3815847933SSatish Kharat __le16 ret_major; 3915847933SSatish Kharat __le16 ret_minor; 4015847933SSatish Kharat }; 4115847933SSatish Kharat 4215847933SSatish Kharat #define ENIC_MBOX_ERR_GENERIC BIT(0) 4315847933SSatish Kharat #define ENIC_MBOX_ERR_VF_NOT_REGISTERED BIT(1) 4415847933SSatish Kharat #define ENIC_MBOX_ERR_MSG_NOT_SUPPORTED BIT(2) 4515847933SSatish Kharat 4615847933SSatish Kharat /* ENIC_MBOX_VF_CAPABILITY_REQUEST / _REPLY */ 4715847933SSatish Kharat #define ENIC_MBOX_CAP_VERSION_0 0 4815847933SSatish Kharat #define ENIC_MBOX_CAP_VERSION_1 1 4915847933SSatish Kharat 5015847933SSatish Kharat struct enic_mbox_vf_capability_msg { 5115847933SSatish Kharat __le32 version; 5215847933SSatish Kharat __le32 reserved[32]; 5315847933SSatish Kharat }; 5415847933SSatish Kharat 5515847933SSatish Kharat /* The embedded enic_mbox_generic_reply has 2-byte alignment, but the 5615847933SSatish Kharat * __le32 members give this struct 4-byte natural alignment. Receive 5715847933SSatish Kharat * buffers come from kmalloc (>= 8-byte aligned), so there is no 5815847933SSatish Kharat * misaligned access risk when casting from the receive buffer. 5915847933SSatish Kharat */ 6015847933SSatish Kharat struct enic_mbox_vf_capability_reply_msg { 6115847933SSatish Kharat struct enic_mbox_generic_reply reply; 6215847933SSatish Kharat __le32 version; 6315847933SSatish Kharat __le32 reserved[32]; 6415847933SSatish Kharat }; 6515847933SSatish Kharat 6615847933SSatish Kharat /* ENIC_MBOX_VF_REGISTER / _UNREGISTER */ 6715847933SSatish Kharat struct enic_mbox_vf_register_reply_msg { 6815847933SSatish Kharat struct enic_mbox_generic_reply reply; 6915847933SSatish Kharat }; 7015847933SSatish Kharat 7115847933SSatish Kharat /* ENIC_MBOX_PF_LINK_STATE_NOTIF / _ACK */ 7215847933SSatish Kharat #define ENIC_MBOX_LINK_STATE_DISABLE 0 7315847933SSatish Kharat #define ENIC_MBOX_LINK_STATE_ENABLE 1 7415847933SSatish Kharat 7515847933SSatish Kharat struct enic_mbox_pf_link_state_notif_msg { 7615847933SSatish Kharat __le32 link_state; 7715847933SSatish Kharat }; 7815847933SSatish Kharat 7915847933SSatish Kharat struct enic_mbox_pf_link_state_ack_msg { 8015847933SSatish Kharat struct enic_mbox_generic_reply ack; 8115847933SSatish Kharat }; 8215847933SSatish Kharat 831f0c856bSSatish Kharat #define ENIC_MBOX_DST_PF 0xFFFF 841f0c856bSSatish Kharat 851f0c856bSSatish Kharat struct enic; 861f0c856bSSatish Kharat 871f0c856bSSatish Kharat void enic_mbox_init(struct enic *enic); 881f0c856bSSatish Kharat int enic_mbox_send_msg(struct enic *enic, u8 msg_type, u16 dst_vnic_id, 891f0c856bSSatish Kharat void *payload, u16 payload_len); 9006bdfb16SSatish Kharat int enic_mbox_send_link_state(struct enic *enic, u16 vf_id, u32 link_state); 91*72b65c94SSatish Kharat int enic_mbox_vf_capability_check(struct enic *enic); 92*72b65c94SSatish Kharat int enic_mbox_vf_register(struct enic *enic); 93*72b65c94SSatish Kharat int enic_mbox_vf_unregister(struct enic *enic); 941f0c856bSSatish Kharat 9515847933SSatish Kharat #endif /* _ENIC_MBOX_H_ */ 96