[PATCH 14/95] drm/amdgpu: Implement PSP cmd UAL_SET_STATION_CONFIG
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
From: Felix Kuehling <[email protected]> To set the UALink station 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 | 35 +++++++++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h | 4 +++ 2 files changed, 39 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index cbd85b27c6f6c..47367ff8c3903 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -835,6 +835,8 @@ static const char *psp_gfx_cmd_name(enum psp_gfx_cmd_id cmd_id) return "UAL_SET_PPOD_CONFIG"; case GFX_CMD_ID_UAL_SET_VPOD_CONFIG: return "UAL_SET_VPOD_CONFIG"; + case GFX_CMD_ID_UAL_SET_STATION_CONFIG: + return "UAL_SET_STATION_CONFIG"; default: return "UNKNOWN CMD"; } @@ -1357,6 +1359,39 @@ int psp_ual_set_vpod_config(struct psp_context *psp, uint32_t intf_ver, return ret; } +int psp_ual_set_station_config(struct psp_context *psp, uint32_t intf_ver, + const struct amdgpu_ualink_station_config *stations) +{ + 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_STATION_CONFIG; + cmd->cmd.cmd_set_station_config_ual.num_stations = stations->n_stations; + cmd->cmd.cmd_set_station_config_ual.station_flag = stations->flags; + memcpy(cmd->cmd.cmd_set_station_config_ual.lane_en_bitmap, + stations->lane_en_bitmap, + min(stations->n_stations, + sizeof(cmd->cmd.cmd_set_station_config_ual.lane_en_bitmap))); + /* The remainder is already 0-initialized by acquire_psp_cmd_buf */ + + 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 d3bc3ba30599c..60ee3dc25113b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h @@ -709,6 +709,7 @@ int amdgpu_psp_irq_mgr_register( struct amdgpu_ualink_info; struct amdgpu_ualink_ppod_setup; struct amdgpu_ualink_vpod_config; +struct amdgpu_ualink_station_config; int psp_ual_get_interface_version(struct psp_context *psp, uint32_t *intf_ver); @@ -721,4 +722,7 @@ int psp_ual_set_ppod_config(struct psp_context *psp, uint32_t intf_ver, int psp_ual_set_vpod_config(struct psp_context *psp, uint32_t intf_ver, const struct amdgpu_ualink_vpod_config *config); +int psp_ual_set_station_config(struct psp_context *psp, uint32_t intf_ver, + const struct amdgpu_ualink_station_config *stations); + #endif -- 2.55.0