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