hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_64_BIT_REG, true);
ret = hclge_cmd_send(&hdev->hw, desc, cmd_num); if (ret) {
dev_err(&hdev->pdev->dev, "Query 64 bit register cmd failed, ret = %d.\n", ret);
kfree(desc); return ret;
}
for (i = 0; i < cmd_num; i++) { if (i == 0) {
desc_data = (__le64 *)(&desc[i].data[0]);
n = HCLGE_64_BIT_REG_RTN_DATANUM - nodata_len;
} else {
desc_data = (__le64 *)(&desc[i]);
n = HCLGE_64_BIT_REG_RTN_DATANUM;
} for (k = 0; k < n; k++) {
*reg_val++ = le64_to_cpu(*desc_data++);
regs_num--; if (!regs_num) break;
}
}
kfree(desc); return 0;
}
int hclge_query_bd_num_cmd_send(struct hclge_dev *hdev, struct hclge_desc *desc)
{ int i;
/* initialize command BD except the last one */ for (i = 0; i < HCLGE_GET_DFX_REG_TYPE_CNT - 1; i++) {
hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_BD_NUM, true);
desc[i].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);
}
/* initialize the last command BD */
hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_BD_NUM, true);
staticint hclge_get_dfx_reg_bd_num(struct hclge_dev *hdev, int *bd_num_list,
u32 type_num)
{
u32 entries_per_desc, desc_index, index, offset, i; struct hclge_desc desc[HCLGE_GET_DFX_REG_TYPE_CNT]; int ret;
ret = hclge_query_bd_num_cmd_send(hdev, desc); if (ret) {
dev_err(&hdev->pdev->dev, "Get dfx bd num fail, status is %d.\n", ret); return ret;
}
entries_per_desc = ARRAY_SIZE(desc[0].data); for (i = 0; i < type_num; i++) {
offset = hclge_dfx_bd_offset_list[i];
index = offset % entries_per_desc;
desc_index = offset / entries_per_desc;
bd_num_list[i] = le32_to_cpu(desc[desc_index].data[index]);
}
return ret;
}
staticint hclge_dfx_reg_cmd_send(struct hclge_dev *hdev, struct hclge_desc *desc_src, int bd_num, enum hclge_opcode_type cmd)
{ struct hclge_desc *desc = desc_src; int i, ret;
hclge_cmd_setup_basic_desc(desc, cmd, true); for (i = 0; i < bd_num - 1; i++) {
desc->flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);
desc++;
hclge_cmd_setup_basic_desc(desc, cmd, true);
}
desc = desc_src;
ret = hclge_cmd_send(&hdev->hw, desc, bd_num); if (ret)
dev_err(&hdev->pdev->dev, "Query dfx reg cmd(0x%x) send fail, status is %d.\n",
cmd, ret);
return ret;
}
/* tnl_id = 0 means get sum of all tnl reg's value */ staticint hclge_dfx_reg_rpu_tnl_cmd_send(struct hclge_dev *hdev, u32 tnl_id, struct hclge_desc *desc, int bd_num)
{ int i, ret;
for (i = 0; i < bd_num; i++) {
hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_RPU_REG_0, true); if (i != bd_num - 1)
desc[i].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);
}
desc[0].data[0] = cpu_to_le32(tnl_id);
ret = hclge_cmd_send(&hdev->hw, desc, bd_num); if (ret)
dev_err(&hdev->pdev->dev, "failed to query dfx rpu tnl reg, ret = %d\n",
ret); return ret;
}
entries_per_desc = ARRAY_SIZE(desc->data);
reg_num = entries_per_desc * bd_num; for (i = 0; i < reg_num; i++) {
index = i % entries_per_desc;
desc_index = i / entries_per_desc;
*reg++ = le32_to_cpu(desc[desc_index].data[index]);
}
return reg_num;
}
staticint hclge_get_dfx_reg_len(struct hclge_dev *hdev, int *len)
{
u32 dfx_reg_type_num = ARRAY_SIZE(hclge_dfx_bd_offset_list); struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev); int data_len_per_desc; int *bd_num_list; int ret;
u32 i;
bd_num_list = kcalloc(dfx_reg_type_num, sizeof(int), GFP_KERNEL); if (!bd_num_list) return -ENOMEM;
ret = hclge_get_dfx_reg_bd_num(hdev, bd_num_list, dfx_reg_type_num); if (ret) {
dev_err(&hdev->pdev->dev, "Get dfx reg bd num fail, status is %d.\n", ret); goto out;
}
data_len_per_desc = sizeof_field(struct hclge_desc, data);
*len = 0; for (i = 0; i < dfx_reg_type_num; i++)
*len += bd_num_list[i] * data_len_per_desc + HCLGE_REG_TLV_SIZE;
/** * the num of dfx_rpu_0 is reused by each dfx_rpu_tnl * HCLGE_DFX_BD_OFFSET is starting at 1, but the array subscript is * starting at 0, so offset need '- 1'.
*/
*len += (bd_num_list[HCLGE_DFX_RPU_0_BD_OFFSET - 1] * data_len_per_desc +
HCLGE_REG_TLV_SIZE) * ae_dev->dev_specs.tnl_num;
out:
kfree(bd_num_list); return ret;
}
staticint hclge_get_dfx_rpu_tnl_reg(struct hclge_dev *hdev, u32 *reg, struct hclge_desc *desc_src, int bd_num)
{ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev); int ret = 0;
u8 i;
for (i = HCLGE_REG_RPU_TNL_ID_0; i <= ae_dev->dev_specs.tnl_num; i++) {
ret = hclge_dfx_reg_rpu_tnl_cmd_send(hdev, i, desc_src, bd_num); if (ret) break;
staticint hclge_get_dfx_reg(struct hclge_dev *hdev, void *data)
{
u32 dfx_reg_type_num = ARRAY_SIZE(hclge_dfx_bd_offset_list); int bd_num, bd_num_max, buf_len; struct hclge_desc *desc_src; int *bd_num_list;
u32 *reg = data; int ret;
u32 i;
bd_num_list = kcalloc(dfx_reg_type_num, sizeof(int), GFP_KERNEL); if (!bd_num_list) return -ENOMEM;
ret = hclge_get_dfx_reg_bd_num(hdev, bd_num_list, dfx_reg_type_num); if (ret) {
dev_err(&hdev->pdev->dev, "Get dfx reg bd num fail, status is %d.\n", ret); goto out;
}
bd_num_max = bd_num_list[0]; for (i = 1; i < dfx_reg_type_num; i++)
bd_num_max = max_t(int, bd_num_max, bd_num_list[i]);
buf_len = sizeof(*desc_src) * bd_num_max;
desc_src = kzalloc(buf_len, GFP_KERNEL); if (!desc_src) {
ret = -ENOMEM; goto out;
}
for (i = 0; i < dfx_reg_type_num; i++) {
bd_num = bd_num_list[i];
ret = hclge_dfx_reg_cmd_send(hdev, desc_src, bd_num,
hclge_dfx_reg_opcode_list[i]); if (ret) {
dev_err(&hdev->pdev->dev, "Get dfx reg fail, status is %d.\n", ret); goto free;
}
/** * HCLGE_DFX_BD_OFFSET is starting at 1, but the array subscript is * starting at 0, so offset need '- 1'.
*/
bd_num = bd_num_list[HCLGE_DFX_RPU_0_BD_OFFSET - 1];
ret = hclge_get_dfx_rpu_tnl_reg(hdev, reg, desc_src, bd_num);
total_num = *regs_num_32_bit + *regs_num_64_bit; if (!total_num) return -EINVAL;
return 0;
}
int hclge_get_regs_len(struct hnae3_handle *handle)
{ struct hnae3_knic_private_info *kinfo = &handle->kinfo; struct hclge_vport *vport = hclge_get_vport(handle); int regs_num_32_bit, regs_num_64_bit, dfx_regs_len; int cmdq_len, common_len, ring_len, tqp_intr_len; int regs_len_32_bit, regs_len_64_bit; struct hclge_dev *hdev = vport->back; int ret;
ret = hclge_get_regs_num(hdev, ®s_num_32_bit, ®s_num_64_bit); if (ret) {
dev_err(&hdev->pdev->dev, "Get register number failed, ret = %d.\n", ret); return ret;
}
ret = hclge_get_dfx_reg_len(hdev, &dfx_regs_len); if (ret) {
dev_err(&hdev->pdev->dev, "Get dfx reg len failed, ret = %d.\n", ret); return ret;
}
ret = hclge_get_regs_num(hdev, ®s_num_32_bit, ®s_num_64_bit); if (ret) {
dev_err(&hdev->pdev->dev, "Get register number failed, ret = %d.\n", ret); return;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.