1/*
2* CDDL HEADER START
3*
4* The contents of this file are subject to the terms of the
5* Common Development and Distribution License, v.1,  (the "License").
6* You may not use this file except in compliance with the License.
7*
8* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9* or http://opensource.org/licenses/CDDL-1.0.
10* See the License for the specific language governing permissions
11* and limitations under the License.
12*
13* When distributing Covered Code, include this CDDL HEADER in each
14* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15* If applicable, add the following below this CDDL HEADER, with the
16* fields enclosed by brackets "[]" replaced with your own identifying
17* information: Portions Copyright [yyyy] [name of copyright owner]
18*
19* CDDL HEADER END
20*/
21
22/*
23* Copyright 2014-2017 Cavium, Inc.
24* The contents of this file are subject to the terms of the Common Development
25* and Distribution License, v.1,  (the "License").
26
27* You may not use this file except in compliance with the License.
28
29* You can obtain a copy of the License at available
30* at http://opensource.org/licenses/CDDL-1.0
31
32* See the License for the specific language governing permissions and
33* limitations under the License.
34*/
35
36#ifndef __ECORE_VF_API_H__
37#define __ECORE_VF_API_H__
38
39#include "ecore_sp_api.h"
40#include "ecore_mcp_api.h"
41
42#ifdef CONFIG_ECORE_SRIOV
43/**
44 * @brief Read the VF bulletin and act on it if needed
45 *
46 * @param p_hwfn
47 * @param p_change - ecore fills 1 iff bulletin board has changed, 0 otherwise.
48 *
49 * @return enum _ecore_status
50 */
51enum _ecore_status_t ecore_vf_read_bulletin(struct ecore_hwfn *p_hwfn,
52					    u8 *p_change);
53
54/**
55 * @brief Get link paramters for VF from ecore
56 *
57 * @param p_hwfn
58 * @param params - the link params structure to be filled for the VF
59 */
60void ecore_vf_get_link_params(struct ecore_hwfn *p_hwfn,
61			      struct ecore_mcp_link_params *params);
62
63/**
64 * @brief Get link state for VF from ecore
65 *
66 * @param p_hwfn
67 * @param link - the link state structure to be filled for the VF
68 */
69void ecore_vf_get_link_state(struct ecore_hwfn *p_hwfn,
70			     struct ecore_mcp_link_state *link);
71
72/**
73 * @brief Get link capabilities for VF from ecore
74 *
75 * @param p_hwfn
76 * @param p_link_caps - the link capabilities structure to be filled for the VF
77 */
78void ecore_vf_get_link_caps(struct ecore_hwfn *p_hwfn,
79			    struct ecore_mcp_link_capabilities *p_link_caps);
80
81/**
82 * @brief Get number of Rx queues allocated for VF by ecore
83 *
84 *  @param p_hwfn
85 *  @param num_rxqs - allocated RX queues
86 */
87void ecore_vf_get_num_rxqs(struct ecore_hwfn *p_hwfn,
88			   u8 *num_rxqs);
89
90/**
91 * @brief Get number of Rx queues allocated for VF by ecore
92 *
93 *  @param p_hwfn
94 *  @param num_txqs - allocated RX queues
95 */
96void ecore_vf_get_num_txqs(struct ecore_hwfn *p_hwfn,
97			   u8 *num_txqs);
98
99/**
100 * @brief Get port mac address for VF
101 *
102 * @param p_hwfn
103 * @param port_mac - destination location for port mac
104 */
105void ecore_vf_get_port_mac(struct ecore_hwfn *p_hwfn,
106			   u8 *port_mac);
107
108/**
109 * @brief Get number of VLAN filters allocated for VF by ecore
110 *
111 *  @param p_hwfn
112 *  @param num_rxqs - allocated VLAN filters
113 */
114void ecore_vf_get_num_vlan_filters(struct ecore_hwfn *p_hwfn,
115				   u8 *num_vlan_filters);
116
117/**
118 * @brief Get number of MAC filters allocated for VF by ecore
119 *
120 *  @param p_hwfn
121 *  @param num_rxqs - allocated MAC filters
122 */
123void ecore_vf_get_num_mac_filters(struct ecore_hwfn *p_hwfn,
124				  u8 *num_mac_filters);
125
126/**
127 * @brief Check if VF can set a MAC address
128 *
129 * @param p_hwfn
130 * @param mac
131 *
132 * @return bool
133 */
134bool ecore_vf_check_mac(struct ecore_hwfn *p_hwfn, u8 *mac);
135
136#ifndef LINUX_REMOVE
137/**
138 * @brief Copy forced MAC address from bulletin board
139 *
140 * @param hwfn
141 * @param dst_mac
142 * @param p_is_forced - out param which indicate in case mac
143 *      	        exist if it forced or not.
144 *
145 * @return bool       - return true if mac exist and false if
146 *                      not.
147 */
148bool ecore_vf_bulletin_get_forced_mac(struct ecore_hwfn *hwfn, u8 *dst_mac,
149				      u8 *p_is_forced);
150
151/**
152 * @brief Check if force vlan is set and copy the forced vlan
153 *        from bulletin board
154 *
155 * @param hwfn
156 * @param dst_pvid
157 * @return bool
158 */
159bool ecore_vf_bulletin_get_forced_vlan(struct ecore_hwfn *hwfn, u16 *dst_pvid);
160
161/**
162 * @brief Check if VF is based on PF whose driver is pre-fp-hsi version;
163 *        This affects the fastpath implementation of the driver.
164 *
165 * @param p_hwfn
166 *
167 * @return bool - true iff PF is pre-fp-hsi version.
168 */
169bool ecore_vf_get_pre_fp_hsi(struct ecore_hwfn *p_hwfn);
170
171#endif
172
173/**
174 * @brief Set firmware version information in dev_info from VFs acquire response tlv
175 *
176 * @param p_hwfn
177 * @param fw_major
178 * @param fw_minor
179 * @param fw_rev
180 * @param fw_eng
181 */
182void ecore_vf_get_fw_version(struct ecore_hwfn *p_hwfn,
183			     u16 *fw_major,
184			     u16 *fw_minor,
185			     u16 *fw_rev,
186			     u16 *fw_eng);
187void ecore_vf_bulletin_get_udp_ports(struct ecore_hwfn *p_hwfn,
188				     u16 *p_vxlan_port, u16 *p_geneve_port);
189#else
190static OSAL_INLINE enum _ecore_status_t ecore_vf_read_bulletin(struct ecore_hwfn *p_hwfn, u8 *p_change) {return ECORE_INVAL;}
191static OSAL_INLINE void ecore_vf_get_link_params(struct ecore_hwfn *p_hwfn, struct ecore_mcp_link_params *params) {}
192static OSAL_INLINE void ecore_vf_get_link_state(struct ecore_hwfn *p_hwfn, struct ecore_mcp_link_state *link) {}
193static OSAL_INLINE void ecore_vf_get_link_caps(struct ecore_hwfn *p_hwfn, struct ecore_mcp_link_capabilities *p_link_caps) {}
194static OSAL_INLINE void ecore_vf_get_num_rxqs(struct ecore_hwfn *p_hwfn, u8 *num_rxqs) {}
195static OSAL_INLINE void ecore_vf_get_num_txqs(struct ecore_hwfn *p_hwfn, u8 *num_txqs) {}
196static OSAL_INLINE void ecore_vf_get_port_mac(struct ecore_hwfn *p_hwfn, u8 *port_mac) {}
197static OSAL_INLINE void ecore_vf_get_num_vlan_filters(struct ecore_hwfn *p_hwfn, u8 *num_vlan_filters) {}
198static OSAL_INLINE void ecore_vf_get_num_mac_filters(struct ecore_hwfn *p_hwfn, u8 *num_mac_filters) {}
199static OSAL_INLINE bool ecore_vf_check_mac(struct ecore_hwfn *p_hwfn, u8 *mac) {return false;}
200#ifndef LINUX_REMOVE
201static OSAL_INLINE bool ecore_vf_bulletin_get_forced_mac(struct ecore_hwfn *hwfn, u8 *dst_mac, u8 *p_is_forced) {return false;}
202static OSAL_INLINE bool ecore_vf_get_pre_fp_hsi(struct ecore_hwfn *p_hwfn) {return false; }
203#endif
204static OSAL_INLINE void ecore_vf_get_fw_version(struct ecore_hwfn *p_hwfn, u16 *fw_major, u16 *fw_minor, u16 *fw_rev, u16 *fw_eng) {}
205static OSAL_INLINE void ecore_vf_bulletin_get_udp_ports(struct ecore_hwfn *p_hwfn, u16 *p_vxlan_port, u16 *p_geneve_port) { return; }
206#endif
207#endif
208