diff options
author | Hawking Zhang <Hawking.Zhang@amd.com> | 2017-06-19 02:19:07 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-06-29 12:43:45 -0400 |
commit | 2fcd43cef6e28ca546376af07c0454dc72b593f9 (patch) | |
tree | e06b3cc59917a16df458db7eae27ffa1d41fe031 /drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | |
parent | ebc1c9c1be5b49ddb8396350b12b74be493d48d2 (diff) |
drm/amdgpu: add mmhub pg init sequence on raven
MMHub Powergating init sequence.
Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c index f50b5a77f45a..8447ce74304f 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | |||
@@ -244,6 +244,176 @@ static void mmhub_v1_0_program_invalidation(struct amdgpu_device *adev) | |||
244 | } | 244 | } |
245 | } | 245 | } |
246 | 246 | ||
247 | struct pctl_data { | ||
248 | uint32_t index; | ||
249 | uint32_t data; | ||
250 | }; | ||
251 | |||
252 | const struct pctl_data pctl0_data[] = { | ||
253 | {0x0, 0x7a640}, | ||
254 | {0x9, 0x2a64a}, | ||
255 | {0xd, 0x2a680}, | ||
256 | {0x11, 0x6a684}, | ||
257 | {0x19, 0xea68e}, | ||
258 | {0x29, 0xa69e}, | ||
259 | {0x2b, 0x34a6c0}, | ||
260 | {0x61, 0x83a707}, | ||
261 | {0xe6, 0x8a7a4}, | ||
262 | {0xf0, 0x1a7b8}, | ||
263 | {0xf3, 0xfa7cc}, | ||
264 | {0x104, 0x17a7dd}, | ||
265 | {0x11d, 0xa7dc}, | ||
266 | {0x11f, 0x12a7f5}, | ||
267 | {0x133, 0xa808}, | ||
268 | {0x135, 0x12a810}, | ||
269 | {0x149, 0x7a82c} | ||
270 | }; | ||
271 | #define PCTL0_DATA_LEN (sizeof(pctl0_data)/sizeof(pctl0_data[0])) | ||
272 | |||
273 | #define PCTL0_RENG_EXEC_END_PTR 0x151 | ||
274 | #define PCTL0_STCTRL_REG_SAVE_RANGE0_BASE 0xa640 | ||
275 | #define PCTL0_STCTRL_REG_SAVE_RANGE0_LIMIT 0xa833 | ||
276 | |||
277 | const struct pctl_data pctl1_data[] = { | ||
278 | {0x0, 0x39a000}, | ||
279 | {0x3b, 0x44a040}, | ||
280 | {0x81, 0x2a08d}, | ||
281 | {0x85, 0x6ba094}, | ||
282 | {0xf2, 0x18a100}, | ||
283 | {0x10c, 0x4a132}, | ||
284 | {0x112, 0xca141}, | ||
285 | {0x120, 0x2fa158}, | ||
286 | {0x151, 0x17a1d0}, | ||
287 | {0x16a, 0x1a1e9}, | ||
288 | {0x16d, 0x13a1ec}, | ||
289 | {0x182, 0x7a201}, | ||
290 | {0x18b, 0x3a20a}, | ||
291 | {0x190, 0x7a580}, | ||
292 | {0x199, 0xa590}, | ||
293 | {0x19b, 0x4a594}, | ||
294 | {0x1a1, 0x1a59c}, | ||
295 | {0x1a4, 0x7a82c}, | ||
296 | {0x1ad, 0xfa7cc}, | ||
297 | {0x1be, 0x17a7dd}, | ||
298 | {0x1d7, 0x12a810} | ||
299 | }; | ||
300 | #define PCTL1_DATA_LEN (sizeof(pctl1_data)/sizeof(pctl1_data[0])) | ||
301 | |||
302 | #define PCTL1_RENG_EXEC_END_PTR 0x1ea | ||
303 | #define PCTL1_STCTRL_REG_SAVE_RANGE0_BASE 0xa000 | ||
304 | #define PCTL1_STCTRL_REG_SAVE_RANGE0_LIMIT 0xa20d | ||
305 | #define PCTL1_STCTRL_REG_SAVE_RANGE1_BASE 0xa580 | ||
306 | #define PCTL1_STCTRL_REG_SAVE_RANGE1_LIMIT 0xa59d | ||
307 | #define PCTL1_STCTRL_REG_SAVE_RANGE2_BASE 0xa82c | ||
308 | #define PCTL1_STCTRL_REG_SAVE_RANGE2_LIMIT 0xa833 | ||
309 | |||
310 | static void mmhub_v1_0_power_gating_write_save_ranges(struct amdgpu_device *adev) | ||
311 | { | ||
312 | uint32_t tmp = 0; | ||
313 | |||
314 | /* PCTL0_STCTRL_REGISTER_SAVE_RANGE0 */ | ||
315 | tmp = REG_SET_FIELD(tmp, PCTL0_STCTRL_REGISTER_SAVE_RANGE0, | ||
316 | STCTRL_REGISTER_SAVE_BASE, | ||
317 | PCTL0_STCTRL_REG_SAVE_RANGE0_BASE); | ||
318 | tmp = REG_SET_FIELD(tmp, PCTL0_STCTRL_REGISTER_SAVE_RANGE0, | ||
319 | STCTRL_REGISTER_SAVE_LIMIT, | ||
320 | PCTL0_STCTRL_REG_SAVE_RANGE0_LIMIT); | ||
321 | WREG32_SOC15(MMHUB, 0, mmPCTL0_STCTRL_REGISTER_SAVE_RANGE0, tmp); | ||
322 | |||
323 | /* PCTL1_STCTRL_REGISTER_SAVE_RANGE0 */ | ||
324 | tmp = 0; | ||
325 | tmp = REG_SET_FIELD(tmp, PCTL1_STCTRL_REGISTER_SAVE_RANGE0, | ||
326 | STCTRL_REGISTER_SAVE_BASE, | ||
327 | PCTL1_STCTRL_REG_SAVE_RANGE0_BASE); | ||
328 | tmp = REG_SET_FIELD(tmp, PCTL1_STCTRL_REGISTER_SAVE_RANGE0, | ||
329 | STCTRL_REGISTER_SAVE_LIMIT, | ||
330 | PCTL1_STCTRL_REG_SAVE_RANGE0_LIMIT); | ||
331 | WREG32_SOC15(MMHUB, 0, mmPCTL1_STCTRL_REGISTER_SAVE_RANGE0, tmp); | ||
332 | |||
333 | /* PCTL1_STCTRL_REGISTER_SAVE_RANGE1 */ | ||
334 | tmp = 0; | ||
335 | tmp = REG_SET_FIELD(tmp, PCTL1_STCTRL_REGISTER_SAVE_RANGE1, | ||
336 | STCTRL_REGISTER_SAVE_BASE, | ||
337 | PCTL1_STCTRL_REG_SAVE_RANGE1_BASE); | ||
338 | tmp = REG_SET_FIELD(tmp, PCTL1_STCTRL_REGISTER_SAVE_RANGE1, | ||
339 | STCTRL_REGISTER_SAVE_LIMIT, | ||
340 | PCTL1_STCTRL_REG_SAVE_RANGE1_LIMIT); | ||
341 | WREG32_SOC15(MMHUB, 0, mmPCTL1_STCTRL_REGISTER_SAVE_RANGE1, tmp); | ||
342 | |||
343 | /* PCTL1_STCTRL_REGISTER_SAVE_RANGE2 */ | ||
344 | tmp = 0; | ||
345 | tmp = REG_SET_FIELD(tmp, PCTL1_STCTRL_REGISTER_SAVE_RANGE2, | ||
346 | STCTRL_REGISTER_SAVE_BASE, | ||
347 | PCTL1_STCTRL_REG_SAVE_RANGE2_BASE); | ||
348 | tmp = REG_SET_FIELD(tmp, PCTL1_STCTRL_REGISTER_SAVE_RANGE2, | ||
349 | STCTRL_REGISTER_SAVE_LIMIT, | ||
350 | PCTL1_STCTRL_REG_SAVE_RANGE2_LIMIT); | ||
351 | WREG32_SOC15(MMHUB, 0, mmPCTL1_STCTRL_REGISTER_SAVE_RANGE2, tmp); | ||
352 | } | ||
353 | |||
354 | void mmhub_v1_0_initialize_power_gating(struct amdgpu_device *adev) | ||
355 | { | ||
356 | uint32_t pctl0_misc = 0; | ||
357 | uint32_t pctl0_reng_execute = 0; | ||
358 | uint32_t pctl1_misc = 0; | ||
359 | uint32_t pctl1_reng_execute = 0; | ||
360 | int i = 0; | ||
361 | |||
362 | if (amdgpu_sriov_vf(adev)) | ||
363 | return; | ||
364 | |||
365 | pctl0_misc = RREG32_SOC15(MMHUB, 0, mmPCTL0_MISC); | ||
366 | pctl0_reng_execute = RREG32_SOC15(MMHUB, 0, mmPCTL0_RENG_EXECUTE); | ||
367 | pctl1_misc = RREG32_SOC15(MMHUB, 0, mmPCTL1_MISC); | ||
368 | pctl1_reng_execute = RREG32_SOC15(MMHUB, 0, mmPCTL1_RENG_EXECUTE); | ||
369 | |||
370 | /* Light sleep must be disabled before writing to pctl0 registers */ | ||
371 | pctl0_misc &= ~PCTL0_MISC__RENG_MEM_LS_ENABLE_MASK; | ||
372 | WREG32_SOC15(MMHUB, 0, mmPCTL0_MISC, pctl0_misc); | ||
373 | |||
374 | /* Write data used to access ram of register engine */ | ||
375 | for (i = 0; i < PCTL0_DATA_LEN; i++) { | ||
376 | WREG32_SOC15(MMHUB, 0, mmPCTL0_RENG_RAM_INDEX, | ||
377 | pctl0_data[i].index); | ||
378 | WREG32_SOC15(MMHUB, 0, mmPCTL0_RENG_RAM_DATA, | ||
379 | pctl0_data[i].data); | ||
380 | } | ||
381 | |||
382 | /* Set the reng execute end ptr for pctl0 */ | ||
383 | pctl0_reng_execute = REG_SET_FIELD(pctl0_reng_execute, | ||
384 | PCTL0_RENG_EXECUTE, | ||
385 | RENG_EXECUTE_END_PTR, | ||
386 | PCTL0_RENG_EXEC_END_PTR); | ||
387 | WREG32_SOC15(MMHUB, 0, mmPCTL0_RENG_EXECUTE, pctl0_reng_execute); | ||
388 | |||
389 | /* Light sleep must be disabled before writing to pctl1 registers */ | ||
390 | pctl1_misc &= ~PCTL1_MISC__RENG_MEM_LS_ENABLE_MASK; | ||
391 | WREG32_SOC15(MMHUB, 0, mmPCTL1_MISC, pctl1_misc); | ||
392 | |||
393 | /* Write data used to access ram of register engine */ | ||
394 | for (i = 0; i < PCTL1_DATA_LEN; i++) { | ||
395 | WREG32_SOC15(MMHUB, 0, mmPCTL1_RENG_RAM_INDEX, | ||
396 | pctl1_data[i].index); | ||
397 | WREG32_SOC15(MMHUB, 0, mmPCTL1_RENG_RAM_DATA, | ||
398 | pctl1_data[i].data); | ||
399 | } | ||
400 | |||
401 | /* Set the reng execute end ptr for pctl1 */ | ||
402 | pctl1_reng_execute = REG_SET_FIELD(pctl1_reng_execute, | ||
403 | PCTL1_RENG_EXECUTE, | ||
404 | RENG_EXECUTE_END_PTR, | ||
405 | PCTL1_RENG_EXEC_END_PTR); | ||
406 | WREG32_SOC15(MMHUB, 0, mmPCTL1_RENG_EXECUTE, pctl1_reng_execute); | ||
407 | |||
408 | mmhub_v1_0_power_gating_write_save_ranges(adev); | ||
409 | |||
410 | /* Re-enable light sleep */ | ||
411 | pctl0_misc |= PCTL0_MISC__RENG_MEM_LS_ENABLE_MASK; | ||
412 | WREG32_SOC15(MMHUB, 0, mmPCTL0_MISC, pctl0_misc); | ||
413 | pctl1_misc |= PCTL1_MISC__RENG_MEM_LS_ENABLE_MASK; | ||
414 | WREG32_SOC15(MMHUB, 0, mmPCTL1_MISC, pctl1_misc); | ||
415 | } | ||
416 | |||
247 | int mmhub_v1_0_gart_enable(struct amdgpu_device *adev) | 417 | int mmhub_v1_0_gart_enable(struct amdgpu_device *adev) |
248 | { | 418 | { |
249 | if (amdgpu_sriov_vf(adev)) { | 419 | if (amdgpu_sriov_vf(adev)) { |