From: Felix Kuehling <[email protected]>

To set the virtual pod configuration to PSP.

Signed-off-by: Felix Kuehling <[email protected]>
Reviewed-by: Mukul Joshi <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 42 +++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h |  4 +++
 2 files changed, 46 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 1d78d8589f54a..cbd85b27c6f6c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -833,6 +833,8 @@ static const char *psp_gfx_cmd_name(enum psp_gfx_cmd_id 
cmd_id)
                return "UAL_GET_CONFIG";
        case GFX_CMD_ID_UAL_SET_PPOD_CONFIG:
                return "UAL_SET_PPOD_CONFIG";
+       case GFX_CMD_ID_UAL_SET_VPOD_CONFIG:
+               return "UAL_SET_VPOD_CONFIG";
        default:
                return "UNKNOWN CMD";
        }
@@ -1315,6 +1317,46 @@ int psp_ual_set_ppod_config(struct psp_context *psp, 
uint32_t intf_ver,
        return ret;
 }
 
+int psp_ual_set_vpod_config(struct psp_context *psp, uint32_t intf_ver,
+                           const struct amdgpu_ualink_vpod_config *config)
+{
+       struct psp_gfx_cmd_resp *cmd;
+       int ret;
+
+       /* TBD check interface version 1.x */
+       if (intf_ver > 0x1ffff) {
+               pr_warn("PSP UAL interface version mismatch: 0x%x\n", intf_ver);
+               return -EOPNOTSUPP;
+       }
+
+       cmd = acquire_psp_cmd_buf(psp);
+
+       cmd->cmd_id = GFX_CMD_ID_UAL_SET_VPOD_CONFIG;
+       cmd->cmd.cmd_set_vpod_config_ual.addr_mode =
+               (enum psp_gfx_ual_npa_address_mode)config->vpod.addr_mode;
+       cmd->cmd.cmd_set_vpod_config_ual.vpod_id = config->vpod.id;
+       cmd->cmd.cmd_set_vpod_config_ual.vpod_size = config->vpod.size;
+
+       
bitmap_to_arr32(cmd->cmd.cmd_set_vpod_config_ual.vpod_active_accelerators,
+                       config->vpod.active_accel_bits,
+                       min(AMDGPU_UALINK_ACCEL_MAX, 
PSP_GFX_UAL_MAX_ACC_BIT_MASK*32));
+       /* Clear any remaining accelerator bits */
+       if (PSP_GFX_UAL_MAX_ACC_BIT_MASK > 
DIV_ROUND_UP(AMDGPU_UALINK_ACCEL_MAX, 32))
+               
memset(cmd->cmd.cmd_set_vpod_config_ual.vpod_active_accelerators +
+                      DIV_ROUND_UP(AMDGPU_UALINK_ACCEL_MAX, 32), 0,
+                      (PSP_GFX_UAL_MAX_ACC_BIT_MASK -
+                       DIV_ROUND_UP(AMDGPU_UALINK_ACCEL_MAX, 32)) * 
sizeof(u32));
+
+       ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
+
+       if (!ret && cmd->resp.status)
+               ret = -EINVAL;
+
+       release_psp_cmd_buf(psp);
+
+       return ret;
+}
+
 int psp_update_fw_reservation(struct psp_context *psp)
 {
        int ret;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index b65ac4f825d75..d3bc3ba30599c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -708,6 +708,7 @@ int amdgpu_psp_irq_mgr_register(
 
 struct amdgpu_ualink_info;
 struct amdgpu_ualink_ppod_setup;
+struct amdgpu_ualink_vpod_config;
 
 int psp_ual_get_interface_version(struct psp_context *psp, uint32_t *intf_ver);
 
@@ -717,4 +718,7 @@ int psp_ual_query_info(struct psp_context *psp, uint32_t 
intf_ver,
 int psp_ual_set_ppod_config(struct psp_context *psp, uint32_t intf_ver,
                            const struct amdgpu_ualink_ppod_setup *setup);
 
+int psp_ual_set_vpod_config(struct psp_context *psp, uint32_t intf_ver,
+                           const struct amdgpu_ualink_vpod_config *config);
+
 #endif
-- 
2.55.0

Reply via email to