xref: /linux/drivers/net/ethernet/cisco/enic/enic_mbox.h (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
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