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