1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Marvell Octeon EP (EndPoint) Ethernet Driver
3  *
4  * Copyright (C) 2020 Marvell.
5  *
6  */
7 
8 #ifndef _OCTEP_PFVF_MBOX_H_
9 #define _OCTEP_PFVF_MBOX_H_
10 
11 /* VF flags */
12 #define OCTEON_PFVF_FLAG_MAC_SET_BY_PF  BIT_ULL(0) /* PF has set VF MAC address */
13 #define OCTEON_SDP_16K_HW_FRS  16380UL
14 #define OCTEON_SDP_64K_HW_FRS  65531UL
15 
16 /* When a new command is implemented,PF Mbox version should be bumped.
17  */
18 enum octep_pfvf_mbox_version {
19 	OCTEP_PFVF_MBOX_VERSION_V0,
20 	OCTEP_PFVF_MBOX_VERSION_V1,
21 	OCTEP_PFVF_MBOX_VERSION_V2,
22 };
23 
24 #define OCTEP_PFVF_MBOX_VERSION_CURRENT	OCTEP_PFVF_MBOX_VERSION_V2
25 
26 enum octep_pfvf_mbox_opcode {
27 	OCTEP_PFVF_MBOX_CMD_VERSION,
28 	OCTEP_PFVF_MBOX_CMD_SET_MTU,
29 	OCTEP_PFVF_MBOX_CMD_SET_MAC_ADDR,
30 	OCTEP_PFVF_MBOX_CMD_GET_MAC_ADDR,
31 	OCTEP_PFVF_MBOX_CMD_GET_LINK_INFO,
32 	OCTEP_PFVF_MBOX_CMD_GET_STATS,
33 	OCTEP_PFVF_MBOX_CMD_SET_RX_STATE,
34 	OCTEP_PFVF_MBOX_CMD_SET_LINK_STATUS,
35 	OCTEP_PFVF_MBOX_CMD_GET_LINK_STATUS,
36 	OCTEP_PFVF_MBOX_CMD_GET_MTU,
37 	OCTEP_PFVF_MBOX_CMD_DEV_REMOVE,
38 	OCTEP_PFVF_MBOX_CMD_GET_FW_INFO,
39 	OCTEP_PFVF_MBOX_CMD_SET_OFFLOADS,
40 	OCTEP_PFVF_MBOX_NOTIF_LINK_STATUS,
41 	OCTEP_PFVF_MBOX_CMD_MAX,
42 };
43 
44 enum octep_pfvf_mbox_word_type {
45 	OCTEP_PFVF_MBOX_TYPE_CMD,
46 	OCTEP_PFVF_MBOX_TYPE_RSP_ACK,
47 	OCTEP_PFVF_MBOX_TYPE_RSP_NACK,
48 };
49 
50 enum octep_pfvf_mbox_cmd_status {
51 	OCTEP_PFVF_MBOX_CMD_STATUS_NOT_SETUP = 1,
52 	OCTEP_PFVF_MBOX_CMD_STATUS_TIMEDOUT = 2,
53 	OCTEP_PFVF_MBOX_CMD_STATUS_NACK = 3,
54 	OCTEP_PFVF_MBOX_CMD_STATUS_BUSY = 4
55 };
56 
57 enum octep_pfvf_mbox_state {
58 	OCTEP_PFVF_MBOX_STATE_IDLE = 0,
59 	OCTEP_PFVF_MBOX_STATE_BUSY = 1,
60 };
61 
62 enum octep_pfvf_link_status {
63 	OCTEP_PFVF_LINK_STATUS_DOWN,
64 	OCTEP_PFVF_LINK_STATUS_UP,
65 };
66 
67 enum octep_pfvf_link_speed {
68 	OCTEP_PFVF_LINK_SPEED_NONE,
69 	OCTEP_PFVF_LINK_SPEED_1000,
70 	OCTEP_PFVF_LINK_SPEED_10000,
71 	OCTEP_PFVF_LINK_SPEED_25000,
72 	OCTEP_PFVF_LINK_SPEED_40000,
73 	OCTEP_PFVF_LINK_SPEED_50000,
74 	OCTEP_PFVF_LINK_SPEED_100000,
75 	OCTEP_PFVF_LINK_SPEED_LAST,
76 };
77 
78 enum octep_pfvf_link_duplex {
79 	OCTEP_PFVF_LINK_HALF_DUPLEX,
80 	OCTEP_PFVF_LINK_FULL_DUPLEX,
81 };
82 
83 enum octep_pfvf_link_autoneg {
84 	OCTEP_PFVF_LINK_AUTONEG,
85 	OCTEP_PFVF_LINK_FIXED,
86 };
87 
88 #define OCTEP_PFVF_MBOX_TIMEOUT_MS     500
89 #define OCTEP_PFVF_MBOX_MAX_RETRIES    2
90 #define OCTEP_PFVF_MBOX_MAX_DATA_SIZE  6
91 #define OCTEP_PFVF_MBOX_MORE_FRAG_FLAG 1
92 #define OCTEP_PFVF_MBOX_WRITE_WAIT_TIME msecs_to_jiffies(1)
93 
94 union octep_pfvf_mbox_word {
95 	u64 u64;
96 	struct {
97 		u64 opcode:8;
98 		u64 type:2;
99 		u64 rsvd:6;
100 		u64 data:48;
101 	} s;
102 	struct {
103 		u64 opcode:8;
104 		u64 type:2;
105 		u64 frag:1;
106 		u64 rsvd:5;
107 		u8 data[6];
108 	} s_data;
109 	struct {
110 		u64 opcode:8;
111 		u64 type:2;
112 		u64 rsvd:6;
113 		u64 version:48;
114 	} s_version;
115 	struct {
116 		u64 opcode:8;
117 		u64 type:2;
118 		u64 rsvd:6;
119 		u8 mac_addr[6];
120 	} s_set_mac;
121 	struct {
122 		u64 opcode:8;
123 		u64 type:2;
124 		u64 rsvd:6;
125 		u64 mtu:48;
126 	} s_set_mtu;
127 	struct {
128 		u64 opcode:8;
129 		u64 type:2;
130 		u64 rsvd:6;
131 		u64 mtu:48;
132 	} s_get_mtu;
133 	struct {
134 		u64 opcode:8;
135 		u64 type:2;
136 		u64 state:1;
137 		u64 rsvd:53;
138 	} s_link_state;
139 	struct {
140 		u64 opcode:8;
141 		u64 type:2;
142 		u64 status:1;
143 		u64 rsvd:53;
144 	} s_link_status;
145 	struct {
146 		u64 opcode:8;
147 		u64 type:2;
148 		u64 pkind:8;
149 		u64 fsz:8;
150 		u64 rx_ol_flags:16;
151 		u64 tx_ol_flags:16;
152 		u64 rsvd:6;
153 	} s_fw_info;
154 	struct {
155 		u64 opcode:8;
156 		u64 type:2;
157 		u64 rsvd:22;
158 		u64 rx_ol_flags:16;
159 		u64 tx_ol_flags:16;
160 	} s_offloads;
161 } __packed;
162 
163 void octep_pfvf_mbox_work(struct work_struct *work);
164 int octep_setup_pfvf_mbox(struct octep_device *oct);
165 void octep_delete_pfvf_mbox(struct octep_device *oct);
166 void octep_pfvf_notify(struct octep_device *oct, struct octep_ctrl_mbox_msg *msg);
167 #endif
168