aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorEvan Quan <evan.quan@amd.com>2017-09-04 05:42:28 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-12 14:29:48 -0400
commitf1ac0fc2f2355495628a45e90cbd88e3d2c40ef9 (patch)
treeac9c62aeebccca21158a2fd62215d0ba8a8ad79c /drivers/gpu/drm/amd/amdgpu
parent9a18999640fa6aed0578c59c328dca9ca01a2d9a (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.c16
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;