aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Quan <evan.quan@amd.com>2017-09-08 01:04:52 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-12 14:30:11 -0400
commit4ef72453311a697b3fb90da9c86c83012911ccf9 (patch)
tree155c5d6d86530f48434ba9f2bb10ab89d84c7638
parentf1ac0fc2f2355495628a45e90cbd88e3d2c40ef9 (diff)
drm/amdgpu: added api for stopping psp ring (v2)
- v2: reuse the ring stop api in ring destory 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>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v10_0.c15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v10_0.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v3_1.c15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v3_1.h2
6 files changed, 36 insertions, 2 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 8c2204c7b384..abd20819ba6b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -57,6 +57,7 @@ static int psp_sw_init(void *handle)
57 psp->prep_cmd_buf = psp_v3_1_prep_cmd_buf; 57 psp->prep_cmd_buf = psp_v3_1_prep_cmd_buf;
58 psp->ring_init = psp_v3_1_ring_init; 58 psp->ring_init = psp_v3_1_ring_init;
59 psp->ring_create = psp_v3_1_ring_create; 59 psp->ring_create = psp_v3_1_ring_create;
60 psp->ring_stop = psp_v3_1_ring_stop;
60 psp->ring_destroy = psp_v3_1_ring_destroy; 61 psp->ring_destroy = psp_v3_1_ring_destroy;
61 psp->cmd_submit = psp_v3_1_cmd_submit; 62 psp->cmd_submit = psp_v3_1_cmd_submit;
62 psp->compare_sram_data = psp_v3_1_compare_sram_data; 63 psp->compare_sram_data = psp_v3_1_compare_sram_data;
@@ -69,6 +70,7 @@ static int psp_sw_init(void *handle)
69 psp->prep_cmd_buf = psp_v10_0_prep_cmd_buf; 70 psp->prep_cmd_buf = psp_v10_0_prep_cmd_buf;
70 psp->ring_init = psp_v10_0_ring_init; 71 psp->ring_init = psp_v10_0_ring_init;
71 psp->ring_create = psp_v10_0_ring_create; 72 psp->ring_create = psp_v10_0_ring_create;
73 psp->ring_stop = psp_v10_0_ring_stop;
72 psp->ring_destroy = psp_v10_0_ring_destroy; 74 psp->ring_destroy = psp_v10_0_ring_destroy;
73 psp->cmd_submit = psp_v10_0_cmd_submit; 75 psp->cmd_submit = psp_v10_0_cmd_submit;
74 psp->compare_sram_data = psp_v10_0_compare_sram_data; 76 psp->compare_sram_data = psp_v10_0_compare_sram_data;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index 538fa9dbfb21..e79795b59797 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -66,6 +66,8 @@ struct psp_context
66 struct psp_gfx_cmd_resp *cmd); 66 struct psp_gfx_cmd_resp *cmd);
67 int (*ring_init)(struct psp_context *psp, enum psp_ring_type ring_type); 67 int (*ring_init)(struct psp_context *psp, enum psp_ring_type ring_type);
68 int (*ring_create)(struct psp_context *psp, enum psp_ring_type ring_type); 68 int (*ring_create)(struct psp_context *psp, enum psp_ring_type ring_type);
69 int (*ring_stop)(struct psp_context *psp,
70 enum psp_ring_type ring_type);
69 int (*ring_destroy)(struct psp_context *psp, 71 int (*ring_destroy)(struct psp_context *psp,
70 enum psp_ring_type ring_type); 72 enum psp_ring_type ring_type);
71 int (*cmd_submit)(struct psp_context *psp, struct amdgpu_firmware_info *ucode, 73 int (*cmd_submit)(struct psp_context *psp, struct amdgpu_firmware_info *ucode,
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
index b77feef829e7..6ec5c9f8074d 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
@@ -207,7 +207,7 @@ int psp_v10_0_ring_create(struct psp_context *psp, enum psp_ring_type ring_type)
207 return ret; 207 return ret;
208} 208}
209 209
210int psp_v10_0_ring_destroy(struct psp_context *psp, enum psp_ring_type ring_type) 210int psp_v10_0_ring_stop(struct psp_context *psp, enum psp_ring_type ring_type)
211{ 211{
212 int ret = 0; 212 int ret = 0;
213 struct psp_ring *ring; 213 struct psp_ring *ring;
@@ -227,6 +227,19 @@ int psp_v10_0_ring_destroy(struct psp_context *psp, enum psp_ring_type ring_type
227 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64), 227 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
228 0x80000000, 0x80000000, false); 228 0x80000000, 0x80000000, false);
229 229
230 return ret;
231}
232
233int psp_v10_0_ring_destroy(struct psp_context *psp, enum psp_ring_type ring_type)
234{
235 int ret = 0;
236 struct psp_ring *ring = &psp->km_ring;
237 struct amdgpu_device *adev = psp->adev;
238
239 ret = psp_v10_0_ring_stop(psp, ring_type);
240 if (ret)
241 DRM_ERROR("Fail to stop psp ring\n");
242
230 amdgpu_bo_free_kernel(&adev->firmware.rbuf, 243 amdgpu_bo_free_kernel(&adev->firmware.rbuf,
231 &ring->ring_mem_mc_addr, 244 &ring->ring_mem_mc_addr,
232 (void **)&ring->ring_mem); 245 (void **)&ring->ring_mem);
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.h b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.h
index e76cde2f01f9..3af3ad1320ff 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.h
@@ -34,6 +34,8 @@ extern int psp_v10_0_ring_init(struct psp_context *psp,
34 enum psp_ring_type ring_type); 34 enum psp_ring_type ring_type);
35extern int psp_v10_0_ring_create(struct psp_context *psp, 35extern int psp_v10_0_ring_create(struct psp_context *psp,
36 enum psp_ring_type ring_type); 36 enum psp_ring_type ring_type);
37extern int psp_v10_0_ring_stop(struct psp_context *psp,
38 enum psp_ring_type ring_type);
37extern int psp_v10_0_ring_destroy(struct psp_context *psp, 39extern int psp_v10_0_ring_destroy(struct psp_context *psp,
38 enum psp_ring_type ring_type); 40 enum psp_ring_type ring_type);
39extern int psp_v10_0_cmd_submit(struct psp_context *psp, 41extern int psp_v10_0_cmd_submit(struct psp_context *psp,
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
index 2a535a4b8d5b..bcbe30dfff39 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
@@ -319,7 +319,7 @@ int psp_v3_1_ring_create(struct psp_context *psp, enum psp_ring_type ring_type)
319 return ret; 319 return ret;
320} 320}
321 321
322int psp_v3_1_ring_destroy(struct psp_context *psp, enum psp_ring_type ring_type) 322int psp_v3_1_ring_stop(struct psp_context *psp, enum psp_ring_type ring_type)
323{ 323{
324 int ret = 0; 324 int ret = 0;
325 struct psp_ring *ring; 325 struct psp_ring *ring;
@@ -339,6 +339,19 @@ int psp_v3_1_ring_destroy(struct psp_context *psp, enum psp_ring_type ring_type)
339 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64), 339 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64),
340 0x80000000, 0x80000000, false); 340 0x80000000, 0x80000000, false);
341 341
342 return ret;
343}
344
345int psp_v3_1_ring_destroy(struct psp_context *psp, enum psp_ring_type ring_type)
346{
347 int ret = 0;
348 struct psp_ring *ring = &psp->km_ring;
349 struct amdgpu_device *adev = psp->adev;
350
351 ret = psp_v3_1_ring_stop(psp, ring_type);
352 if (ret)
353 DRM_ERROR("Fail to stop psp ring\n");
354
342 amdgpu_bo_free_kernel(&adev->firmware.rbuf, 355 amdgpu_bo_free_kernel(&adev->firmware.rbuf,
343 &ring->ring_mem_mc_addr, 356 &ring->ring_mem_mc_addr,
344 (void **)&ring->ring_mem); 357 (void **)&ring->ring_mem);
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
index 9dcd0b25c4c6..5af2231b7099 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
@@ -41,6 +41,8 @@ extern int psp_v3_1_ring_init(struct psp_context *psp,
41 enum psp_ring_type ring_type); 41 enum psp_ring_type ring_type);
42extern int psp_v3_1_ring_create(struct psp_context *psp, 42extern int psp_v3_1_ring_create(struct psp_context *psp,
43 enum psp_ring_type ring_type); 43 enum psp_ring_type ring_type);
44extern int psp_v3_1_ring_stop(struct psp_context *psp,
45 enum psp_ring_type ring_type);
44extern int psp_v3_1_ring_destroy(struct psp_context *psp, 46extern int psp_v3_1_ring_destroy(struct psp_context *psp,
45 enum psp_ring_type ring_type); 47 enum psp_ring_type ring_type);
46extern int psp_v3_1_cmd_submit(struct psp_context *psp, 48extern int psp_v3_1_cmd_submit(struct psp_context *psp,