268 lines
7.9 KiB
Diff
268 lines
7.9 KiB
Diff
From e46f9bfa89b8b9caced49a74db695e86e963b35d Mon Sep 17 00:00:00 2001
|
|
From: Vadim Pasternak <vadimp@nvidia.com>
|
|
Date: Mon, 3 Jan 2022 10:20:49 +0000
|
|
Subject: [PATCH] mlxsw: reg: Add Management DownStream Device Query Register
|
|
|
|
The MDDQ register allows to query the DownStream device properties.
|
|
|
|
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
|
|
---
|
|
drivers/net/ethernet/mellanox/mlxsw/reg.h | 234 ++++++++++++++++++++++
|
|
1 file changed, 234 insertions(+)
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h
|
|
index 42169957c..d5301bd6f 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlxsw/reg.h
|
|
+++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h
|
|
@@ -10297,6 +10297,239 @@ mlxsw_reg_mgpir_unpack(char *payload, u8 *num_of_devices,
|
|
*num_of_slots = mlxsw_reg_mgpir_num_of_slots_get(payload);
|
|
}
|
|
|
|
+/* MDDQ - Management DownStream Device Query Register
|
|
+ * --------------------------------------------------
|
|
+ * This register allows to query the DownStream device properties. The desired
|
|
+ * information is chosen upon the query_type field and is delivered by 32B
|
|
+ * of data blocks.
|
|
+ */
|
|
+#define MLXSW_REG_MDDQ_ID 0x9161
|
|
+#define MLXSW_REG_MDDQ_LEN 0x30
|
|
+
|
|
+MLXSW_REG_DEFINE(mddq, MLXSW_REG_MDDQ_ID, MLXSW_REG_MDDQ_LEN);
|
|
+
|
|
+/* reg_mddq_sie
|
|
+ * Slot info event enable.
|
|
+ * When set to '1', each change in the slot_info.provisioned / sr_valid /
|
|
+ * active / ready will generate an event.
|
|
+ * Access: RW
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, sie, 0x00, 31, 1);
|
|
+
|
|
+enum mlxsw_reg_mddq_query_type {
|
|
+ MLXSW_REG_MDDQ_QUERY_TYPE_SLOT_INFO = 1,
|
|
+ MLXSW_REG_MDDQ_QUERY_TYPE_DEVICE_INFO, /* If there are no devices
|
|
+ * on the slot, data_valid
|
|
+ * will be '0'.
|
|
+ */
|
|
+ MLXSW_REG_MDDQ_QUERY_TYPE_SLOT_NAME,
|
|
+};
|
|
+
|
|
+/* reg_mddq_query_type
|
|
+ * Access: Index
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, query_type, 0x00, 16, 8);
|
|
+
|
|
+/* reg_mddq_slot_index
|
|
+ * Slot index. 0 is reserved.
|
|
+ * Access: Index
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, slot_index, 0x00, 0, 4);
|
|
+
|
|
+/* reg_mddq_response_msg_seq
|
|
+ * Response message sequential number. For a specific request, the response
|
|
+ * message sequential number is the following one. In addition, the last
|
|
+ * message should be 0.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, response_msg_seq, 0x04, 16, 8);
|
|
+
|
|
+/* reg_mddq_request_msg_seq
|
|
+ * Request message sequential number.
|
|
+ * The first message number should be 0.
|
|
+ * Access: Index
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, request_msg_seq, 0x04, 0, 8);
|
|
+
|
|
+/* reg_mddq_data_valid
|
|
+ * If set, the data in the data field is valid and contain the information
|
|
+ * for the queried index.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, data_valid, 0x08, 31, 1);
|
|
+
|
|
+/* reg_mddq_provisioned
|
|
+ * If set, the INI file is applied and the card is provisioned.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, provisioned, 0x10, 31, 1);
|
|
+
|
|
+/* reg_mddq_sr_valid
|
|
+ * If set, Shift Register is valid (after being provisioned).
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, sr_valid, 0x10, 30, 1);
|
|
+
|
|
+enum mlxsw_reg_mddq_ready {
|
|
+ MLXSW_REG_MDDQ_READY_NOT_READY,
|
|
+ MLXSW_REG_MDDQ_READY_READY,
|
|
+ MLXSW_REG_MDDQ_READY_ERROR,
|
|
+};
|
|
+
|
|
+/* reg_mddq_lc_ready
|
|
+ * If set, the LC is powered on, matching the INI version and a new FW
|
|
+ * version can be burnt (if necessary).
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, lc_ready, 0x10, 28, 2);
|
|
+
|
|
+/* reg_mddq_active
|
|
+ * If set, the FW has completed the MDDC.device_enable command.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, active, 0x10, 27, 1);
|
|
+
|
|
+/* reg_mddq_hw_revision
|
|
+ * Major user-configured version number of the current INI file.
|
|
+ * Valid only when active or ready are '1'.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, hw_revision, 0x14, 16, 16);
|
|
+
|
|
+/* reg_mddq_ini_file_version
|
|
+ * User-configured version number of the current INI file.
|
|
+ * Valid only when active or lc_ready are '1'.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, ini_file_version, 0x14, 0, 16);
|
|
+
|
|
+enum mlxsw_reg_mddq_card_type {
|
|
+ MLXSW_REG_MDDQ_CARD_TYPE_BUFFALO_4X400G,
|
|
+ MLXSW_REG_MDDQ_CARD_TYPE_BUFFALO_8X200G,
|
|
+ MLXSW_REG_MDDQ_CARD_TYPE_BUFFALO_16X100G,
|
|
+};
|
|
+
|
|
+/* reg_mddq_card_type
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, card_type, 0x18, 0, 8);
|
|
+
|
|
+static inline void
|
|
+__mlxsw_reg_mddq_pack(char *payload, u8 slot_index,
|
|
+ enum mlxsw_reg_mddq_query_type query_type)
|
|
+{
|
|
+ MLXSW_REG_ZERO(mddq, payload);
|
|
+ mlxsw_reg_mddq_slot_index_set(payload, slot_index);
|
|
+ mlxsw_reg_mddq_query_type_set(payload, query_type);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+mlxsw_reg_mddq_slot_info_pack(char *payload, u8 slot_index, bool sie)
|
|
+{
|
|
+ __mlxsw_reg_mddq_pack(payload, slot_index,
|
|
+ MLXSW_REG_MDDQ_QUERY_TYPE_SLOT_INFO);
|
|
+ mlxsw_reg_mddq_sie_set(payload, sie);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+mlxsw_reg_mddq_slot_info_unpack(const char *payload, u8 *p_slot_index,
|
|
+ bool *p_provisioned, bool *p_sr_valid,
|
|
+ enum mlxsw_reg_mddq_ready *p_lc_ready,
|
|
+ bool *p_active, u16 *p_hw_revision,
|
|
+ u16 *p_ini_file_version,
|
|
+ enum mlxsw_reg_mddq_card_type *p_card_type)
|
|
+{
|
|
+ *p_slot_index = mlxsw_reg_mddq_slot_index_get(payload);
|
|
+ *p_provisioned = mlxsw_reg_mddq_provisioned_get(payload);
|
|
+ *p_sr_valid = mlxsw_reg_mddq_sr_valid_get(payload);
|
|
+ *p_lc_ready = mlxsw_reg_mddq_lc_ready_get(payload);
|
|
+ *p_active = mlxsw_reg_mddq_active_get(payload);
|
|
+ *p_hw_revision = mlxsw_reg_mddq_hw_revision_get(payload);
|
|
+ *p_ini_file_version = mlxsw_reg_mddq_ini_file_version_get(payload);
|
|
+ *p_card_type = mlxsw_reg_mddq_card_type_get(payload);
|
|
+}
|
|
+
|
|
+/* reg_mddq_flash_owner
|
|
+ * If set, the device is the flash owner. Otherwise, a shared flash
|
|
+ * is used by this device (another device is the flash owner).
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, flash_owner, 0x10, 30, 1);
|
|
+
|
|
+/* reg_mddq_device_index
|
|
+ * Device index. The first device should number 0.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, device_index, 0x10, 0, 8);
|
|
+
|
|
+/* reg_mddq_fw_major
|
|
+ * Major FW version number.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, fw_major, 0x14, 16, 16);
|
|
+
|
|
+/* reg_mddq_fw_minor
|
|
+ * Minor FW version number.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, fw_minor, 0x18, 16, 16);
|
|
+
|
|
+/* reg_mddq_fw_sub_minor
|
|
+ * Sub-minor FW version number.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM32(reg, mddq, fw_sub_minor, 0x18, 0, 16);
|
|
+
|
|
+static inline void
|
|
+mlxsw_reg_mddq_device_info_pack(char *payload, u8 slot_index,
|
|
+ u8 request_msg_seq)
|
|
+{
|
|
+ __mlxsw_reg_mddq_pack(payload, slot_index,
|
|
+ MLXSW_REG_MDDQ_QUERY_TYPE_DEVICE_INFO);
|
|
+ mlxsw_reg_mddq_request_msg_seq_set(payload, request_msg_seq);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+mlxsw_reg_mddq_device_info_unpack(const char *payload, u8 *p_response_msg_seq,
|
|
+ bool *p_data_valid, bool *p_flash_owner,
|
|
+ u8 *p_device_index, u16 *p_fw_major,
|
|
+ u16 *p_fw_minor, u16 *p_fw_sub_minor)
|
|
+{
|
|
+ *p_response_msg_seq = mlxsw_reg_mddq_response_msg_seq_get(payload);
|
|
+ *p_data_valid = mlxsw_reg_mddq_data_valid_get(payload);
|
|
+ if (p_flash_owner)
|
|
+ *p_flash_owner = mlxsw_reg_mddq_flash_owner_get(payload);
|
|
+ *p_device_index = mlxsw_reg_mddq_device_index_get(payload);
|
|
+ if (p_fw_major)
|
|
+ *p_fw_major = mlxsw_reg_mddq_fw_major_get(payload);
|
|
+ if (p_fw_minor)
|
|
+ *p_fw_minor = mlxsw_reg_mddq_fw_minor_get(payload);
|
|
+ if (p_fw_sub_minor)
|
|
+ *p_fw_sub_minor = mlxsw_reg_mddq_fw_sub_minor_get(payload);
|
|
+}
|
|
+
|
|
+#define MLXSW_REG_MDDQ_SLOT_ACII_NAME_LEN 20
|
|
+
|
|
+/* reg_mddq_slot_ascii_name
|
|
+ * Slot's ASCII name.
|
|
+ * Access: RO
|
|
+ */
|
|
+MLXSW_ITEM_BUF(reg, mddq, slot_ascii_name, 0x10,
|
|
+ MLXSW_REG_MDDQ_SLOT_ACII_NAME_LEN);
|
|
+
|
|
+static inline void
|
|
+mlxsw_reg_mddq_slot_name_pack(char *payload, u8 slot_index)
|
|
+{
|
|
+ __mlxsw_reg_mddq_pack(payload, slot_index,
|
|
+ MLXSW_REG_MDDQ_QUERY_TYPE_SLOT_NAME);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+mlxsw_reg_mddq_slot_name_unpack(const char *payload, char *slot_ascii_name)
|
|
+{
|
|
+ mlxsw_reg_mddq_slot_ascii_name_memcpy_from(payload, slot_ascii_name);
|
|
+}
|
|
+
|
|
/* MFDE - Monitoring FW Debug Register
|
|
* -----------------------------------
|
|
*/
|
|
@@ -11496,6 +11729,7 @@ static const struct mlxsw_reg_info *mlxsw_reg_infos[] = {
|
|
MLXSW_REG(mtptpt),
|
|
MLXSW_REG(mfgd),
|
|
MLXSW_REG(mgpir),
|
|
+ MLXSW_REG(mddq),
|
|
MLXSW_REG(mfde),
|
|
MLXSW_REG(tngcr),
|
|
MLXSW_REG(tnumt),
|
|
--
|
|
2.30.2
|
|
|