18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 28c2ecf20Sopenharmony_ci/* QLogic qed NIC Driver 38c2ecf20Sopenharmony_ci * Copyright (c) 2015-2017 QLogic Corporation 48c2ecf20Sopenharmony_ci * Copyright (c) 2019-2020 Marvell International Ltd. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef _QED_MCP_H 88c2ecf20Sopenharmony_ci#define _QED_MCP_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/types.h> 118c2ecf20Sopenharmony_ci#include <linux/delay.h> 128c2ecf20Sopenharmony_ci#include <linux/slab.h> 138c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 148c2ecf20Sopenharmony_ci#include <linux/qed/qed_fcoe_if.h> 158c2ecf20Sopenharmony_ci#include "qed_hsi.h" 168c2ecf20Sopenharmony_ci#include "qed_dev_api.h" 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cistruct qed_mcp_link_speed_params { 198c2ecf20Sopenharmony_ci bool autoneg; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci u32 advertised_speeds; 228c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_RES 0x1 238c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_1G 0x2 248c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_10G 0x4 258c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_20G 0x8 268c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_25G 0x10 278c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_40G 0x20 288c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_50G_R 0x40 298c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_50G_R2 0x80 308c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_100G_R2 0x100 318c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_100G_R4 0x200 328c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_MASK_100G_P4 0x400 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci u32 forced_speed; /* In Mb/s */ 358c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_1G 0x1 368c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_10G 0x2 378c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_20G 0x4 388c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_25G 0x8 398c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_40G 0x10 408c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_50G_R 0x20 418c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_50G_R2 0x40 428c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_100G_R2 0x80 438c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_100G_R4 0x100 448c2ecf20Sopenharmony_ci#define QED_EXT_SPEED_100G_P4 0x200 458c2ecf20Sopenharmony_ci}; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_cistruct qed_mcp_link_pause_params { 488c2ecf20Sopenharmony_ci bool autoneg; 498c2ecf20Sopenharmony_ci bool forced_rx; 508c2ecf20Sopenharmony_ci bool forced_tx; 518c2ecf20Sopenharmony_ci}; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cienum qed_mcp_eee_mode { 548c2ecf20Sopenharmony_ci QED_MCP_EEE_DISABLED, 558c2ecf20Sopenharmony_ci QED_MCP_EEE_ENABLED, 568c2ecf20Sopenharmony_ci QED_MCP_EEE_UNSUPPORTED 578c2ecf20Sopenharmony_ci}; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistruct qed_mcp_link_params { 608c2ecf20Sopenharmony_ci struct qed_mcp_link_speed_params speed; 618c2ecf20Sopenharmony_ci struct qed_mcp_link_pause_params pause; 628c2ecf20Sopenharmony_ci u32 loopback_mode; 638c2ecf20Sopenharmony_ci struct qed_link_eee_params eee; 648c2ecf20Sopenharmony_ci u32 fec; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci struct qed_mcp_link_speed_params ext_speed; 678c2ecf20Sopenharmony_ci u32 ext_fec_mode; 688c2ecf20Sopenharmony_ci}; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistruct qed_mcp_link_capabilities { 718c2ecf20Sopenharmony_ci u32 speed_capabilities; 728c2ecf20Sopenharmony_ci bool default_speed_autoneg; 738c2ecf20Sopenharmony_ci u32 fec_default; 748c2ecf20Sopenharmony_ci enum qed_mcp_eee_mode default_eee; 758c2ecf20Sopenharmony_ci u32 eee_lpi_timer; 768c2ecf20Sopenharmony_ci u8 eee_speed_caps; 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci u32 default_ext_speed_caps; 798c2ecf20Sopenharmony_ci u32 default_ext_autoneg; 808c2ecf20Sopenharmony_ci u32 default_ext_speed; 818c2ecf20Sopenharmony_ci u32 default_ext_fec; 828c2ecf20Sopenharmony_ci}; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cistruct qed_mcp_link_state { 858c2ecf20Sopenharmony_ci bool link_up; 868c2ecf20Sopenharmony_ci u32 min_pf_rate; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci /* Actual link speed in Mb/s */ 898c2ecf20Sopenharmony_ci u32 line_speed; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci /* PF max speed in Mb/s, deduced from line_speed 928c2ecf20Sopenharmony_ci * according to PF max bandwidth configuration. 938c2ecf20Sopenharmony_ci */ 948c2ecf20Sopenharmony_ci u32 speed; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci bool full_duplex; 978c2ecf20Sopenharmony_ci bool an; 988c2ecf20Sopenharmony_ci bool an_complete; 998c2ecf20Sopenharmony_ci bool parallel_detection; 1008c2ecf20Sopenharmony_ci bool pfc_enabled; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci u32 partner_adv_speed; 1038c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_SPEED_1G_HD BIT(0) 1048c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_SPEED_1G_FD BIT(1) 1058c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_SPEED_10G BIT(2) 1068c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_SPEED_20G BIT(3) 1078c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_SPEED_25G BIT(4) 1088c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_SPEED_40G BIT(5) 1098c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_SPEED_50G BIT(6) 1108c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_SPEED_100G BIT(7) 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci bool partner_tx_flow_ctrl_en; 1138c2ecf20Sopenharmony_ci bool partner_rx_flow_ctrl_en; 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci u8 partner_adv_pause; 1168c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_SYMMETRIC_PAUSE 0x1 1178c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_ASYMMETRIC_PAUSE 0x2 1188c2ecf20Sopenharmony_ci#define QED_LINK_PARTNER_BOTH_PAUSE 0x3 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci bool sfp_tx_fault; 1218c2ecf20Sopenharmony_ci bool eee_active; 1228c2ecf20Sopenharmony_ci u8 eee_adv_caps; 1238c2ecf20Sopenharmony_ci u8 eee_lp_adv_caps; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci u32 fec_active; 1268c2ecf20Sopenharmony_ci}; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_cistruct qed_mcp_function_info { 1298c2ecf20Sopenharmony_ci u8 pause_on_host; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci enum qed_pci_personality protocol; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci u8 bandwidth_min; 1348c2ecf20Sopenharmony_ci u8 bandwidth_max; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci u8 mac[ETH_ALEN]; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci u64 wwn_port; 1398c2ecf20Sopenharmony_ci u64 wwn_node; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci#define QED_MCP_VLAN_UNSET (0xffff) 1428c2ecf20Sopenharmony_ci u16 ovlan; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci u16 mtu; 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_cistruct qed_mcp_nvm_common { 1488c2ecf20Sopenharmony_ci u32 offset; 1498c2ecf20Sopenharmony_ci u32 param; 1508c2ecf20Sopenharmony_ci u32 resp; 1518c2ecf20Sopenharmony_ci u32 cmd; 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_cistruct qed_mcp_drv_version { 1558c2ecf20Sopenharmony_ci u32 version; 1568c2ecf20Sopenharmony_ci u8 name[MCP_DRV_VER_STR_SIZE - 4]; 1578c2ecf20Sopenharmony_ci}; 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_cistruct qed_mcp_lan_stats { 1608c2ecf20Sopenharmony_ci u64 ucast_rx_pkts; 1618c2ecf20Sopenharmony_ci u64 ucast_tx_pkts; 1628c2ecf20Sopenharmony_ci u32 fcs_err; 1638c2ecf20Sopenharmony_ci}; 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_cistruct qed_mcp_fcoe_stats { 1668c2ecf20Sopenharmony_ci u64 rx_pkts; 1678c2ecf20Sopenharmony_ci u64 tx_pkts; 1688c2ecf20Sopenharmony_ci u32 fcs_err; 1698c2ecf20Sopenharmony_ci u32 login_failure; 1708c2ecf20Sopenharmony_ci}; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_cistruct qed_mcp_iscsi_stats { 1738c2ecf20Sopenharmony_ci u64 rx_pdus; 1748c2ecf20Sopenharmony_ci u64 tx_pdus; 1758c2ecf20Sopenharmony_ci u64 rx_bytes; 1768c2ecf20Sopenharmony_ci u64 tx_bytes; 1778c2ecf20Sopenharmony_ci}; 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_cistruct qed_mcp_rdma_stats { 1808c2ecf20Sopenharmony_ci u64 rx_pkts; 1818c2ecf20Sopenharmony_ci u64 tx_pkts; 1828c2ecf20Sopenharmony_ci u64 rx_bytes; 1838c2ecf20Sopenharmony_ci u64 tx_byts; 1848c2ecf20Sopenharmony_ci}; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_cienum qed_mcp_protocol_type { 1878c2ecf20Sopenharmony_ci QED_MCP_LAN_STATS, 1888c2ecf20Sopenharmony_ci QED_MCP_FCOE_STATS, 1898c2ecf20Sopenharmony_ci QED_MCP_ISCSI_STATS, 1908c2ecf20Sopenharmony_ci QED_MCP_RDMA_STATS 1918c2ecf20Sopenharmony_ci}; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ciunion qed_mcp_protocol_stats { 1948c2ecf20Sopenharmony_ci struct qed_mcp_lan_stats lan_stats; 1958c2ecf20Sopenharmony_ci struct qed_mcp_fcoe_stats fcoe_stats; 1968c2ecf20Sopenharmony_ci struct qed_mcp_iscsi_stats iscsi_stats; 1978c2ecf20Sopenharmony_ci struct qed_mcp_rdma_stats rdma_stats; 1988c2ecf20Sopenharmony_ci}; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_cienum qed_ov_eswitch { 2018c2ecf20Sopenharmony_ci QED_OV_ESWITCH_NONE, 2028c2ecf20Sopenharmony_ci QED_OV_ESWITCH_VEB, 2038c2ecf20Sopenharmony_ci QED_OV_ESWITCH_VEPA 2048c2ecf20Sopenharmony_ci}; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_cienum qed_ov_client { 2078c2ecf20Sopenharmony_ci QED_OV_CLIENT_DRV, 2088c2ecf20Sopenharmony_ci QED_OV_CLIENT_USER, 2098c2ecf20Sopenharmony_ci QED_OV_CLIENT_VENDOR_SPEC 2108c2ecf20Sopenharmony_ci}; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_cienum qed_ov_driver_state { 2138c2ecf20Sopenharmony_ci QED_OV_DRIVER_STATE_NOT_LOADED, 2148c2ecf20Sopenharmony_ci QED_OV_DRIVER_STATE_DISABLED, 2158c2ecf20Sopenharmony_ci QED_OV_DRIVER_STATE_ACTIVE 2168c2ecf20Sopenharmony_ci}; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_cienum qed_ov_wol { 2198c2ecf20Sopenharmony_ci QED_OV_WOL_DEFAULT, 2208c2ecf20Sopenharmony_ci QED_OV_WOL_DISABLED, 2218c2ecf20Sopenharmony_ci QED_OV_WOL_ENABLED 2228c2ecf20Sopenharmony_ci}; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_cienum qed_mfw_tlv_type { 2258c2ecf20Sopenharmony_ci QED_MFW_TLV_GENERIC = 0x1, /* Core driver TLVs */ 2268c2ecf20Sopenharmony_ci QED_MFW_TLV_ETH = 0x2, /* L2 driver TLVs */ 2278c2ecf20Sopenharmony_ci QED_MFW_TLV_FCOE = 0x4, /* FCoE protocol TLVs */ 2288c2ecf20Sopenharmony_ci QED_MFW_TLV_ISCSI = 0x8, /* SCSI protocol TLVs */ 2298c2ecf20Sopenharmony_ci QED_MFW_TLV_MAX = 0x16, 2308c2ecf20Sopenharmony_ci}; 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_cistruct qed_mfw_tlv_generic { 2338c2ecf20Sopenharmony_ci#define QED_MFW_TLV_FLAGS_SIZE 2 2348c2ecf20Sopenharmony_ci struct { 2358c2ecf20Sopenharmony_ci u8 ipv4_csum_offload; 2368c2ecf20Sopenharmony_ci u8 lso_supported; 2378c2ecf20Sopenharmony_ci bool b_set; 2388c2ecf20Sopenharmony_ci } flags; 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci#define QED_MFW_TLV_MAC_COUNT 3 2418c2ecf20Sopenharmony_ci /* First entry for primary MAC, 2 secondary MACs possible */ 2428c2ecf20Sopenharmony_ci u8 mac[QED_MFW_TLV_MAC_COUNT][6]; 2438c2ecf20Sopenharmony_ci bool mac_set[QED_MFW_TLV_MAC_COUNT]; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci u64 rx_frames; 2468c2ecf20Sopenharmony_ci bool rx_frames_set; 2478c2ecf20Sopenharmony_ci u64 rx_bytes; 2488c2ecf20Sopenharmony_ci bool rx_bytes_set; 2498c2ecf20Sopenharmony_ci u64 tx_frames; 2508c2ecf20Sopenharmony_ci bool tx_frames_set; 2518c2ecf20Sopenharmony_ci u64 tx_bytes; 2528c2ecf20Sopenharmony_ci bool tx_bytes_set; 2538c2ecf20Sopenharmony_ci}; 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ciunion qed_mfw_tlv_data { 2568c2ecf20Sopenharmony_ci struct qed_mfw_tlv_generic generic; 2578c2ecf20Sopenharmony_ci struct qed_mfw_tlv_eth eth; 2588c2ecf20Sopenharmony_ci struct qed_mfw_tlv_fcoe fcoe; 2598c2ecf20Sopenharmony_ci struct qed_mfw_tlv_iscsi iscsi; 2608c2ecf20Sopenharmony_ci}; 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci#define QED_NVM_CFG_OPTION_ALL BIT(0) 2638c2ecf20Sopenharmony_ci#define QED_NVM_CFG_OPTION_INIT BIT(1) 2648c2ecf20Sopenharmony_ci#define QED_NVM_CFG_OPTION_COMMIT BIT(2) 2658c2ecf20Sopenharmony_ci#define QED_NVM_CFG_OPTION_FREE BIT(3) 2668c2ecf20Sopenharmony_ci#define QED_NVM_CFG_OPTION_ENTITY_SEL BIT(4) 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci/** 2698c2ecf20Sopenharmony_ci * @brief - returns the link params of the hw function 2708c2ecf20Sopenharmony_ci * 2718c2ecf20Sopenharmony_ci * @param p_hwfn 2728c2ecf20Sopenharmony_ci * 2738c2ecf20Sopenharmony_ci * @returns pointer to link params 2748c2ecf20Sopenharmony_ci */ 2758c2ecf20Sopenharmony_cistruct qed_mcp_link_params *qed_mcp_get_link_params(struct qed_hwfn *); 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci/** 2788c2ecf20Sopenharmony_ci * @brief - return the link state of the hw function 2798c2ecf20Sopenharmony_ci * 2808c2ecf20Sopenharmony_ci * @param p_hwfn 2818c2ecf20Sopenharmony_ci * 2828c2ecf20Sopenharmony_ci * @returns pointer to link state 2838c2ecf20Sopenharmony_ci */ 2848c2ecf20Sopenharmony_cistruct qed_mcp_link_state *qed_mcp_get_link_state(struct qed_hwfn *); 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci/** 2878c2ecf20Sopenharmony_ci * @brief - return the link capabilities of the hw function 2888c2ecf20Sopenharmony_ci * 2898c2ecf20Sopenharmony_ci * @param p_hwfn 2908c2ecf20Sopenharmony_ci * 2918c2ecf20Sopenharmony_ci * @returns pointer to link capabilities 2928c2ecf20Sopenharmony_ci */ 2938c2ecf20Sopenharmony_cistruct qed_mcp_link_capabilities 2948c2ecf20Sopenharmony_ci *qed_mcp_get_link_capabilities(struct qed_hwfn *p_hwfn); 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci/** 2978c2ecf20Sopenharmony_ci * @brief Request the MFW to set the the link according to 'link_input'. 2988c2ecf20Sopenharmony_ci * 2998c2ecf20Sopenharmony_ci * @param p_hwfn 3008c2ecf20Sopenharmony_ci * @param p_ptt 3018c2ecf20Sopenharmony_ci * @param b_up - raise link if `true'. Reset link if `false'. 3028c2ecf20Sopenharmony_ci * 3038c2ecf20Sopenharmony_ci * @return int 3048c2ecf20Sopenharmony_ci */ 3058c2ecf20Sopenharmony_ciint qed_mcp_set_link(struct qed_hwfn *p_hwfn, 3068c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 3078c2ecf20Sopenharmony_ci bool b_up); 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci/** 3108c2ecf20Sopenharmony_ci * @brief Get the management firmware version value 3118c2ecf20Sopenharmony_ci * 3128c2ecf20Sopenharmony_ci * @param p_hwfn 3138c2ecf20Sopenharmony_ci * @param p_ptt 3148c2ecf20Sopenharmony_ci * @param p_mfw_ver - mfw version value 3158c2ecf20Sopenharmony_ci * @param p_running_bundle_id - image id in nvram; Optional. 3168c2ecf20Sopenharmony_ci * 3178c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 3188c2ecf20Sopenharmony_ci */ 3198c2ecf20Sopenharmony_ciint qed_mcp_get_mfw_ver(struct qed_hwfn *p_hwfn, 3208c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 3218c2ecf20Sopenharmony_ci u32 *p_mfw_ver, u32 *p_running_bundle_id); 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci/** 3248c2ecf20Sopenharmony_ci * @brief Get the MBI version value 3258c2ecf20Sopenharmony_ci * 3268c2ecf20Sopenharmony_ci * @param p_hwfn 3278c2ecf20Sopenharmony_ci * @param p_ptt 3288c2ecf20Sopenharmony_ci * @param p_mbi_ver - A pointer to a variable to be filled with the MBI version. 3298c2ecf20Sopenharmony_ci * 3308c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 3318c2ecf20Sopenharmony_ci */ 3328c2ecf20Sopenharmony_ciint qed_mcp_get_mbi_ver(struct qed_hwfn *p_hwfn, 3338c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u32 *p_mbi_ver); 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci/** 3368c2ecf20Sopenharmony_ci * @brief Get media type value of the port. 3378c2ecf20Sopenharmony_ci * 3388c2ecf20Sopenharmony_ci * @param cdev - qed dev pointer 3398c2ecf20Sopenharmony_ci * @param p_ptt 3408c2ecf20Sopenharmony_ci * @param mfw_ver - media type value 3418c2ecf20Sopenharmony_ci * 3428c2ecf20Sopenharmony_ci * @return int - 3438c2ecf20Sopenharmony_ci * 0 - Operation was successul. 3448c2ecf20Sopenharmony_ci * -EBUSY - Operation failed 3458c2ecf20Sopenharmony_ci */ 3468c2ecf20Sopenharmony_ciint qed_mcp_get_media_type(struct qed_hwfn *p_hwfn, 3478c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u32 *media_type); 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci/** 3508c2ecf20Sopenharmony_ci * @brief Get transceiver data of the port. 3518c2ecf20Sopenharmony_ci * 3528c2ecf20Sopenharmony_ci * @param cdev - qed dev pointer 3538c2ecf20Sopenharmony_ci * @param p_ptt 3548c2ecf20Sopenharmony_ci * @param p_transceiver_state - transceiver state. 3558c2ecf20Sopenharmony_ci * @param p_transceiver_type - media type value 3568c2ecf20Sopenharmony_ci * 3578c2ecf20Sopenharmony_ci * @return int - 3588c2ecf20Sopenharmony_ci * 0 - Operation was successful. 3598c2ecf20Sopenharmony_ci * -EBUSY - Operation failed 3608c2ecf20Sopenharmony_ci */ 3618c2ecf20Sopenharmony_ciint qed_mcp_get_transceiver_data(struct qed_hwfn *p_hwfn, 3628c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 3638c2ecf20Sopenharmony_ci u32 *p_transceiver_state, 3648c2ecf20Sopenharmony_ci u32 *p_tranceiver_type); 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_ci/** 3678c2ecf20Sopenharmony_ci * @brief Get transceiver supported speed mask. 3688c2ecf20Sopenharmony_ci * 3698c2ecf20Sopenharmony_ci * @param cdev - qed dev pointer 3708c2ecf20Sopenharmony_ci * @param p_ptt 3718c2ecf20Sopenharmony_ci * @param p_speed_mask - Bit mask of all supported speeds. 3728c2ecf20Sopenharmony_ci * 3738c2ecf20Sopenharmony_ci * @return int - 3748c2ecf20Sopenharmony_ci * 0 - Operation was successful. 3758c2ecf20Sopenharmony_ci * -EBUSY - Operation failed 3768c2ecf20Sopenharmony_ci */ 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ciint qed_mcp_trans_speed_mask(struct qed_hwfn *p_hwfn, 3798c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u32 *p_speed_mask); 3808c2ecf20Sopenharmony_ci 3818c2ecf20Sopenharmony_ci/** 3828c2ecf20Sopenharmony_ci * @brief Get board configuration. 3838c2ecf20Sopenharmony_ci * 3848c2ecf20Sopenharmony_ci * @param cdev - qed dev pointer 3858c2ecf20Sopenharmony_ci * @param p_ptt 3868c2ecf20Sopenharmony_ci * @param p_board_config - Board config. 3878c2ecf20Sopenharmony_ci * 3888c2ecf20Sopenharmony_ci * @return int - 3898c2ecf20Sopenharmony_ci * 0 - Operation was successful. 3908c2ecf20Sopenharmony_ci * -EBUSY - Operation failed 3918c2ecf20Sopenharmony_ci */ 3928c2ecf20Sopenharmony_ciint qed_mcp_get_board_config(struct qed_hwfn *p_hwfn, 3938c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u32 *p_board_config); 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_ci/** 3968c2ecf20Sopenharmony_ci * @brief General function for sending commands to the MCP 3978c2ecf20Sopenharmony_ci * mailbox. It acquire mutex lock for the entire 3988c2ecf20Sopenharmony_ci * operation, from sending the request until the MCP 3998c2ecf20Sopenharmony_ci * response. Waiting for MCP response will be checked up 4008c2ecf20Sopenharmony_ci * to 5 seconds every 5ms. 4018c2ecf20Sopenharmony_ci * 4028c2ecf20Sopenharmony_ci * @param p_hwfn - hw function 4038c2ecf20Sopenharmony_ci * @param p_ptt - PTT required for register access 4048c2ecf20Sopenharmony_ci * @param cmd - command to be sent to the MCP. 4058c2ecf20Sopenharmony_ci * @param param - Optional param 4068c2ecf20Sopenharmony_ci * @param o_mcp_resp - The MCP response code (exclude sequence). 4078c2ecf20Sopenharmony_ci * @param o_mcp_param- Optional parameter provided by the MCP 4088c2ecf20Sopenharmony_ci * response 4098c2ecf20Sopenharmony_ci * @return int - 0 - operation 4108c2ecf20Sopenharmony_ci * was successul. 4118c2ecf20Sopenharmony_ci */ 4128c2ecf20Sopenharmony_ciint qed_mcp_cmd(struct qed_hwfn *p_hwfn, 4138c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 4148c2ecf20Sopenharmony_ci u32 cmd, 4158c2ecf20Sopenharmony_ci u32 param, 4168c2ecf20Sopenharmony_ci u32 *o_mcp_resp, 4178c2ecf20Sopenharmony_ci u32 *o_mcp_param); 4188c2ecf20Sopenharmony_ci 4198c2ecf20Sopenharmony_ci/** 4208c2ecf20Sopenharmony_ci * @brief - drains the nig, allowing completion to pass in case of pauses. 4218c2ecf20Sopenharmony_ci * (Should be called only from sleepable context) 4228c2ecf20Sopenharmony_ci * 4238c2ecf20Sopenharmony_ci * @param p_hwfn 4248c2ecf20Sopenharmony_ci * @param p_ptt 4258c2ecf20Sopenharmony_ci */ 4268c2ecf20Sopenharmony_ciint qed_mcp_drain(struct qed_hwfn *p_hwfn, 4278c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 4288c2ecf20Sopenharmony_ci 4298c2ecf20Sopenharmony_ci/** 4308c2ecf20Sopenharmony_ci * @brief Get the flash size value 4318c2ecf20Sopenharmony_ci * 4328c2ecf20Sopenharmony_ci * @param p_hwfn 4338c2ecf20Sopenharmony_ci * @param p_ptt 4348c2ecf20Sopenharmony_ci * @param p_flash_size - flash size in bytes to be filled. 4358c2ecf20Sopenharmony_ci * 4368c2ecf20Sopenharmony_ci * @return int - 0 - operation was successul. 4378c2ecf20Sopenharmony_ci */ 4388c2ecf20Sopenharmony_ciint qed_mcp_get_flash_size(struct qed_hwfn *p_hwfn, 4398c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 4408c2ecf20Sopenharmony_ci u32 *p_flash_size); 4418c2ecf20Sopenharmony_ci 4428c2ecf20Sopenharmony_ci/** 4438c2ecf20Sopenharmony_ci * @brief Send driver version to MFW 4448c2ecf20Sopenharmony_ci * 4458c2ecf20Sopenharmony_ci * @param p_hwfn 4468c2ecf20Sopenharmony_ci * @param p_ptt 4478c2ecf20Sopenharmony_ci * @param version - Version value 4488c2ecf20Sopenharmony_ci * @param name - Protocol driver name 4498c2ecf20Sopenharmony_ci * 4508c2ecf20Sopenharmony_ci * @return int - 0 - operation was successul. 4518c2ecf20Sopenharmony_ci */ 4528c2ecf20Sopenharmony_ciint 4538c2ecf20Sopenharmony_ciqed_mcp_send_drv_version(struct qed_hwfn *p_hwfn, 4548c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 4558c2ecf20Sopenharmony_ci struct qed_mcp_drv_version *p_ver); 4568c2ecf20Sopenharmony_ci 4578c2ecf20Sopenharmony_ci/** 4588c2ecf20Sopenharmony_ci * @brief Read the MFW process kill counter 4598c2ecf20Sopenharmony_ci * 4608c2ecf20Sopenharmony_ci * @param p_hwfn 4618c2ecf20Sopenharmony_ci * @param p_ptt 4628c2ecf20Sopenharmony_ci * 4638c2ecf20Sopenharmony_ci * @return u32 4648c2ecf20Sopenharmony_ci */ 4658c2ecf20Sopenharmony_ciu32 qed_get_process_kill_counter(struct qed_hwfn *p_hwfn, 4668c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 4678c2ecf20Sopenharmony_ci 4688c2ecf20Sopenharmony_ci/** 4698c2ecf20Sopenharmony_ci * @brief Trigger a recovery process 4708c2ecf20Sopenharmony_ci * 4718c2ecf20Sopenharmony_ci * @param p_hwfn 4728c2ecf20Sopenharmony_ci * @param p_ptt 4738c2ecf20Sopenharmony_ci * 4748c2ecf20Sopenharmony_ci * @return int 4758c2ecf20Sopenharmony_ci */ 4768c2ecf20Sopenharmony_ciint qed_start_recovery_process(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 4778c2ecf20Sopenharmony_ci 4788c2ecf20Sopenharmony_ci/** 4798c2ecf20Sopenharmony_ci * @brief A recovery handler must call this function as its first step. 4808c2ecf20Sopenharmony_ci * It is assumed that the handler is not run from an interrupt context. 4818c2ecf20Sopenharmony_ci * 4828c2ecf20Sopenharmony_ci * @param cdev 4838c2ecf20Sopenharmony_ci * @param p_ptt 4848c2ecf20Sopenharmony_ci * 4858c2ecf20Sopenharmony_ci * @return int 4868c2ecf20Sopenharmony_ci */ 4878c2ecf20Sopenharmony_ciint qed_recovery_prolog(struct qed_dev *cdev); 4888c2ecf20Sopenharmony_ci 4898c2ecf20Sopenharmony_ci/** 4908c2ecf20Sopenharmony_ci * @brief Notify MFW about the change in base device properties 4918c2ecf20Sopenharmony_ci * 4928c2ecf20Sopenharmony_ci * @param p_hwfn 4938c2ecf20Sopenharmony_ci * @param p_ptt 4948c2ecf20Sopenharmony_ci * @param client - qed client type 4958c2ecf20Sopenharmony_ci * 4968c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 4978c2ecf20Sopenharmony_ci */ 4988c2ecf20Sopenharmony_ciint qed_mcp_ov_update_current_config(struct qed_hwfn *p_hwfn, 4998c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 5008c2ecf20Sopenharmony_ci enum qed_ov_client client); 5018c2ecf20Sopenharmony_ci 5028c2ecf20Sopenharmony_ci/** 5038c2ecf20Sopenharmony_ci * @brief Notify MFW about the driver state 5048c2ecf20Sopenharmony_ci * 5058c2ecf20Sopenharmony_ci * @param p_hwfn 5068c2ecf20Sopenharmony_ci * @param p_ptt 5078c2ecf20Sopenharmony_ci * @param drv_state - Driver state 5088c2ecf20Sopenharmony_ci * 5098c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 5108c2ecf20Sopenharmony_ci */ 5118c2ecf20Sopenharmony_ciint qed_mcp_ov_update_driver_state(struct qed_hwfn *p_hwfn, 5128c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 5138c2ecf20Sopenharmony_ci enum qed_ov_driver_state drv_state); 5148c2ecf20Sopenharmony_ci 5158c2ecf20Sopenharmony_ci/** 5168c2ecf20Sopenharmony_ci * @brief Send MTU size to MFW 5178c2ecf20Sopenharmony_ci * 5188c2ecf20Sopenharmony_ci * @param p_hwfn 5198c2ecf20Sopenharmony_ci * @param p_ptt 5208c2ecf20Sopenharmony_ci * @param mtu - MTU size 5218c2ecf20Sopenharmony_ci * 5228c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 5238c2ecf20Sopenharmony_ci */ 5248c2ecf20Sopenharmony_ciint qed_mcp_ov_update_mtu(struct qed_hwfn *p_hwfn, 5258c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u16 mtu); 5268c2ecf20Sopenharmony_ci 5278c2ecf20Sopenharmony_ci/** 5288c2ecf20Sopenharmony_ci * @brief Send MAC address to MFW 5298c2ecf20Sopenharmony_ci * 5308c2ecf20Sopenharmony_ci * @param p_hwfn 5318c2ecf20Sopenharmony_ci * @param p_ptt 5328c2ecf20Sopenharmony_ci * @param mac - MAC address 5338c2ecf20Sopenharmony_ci * 5348c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 5358c2ecf20Sopenharmony_ci */ 5368c2ecf20Sopenharmony_ciint qed_mcp_ov_update_mac(struct qed_hwfn *p_hwfn, 5378c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u8 *mac); 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_ci/** 5408c2ecf20Sopenharmony_ci * @brief Send WOL mode to MFW 5418c2ecf20Sopenharmony_ci * 5428c2ecf20Sopenharmony_ci * @param p_hwfn 5438c2ecf20Sopenharmony_ci * @param p_ptt 5448c2ecf20Sopenharmony_ci * @param wol - WOL mode 5458c2ecf20Sopenharmony_ci * 5468c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 5478c2ecf20Sopenharmony_ci */ 5488c2ecf20Sopenharmony_ciint qed_mcp_ov_update_wol(struct qed_hwfn *p_hwfn, 5498c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 5508c2ecf20Sopenharmony_ci enum qed_ov_wol wol); 5518c2ecf20Sopenharmony_ci 5528c2ecf20Sopenharmony_ci/** 5538c2ecf20Sopenharmony_ci * @brief Set LED status 5548c2ecf20Sopenharmony_ci * 5558c2ecf20Sopenharmony_ci * @param p_hwfn 5568c2ecf20Sopenharmony_ci * @param p_ptt 5578c2ecf20Sopenharmony_ci * @param mode - LED mode 5588c2ecf20Sopenharmony_ci * 5598c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 5608c2ecf20Sopenharmony_ci */ 5618c2ecf20Sopenharmony_ciint qed_mcp_set_led(struct qed_hwfn *p_hwfn, 5628c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 5638c2ecf20Sopenharmony_ci enum qed_led_mode mode); 5648c2ecf20Sopenharmony_ci 5658c2ecf20Sopenharmony_ci/** 5668c2ecf20Sopenharmony_ci * @brief Read from nvm 5678c2ecf20Sopenharmony_ci * 5688c2ecf20Sopenharmony_ci * @param cdev 5698c2ecf20Sopenharmony_ci * @param addr - nvm offset 5708c2ecf20Sopenharmony_ci * @param p_buf - nvm read buffer 5718c2ecf20Sopenharmony_ci * @param len - buffer len 5728c2ecf20Sopenharmony_ci * 5738c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 5748c2ecf20Sopenharmony_ci */ 5758c2ecf20Sopenharmony_ciint qed_mcp_nvm_read(struct qed_dev *cdev, u32 addr, u8 *p_buf, u32 len); 5768c2ecf20Sopenharmony_ci 5778c2ecf20Sopenharmony_ci/** 5788c2ecf20Sopenharmony_ci * @brief Write to nvm 5798c2ecf20Sopenharmony_ci * 5808c2ecf20Sopenharmony_ci * @param cdev 5818c2ecf20Sopenharmony_ci * @param addr - nvm offset 5828c2ecf20Sopenharmony_ci * @param cmd - nvm command 5838c2ecf20Sopenharmony_ci * @param p_buf - nvm write buffer 5848c2ecf20Sopenharmony_ci * @param len - buffer len 5858c2ecf20Sopenharmony_ci * 5868c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 5878c2ecf20Sopenharmony_ci */ 5888c2ecf20Sopenharmony_ciint qed_mcp_nvm_write(struct qed_dev *cdev, 5898c2ecf20Sopenharmony_ci u32 cmd, u32 addr, u8 *p_buf, u32 len); 5908c2ecf20Sopenharmony_ci 5918c2ecf20Sopenharmony_ci/** 5928c2ecf20Sopenharmony_ci * @brief Check latest response 5938c2ecf20Sopenharmony_ci * 5948c2ecf20Sopenharmony_ci * @param cdev 5958c2ecf20Sopenharmony_ci * @param p_buf - nvm write buffer 5968c2ecf20Sopenharmony_ci * 5978c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 5988c2ecf20Sopenharmony_ci */ 5998c2ecf20Sopenharmony_ciint qed_mcp_nvm_resp(struct qed_dev *cdev, u8 *p_buf); 6008c2ecf20Sopenharmony_ci 6018c2ecf20Sopenharmony_cistruct qed_nvm_image_att { 6028c2ecf20Sopenharmony_ci u32 start_addr; 6038c2ecf20Sopenharmony_ci u32 length; 6048c2ecf20Sopenharmony_ci}; 6058c2ecf20Sopenharmony_ci 6068c2ecf20Sopenharmony_ci/** 6078c2ecf20Sopenharmony_ci * @brief Allows reading a whole nvram image 6088c2ecf20Sopenharmony_ci * 6098c2ecf20Sopenharmony_ci * @param p_hwfn 6108c2ecf20Sopenharmony_ci * @param image_id - image to get attributes for 6118c2ecf20Sopenharmony_ci * @param p_image_att - image attributes structure into which to fill data 6128c2ecf20Sopenharmony_ci * 6138c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 6148c2ecf20Sopenharmony_ci */ 6158c2ecf20Sopenharmony_ciint 6168c2ecf20Sopenharmony_ciqed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn, 6178c2ecf20Sopenharmony_ci enum qed_nvm_images image_id, 6188c2ecf20Sopenharmony_ci struct qed_nvm_image_att *p_image_att); 6198c2ecf20Sopenharmony_ci 6208c2ecf20Sopenharmony_ci/** 6218c2ecf20Sopenharmony_ci * @brief Allows reading a whole nvram image 6228c2ecf20Sopenharmony_ci * 6238c2ecf20Sopenharmony_ci * @param p_hwfn 6248c2ecf20Sopenharmony_ci * @param image_id - image requested for reading 6258c2ecf20Sopenharmony_ci * @param p_buffer - allocated buffer into which to fill data 6268c2ecf20Sopenharmony_ci * @param buffer_len - length of the allocated buffer. 6278c2ecf20Sopenharmony_ci * 6288c2ecf20Sopenharmony_ci * @return 0 iff p_buffer now contains the nvram image. 6298c2ecf20Sopenharmony_ci */ 6308c2ecf20Sopenharmony_ciint qed_mcp_get_nvm_image(struct qed_hwfn *p_hwfn, 6318c2ecf20Sopenharmony_ci enum qed_nvm_images image_id, 6328c2ecf20Sopenharmony_ci u8 *p_buffer, u32 buffer_len); 6338c2ecf20Sopenharmony_ci 6348c2ecf20Sopenharmony_ci/** 6358c2ecf20Sopenharmony_ci * @brief Bist register test 6368c2ecf20Sopenharmony_ci * 6378c2ecf20Sopenharmony_ci * @param p_hwfn - hw function 6388c2ecf20Sopenharmony_ci * @param p_ptt - PTT required for register access 6398c2ecf20Sopenharmony_ci * 6408c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 6418c2ecf20Sopenharmony_ci */ 6428c2ecf20Sopenharmony_ciint qed_mcp_bist_register_test(struct qed_hwfn *p_hwfn, 6438c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 6448c2ecf20Sopenharmony_ci 6458c2ecf20Sopenharmony_ci/** 6468c2ecf20Sopenharmony_ci * @brief Bist clock test 6478c2ecf20Sopenharmony_ci * 6488c2ecf20Sopenharmony_ci * @param p_hwfn - hw function 6498c2ecf20Sopenharmony_ci * @param p_ptt - PTT required for register access 6508c2ecf20Sopenharmony_ci * 6518c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 6528c2ecf20Sopenharmony_ci */ 6538c2ecf20Sopenharmony_ciint qed_mcp_bist_clock_test(struct qed_hwfn *p_hwfn, 6548c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_ci/** 6578c2ecf20Sopenharmony_ci * @brief Bist nvm test - get number of images 6588c2ecf20Sopenharmony_ci * 6598c2ecf20Sopenharmony_ci * @param p_hwfn - hw function 6608c2ecf20Sopenharmony_ci * @param p_ptt - PTT required for register access 6618c2ecf20Sopenharmony_ci * @param num_images - number of images if operation was 6628c2ecf20Sopenharmony_ci * successful. 0 if not. 6638c2ecf20Sopenharmony_ci * 6648c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 6658c2ecf20Sopenharmony_ci */ 6668c2ecf20Sopenharmony_ciint qed_mcp_bist_nvm_get_num_images(struct qed_hwfn *p_hwfn, 6678c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 6688c2ecf20Sopenharmony_ci u32 *num_images); 6698c2ecf20Sopenharmony_ci 6708c2ecf20Sopenharmony_ci/** 6718c2ecf20Sopenharmony_ci * @brief Bist nvm test - get image attributes by index 6728c2ecf20Sopenharmony_ci * 6738c2ecf20Sopenharmony_ci * @param p_hwfn - hw function 6748c2ecf20Sopenharmony_ci * @param p_ptt - PTT required for register access 6758c2ecf20Sopenharmony_ci * @param p_image_att - Attributes of image 6768c2ecf20Sopenharmony_ci * @param image_index - Index of image to get information for 6778c2ecf20Sopenharmony_ci * 6788c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 6798c2ecf20Sopenharmony_ci */ 6808c2ecf20Sopenharmony_ciint qed_mcp_bist_nvm_get_image_att(struct qed_hwfn *p_hwfn, 6818c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 6828c2ecf20Sopenharmony_ci struct bist_nvm_image_att *p_image_att, 6838c2ecf20Sopenharmony_ci u32 image_index); 6848c2ecf20Sopenharmony_ci 6858c2ecf20Sopenharmony_ci/** 6868c2ecf20Sopenharmony_ci * @brief - Processes the TLV request from MFW i.e., get the required TLV info 6878c2ecf20Sopenharmony_ci * from the qed client and send it to the MFW. 6888c2ecf20Sopenharmony_ci * 6898c2ecf20Sopenharmony_ci * @param p_hwfn 6908c2ecf20Sopenharmony_ci * @param p_ptt 6918c2ecf20Sopenharmony_ci * 6928c2ecf20Sopenharmony_ci * @param return 0 upon success. 6938c2ecf20Sopenharmony_ci */ 6948c2ecf20Sopenharmony_ciint qed_mfw_process_tlv_req(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 6958c2ecf20Sopenharmony_ci 6968c2ecf20Sopenharmony_ci/** 6978c2ecf20Sopenharmony_ci * @brief Send raw debug data to the MFW 6988c2ecf20Sopenharmony_ci * 6998c2ecf20Sopenharmony_ci * @param p_hwfn 7008c2ecf20Sopenharmony_ci * @param p_ptt 7018c2ecf20Sopenharmony_ci * @param p_buf - raw debug data buffer 7028c2ecf20Sopenharmony_ci * @param size - buffer size 7038c2ecf20Sopenharmony_ci */ 7048c2ecf20Sopenharmony_ciint 7058c2ecf20Sopenharmony_ciqed_mcp_send_raw_debug_data(struct qed_hwfn *p_hwfn, 7068c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u8 *p_buf, u32 size); 7078c2ecf20Sopenharmony_ci 7088c2ecf20Sopenharmony_ci/* Using hwfn number (and not pf_num) is required since in CMT mode, 7098c2ecf20Sopenharmony_ci * same pf_num may be used by two different hwfn 7108c2ecf20Sopenharmony_ci * TODO - this shouldn't really be in .h file, but until all fields 7118c2ecf20Sopenharmony_ci * required during hw-init will be placed in their correct place in shmem 7128c2ecf20Sopenharmony_ci * we need it in qed_dev.c [for readin the nvram reflection in shmem]. 7138c2ecf20Sopenharmony_ci */ 7148c2ecf20Sopenharmony_ci#define MCP_PF_ID_BY_REL(p_hwfn, rel_pfid) (QED_IS_BB((p_hwfn)->cdev) ? \ 7158c2ecf20Sopenharmony_ci ((rel_pfid) | \ 7168c2ecf20Sopenharmony_ci ((p_hwfn)->abs_pf_id & 1) << 3) : \ 7178c2ecf20Sopenharmony_ci rel_pfid) 7188c2ecf20Sopenharmony_ci#define MCP_PF_ID(p_hwfn) MCP_PF_ID_BY_REL(p_hwfn, (p_hwfn)->rel_pf_id) 7198c2ecf20Sopenharmony_ci 7208c2ecf20Sopenharmony_cistruct qed_mcp_info { 7218c2ecf20Sopenharmony_ci /* List for mailbox commands which were sent and wait for a response */ 7228c2ecf20Sopenharmony_ci struct list_head cmd_list; 7238c2ecf20Sopenharmony_ci 7248c2ecf20Sopenharmony_ci /* Spinlock used for protecting the access to the mailbox commands list 7258c2ecf20Sopenharmony_ci * and the sending of the commands. 7268c2ecf20Sopenharmony_ci */ 7278c2ecf20Sopenharmony_ci spinlock_t cmd_lock; 7288c2ecf20Sopenharmony_ci 7298c2ecf20Sopenharmony_ci /* Flag to indicate whether sending a MFW mailbox command is blocked */ 7308c2ecf20Sopenharmony_ci bool b_block_cmd; 7318c2ecf20Sopenharmony_ci 7328c2ecf20Sopenharmony_ci /* Spinlock used for syncing SW link-changes and link-changes 7338c2ecf20Sopenharmony_ci * originating from attention context. 7348c2ecf20Sopenharmony_ci */ 7358c2ecf20Sopenharmony_ci spinlock_t link_lock; 7368c2ecf20Sopenharmony_ci 7378c2ecf20Sopenharmony_ci u32 public_base; 7388c2ecf20Sopenharmony_ci u32 drv_mb_addr; 7398c2ecf20Sopenharmony_ci u32 mfw_mb_addr; 7408c2ecf20Sopenharmony_ci u32 port_addr; 7418c2ecf20Sopenharmony_ci u16 drv_mb_seq; 7428c2ecf20Sopenharmony_ci u16 drv_pulse_seq; 7438c2ecf20Sopenharmony_ci struct qed_mcp_link_params link_input; 7448c2ecf20Sopenharmony_ci struct qed_mcp_link_state link_output; 7458c2ecf20Sopenharmony_ci struct qed_mcp_link_capabilities link_capabilities; 7468c2ecf20Sopenharmony_ci struct qed_mcp_function_info func_info; 7478c2ecf20Sopenharmony_ci u8 *mfw_mb_cur; 7488c2ecf20Sopenharmony_ci u8 *mfw_mb_shadow; 7498c2ecf20Sopenharmony_ci u16 mfw_mb_length; 7508c2ecf20Sopenharmony_ci u32 mcp_hist; 7518c2ecf20Sopenharmony_ci 7528c2ecf20Sopenharmony_ci /* Capabilties negotiated with the MFW */ 7538c2ecf20Sopenharmony_ci u32 capabilities; 7548c2ecf20Sopenharmony_ci 7558c2ecf20Sopenharmony_ci /* S/N for debug data mailbox commands */ 7568c2ecf20Sopenharmony_ci atomic_t dbg_data_seq; 7578c2ecf20Sopenharmony_ci}; 7588c2ecf20Sopenharmony_ci 7598c2ecf20Sopenharmony_cistruct qed_mcp_mb_params { 7608c2ecf20Sopenharmony_ci u32 cmd; 7618c2ecf20Sopenharmony_ci u32 param; 7628c2ecf20Sopenharmony_ci void *p_data_src; 7638c2ecf20Sopenharmony_ci void *p_data_dst; 7648c2ecf20Sopenharmony_ci u8 data_src_size; 7658c2ecf20Sopenharmony_ci u8 data_dst_size; 7668c2ecf20Sopenharmony_ci u32 mcp_resp; 7678c2ecf20Sopenharmony_ci u32 mcp_param; 7688c2ecf20Sopenharmony_ci u32 flags; 7698c2ecf20Sopenharmony_ci#define QED_MB_FLAG_CAN_SLEEP (0x1 << 0) 7708c2ecf20Sopenharmony_ci#define QED_MB_FLAG_AVOID_BLOCK (0x1 << 1) 7718c2ecf20Sopenharmony_ci#define QED_MB_FLAGS_IS_SET(params, flag) \ 7728c2ecf20Sopenharmony_ci ({ typeof(params) __params = (params); \ 7738c2ecf20Sopenharmony_ci (__params && (__params->flags & QED_MB_FLAG_ ## flag)); }) 7748c2ecf20Sopenharmony_ci}; 7758c2ecf20Sopenharmony_ci 7768c2ecf20Sopenharmony_cistruct qed_drv_tlv_hdr { 7778c2ecf20Sopenharmony_ci u8 tlv_type; 7788c2ecf20Sopenharmony_ci u8 tlv_length; /* In dwords - not including this header */ 7798c2ecf20Sopenharmony_ci u8 tlv_reserved; 7808c2ecf20Sopenharmony_ci#define QED_DRV_TLV_FLAGS_CHANGED 0x01 7818c2ecf20Sopenharmony_ci u8 tlv_flags; 7828c2ecf20Sopenharmony_ci}; 7838c2ecf20Sopenharmony_ci 7848c2ecf20Sopenharmony_ci/** 7858c2ecf20Sopenharmony_ci * qed_mcp_is_ext_speed_supported() - Check if management firmware supports 7868c2ecf20Sopenharmony_ci * extended speeds. 7878c2ecf20Sopenharmony_ci * @p_hwfn: HW device data. 7888c2ecf20Sopenharmony_ci * 7898c2ecf20Sopenharmony_ci * Return: true if supported, false otherwise. 7908c2ecf20Sopenharmony_ci */ 7918c2ecf20Sopenharmony_cistatic inline bool 7928c2ecf20Sopenharmony_ciqed_mcp_is_ext_speed_supported(const struct qed_hwfn *p_hwfn) 7938c2ecf20Sopenharmony_ci{ 7948c2ecf20Sopenharmony_ci return !!(p_hwfn->mcp_info->capabilities & 7958c2ecf20Sopenharmony_ci FW_MB_PARAM_FEATURE_SUPPORT_EXT_SPEED_FEC_CONTROL); 7968c2ecf20Sopenharmony_ci} 7978c2ecf20Sopenharmony_ci 7988c2ecf20Sopenharmony_ci/** 7998c2ecf20Sopenharmony_ci * @brief Initialize the interface with the MCP 8008c2ecf20Sopenharmony_ci * 8018c2ecf20Sopenharmony_ci * @param p_hwfn - HW func 8028c2ecf20Sopenharmony_ci * @param p_ptt - PTT required for register access 8038c2ecf20Sopenharmony_ci * 8048c2ecf20Sopenharmony_ci * @return int 8058c2ecf20Sopenharmony_ci */ 8068c2ecf20Sopenharmony_ciint qed_mcp_cmd_init(struct qed_hwfn *p_hwfn, 8078c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 8088c2ecf20Sopenharmony_ci 8098c2ecf20Sopenharmony_ci/** 8108c2ecf20Sopenharmony_ci * @brief Initialize the port interface with the MCP 8118c2ecf20Sopenharmony_ci * 8128c2ecf20Sopenharmony_ci * @param p_hwfn 8138c2ecf20Sopenharmony_ci * @param p_ptt 8148c2ecf20Sopenharmony_ci * Can only be called after `num_ports_in_engines' is set 8158c2ecf20Sopenharmony_ci */ 8168c2ecf20Sopenharmony_civoid qed_mcp_cmd_port_init(struct qed_hwfn *p_hwfn, 8178c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 8188c2ecf20Sopenharmony_ci/** 8198c2ecf20Sopenharmony_ci * @brief Releases resources allocated during the init process. 8208c2ecf20Sopenharmony_ci * 8218c2ecf20Sopenharmony_ci * @param p_hwfn - HW func 8228c2ecf20Sopenharmony_ci * @param p_ptt - PTT required for register access 8238c2ecf20Sopenharmony_ci * 8248c2ecf20Sopenharmony_ci * @return int 8258c2ecf20Sopenharmony_ci */ 8268c2ecf20Sopenharmony_ci 8278c2ecf20Sopenharmony_ciint qed_mcp_free(struct qed_hwfn *p_hwfn); 8288c2ecf20Sopenharmony_ci 8298c2ecf20Sopenharmony_ci/** 8308c2ecf20Sopenharmony_ci * @brief This function is called from the DPC context. After 8318c2ecf20Sopenharmony_ci * pointing PTT to the mfw mb, check for events sent by the MCP 8328c2ecf20Sopenharmony_ci * to the driver and ack them. In case a critical event 8338c2ecf20Sopenharmony_ci * detected, it will be handled here, otherwise the work will be 8348c2ecf20Sopenharmony_ci * queued to a sleepable work-queue. 8358c2ecf20Sopenharmony_ci * 8368c2ecf20Sopenharmony_ci * @param p_hwfn - HW function 8378c2ecf20Sopenharmony_ci * @param p_ptt - PTT required for register access 8388c2ecf20Sopenharmony_ci * @return int - 0 - operation 8398c2ecf20Sopenharmony_ci * was successul. 8408c2ecf20Sopenharmony_ci */ 8418c2ecf20Sopenharmony_ciint qed_mcp_handle_events(struct qed_hwfn *p_hwfn, 8428c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 8438c2ecf20Sopenharmony_ci 8448c2ecf20Sopenharmony_cienum qed_drv_role { 8458c2ecf20Sopenharmony_ci QED_DRV_ROLE_OS, 8468c2ecf20Sopenharmony_ci QED_DRV_ROLE_KDUMP, 8478c2ecf20Sopenharmony_ci}; 8488c2ecf20Sopenharmony_ci 8498c2ecf20Sopenharmony_cistruct qed_load_req_params { 8508c2ecf20Sopenharmony_ci /* Input params */ 8518c2ecf20Sopenharmony_ci enum qed_drv_role drv_role; 8528c2ecf20Sopenharmony_ci u8 timeout_val; 8538c2ecf20Sopenharmony_ci bool avoid_eng_reset; 8548c2ecf20Sopenharmony_ci enum qed_override_force_load override_force_load; 8558c2ecf20Sopenharmony_ci 8568c2ecf20Sopenharmony_ci /* Output params */ 8578c2ecf20Sopenharmony_ci u32 load_code; 8588c2ecf20Sopenharmony_ci}; 8598c2ecf20Sopenharmony_ci 8608c2ecf20Sopenharmony_ci/** 8618c2ecf20Sopenharmony_ci * @brief Sends a LOAD_REQ to the MFW, and in case the operation succeeds, 8628c2ecf20Sopenharmony_ci * returns whether this PF is the first on the engine/port or function. 8638c2ecf20Sopenharmony_ci * 8648c2ecf20Sopenharmony_ci * @param p_hwfn 8658c2ecf20Sopenharmony_ci * @param p_ptt 8668c2ecf20Sopenharmony_ci * @param p_params 8678c2ecf20Sopenharmony_ci * 8688c2ecf20Sopenharmony_ci * @return int - 0 - Operation was successful. 8698c2ecf20Sopenharmony_ci */ 8708c2ecf20Sopenharmony_ciint qed_mcp_load_req(struct qed_hwfn *p_hwfn, 8718c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 8728c2ecf20Sopenharmony_ci struct qed_load_req_params *p_params); 8738c2ecf20Sopenharmony_ci 8748c2ecf20Sopenharmony_ci/** 8758c2ecf20Sopenharmony_ci * @brief Sends a LOAD_DONE message to the MFW 8768c2ecf20Sopenharmony_ci * 8778c2ecf20Sopenharmony_ci * @param p_hwfn 8788c2ecf20Sopenharmony_ci * @param p_ptt 8798c2ecf20Sopenharmony_ci * 8808c2ecf20Sopenharmony_ci * @return int - 0 - Operation was successful. 8818c2ecf20Sopenharmony_ci */ 8828c2ecf20Sopenharmony_ciint qed_mcp_load_done(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 8838c2ecf20Sopenharmony_ci 8848c2ecf20Sopenharmony_ci/** 8858c2ecf20Sopenharmony_ci * @brief Sends a UNLOAD_REQ message to the MFW 8868c2ecf20Sopenharmony_ci * 8878c2ecf20Sopenharmony_ci * @param p_hwfn 8888c2ecf20Sopenharmony_ci * @param p_ptt 8898c2ecf20Sopenharmony_ci * 8908c2ecf20Sopenharmony_ci * @return int - 0 - Operation was successful. 8918c2ecf20Sopenharmony_ci */ 8928c2ecf20Sopenharmony_ciint qed_mcp_unload_req(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 8938c2ecf20Sopenharmony_ci 8948c2ecf20Sopenharmony_ci/** 8958c2ecf20Sopenharmony_ci * @brief Sends a UNLOAD_DONE message to the MFW 8968c2ecf20Sopenharmony_ci * 8978c2ecf20Sopenharmony_ci * @param p_hwfn 8988c2ecf20Sopenharmony_ci * @param p_ptt 8998c2ecf20Sopenharmony_ci * 9008c2ecf20Sopenharmony_ci * @return int - 0 - Operation was successful. 9018c2ecf20Sopenharmony_ci */ 9028c2ecf20Sopenharmony_ciint qed_mcp_unload_done(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 9038c2ecf20Sopenharmony_ci 9048c2ecf20Sopenharmony_ci/** 9058c2ecf20Sopenharmony_ci * @brief Read the MFW mailbox into Current buffer. 9068c2ecf20Sopenharmony_ci * 9078c2ecf20Sopenharmony_ci * @param p_hwfn 9088c2ecf20Sopenharmony_ci * @param p_ptt 9098c2ecf20Sopenharmony_ci */ 9108c2ecf20Sopenharmony_civoid qed_mcp_read_mb(struct qed_hwfn *p_hwfn, 9118c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 9128c2ecf20Sopenharmony_ci 9138c2ecf20Sopenharmony_ci/** 9148c2ecf20Sopenharmony_ci * @brief Ack to mfw that driver finished FLR process for VFs 9158c2ecf20Sopenharmony_ci * 9168c2ecf20Sopenharmony_ci * @param p_hwfn 9178c2ecf20Sopenharmony_ci * @param p_ptt 9188c2ecf20Sopenharmony_ci * @param vfs_to_ack - bit mask of all engine VFs for which the PF acks. 9198c2ecf20Sopenharmony_ci * 9208c2ecf20Sopenharmony_ci * @param return int - 0 upon success. 9218c2ecf20Sopenharmony_ci */ 9228c2ecf20Sopenharmony_ciint qed_mcp_ack_vf_flr(struct qed_hwfn *p_hwfn, 9238c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u32 *vfs_to_ack); 9248c2ecf20Sopenharmony_ci 9258c2ecf20Sopenharmony_ci/** 9268c2ecf20Sopenharmony_ci * @brief - calls during init to read shmem of all function-related info. 9278c2ecf20Sopenharmony_ci * 9288c2ecf20Sopenharmony_ci * @param p_hwfn 9298c2ecf20Sopenharmony_ci * 9308c2ecf20Sopenharmony_ci * @param return 0 upon success. 9318c2ecf20Sopenharmony_ci */ 9328c2ecf20Sopenharmony_ciint qed_mcp_fill_shmem_func_info(struct qed_hwfn *p_hwfn, 9338c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 9348c2ecf20Sopenharmony_ci 9358c2ecf20Sopenharmony_ci/** 9368c2ecf20Sopenharmony_ci * @brief - Reset the MCP using mailbox command. 9378c2ecf20Sopenharmony_ci * 9388c2ecf20Sopenharmony_ci * @param p_hwfn 9398c2ecf20Sopenharmony_ci * @param p_ptt 9408c2ecf20Sopenharmony_ci * 9418c2ecf20Sopenharmony_ci * @param return 0 upon success. 9428c2ecf20Sopenharmony_ci */ 9438c2ecf20Sopenharmony_ciint qed_mcp_reset(struct qed_hwfn *p_hwfn, 9448c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt); 9458c2ecf20Sopenharmony_ci 9468c2ecf20Sopenharmony_ci/** 9478c2ecf20Sopenharmony_ci * @brief - Sends an NVM read command request to the MFW to get 9488c2ecf20Sopenharmony_ci * a buffer. 9498c2ecf20Sopenharmony_ci * 9508c2ecf20Sopenharmony_ci * @param p_hwfn 9518c2ecf20Sopenharmony_ci * @param p_ptt 9528c2ecf20Sopenharmony_ci * @param cmd - Command: DRV_MSG_CODE_NVM_GET_FILE_DATA or 9538c2ecf20Sopenharmony_ci * DRV_MSG_CODE_NVM_READ_NVRAM commands 9548c2ecf20Sopenharmony_ci * @param param - [0:23] - Offset [24:31] - Size 9558c2ecf20Sopenharmony_ci * @param o_mcp_resp - MCP response 9568c2ecf20Sopenharmony_ci * @param o_mcp_param - MCP response param 9578c2ecf20Sopenharmony_ci * @param o_txn_size - Buffer size output 9588c2ecf20Sopenharmony_ci * @param o_buf - Pointer to the buffer returned by the MFW. 9598c2ecf20Sopenharmony_ci * 9608c2ecf20Sopenharmony_ci * @param return 0 upon success. 9618c2ecf20Sopenharmony_ci */ 9628c2ecf20Sopenharmony_ciint qed_mcp_nvm_rd_cmd(struct qed_hwfn *p_hwfn, 9638c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 9648c2ecf20Sopenharmony_ci u32 cmd, 9658c2ecf20Sopenharmony_ci u32 param, 9668c2ecf20Sopenharmony_ci u32 *o_mcp_resp, 9678c2ecf20Sopenharmony_ci u32 *o_mcp_param, u32 *o_txn_size, u32 *o_buf); 9688c2ecf20Sopenharmony_ci 9698c2ecf20Sopenharmony_ci/** 9708c2ecf20Sopenharmony_ci * @brief Read from sfp 9718c2ecf20Sopenharmony_ci * 9728c2ecf20Sopenharmony_ci * @param p_hwfn - hw function 9738c2ecf20Sopenharmony_ci * @param p_ptt - PTT required for register access 9748c2ecf20Sopenharmony_ci * @param port - transceiver port 9758c2ecf20Sopenharmony_ci * @param addr - I2C address 9768c2ecf20Sopenharmony_ci * @param offset - offset in sfp 9778c2ecf20Sopenharmony_ci * @param len - buffer length 9788c2ecf20Sopenharmony_ci * @param p_buf - buffer to read into 9798c2ecf20Sopenharmony_ci * 9808c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 9818c2ecf20Sopenharmony_ci */ 9828c2ecf20Sopenharmony_ciint qed_mcp_phy_sfp_read(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 9838c2ecf20Sopenharmony_ci u32 port, u32 addr, u32 offset, u32 len, u8 *p_buf); 9848c2ecf20Sopenharmony_ci 9858c2ecf20Sopenharmony_ci/** 9868c2ecf20Sopenharmony_ci * @brief indicates whether the MFW objects [under mcp_info] are accessible 9878c2ecf20Sopenharmony_ci * 9888c2ecf20Sopenharmony_ci * @param p_hwfn 9898c2ecf20Sopenharmony_ci * 9908c2ecf20Sopenharmony_ci * @return true iff MFW is running and mcp_info is initialized 9918c2ecf20Sopenharmony_ci */ 9928c2ecf20Sopenharmony_cibool qed_mcp_is_init(struct qed_hwfn *p_hwfn); 9938c2ecf20Sopenharmony_ci 9948c2ecf20Sopenharmony_ci/** 9958c2ecf20Sopenharmony_ci * @brief request MFW to configure MSI-X for a VF 9968c2ecf20Sopenharmony_ci * 9978c2ecf20Sopenharmony_ci * @param p_hwfn 9988c2ecf20Sopenharmony_ci * @param p_ptt 9998c2ecf20Sopenharmony_ci * @param vf_id - absolute inside engine 10008c2ecf20Sopenharmony_ci * @param num_sbs - number of entries to request 10018c2ecf20Sopenharmony_ci * 10028c2ecf20Sopenharmony_ci * @return int 10038c2ecf20Sopenharmony_ci */ 10048c2ecf20Sopenharmony_ciint qed_mcp_config_vf_msix(struct qed_hwfn *p_hwfn, 10058c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u8 vf_id, u8 num); 10068c2ecf20Sopenharmony_ci 10078c2ecf20Sopenharmony_ci/** 10088c2ecf20Sopenharmony_ci * @brief - Halt the MCP. 10098c2ecf20Sopenharmony_ci * 10108c2ecf20Sopenharmony_ci * @param p_hwfn 10118c2ecf20Sopenharmony_ci * @param p_ptt 10128c2ecf20Sopenharmony_ci * 10138c2ecf20Sopenharmony_ci * @param return 0 upon success. 10148c2ecf20Sopenharmony_ci */ 10158c2ecf20Sopenharmony_ciint qed_mcp_halt(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 10168c2ecf20Sopenharmony_ci 10178c2ecf20Sopenharmony_ci/** 10188c2ecf20Sopenharmony_ci * @brief - Wake up the MCP. 10198c2ecf20Sopenharmony_ci * 10208c2ecf20Sopenharmony_ci * @param p_hwfn 10218c2ecf20Sopenharmony_ci * @param p_ptt 10228c2ecf20Sopenharmony_ci * 10238c2ecf20Sopenharmony_ci * @param return 0 upon success. 10248c2ecf20Sopenharmony_ci */ 10258c2ecf20Sopenharmony_ciint qed_mcp_resume(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 10268c2ecf20Sopenharmony_ci 10278c2ecf20Sopenharmony_ciint qed_configure_pf_min_bandwidth(struct qed_dev *cdev, u8 min_bw); 10288c2ecf20Sopenharmony_ciint qed_configure_pf_max_bandwidth(struct qed_dev *cdev, u8 max_bw); 10298c2ecf20Sopenharmony_ciint __qed_configure_pf_max_bandwidth(struct qed_hwfn *p_hwfn, 10308c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 10318c2ecf20Sopenharmony_ci struct qed_mcp_link_state *p_link, 10328c2ecf20Sopenharmony_ci u8 max_bw); 10338c2ecf20Sopenharmony_ciint __qed_configure_pf_min_bandwidth(struct qed_hwfn *p_hwfn, 10348c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 10358c2ecf20Sopenharmony_ci struct qed_mcp_link_state *p_link, 10368c2ecf20Sopenharmony_ci u8 min_bw); 10378c2ecf20Sopenharmony_ci 10388c2ecf20Sopenharmony_ciint qed_mcp_mask_parities(struct qed_hwfn *p_hwfn, 10398c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, u32 mask_parities); 10408c2ecf20Sopenharmony_ci 10418c2ecf20Sopenharmony_ci/* @brief - Gets the mdump retained data from the MFW. 10428c2ecf20Sopenharmony_ci * 10438c2ecf20Sopenharmony_ci * @param p_hwfn 10448c2ecf20Sopenharmony_ci * @param p_ptt 10458c2ecf20Sopenharmony_ci * @param p_mdump_retain 10468c2ecf20Sopenharmony_ci * 10478c2ecf20Sopenharmony_ci * @param return 0 upon success. 10488c2ecf20Sopenharmony_ci */ 10498c2ecf20Sopenharmony_ciint 10508c2ecf20Sopenharmony_ciqed_mcp_mdump_get_retain(struct qed_hwfn *p_hwfn, 10518c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 10528c2ecf20Sopenharmony_ci struct mdump_retain_data_stc *p_mdump_retain); 10538c2ecf20Sopenharmony_ci 10548c2ecf20Sopenharmony_ci/** 10558c2ecf20Sopenharmony_ci * @brief - Sets the MFW's max value for the given resource 10568c2ecf20Sopenharmony_ci * 10578c2ecf20Sopenharmony_ci * @param p_hwfn 10588c2ecf20Sopenharmony_ci * @param p_ptt 10598c2ecf20Sopenharmony_ci * @param res_id 10608c2ecf20Sopenharmony_ci * @param resc_max_val 10618c2ecf20Sopenharmony_ci * @param p_mcp_resp 10628c2ecf20Sopenharmony_ci * 10638c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 10648c2ecf20Sopenharmony_ci */ 10658c2ecf20Sopenharmony_ciint 10668c2ecf20Sopenharmony_ciqed_mcp_set_resc_max_val(struct qed_hwfn *p_hwfn, 10678c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 10688c2ecf20Sopenharmony_ci enum qed_resources res_id, 10698c2ecf20Sopenharmony_ci u32 resc_max_val, u32 *p_mcp_resp); 10708c2ecf20Sopenharmony_ci 10718c2ecf20Sopenharmony_ci/** 10728c2ecf20Sopenharmony_ci * @brief - Gets the MFW allocation info for the given resource 10738c2ecf20Sopenharmony_ci * 10748c2ecf20Sopenharmony_ci * @param p_hwfn 10758c2ecf20Sopenharmony_ci * @param p_ptt 10768c2ecf20Sopenharmony_ci * @param res_id 10778c2ecf20Sopenharmony_ci * @param p_mcp_resp 10788c2ecf20Sopenharmony_ci * @param p_resc_num 10798c2ecf20Sopenharmony_ci * @param p_resc_start 10808c2ecf20Sopenharmony_ci * 10818c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 10828c2ecf20Sopenharmony_ci */ 10838c2ecf20Sopenharmony_ciint 10848c2ecf20Sopenharmony_ciqed_mcp_get_resc_info(struct qed_hwfn *p_hwfn, 10858c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 10868c2ecf20Sopenharmony_ci enum qed_resources res_id, 10878c2ecf20Sopenharmony_ci u32 *p_mcp_resp, u32 *p_resc_num, u32 *p_resc_start); 10888c2ecf20Sopenharmony_ci 10898c2ecf20Sopenharmony_ci/** 10908c2ecf20Sopenharmony_ci * @brief Send eswitch mode to MFW 10918c2ecf20Sopenharmony_ci * 10928c2ecf20Sopenharmony_ci * @param p_hwfn 10938c2ecf20Sopenharmony_ci * @param p_ptt 10948c2ecf20Sopenharmony_ci * @param eswitch - eswitch mode 10958c2ecf20Sopenharmony_ci * 10968c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 10978c2ecf20Sopenharmony_ci */ 10988c2ecf20Sopenharmony_ciint qed_mcp_ov_update_eswitch(struct qed_hwfn *p_hwfn, 10998c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 11008c2ecf20Sopenharmony_ci enum qed_ov_eswitch eswitch); 11018c2ecf20Sopenharmony_ci 11028c2ecf20Sopenharmony_ci#define QED_MCP_RESC_LOCK_MIN_VAL RESOURCE_DUMP 11038c2ecf20Sopenharmony_ci#define QED_MCP_RESC_LOCK_MAX_VAL 31 11048c2ecf20Sopenharmony_ci 11058c2ecf20Sopenharmony_cienum qed_resc_lock { 11068c2ecf20Sopenharmony_ci QED_RESC_LOCK_DBG_DUMP = QED_MCP_RESC_LOCK_MIN_VAL, 11078c2ecf20Sopenharmony_ci QED_RESC_LOCK_PTP_PORT0, 11088c2ecf20Sopenharmony_ci QED_RESC_LOCK_PTP_PORT1, 11098c2ecf20Sopenharmony_ci QED_RESC_LOCK_PTP_PORT2, 11108c2ecf20Sopenharmony_ci QED_RESC_LOCK_PTP_PORT3, 11118c2ecf20Sopenharmony_ci QED_RESC_LOCK_RESC_ALLOC = QED_MCP_RESC_LOCK_MAX_VAL, 11128c2ecf20Sopenharmony_ci QED_RESC_LOCK_RESC_INVALID 11138c2ecf20Sopenharmony_ci}; 11148c2ecf20Sopenharmony_ci 11158c2ecf20Sopenharmony_ci/** 11168c2ecf20Sopenharmony_ci * @brief - Initiates PF FLR 11178c2ecf20Sopenharmony_ci * 11188c2ecf20Sopenharmony_ci * @param p_hwfn 11198c2ecf20Sopenharmony_ci * @param p_ptt 11208c2ecf20Sopenharmony_ci * 11218c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 11228c2ecf20Sopenharmony_ci */ 11238c2ecf20Sopenharmony_ciint qed_mcp_initiate_pf_flr(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 11248c2ecf20Sopenharmony_cistruct qed_resc_lock_params { 11258c2ecf20Sopenharmony_ci /* Resource number [valid values are 0..31] */ 11268c2ecf20Sopenharmony_ci u8 resource; 11278c2ecf20Sopenharmony_ci 11288c2ecf20Sopenharmony_ci /* Lock timeout value in seconds [default, none or 1..254] */ 11298c2ecf20Sopenharmony_ci u8 timeout; 11308c2ecf20Sopenharmony_ci#define QED_MCP_RESC_LOCK_TO_DEFAULT 0 11318c2ecf20Sopenharmony_ci#define QED_MCP_RESC_LOCK_TO_NONE 255 11328c2ecf20Sopenharmony_ci 11338c2ecf20Sopenharmony_ci /* Number of times to retry locking */ 11348c2ecf20Sopenharmony_ci u8 retry_num; 11358c2ecf20Sopenharmony_ci#define QED_MCP_RESC_LOCK_RETRY_CNT_DFLT 10 11368c2ecf20Sopenharmony_ci 11378c2ecf20Sopenharmony_ci /* The interval in usec between retries */ 11388c2ecf20Sopenharmony_ci u16 retry_interval; 11398c2ecf20Sopenharmony_ci#define QED_MCP_RESC_LOCK_RETRY_VAL_DFLT 10000 11408c2ecf20Sopenharmony_ci 11418c2ecf20Sopenharmony_ci /* Use sleep or delay between retries */ 11428c2ecf20Sopenharmony_ci bool sleep_b4_retry; 11438c2ecf20Sopenharmony_ci 11448c2ecf20Sopenharmony_ci /* Will be set as true if the resource is free and granted */ 11458c2ecf20Sopenharmony_ci bool b_granted; 11468c2ecf20Sopenharmony_ci 11478c2ecf20Sopenharmony_ci /* Will be filled with the resource owner. 11488c2ecf20Sopenharmony_ci * [0..15 = PF0-15, 16 = MFW] 11498c2ecf20Sopenharmony_ci */ 11508c2ecf20Sopenharmony_ci u8 owner; 11518c2ecf20Sopenharmony_ci}; 11528c2ecf20Sopenharmony_ci 11538c2ecf20Sopenharmony_ci/** 11548c2ecf20Sopenharmony_ci * @brief Acquires MFW generic resource lock 11558c2ecf20Sopenharmony_ci * 11568c2ecf20Sopenharmony_ci * @param p_hwfn 11578c2ecf20Sopenharmony_ci * @param p_ptt 11588c2ecf20Sopenharmony_ci * @param p_params 11598c2ecf20Sopenharmony_ci * 11608c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 11618c2ecf20Sopenharmony_ci */ 11628c2ecf20Sopenharmony_ciint 11638c2ecf20Sopenharmony_ciqed_mcp_resc_lock(struct qed_hwfn *p_hwfn, 11648c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, struct qed_resc_lock_params *p_params); 11658c2ecf20Sopenharmony_ci 11668c2ecf20Sopenharmony_cistruct qed_resc_unlock_params { 11678c2ecf20Sopenharmony_ci /* Resource number [valid values are 0..31] */ 11688c2ecf20Sopenharmony_ci u8 resource; 11698c2ecf20Sopenharmony_ci 11708c2ecf20Sopenharmony_ci /* Allow to release a resource even if belongs to another PF */ 11718c2ecf20Sopenharmony_ci bool b_force; 11728c2ecf20Sopenharmony_ci 11738c2ecf20Sopenharmony_ci /* Will be set as true if the resource is released */ 11748c2ecf20Sopenharmony_ci bool b_released; 11758c2ecf20Sopenharmony_ci}; 11768c2ecf20Sopenharmony_ci 11778c2ecf20Sopenharmony_ci/** 11788c2ecf20Sopenharmony_ci * @brief Releases MFW generic resource lock 11798c2ecf20Sopenharmony_ci * 11808c2ecf20Sopenharmony_ci * @param p_hwfn 11818c2ecf20Sopenharmony_ci * @param p_ptt 11828c2ecf20Sopenharmony_ci * @param p_params 11838c2ecf20Sopenharmony_ci * 11848c2ecf20Sopenharmony_ci * @return int - 0 - operation was successful. 11858c2ecf20Sopenharmony_ci */ 11868c2ecf20Sopenharmony_ciint 11878c2ecf20Sopenharmony_ciqed_mcp_resc_unlock(struct qed_hwfn *p_hwfn, 11888c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 11898c2ecf20Sopenharmony_ci struct qed_resc_unlock_params *p_params); 11908c2ecf20Sopenharmony_ci 11918c2ecf20Sopenharmony_ci/** 11928c2ecf20Sopenharmony_ci * @brief - default initialization for lock/unlock resource structs 11938c2ecf20Sopenharmony_ci * 11948c2ecf20Sopenharmony_ci * @param p_lock - lock params struct to be initialized; Can be NULL 11958c2ecf20Sopenharmony_ci * @param p_unlock - unlock params struct to be initialized; Can be NULL 11968c2ecf20Sopenharmony_ci * @param resource - the requested resource 11978c2ecf20Sopenharmony_ci * @paral b_is_permanent - disable retries & aging when set 11988c2ecf20Sopenharmony_ci */ 11998c2ecf20Sopenharmony_civoid qed_mcp_resc_lock_default_init(struct qed_resc_lock_params *p_lock, 12008c2ecf20Sopenharmony_ci struct qed_resc_unlock_params *p_unlock, 12018c2ecf20Sopenharmony_ci enum qed_resc_lock 12028c2ecf20Sopenharmony_ci resource, bool b_is_permanent); 12038c2ecf20Sopenharmony_ci 12048c2ecf20Sopenharmony_ci/** 12058c2ecf20Sopenharmony_ci * @brief - Return whether management firmware support smart AN 12068c2ecf20Sopenharmony_ci * 12078c2ecf20Sopenharmony_ci * @param p_hwfn 12088c2ecf20Sopenharmony_ci * 12098c2ecf20Sopenharmony_ci * @return bool - true if feature is supported. 12108c2ecf20Sopenharmony_ci */ 12118c2ecf20Sopenharmony_cibool qed_mcp_is_smart_an_supported(struct qed_hwfn *p_hwfn); 12128c2ecf20Sopenharmony_ci 12138c2ecf20Sopenharmony_ci/** 12148c2ecf20Sopenharmony_ci * @brief Learn of supported MFW features; To be done during early init 12158c2ecf20Sopenharmony_ci * 12168c2ecf20Sopenharmony_ci * @param p_hwfn 12178c2ecf20Sopenharmony_ci * @param p_ptt 12188c2ecf20Sopenharmony_ci */ 12198c2ecf20Sopenharmony_ciint qed_mcp_get_capabilities(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 12208c2ecf20Sopenharmony_ci 12218c2ecf20Sopenharmony_ci/** 12228c2ecf20Sopenharmony_ci * @brief Inform MFW of set of features supported by driver. Should be done 12238c2ecf20Sopenharmony_ci * inside the content of the LOAD_REQ. 12248c2ecf20Sopenharmony_ci * 12258c2ecf20Sopenharmony_ci * @param p_hwfn 12268c2ecf20Sopenharmony_ci * @param p_ptt 12278c2ecf20Sopenharmony_ci */ 12288c2ecf20Sopenharmony_ciint qed_mcp_set_capabilities(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 12298c2ecf20Sopenharmony_ci 12308c2ecf20Sopenharmony_ci/** 12318c2ecf20Sopenharmony_ci * @brief Read ufp config from the shared memory. 12328c2ecf20Sopenharmony_ci * 12338c2ecf20Sopenharmony_ci * @param p_hwfn 12348c2ecf20Sopenharmony_ci * @param p_ptt 12358c2ecf20Sopenharmony_ci */ 12368c2ecf20Sopenharmony_civoid qed_mcp_read_ufp_config(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 12378c2ecf20Sopenharmony_ci 12388c2ecf20Sopenharmony_ci/** 12398c2ecf20Sopenharmony_ci * @brief Populate the nvm info shadow in the given hardware function 12408c2ecf20Sopenharmony_ci * 12418c2ecf20Sopenharmony_ci * @param p_hwfn 12428c2ecf20Sopenharmony_ci */ 12438c2ecf20Sopenharmony_ciint qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn); 12448c2ecf20Sopenharmony_ci 12458c2ecf20Sopenharmony_ci/** 12468c2ecf20Sopenharmony_ci * @brief Delete nvm info shadow in the given hardware function 12478c2ecf20Sopenharmony_ci * 12488c2ecf20Sopenharmony_ci * @param p_hwfn 12498c2ecf20Sopenharmony_ci */ 12508c2ecf20Sopenharmony_civoid qed_mcp_nvm_info_free(struct qed_hwfn *p_hwfn); 12518c2ecf20Sopenharmony_ci 12528c2ecf20Sopenharmony_ci/** 12538c2ecf20Sopenharmony_ci * @brief Get the engine affinity configuration. 12548c2ecf20Sopenharmony_ci * 12558c2ecf20Sopenharmony_ci * @param p_hwfn 12568c2ecf20Sopenharmony_ci * @param p_ptt 12578c2ecf20Sopenharmony_ci */ 12588c2ecf20Sopenharmony_ciint qed_mcp_get_engine_config(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 12598c2ecf20Sopenharmony_ci 12608c2ecf20Sopenharmony_ci/** 12618c2ecf20Sopenharmony_ci * @brief Get the PPFID bitmap. 12628c2ecf20Sopenharmony_ci * 12638c2ecf20Sopenharmony_ci * @param p_hwfn 12648c2ecf20Sopenharmony_ci * @param p_ptt 12658c2ecf20Sopenharmony_ci */ 12668c2ecf20Sopenharmony_ciint qed_mcp_get_ppfid_bitmap(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); 12678c2ecf20Sopenharmony_ci 12688c2ecf20Sopenharmony_ci/** 12698c2ecf20Sopenharmony_ci * @brief Get NVM config attribute value. 12708c2ecf20Sopenharmony_ci * 12718c2ecf20Sopenharmony_ci * @param p_hwfn 12728c2ecf20Sopenharmony_ci * @param p_ptt 12738c2ecf20Sopenharmony_ci * @param option_id 12748c2ecf20Sopenharmony_ci * @param entity_id 12758c2ecf20Sopenharmony_ci * @param flags 12768c2ecf20Sopenharmony_ci * @param p_buf 12778c2ecf20Sopenharmony_ci * @param p_len 12788c2ecf20Sopenharmony_ci */ 12798c2ecf20Sopenharmony_ciint qed_mcp_nvm_get_cfg(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 12808c2ecf20Sopenharmony_ci u16 option_id, u8 entity_id, u16 flags, u8 *p_buf, 12818c2ecf20Sopenharmony_ci u32 *p_len); 12828c2ecf20Sopenharmony_ci 12838c2ecf20Sopenharmony_ci/** 12848c2ecf20Sopenharmony_ci * @brief Set NVM config attribute value. 12858c2ecf20Sopenharmony_ci * 12868c2ecf20Sopenharmony_ci * @param p_hwfn 12878c2ecf20Sopenharmony_ci * @param p_ptt 12888c2ecf20Sopenharmony_ci * @param option_id 12898c2ecf20Sopenharmony_ci * @param entity_id 12908c2ecf20Sopenharmony_ci * @param flags 12918c2ecf20Sopenharmony_ci * @param p_buf 12928c2ecf20Sopenharmony_ci * @param len 12938c2ecf20Sopenharmony_ci */ 12948c2ecf20Sopenharmony_ciint qed_mcp_nvm_set_cfg(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, 12958c2ecf20Sopenharmony_ci u16 option_id, u8 entity_id, u16 flags, u8 *p_buf, 12968c2ecf20Sopenharmony_ci u32 len); 12978c2ecf20Sopenharmony_ci#endif 1298