| /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ |
| /* QLogic qed NIC Driver |
| * Copyright (c) 2015-2017 QLogic Corporation |
| * Copyright (c) 2019-2020 Marvell International Ltd. |
| */ |
| |
| #ifndef _QED_MCP_H |
| #define _QED_MCP_H |
| |
| #include <linux/types.h> |
| #include <linux/delay.h> |
| #include <linux/slab.h> |
| #include <linux/spinlock.h> |
| #include <linux/qed/qed_fcoe_if.h> |
| #include "qed_hsi.h" |
| #include "qed_dev_api.h" |
| |
| struct qed_mcp_link_speed_params { |
| bool autoneg; |
| |
| u32 advertised_speeds; |
| #define QED_EXT_SPEED_MASK_RES 0x1 |
| #define QED_EXT_SPEED_MASK_1G 0x2 |
| #define QED_EXT_SPEED_MASK_10G 0x4 |
| #define QED_EXT_SPEED_MASK_20G 0x8 |
| #define QED_EXT_SPEED_MASK_25G 0x10 |
| #define QED_EXT_SPEED_MASK_40G 0x20 |
| #define QED_EXT_SPEED_MASK_50G_R 0x40 |
| #define QED_EXT_SPEED_MASK_50G_R2 0x80 |
| #define QED_EXT_SPEED_MASK_100G_R2 0x100 |
| #define QED_EXT_SPEED_MASK_100G_R4 0x200 |
| #define QED_EXT_SPEED_MASK_100G_P4 0x400 |
| |
| u32 forced_speed; /* In Mb/s */ |
| #define QED_EXT_SPEED_1G 0x1 |
| #define QED_EXT_SPEED_10G 0x2 |
| #define QED_EXT_SPEED_20G 0x4 |
| #define QED_EXT_SPEED_25G 0x8 |
| #define QED_EXT_SPEED_40G 0x10 |
| #define QED_EXT_SPEED_50G_R 0x20 |
| #define QED_EXT_SPEED_50G_R2 0x40 |
| #define QED_EXT_SPEED_100G_R2 0x80 |
| #define QED_EXT_SPEED_100G_R4 0x100 |
| #define QED_EXT_SPEED_100G_P4 0x200 |
| }; |
| |
| struct qed_mcp_link_pause_params { |
| bool autoneg; |
| bool forced_rx; |
| bool forced_tx; |
| }; |
| |
| enum qed_mcp_eee_mode { |
| QED_MCP_EEE_DISABLED, |
| QED_MCP_EEE_ENABLED, |
| QED_MCP_EEE_UNSUPPORTED |
| }; |
| |
| struct qed_mcp_link_params { |
| struct qed_mcp_link_speed_params speed; |
| struct qed_mcp_link_pause_params pause; |
| u32 loopback_mode; |
| struct qed_link_eee_params eee; |
| u32 fec; |
| |
| struct qed_mcp_link_speed_params ext_speed; |
| u32 ext_fec_mode; |
| }; |
| |
| struct qed_mcp_link_capabilities { |
| u32 speed_capabilities; |
| bool default_speed_autoneg; |
| u32 fec_default; |
| enum qed_mcp_eee_mode default_eee; |
| u32 eee_lpi_timer; |
| u8 eee_speed_caps; |
| |
| u32 default_ext_speed_caps; |
| u32 default_ext_autoneg; |
| u32 default_ext_speed; |
| u32 default_ext_fec; |
| }; |
| |
| struct qed_mcp_link_state { |
| bool link_up; |
| u32 min_pf_rate; |
| |
| /* Actual link speed in Mb/s */ |
| u32 line_speed; |
| |
| /* PF max speed in Mb/s, deduced from line_speed |
| * according to PF max bandwidth configuration. |
| */ |
| u32 speed; |
| |
| bool full_duplex; |
| bool an; |
| bool an_complete; |
| bool parallel_detection; |
| bool pfc_enabled; |
| |
| u32 partner_adv_speed; |
| #define QED_LINK_PARTNER_SPEED_1G_HD BIT(0) |
| #define QED_LINK_PARTNER_SPEED_1G_FD BIT(1) |
| #define QED_LINK_PARTNER_SPEED_10G BIT(2) |
| #define QED_LINK_PARTNER_SPEED_20G BIT(3) |
| #define QED_LINK_PARTNER_SPEED_25G BIT(4) |
| #define QED_LINK_PARTNER_SPEED_40G BIT(5) |
| #define QED_LINK_PARTNER_SPEED_50G BIT(6) |
| #define QED_LINK_PARTNER_SPEED_100G BIT(7) |
| |
| bool partner_tx_flow_ctrl_en; |
| bool partner_rx_flow_ctrl_en; |
| |
| u8 partner_adv_pause; |
| #define QED_LINK_PARTNER_SYMMETRIC_PAUSE 0x1 |
| #define QED_LINK_PARTNER_ASYMMETRIC_PAUSE 0x2 |
| #define QED_LINK_PARTNER_BOTH_PAUSE 0x3 |
| |
| bool sfp_tx_fault; |
| bool eee_active; |
| u8 eee_adv_caps; |
| u8 eee_lp_adv_caps; |
| |
| u32 fec_active; |
| }; |
| |
| struct qed_mcp_function_info { |
| u8 pause_on_host; |
| |
| enum qed_pci_personality protocol; |
| |
| u8 bandwidth_min; |
| u8 bandwidth_max; |
| |
| u8 mac[ETH_ALEN]; |
| |
| u64 wwn_port; |
| u64 wwn_node; |
| |
| #define QED_MCP_VLAN_UNSET (0xffff) |
| u16 ovlan; |
| |
| u16 mtu; |
| }; |
| |
| struct qed_mcp_nvm_common { |
| u32 offset; |
| u32 param; |
| u32 resp; |
| u32 cmd; |
| }; |
| |
| struct qed_mcp_drv_version { |
| u32 version; |
| u8 name[MCP_DRV_VER_STR_SIZE - 4]; |
| }; |
| |
| struct qed_mcp_lan_stats { |
| u64 ucast_rx_pkts; |
| u64 ucast_tx_pkts; |
| u32 fcs_err; |
| }; |
| |
| struct qed_mcp_fcoe_stats { |
| u64 rx_pkts; |
| u64 tx_pkts; |
| u32 fcs_err; |
| u32 login_failure; |
| }; |
| |
| struct qed_mcp_iscsi_stats { |
| u64 rx_pdus; |
| u64 tx_pdus; |
| u64 rx_bytes; |
| u64 tx_bytes; |
| }; |
| |
| struct qed_mcp_rdma_stats { |
| u64 rx_pkts; |
| u64 tx_pkts; |
| u64 rx_bytes; |
| u64 tx_byts; |
| }; |
| |
| enum qed_mcp_protocol_type { |
| QED_MCP_LAN_STATS, |
| QED_MCP_FCOE_STATS, |
| QED_MCP_ISCSI_STATS, |
| QED_MCP_RDMA_STATS |
| }; |
| |
| union qed_mcp_protocol_stats { |
| struct qed_mcp_lan_stats lan_stats; |
| struct qed_mcp_fcoe_stats fcoe_stats; |
| struct qed_mcp_iscsi_stats iscsi_stats; |
| struct qed_mcp_rdma_stats rdma_stats; |
| }; |
| |
| enum qed_ov_eswitch { |
| QED_OV_ESWITCH_NONE, |
| QED_OV_ESWITCH_VEB, |
| QED_OV_ESWITCH_VEPA |
| }; |
| |
| enum qed_ov_client { |
| QED_OV_CLIENT_DRV, |
| QED_OV_CLIENT_USER, |
| QED_OV_CLIENT_VENDOR_SPEC |
| }; |
| |
| enum qed_ov_driver_state { |
| QED_OV_DRIVER_STATE_NOT_LOADED, |
| QED_OV_DRIVER_STATE_DISABLED, |
| QED_OV_DRIVER_STATE_ACTIVE |
| }; |
| |
| enum qed_ov_wol { |
| QED_OV_WOL_DEFAULT, |
| QED_OV_WOL_DISABLED, |
| QED_OV_WOL_ENABLED |
| }; |
| |
| enum qed_mfw_tlv_type { |
| QED_MFW_TLV_GENERIC = 0x1, /* Core driver TLVs */ |
| QED_MFW_TLV_ETH = 0x2, /* L2 driver TLVs */ |
| QED_MFW_TLV_FCOE = 0x4, /* FCoE protocol TLVs */ |
| QED_MFW_TLV_ISCSI = 0x8, /* SCSI protocol TLVs */ |
| QED_MFW_TLV_MAX = 0x16, |
| }; |
| |
| struct qed_mfw_tlv_generic { |
| #define QED_MFW_TLV_FLAGS_SIZE 2 |
| struct { |
| u8 ipv4_csum_offload; |
| u8 lso_supported; |
| bool b_set; |
| } flags; |
| |
| #define QED_MFW_TLV_MAC_COUNT 3 |
| /* First entry for primary MAC, 2 secondary MACs possible */ |
| u8 mac[QED_MFW_TLV_MAC_COUNT][6]; |
| bool mac_set[QED_MFW_TLV_MAC_COUNT]; |
| |
| u64 rx_frames; |
| bool rx_frames_set; |
| u64 rx_bytes; |
| bool rx_bytes_set; |
| u64 tx_frames; |
| bool tx_frames_set; |
| u64 tx_bytes; |
| bool tx_bytes_set; |
| }; |
| |
| union qed_mfw_tlv_data { |
| struct qed_mfw_tlv_generic generic; |
| struct qed_mfw_tlv_eth eth; |
| struct qed_mfw_tlv_fcoe fcoe; |
| struct qed_mfw_tlv_iscsi iscsi; |
| }; |
| |
| #define QED_NVM_CFG_OPTION_ALL BIT(0) |
| #define QED_NVM_CFG_OPTION_INIT BIT(1) |
| #define QED_NVM_CFG_OPTION_COMMIT BIT(2) |
| #define QED_NVM_CFG_OPTION_FREE BIT(3) |
| #define QED_NVM_CFG_OPTION_ENTITY_SEL BIT(4) |
| |
| /** |
| * qed_mcp_get_link_params(): Returns the link params of the hw function. |
| * |
| * @p_hwfn: HW device data. |
| * |
| * Returns: Pointer to link params. |
| */ |
| struct qed_mcp_link_params *qed_mcp_get_link_params(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * qed_mcp_get_link_state(): Return the link state of the hw function. |
| * |
| * @p_hwfn: HW device data. |
| * |
| * Returns: Pointer to link state. |
| */ |
| struct qed_mcp_link_state *qed_mcp_get_link_state(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * qed_mcp_get_link_capabilities(): Return the link capabilities of the |
| * hw function. |
| * |
| * @p_hwfn: HW device data. |
| * |
| * Returns: Pointer to link capabilities. |
| */ |
| struct qed_mcp_link_capabilities |
| *qed_mcp_get_link_capabilities(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * qed_mcp_set_link(): Request the MFW to set the link according |
| * to 'link_input'. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @b_up: Raise link if `true'. Reset link if `false'. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_set_link(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| bool b_up); |
| |
| /** |
| * qed_mcp_get_mfw_ver(): Get the management firmware version value. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_mfw_ver: MFW version value. |
| * @p_running_bundle_id: Image id in nvram; Optional. |
| * |
| * Return: Int - 0 - operation was successful. |
| */ |
| int qed_mcp_get_mfw_ver(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *p_mfw_ver, u32 *p_running_bundle_id); |
| |
| /** |
| * qed_mcp_get_mbi_ver(): Get the MBI version value. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_mbi_ver: A pointer to a variable to be filled with the MBI version. |
| * |
| * Return: Int - 0 - operation was successful. |
| */ |
| int qed_mcp_get_mbi_ver(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u32 *p_mbi_ver); |
| |
| /** |
| * qed_mcp_get_media_type(): Get media type value of the port. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @media_type: Media type value |
| * |
| * Return: Int - 0 - Operation was successul. |
| * -EBUSY - Operation failed |
| */ |
| int qed_mcp_get_media_type(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u32 *media_type); |
| |
| /** |
| * qed_mcp_get_transceiver_data(): Get transceiver data of the port. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_transceiver_state: Transceiver state. |
| * @p_tranceiver_type: Media type value. |
| * |
| * Return: Int - 0 - Operation was successul. |
| * -EBUSY - Operation failed |
| */ |
| int qed_mcp_get_transceiver_data(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *p_transceiver_state, |
| u32 *p_tranceiver_type); |
| |
| /** |
| * qed_mcp_trans_speed_mask(): Get transceiver supported speed mask. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_speed_mask: Bit mask of all supported speeds. |
| * |
| * Return: Int - 0 - Operation was successul. |
| * -EBUSY - Operation failed |
| */ |
| |
| int qed_mcp_trans_speed_mask(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u32 *p_speed_mask); |
| |
| /** |
| * qed_mcp_get_board_config(): Get board configuration. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_board_config: Board config. |
| * |
| * Return: Int - 0 - Operation was successul. |
| * -EBUSY - Operation failed |
| */ |
| int qed_mcp_get_board_config(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u32 *p_board_config); |
| |
| /** |
| * qed_mcp_cmd(): General function for sending commands to the MCP |
| * mailbox. It acquire mutex lock for the entire |
| * operation, from sending the request until the MCP |
| * response. Waiting for MCP response will be checked up |
| * to 5 seconds every 5ms. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * @cmd: command to be sent to the MCP. |
| * @param: Optional param |
| * @o_mcp_resp: The MCP response code (exclude sequence). |
| * @o_mcp_param: Optional parameter provided by the MCP |
| * response |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_cmd(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 cmd, |
| u32 param, |
| u32 *o_mcp_resp, |
| u32 *o_mcp_param); |
| |
| /** |
| * qed_mcp_drain(): drains the nig, allowing completion to pass in |
| * case of pauses. |
| * (Should be called only from sleepable context) |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_drain(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_get_flash_size(): Get the flash size value. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * @p_flash_size: Flash size in bytes to be filled. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_get_flash_size(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *p_flash_size); |
| |
| /** |
| * qed_mcp_send_drv_version(): Send driver version to MFW. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * @p_ver: Version value. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int |
| qed_mcp_send_drv_version(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| struct qed_mcp_drv_version *p_ver); |
| |
| /** |
| * qed_get_process_kill_counter(): Read the MFW process kill counter. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * |
| * Return: u32. |
| */ |
| u32 qed_get_process_kill_counter(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_start_recovery_process(): Trigger a recovery process. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * |
| * Return: Int. |
| */ |
| int qed_start_recovery_process(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_recovery_prolog(): A recovery handler must call this function |
| * as its first step. |
| * It is assumed that the handler is not run from |
| * an interrupt context. |
| * |
| * @cdev: Qed dev pointer. |
| * |
| * Return: int. |
| */ |
| int qed_recovery_prolog(struct qed_dev *cdev); |
| |
| /** |
| * qed_mcp_ov_update_current_config(): Notify MFW about the change in base |
| * device properties |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @client: Qed client type. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_ov_update_current_config(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| enum qed_ov_client client); |
| |
| /** |
| * qed_mcp_ov_update_driver_state(): Notify MFW about the driver state. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @drv_state: Driver state. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_ov_update_driver_state(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| enum qed_ov_driver_state drv_state); |
| |
| /** |
| * qed_mcp_ov_update_mtu(): Send MTU size to MFW. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @mtu: MTU size. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_ov_update_mtu(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u16 mtu); |
| |
| /** |
| * qed_mcp_ov_update_mac(): Send MAC address to MFW. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @mac: MAC address. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_ov_update_mac(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, const u8 *mac); |
| |
| /** |
| * qed_mcp_ov_update_wol(): Send WOL mode to MFW. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @wol: WOL mode. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_ov_update_wol(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| enum qed_ov_wol wol); |
| |
| /** |
| * qed_mcp_set_led(): Set LED status. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @mode: LED mode. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_set_led(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| enum qed_led_mode mode); |
| |
| /** |
| * qed_mcp_nvm_read(): Read from NVM. |
| * |
| * @cdev: Qed dev pointer. |
| * @addr: NVM offset. |
| * @p_buf: NVM read buffer. |
| * @len: Buffer len. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_nvm_read(struct qed_dev *cdev, u32 addr, u8 *p_buf, u32 len); |
| |
| /** |
| * qed_mcp_nvm_write(): Write to NVM. |
| * |
| * @cdev: Qed dev pointer. |
| * @addr: NVM offset. |
| * @cmd: NVM command. |
| * @p_buf: NVM write buffer. |
| * @len: Buffer len. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_nvm_write(struct qed_dev *cdev, |
| u32 cmd, u32 addr, u8 *p_buf, u32 len); |
| |
| /** |
| * qed_mcp_nvm_resp(): Check latest response. |
| * |
| * @cdev: Qed dev pointer. |
| * @p_buf: NVM write buffer. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_nvm_resp(struct qed_dev *cdev, u8 *p_buf); |
| |
| struct qed_nvm_image_att { |
| u32 start_addr; |
| u32 length; |
| }; |
| |
| /** |
| * qed_mcp_get_nvm_image_att(): Allows reading a whole nvram image. |
| * |
| * @p_hwfn: HW device data. |
| * @image_id: Image to get attributes for. |
| * @p_image_att: Image attributes structure into which to fill data. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int |
| qed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn, |
| enum qed_nvm_images image_id, |
| struct qed_nvm_image_att *p_image_att); |
| |
| /** |
| * qed_mcp_get_nvm_image(): Allows reading a whole nvram image. |
| * |
| * @p_hwfn: HW device data. |
| * @image_id: image requested for reading. |
| * @p_buffer: allocated buffer into which to fill data. |
| * @buffer_len: length of the allocated buffer. |
| * |
| * Return: 0 if p_buffer now contains the nvram image. |
| */ |
| int qed_mcp_get_nvm_image(struct qed_hwfn *p_hwfn, |
| enum qed_nvm_images image_id, |
| u8 *p_buffer, u32 buffer_len); |
| |
| /** |
| * qed_mcp_bist_register_test(): Bist register test. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_bist_register_test(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_bist_clock_test(): Bist clock test. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_bist_clock_test(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_bist_nvm_get_num_images(): Bist nvm test - get number of images. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * @num_images: number of images if operation was |
| * successful. 0 if not. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_bist_nvm_get_num_images(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 *num_images); |
| |
| /** |
| * qed_mcp_bist_nvm_get_image_att(): Bist nvm test - get image attributes |
| * by index. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * @p_image_att: Attributes of image. |
| * @image_index: Index of image to get information for. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_bist_nvm_get_image_att(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| struct bist_nvm_image_att *p_image_att, |
| u32 image_index); |
| |
| /** |
| * qed_mfw_process_tlv_req(): Processes the TLV request from MFW i.e., |
| * get the required TLV info |
| * from the qed client and send it to the MFW. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: 0 upon success. |
| */ |
| int qed_mfw_process_tlv_req(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_send_raw_debug_data(): Send raw debug data to the MFW |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_buf: raw debug data buffer. |
| * @size: Buffer size. |
| * |
| * Return : Int. |
| */ |
| int |
| qed_mcp_send_raw_debug_data(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u8 *p_buf, u32 size); |
| |
| /* Using hwfn number (and not pf_num) is required since in CMT mode, |
| * same pf_num may be used by two different hwfn |
| * TODO - this shouldn't really be in .h file, but until all fields |
| * required during hw-init will be placed in their correct place in shmem |
| * we need it in qed_dev.c [for readin the nvram reflection in shmem]. |
| */ |
| #define MCP_PF_ID_BY_REL(p_hwfn, rel_pfid) (QED_IS_BB((p_hwfn)->cdev) ? \ |
| ((rel_pfid) | \ |
| ((p_hwfn)->abs_pf_id & 1) << 3) : \ |
| rel_pfid) |
| #define MCP_PF_ID(p_hwfn) MCP_PF_ID_BY_REL(p_hwfn, (p_hwfn)->rel_pf_id) |
| |
| struct qed_mcp_info { |
| /* List for mailbox commands which were sent and wait for a response */ |
| struct list_head cmd_list; |
| |
| /* Spinlock used for protecting the access to the mailbox commands list |
| * and the sending of the commands. |
| */ |
| spinlock_t cmd_lock; |
| |
| /* Flag to indicate whether sending a MFW mailbox command is blocked */ |
| bool b_block_cmd; |
| |
| /* Spinlock used for syncing SW link-changes and link-changes |
| * originating from attention context. |
| */ |
| spinlock_t link_lock; |
| |
| u32 public_base; |
| u32 drv_mb_addr; |
| u32 mfw_mb_addr; |
| u32 port_addr; |
| u16 drv_mb_seq; |
| u16 drv_pulse_seq; |
| struct qed_mcp_link_params link_input; |
| struct qed_mcp_link_state link_output; |
| struct qed_mcp_link_capabilities link_capabilities; |
| struct qed_mcp_function_info func_info; |
| u8 *mfw_mb_cur; |
| u8 *mfw_mb_shadow; |
| u16 mfw_mb_length; |
| u32 mcp_hist; |
| |
| /* Capabilties negotiated with the MFW */ |
| u32 capabilities; |
| |
| /* S/N for debug data mailbox commands */ |
| atomic_t dbg_data_seq; |
| }; |
| |
| struct qed_mcp_mb_params { |
| u32 cmd; |
| u32 param; |
| void *p_data_src; |
| void *p_data_dst; |
| u8 data_src_size; |
| u8 data_dst_size; |
| u32 mcp_resp; |
| u32 mcp_param; |
| u32 flags; |
| #define QED_MB_FLAG_CAN_SLEEP (0x1 << 0) |
| #define QED_MB_FLAG_AVOID_BLOCK (0x1 << 1) |
| #define QED_MB_FLAGS_IS_SET(params, flag) \ |
| ({ typeof(params) __params = (params); \ |
| (__params && (__params->flags & QED_MB_FLAG_ ## flag)); }) |
| }; |
| |
| struct qed_drv_tlv_hdr { |
| u8 tlv_type; |
| u8 tlv_length; /* In dwords - not including this header */ |
| u8 tlv_reserved; |
| #define QED_DRV_TLV_FLAGS_CHANGED 0x01 |
| u8 tlv_flags; |
| }; |
| |
| /** |
| * qed_mcp_is_ext_speed_supported() - Check if management firmware supports |
| * extended speeds. |
| * @p_hwfn: HW device data. |
| * |
| * Return: true if supported, false otherwise. |
| */ |
| static inline bool |
| qed_mcp_is_ext_speed_supported(const struct qed_hwfn *p_hwfn) |
| { |
| return !!(p_hwfn->mcp_info->capabilities & |
| FW_MB_PARAM_FEATURE_SUPPORT_EXT_SPEED_FEC_CONTROL); |
| } |
| |
| /** |
| * qed_mcp_cmd_init(): Initialize the interface with the MCP. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_cmd_init(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_cmd_port_init(): Initialize the port interface with the MCP |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Void. |
| * |
| * Can only be called after `num_ports_in_engines' is set |
| */ |
| void qed_mcp_cmd_port_init(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| /** |
| * qed_mcp_free(): Releases resources allocated during the init process. |
| * |
| * @p_hwfn: HW function. |
| * |
| * Return: Int. |
| */ |
| |
| int qed_mcp_free(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * qed_mcp_handle_events(): This function is called from the DPC context. |
| * After pointing PTT to the mfw mb, check for events sent by |
| * the MCP to the driver and ack them. In case a critical event |
| * detected, it will be handled here, otherwise the work will be |
| * queued to a sleepable work-queue. |
| * |
| * @p_hwfn: HW function. |
| * @p_ptt: PTT required for register access. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_handle_events(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| |
| enum qed_drv_role { |
| QED_DRV_ROLE_OS, |
| QED_DRV_ROLE_KDUMP, |
| }; |
| |
| struct qed_load_req_params { |
| /* Input params */ |
| enum qed_drv_role drv_role; |
| u8 timeout_val; |
| bool avoid_eng_reset; |
| enum qed_override_force_load override_force_load; |
| |
| /* Output params */ |
| u32 load_code; |
| }; |
| |
| /** |
| * qed_mcp_load_req(): Sends a LOAD_REQ to the MFW, and in case the |
| * operation succeeds, returns whether this PF is |
| * the first on the engine/port or function. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_params: Params. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_load_req(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| struct qed_load_req_params *p_params); |
| |
| /** |
| * qed_mcp_load_done(): Sends a LOAD_DONE message to the MFW. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_load_done(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_unload_req(): Sends a UNLOAD_REQ message to the MFW. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_unload_req(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_unload_done(): Sends a UNLOAD_DONE message to the MFW |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_unload_done(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_read_mb(): Read the MFW mailbox into Current buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Void. |
| */ |
| void qed_mcp_read_mb(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_ack_vf_flr(): Ack to mfw that driver finished FLR process for VFs |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @vfs_to_ack: bit mask of all engine VFs for which the PF acks. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_ack_vf_flr(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u32 *vfs_to_ack); |
| |
| /** |
| * qed_mcp_fill_shmem_func_info(): Calls during init to read shmem of |
| * all function-related info. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: 0 upon success. |
| */ |
| int qed_mcp_fill_shmem_func_info(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_reset(): Reset the MCP using mailbox command. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: 0 upon success. |
| */ |
| int qed_mcp_reset(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_nvm_rd_cmd(): Sends an NVM read command request to the MFW to get |
| * a buffer. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @cmd: (Command) DRV_MSG_CODE_NVM_GET_FILE_DATA or |
| * DRV_MSG_CODE_NVM_READ_NVRAM commands. |
| * @param: [0:23] - Offset [24:31] - Size. |
| * @o_mcp_resp: MCP response. |
| * @o_mcp_param: MCP response param. |
| * @o_txn_size: Buffer size output. |
| * @o_buf: Pointer to the buffer returned by the MFW. |
| * @b_can_sleep: Can sleep. |
| * |
| * Return: 0 upon success. |
| */ |
| int qed_mcp_nvm_rd_cmd(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| u32 cmd, |
| u32 param, |
| u32 *o_mcp_resp, |
| u32 *o_mcp_param, |
| u32 *o_txn_size, u32 *o_buf, bool b_can_sleep); |
| |
| /** |
| * qed_mcp_phy_sfp_read(): Read from sfp. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: PTT required for register access. |
| * @port: transceiver port. |
| * @addr: I2C address. |
| * @offset: offset in sfp. |
| * @len: buffer length. |
| * @p_buf: buffer to read into. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_phy_sfp_read(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, |
| u32 port, u32 addr, u32 offset, u32 len, u8 *p_buf); |
| |
| /** |
| * qed_mcp_is_init(): indicates whether the MFW objects [under mcp_info] |
| * are accessible |
| * |
| * @p_hwfn: HW device data. |
| * |
| * Return: true if MFW is running and mcp_info is initialized. |
| */ |
| bool qed_mcp_is_init(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * qed_mcp_config_vf_msix(): Request MFW to configure MSI-X for a VF. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @vf_id: absolute inside engine. |
| * @num: number of entries to request. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_config_vf_msix(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u8 vf_id, u8 num); |
| |
| /** |
| * qed_mcp_halt(): Halt the MCP. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: 0 upon success. |
| */ |
| int qed_mcp_halt(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_resume: Wake up the MCP. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: 0 upon success. |
| */ |
| int qed_mcp_resume(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| int qed_configure_pf_min_bandwidth(struct qed_dev *cdev, u8 min_bw); |
| int qed_configure_pf_max_bandwidth(struct qed_dev *cdev, u8 max_bw); |
| int __qed_configure_pf_max_bandwidth(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| struct qed_mcp_link_state *p_link, |
| u8 max_bw); |
| int __qed_configure_pf_min_bandwidth(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| struct qed_mcp_link_state *p_link, |
| u8 min_bw); |
| |
| int qed_mcp_mask_parities(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, u32 mask_parities); |
| |
| /* qed_mcp_mdump_get_retain(): Gets the mdump retained data from the MFW. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_mdump_retain: mdump retain. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int |
| qed_mcp_mdump_get_retain(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| struct mdump_retain_data_stc *p_mdump_retain); |
| |
| /** |
| * qed_mcp_set_resc_max_val(): Sets the MFW's max value for the given resource. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @res_id: RES ID. |
| * @resc_max_val: Resec max val. |
| * @p_mcp_resp: MCP Resp |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int |
| qed_mcp_set_resc_max_val(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| enum qed_resources res_id, |
| u32 resc_max_val, u32 *p_mcp_resp); |
| |
| /** |
| * qed_mcp_get_resc_info(): Gets the MFW allocation info for the given |
| * resource. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @res_id: Res ID. |
| * @p_mcp_resp: MCP resp. |
| * @p_resc_num: Resc num. |
| * @p_resc_start: Resc start. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int |
| qed_mcp_get_resc_info(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| enum qed_resources res_id, |
| u32 *p_mcp_resp, u32 *p_resc_num, u32 *p_resc_start); |
| |
| /** |
| * qed_mcp_ov_update_eswitch(): Send eswitch mode to MFW. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @eswitch: eswitch mode. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_ov_update_eswitch(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| enum qed_ov_eswitch eswitch); |
| |
| #define QED_MCP_RESC_LOCK_MIN_VAL RESOURCE_DUMP |
| #define QED_MCP_RESC_LOCK_MAX_VAL 31 |
| |
| enum qed_resc_lock { |
| QED_RESC_LOCK_DBG_DUMP = QED_MCP_RESC_LOCK_MIN_VAL, |
| QED_RESC_LOCK_PTP_PORT0, |
| QED_RESC_LOCK_PTP_PORT1, |
| QED_RESC_LOCK_PTP_PORT2, |
| QED_RESC_LOCK_PTP_PORT3, |
| QED_RESC_LOCK_RESC_ALLOC = QED_MCP_RESC_LOCK_MAX_VAL, |
| QED_RESC_LOCK_RESC_INVALID |
| }; |
| |
| /** |
| * qed_mcp_initiate_pf_flr(): Initiates PF FLR. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int qed_mcp_initiate_pf_flr(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| struct qed_resc_lock_params { |
| /* Resource number [valid values are 0..31] */ |
| u8 resource; |
| |
| /* Lock timeout value in seconds [default, none or 1..254] */ |
| u8 timeout; |
| #define QED_MCP_RESC_LOCK_TO_DEFAULT 0 |
| #define QED_MCP_RESC_LOCK_TO_NONE 255 |
| |
| /* Number of times to retry locking */ |
| u8 retry_num; |
| #define QED_MCP_RESC_LOCK_RETRY_CNT_DFLT 10 |
| |
| /* The interval in usec between retries */ |
| u16 retry_interval; |
| #define QED_MCP_RESC_LOCK_RETRY_VAL_DFLT 10000 |
| |
| /* Use sleep or delay between retries */ |
| bool sleep_b4_retry; |
| |
| /* Will be set as true if the resource is free and granted */ |
| bool b_granted; |
| |
| /* Will be filled with the resource owner. |
| * [0..15 = PF0-15, 16 = MFW] |
| */ |
| u8 owner; |
| }; |
| |
| /** |
| * qed_mcp_resc_lock(): Acquires MFW generic resource lock. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_params: Params. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int |
| qed_mcp_resc_lock(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, struct qed_resc_lock_params *p_params); |
| |
| struct qed_resc_unlock_params { |
| /* Resource number [valid values are 0..31] */ |
| u8 resource; |
| |
| /* Allow to release a resource even if belongs to another PF */ |
| bool b_force; |
| |
| /* Will be set as true if the resource is released */ |
| bool b_released; |
| }; |
| |
| /** |
| * qed_mcp_resc_unlock(): Releases MFW generic resource lock. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @p_params: Params. |
| * |
| * Return: Int - 0 - Operation was successul. |
| */ |
| int |
| qed_mcp_resc_unlock(struct qed_hwfn *p_hwfn, |
| struct qed_ptt *p_ptt, |
| struct qed_resc_unlock_params *p_params); |
| |
| /** |
| * qed_mcp_resc_lock_default_init(): Default initialization for |
| * lock/unlock resource structs. |
| * |
| * @p_lock: lock params struct to be initialized; Can be NULL. |
| * @p_unlock: unlock params struct to be initialized; Can be NULL. |
| * @resource: the requested resource. |
| * @b_is_permanent: disable retries & aging when set. |
| * |
| * Return: Void. |
| */ |
| void qed_mcp_resc_lock_default_init(struct qed_resc_lock_params *p_lock, |
| struct qed_resc_unlock_params *p_unlock, |
| enum qed_resc_lock |
| resource, bool b_is_permanent); |
| |
| /** |
| * qed_mcp_is_smart_an_supported(): Return whether management firmware |
| * support smart AN |
| * |
| * @p_hwfn: HW device data. |
| * |
| * Return: bool true if feature is supported. |
| */ |
| bool qed_mcp_is_smart_an_supported(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * qed_mcp_get_capabilities(): Learn of supported MFW features; |
| * To be done during early init. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_get_capabilities(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_set_capabilities(): Inform MFW of set of features supported |
| * by driver. Should be done inside the content |
| * of the LOAD_REQ. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_set_capabilities(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_read_ufp_config(): Read ufp config from the shared memory. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Void. |
| */ |
| void qed_mcp_read_ufp_config(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_nvm_info_populate(): Populate the nvm info shadow in the given |
| * hardware function. |
| * |
| * @p_hwfn: HW device data. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * qed_mcp_nvm_info_free(): Delete nvm info shadow in the given |
| * hardware function. |
| * |
| * @p_hwfn: HW device data. |
| * |
| * Return: Void. |
| */ |
| void qed_mcp_nvm_info_free(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * qed_mcp_get_engine_config(): Get the engine affinity configuration. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_get_engine_config(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_get_ppfid_bitmap(): Get the PPFID bitmap. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_get_ppfid_bitmap(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt); |
| |
| /** |
| * qed_mcp_nvm_get_cfg(): Get NVM config attribute value. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @option_id: Option ID. |
| * @entity_id: Entity ID. |
| * @flags: Flags. |
| * @p_buf: Buf. |
| * @p_len: Len. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_nvm_get_cfg(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, |
| u16 option_id, u8 entity_id, u16 flags, u8 *p_buf, |
| u32 *p_len); |
| |
| /** |
| * qed_mcp_nvm_set_cfg(): Set NVM config attribute value. |
| * |
| * @p_hwfn: HW device data. |
| * @p_ptt: P_ptt. |
| * @option_id: Option ID. |
| * @entity_id: Entity ID. |
| * @flags: Flags. |
| * @p_buf: Buf. |
| * @len: Len. |
| * |
| * Return: Int. |
| */ |
| int qed_mcp_nvm_set_cfg(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, |
| u16 option_id, u8 entity_id, u16 flags, u8 *p_buf, |
| u32 len); |
| #endif |