aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
diff options
context:
space:
mode:
authorHawking Zhang <Hawking.Zhang@amd.com>2017-06-19 02:19:07 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-06-29 12:43:45 -0400
commit2fcd43cef6e28ca546376af07c0454dc72b593f9 (patch)
treee06b3cc59917a16df458db7eae27ffa1d41fe031 /drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
parentebc1c9c1be5b49ddb8396350b12b74be493d48d2 (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.c170
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
247struct pctl_data {
248 uint32_t index;
249 uint32_t data;
250};
251
252const 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
277const 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
310static 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
354void 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
247int mmhub_v1_0_gart_enable(struct amdgpu_device *adev) 417int mmhub_v1_0_gart_enable(struct amdgpu_device *adev)
248{ 418{
249 if (amdgpu_sriov_vf(adev)) { 419 if (amdgpu_sriov_vf(adev)) {