aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorHuang Rui <ray.huang@amd.com>2016-09-14 05:14:16 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-09-19 14:38:25 -0400
commit167ac5733c70683c4886a8b3ef347cc6c93a76a6 (patch)
treee3cdf11d3a3ff03b0a92bf21865240f8c784642c /drivers/gpu
parent0b2138a45516ba83445a3c9a8aa38a1fb42c71bc (diff)
drm/amdgpu: implement raster configuration for gfx v8
This patch is to implement the raster configuration and harvested configuration of gfx v8. Signed-off-by: Huang Rui <ray.huang@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Acked-by: Edward O'Callaghan <funfunctor@folklore1984.net> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c168
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vid.h37
2 files changed, 204 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 1e7c615c054e..6da7d94925eb 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -3488,13 +3488,163 @@ static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev)
3488 return (~data) & mask; 3488 return (~data) & mask;
3489} 3489}
3490 3490
3491static void
3492gfx_v8_0_raster_config(struct amdgpu_device *adev, u32 *rconf, u32 *rconf1)
3493{
3494 switch (adev->asic_type) {
3495 case CHIP_FIJI:
3496 *rconf |= RB_MAP_PKR0(2) | RB_MAP_PKR1(2) |
3497 RB_XSEL2(1) | PKR_MAP(2) |
3498 PKR_XSEL(1) | PKR_YSEL(1) |
3499 SE_MAP(2) | SE_XSEL(2) | SE_YSEL(3);
3500 *rconf1 |= SE_PAIR_MAP(2) | SE_PAIR_XSEL(3) |
3501 SE_PAIR_YSEL(2);
3502 break;
3503 case CHIP_TONGA:
3504 case CHIP_POLARIS10:
3505 *rconf |= RB_MAP_PKR0(2) | RB_XSEL2(1) | SE_MAP(2) |
3506 SE_XSEL(1) | SE_YSEL(1);
3507 *rconf1 |= SE_PAIR_MAP(2) | SE_PAIR_XSEL(2) |
3508 SE_PAIR_YSEL(2);
3509 break;
3510 case CHIP_TOPAZ:
3511 case CHIP_CARRIZO:
3512 *rconf |= RB_MAP_PKR0(2);
3513 *rconf1 |= 0x0;
3514 break;
3515 case CHIP_POLARIS11:
3516 *rconf |= RB_MAP_PKR0(2) | RB_XSEL2(1) | SE_MAP(2) |
3517 SE_XSEL(1) | SE_YSEL(1);
3518 *rconf1 |= 0x0;
3519 break;
3520 case CHIP_STONEY:
3521 *rconf |= 0x0;
3522 *rconf1 |= 0x0;
3523 break;
3524 default:
3525 DRM_ERROR("unknown asic: 0x%x\n", adev->asic_type);
3526 break;
3527 }
3528}
3529
3530static void
3531gfx_v8_0_write_harvested_raster_configs(struct amdgpu_device *adev,
3532 u32 raster_config, u32 raster_config_1,
3533 unsigned rb_mask, unsigned num_rb)
3534{
3535 unsigned sh_per_se = max_t(unsigned, adev->gfx.config.max_sh_per_se, 1);
3536 unsigned num_se = max_t(unsigned, adev->gfx.config.max_shader_engines, 1);
3537 unsigned rb_per_pkr = min_t(unsigned, num_rb / num_se / sh_per_se, 2);
3538 unsigned rb_per_se = num_rb / num_se;
3539 unsigned se_mask[4];
3540 unsigned se;
3541
3542 se_mask[0] = ((1 << rb_per_se) - 1) & rb_mask;
3543 se_mask[1] = (se_mask[0] << rb_per_se) & rb_mask;
3544 se_mask[2] = (se_mask[1] << rb_per_se) & rb_mask;
3545 se_mask[3] = (se_mask[2] << rb_per_se) & rb_mask;
3546
3547 WARN_ON(!(num_se == 1 || num_se == 2 || num_se == 4));
3548 WARN_ON(!(sh_per_se == 1 || sh_per_se == 2));
3549 WARN_ON(!(rb_per_pkr == 1 || rb_per_pkr == 2));
3550
3551 if ((num_se > 2) && ((!se_mask[0] && !se_mask[1]) ||
3552 (!se_mask[2] && !se_mask[3]))) {
3553 raster_config_1 &= ~SE_PAIR_MAP_MASK;
3554
3555 if (!se_mask[0] && !se_mask[1]) {
3556 raster_config_1 |=
3557 SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_3);
3558 } else {
3559 raster_config_1 |=
3560 SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_0);
3561 }
3562 }
3563
3564 for (se = 0; se < num_se; se++) {
3565 unsigned raster_config_se = raster_config;
3566 unsigned pkr0_mask = ((1 << rb_per_pkr) - 1) << (se * rb_per_se);
3567 unsigned pkr1_mask = pkr0_mask << rb_per_pkr;
3568 int idx = (se / 2) * 2;
3569
3570 if ((num_se > 1) && (!se_mask[idx] || !se_mask[idx + 1])) {
3571 raster_config_se &= ~SE_MAP_MASK;
3572
3573 if (!se_mask[idx]) {
3574 raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_3);
3575 } else {
3576 raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_0);
3577 }
3578 }
3579
3580 pkr0_mask &= rb_mask;
3581 pkr1_mask &= rb_mask;
3582 if (rb_per_se > 2 && (!pkr0_mask || !pkr1_mask)) {
3583 raster_config_se &= ~PKR_MAP_MASK;
3584
3585 if (!pkr0_mask) {
3586 raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_3);
3587 } else {
3588 raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_0);
3589 }
3590 }
3591
3592 if (rb_per_se >= 2) {
3593 unsigned rb0_mask = 1 << (se * rb_per_se);
3594 unsigned rb1_mask = rb0_mask << 1;
3595
3596 rb0_mask &= rb_mask;
3597 rb1_mask &= rb_mask;
3598 if (!rb0_mask || !rb1_mask) {
3599 raster_config_se &= ~RB_MAP_PKR0_MASK;
3600
3601 if (!rb0_mask) {
3602 raster_config_se |=
3603 RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_3);
3604 } else {
3605 raster_config_se |=
3606 RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_0);
3607 }
3608 }
3609
3610 if (rb_per_se > 2) {
3611 rb0_mask = 1 << (se * rb_per_se + rb_per_pkr);
3612 rb1_mask = rb0_mask << 1;
3613 rb0_mask &= rb_mask;
3614 rb1_mask &= rb_mask;
3615 if (!rb0_mask || !rb1_mask) {
3616 raster_config_se &= ~RB_MAP_PKR1_MASK;
3617
3618 if (!rb0_mask) {
3619 raster_config_se |=
3620 RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_3);
3621 } else {
3622 raster_config_se |=
3623 RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_0);
3624 }
3625 }
3626 }
3627 }
3628
3629 /* GRBM_GFX_INDEX has a different offset on VI */
3630 gfx_v8_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff);
3631 WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se);
3632 WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);
3633 }
3634
3635 /* GRBM_GFX_INDEX has a different offset on VI */
3636 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3637}
3638
3491static void gfx_v8_0_setup_rb(struct amdgpu_device *adev) 3639static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)
3492{ 3640{
3493 int i, j; 3641 int i, j;
3494 u32 data; 3642 u32 data;
3643 u32 raster_config = 0, raster_config_1 = 0;
3495 u32 active_rbs = 0; 3644 u32 active_rbs = 0;
3496 u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / 3645 u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se /
3497 adev->gfx.config.max_sh_per_se; 3646 adev->gfx.config.max_sh_per_se;
3647 unsigned num_rb_pipes;
3498 3648
3499 mutex_lock(&adev->grbm_idx_mutex); 3649 mutex_lock(&adev->grbm_idx_mutex);
3500 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { 3650 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
@@ -3506,10 +3656,26 @@ static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)
3506 } 3656 }
3507 } 3657 }
3508 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 3658 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3509 mutex_unlock(&adev->grbm_idx_mutex);
3510 3659
3511 adev->gfx.config.backend_enable_mask = active_rbs; 3660 adev->gfx.config.backend_enable_mask = active_rbs;
3512 adev->gfx.config.num_rbs = hweight32(active_rbs); 3661 adev->gfx.config.num_rbs = hweight32(active_rbs);
3662
3663 num_rb_pipes = min_t(unsigned, adev->gfx.config.max_backends_per_se *
3664 adev->gfx.config.max_shader_engines, 16);
3665
3666 gfx_v8_0_raster_config(adev, &raster_config, &raster_config_1);
3667
3668 if (!adev->gfx.config.backend_enable_mask ||
3669 adev->gfx.config.num_rbs >= num_rb_pipes) {
3670 WREG32(mmPA_SC_RASTER_CONFIG, raster_config);
3671 WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);
3672 } else {
3673 gfx_v8_0_write_harvested_raster_configs(adev, raster_config, raster_config_1,
3674 adev->gfx.config.backend_enable_mask,
3675 num_rb_pipes);
3676 }
3677
3678 mutex_unlock(&adev->grbm_idx_mutex);
3513} 3679}
3514 3680
3515/** 3681/**
diff --git a/drivers/gpu/drm/amd/amdgpu/vid.h b/drivers/gpu/drm/amd/amdgpu/vid.h
index f62b261660d4..11746f22d0c5 100644
--- a/drivers/gpu/drm/amd/amdgpu/vid.h
+++ b/drivers/gpu/drm/amd/amdgpu/vid.h
@@ -373,4 +373,41 @@
373#define VCE_CMD_WAIT_GE 0x00000106 373#define VCE_CMD_WAIT_GE 0x00000106
374#define VCE_CMD_UPDATE_PTB 0x00000107 374#define VCE_CMD_UPDATE_PTB 0x00000107
375#define VCE_CMD_FLUSH_TLB 0x00000108 375#define VCE_CMD_FLUSH_TLB 0x00000108
376
377/* mmPA_SC_RASTER_CONFIG mask */
378#define RB_MAP_PKR0(x) ((x) << 0)
379#define RB_MAP_PKR0_MASK (0x3 << 0)
380#define RB_MAP_PKR1(x) ((x) << 2)
381#define RB_MAP_PKR1_MASK (0x3 << 2)
382#define RB_XSEL2(x) ((x) << 4)
383#define RB_XSEL2_MASK (0x3 << 4)
384#define RB_XSEL (1 << 6)
385#define RB_YSEL (1 << 7)
386#define PKR_MAP(x) ((x) << 8)
387#define PKR_MAP_MASK (0x3 << 8)
388#define PKR_XSEL(x) ((x) << 10)
389#define PKR_XSEL_MASK (0x3 << 10)
390#define PKR_YSEL(x) ((x) << 12)
391#define PKR_YSEL_MASK (0x3 << 12)
392#define SC_MAP(x) ((x) << 16)
393#define SC_MAP_MASK (0x3 << 16)
394#define SC_XSEL(x) ((x) << 18)
395#define SC_XSEL_MASK (0x3 << 18)
396#define SC_YSEL(x) ((x) << 20)
397#define SC_YSEL_MASK (0x3 << 20)
398#define SE_MAP(x) ((x) << 24)
399#define SE_MAP_MASK (0x3 << 24)
400#define SE_XSEL(x) ((x) << 26)
401#define SE_XSEL_MASK (0x3 << 26)
402#define SE_YSEL(x) ((x) << 28)
403#define SE_YSEL_MASK (0x3 << 28)
404
405/* mmPA_SC_RASTER_CONFIG_1 mask */
406#define SE_PAIR_MAP(x) ((x) << 0)
407#define SE_PAIR_MAP_MASK (0x3 << 0)
408#define SE_PAIR_XSEL(x) ((x) << 2)
409#define SE_PAIR_XSEL_MASK (0x3 << 2)
410#define SE_PAIR_YSEL(x) ((x) << 4)
411#define SE_PAIR_YSEL_MASK (0x3 << 4)
412
376#endif 413#endif