diff options
author | Evan Quan <evan.quan@amd.com> | 2017-09-04 05:42:28 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-12 14:29:48 -0400 |
commit | f1ac0fc2f2355495628a45e90cbd88e3d2c40ef9 (patch) | |
tree | ac9c62aeebccca21158a2fd62215d0ba8a8ad79c /drivers/gpu/drm/amd/amdgpu | |
parent | 9a18999640fa6aed0578c59c328dca9ca01a2d9a (diff) |
drm/amdgpu: fixed raven psp cmd prepare and submit
- fw_size in psp_v10_0_prep_cmd_buf is wrongly set as 0
- fixed the wrong calculation of psp_write_ptr_reg in psp_v10_0_cmd_submit
Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/psp_v10_0.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c index f7cf994b1da2..b77feef829e7 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c | |||
@@ -136,15 +136,13 @@ int psp_v10_0_prep_cmd_buf(struct amdgpu_firmware_info *ucode, struct psp_gfx_cm | |||
136 | { | 136 | { |
137 | int ret; | 137 | int ret; |
138 | uint64_t fw_mem_mc_addr = ucode->mc_addr; | 138 | uint64_t fw_mem_mc_addr = ucode->mc_addr; |
139 | struct common_firmware_header *header; | ||
140 | 139 | ||
141 | memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); | 140 | memset(cmd, 0, sizeof(struct psp_gfx_cmd_resp)); |
142 | header = (struct common_firmware_header *)ucode->fw; | ||
143 | 141 | ||
144 | cmd->cmd_id = GFX_CMD_ID_LOAD_IP_FW; | 142 | cmd->cmd_id = GFX_CMD_ID_LOAD_IP_FW; |
145 | cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(fw_mem_mc_addr); | 143 | cmd->cmd.cmd_load_ip_fw.fw_phy_addr_lo = lower_32_bits(fw_mem_mc_addr); |
146 | cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr); | 144 | cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr); |
147 | cmd->cmd.cmd_load_ip_fw.fw_size = le32_to_cpu(header->ucode_size_bytes); | 145 | cmd->cmd.cmd_load_ip_fw.fw_size = ucode->ucode_size; |
148 | 146 | ||
149 | ret = psp_v10_0_get_fw_type(ucode, &cmd->cmd.cmd_load_ip_fw.fw_type); | 147 | ret = psp_v10_0_get_fw_type(ucode, &cmd->cmd.cmd_load_ip_fw.fw_type); |
150 | if (ret) | 148 | if (ret) |
@@ -245,15 +243,20 @@ int psp_v10_0_cmd_submit(struct psp_context *psp, | |||
245 | struct psp_gfx_rb_frame * write_frame = psp->km_ring.ring_mem; | 243 | struct psp_gfx_rb_frame * write_frame = psp->km_ring.ring_mem; |
246 | struct psp_ring *ring = &psp->km_ring; | 244 | struct psp_ring *ring = &psp->km_ring; |
247 | struct amdgpu_device *adev = psp->adev; | 245 | struct amdgpu_device *adev = psp->adev; |
246 | uint32_t ring_size_dw = ring->ring_size / 4; | ||
247 | uint32_t rb_frame_size_dw = sizeof(struct psp_gfx_rb_frame) / 4; | ||
248 | 248 | ||
249 | /* KM (GPCOM) prepare write pointer */ | 249 | /* KM (GPCOM) prepare write pointer */ |
250 | psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); | 250 | psp_write_ptr_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); |
251 | 251 | ||
252 | /* Update KM RB frame pointer to new frame */ | 252 | /* Update KM RB frame pointer to new frame */ |
253 | if ((psp_write_ptr_reg % ring->ring_size) == 0) | 253 | if ((psp_write_ptr_reg % ring_size_dw) == 0) |
254 | write_frame = ring->ring_mem; | 254 | write_frame = ring->ring_mem; |
255 | else | 255 | else |
256 | write_frame = ring->ring_mem + (psp_write_ptr_reg / (sizeof(struct psp_gfx_rb_frame) / 4)); | 256 | write_frame = ring->ring_mem + (psp_write_ptr_reg / rb_frame_size_dw); |
257 | |||
258 | /* Initialize KM RB frame */ | ||
259 | memset(write_frame, 0, sizeof(struct psp_gfx_rb_frame)); | ||
257 | 260 | ||
258 | /* Update KM RB frame */ | 261 | /* Update KM RB frame */ |
259 | write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr); | 262 | write_frame->cmd_buf_addr_hi = upper_32_bits(cmd_buf_mc_addr); |
@@ -263,8 +266,7 @@ int psp_v10_0_cmd_submit(struct psp_context *psp, | |||
263 | write_frame->fence_value = index; | 266 | write_frame->fence_value = index; |
264 | 267 | ||
265 | /* Update the write Pointer in DWORDs */ | 268 | /* Update the write Pointer in DWORDs */ |
266 | psp_write_ptr_reg += sizeof(struct psp_gfx_rb_frame) / 4; | 269 | psp_write_ptr_reg = (psp_write_ptr_reg + rb_frame_size_dw) % ring_size_dw; |
267 | psp_write_ptr_reg = (psp_write_ptr_reg >= ring->ring_size) ? 0 : psp_write_ptr_reg; | ||
268 | WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, psp_write_ptr_reg); | 270 | WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, psp_write_ptr_reg); |
269 | 271 | ||
270 | return 0; | 272 | return 0; |