diff options
author | Ken Wang <Qingqing.Wang@amd.com> | 2015-06-03 09:02:01 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-06-03 21:04:04 -0400 |
commit | 81c59f54125f9ff84546b6ba26c321662562703d (patch) | |
tree | 5155dcf6e4f917f073d401342b412691e9757383 | |
parent | 71062f435eaf0ff7867a1188e5c7887b0a5871ff (diff) |
drm/amdgpu: add vram_type and vram_bit_width for interface query (v2)
Track the type of vram on the board and provide a query for it.
User mode drivers and tools want this information for determining
bandwidth information and form informational purposes.
v2: fix build when CI support is not enabled
Signed-off-by: Ken Wang <Qingqing.Wang@amd.com>
Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/ci_dpm.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cikd.h | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 32 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 33 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vid.h | 11 | ||||
-rw-r--r-- | include/uapi/drm/amdgpu_drm.h | 13 |
8 files changed, 89 insertions, 27 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 4bdc3265b410..149b76913091 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -767,7 +767,7 @@ struct amdgpu_mc { | |||
767 | const struct firmware *fw; /* MC firmware */ | 767 | const struct firmware *fw; /* MC firmware */ |
768 | uint32_t fw_version; | 768 | uint32_t fw_version; |
769 | struct amdgpu_irq_src vm_fault; | 769 | struct amdgpu_irq_src vm_fault; |
770 | bool is_gddr5; | 770 | uint32_t vram_type; |
771 | }; | 771 | }; |
772 | 772 | ||
773 | /* | 773 | /* |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index f1e5d87ef1f7..5533434c7a8f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -457,6 +457,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
457 | dev_info.cu_ao_mask = cu_info.ao_cu_mask; | 457 | dev_info.cu_ao_mask = cu_info.ao_cu_mask; |
458 | dev_info.ce_ram_size = adev->gfx.ce_ram_size; | 458 | dev_info.ce_ram_size = adev->gfx.ce_ram_size; |
459 | memcpy(&dev_info.cu_bitmap[0], &cu_info.bitmap[0], sizeof(cu_info.bitmap)); | 459 | memcpy(&dev_info.cu_bitmap[0], &cu_info.bitmap[0], sizeof(cu_info.bitmap)); |
460 | dev_info.vram_type = adev->mc.vram_type; | ||
461 | dev_info.vram_bit_width = adev->mc.vram_width; | ||
460 | 462 | ||
461 | return copy_to_user(out, &dev_info, | 463 | return copy_to_user(out, &dev_info, |
462 | min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0; | 464 | min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c index b1a4fbc22e69..82e8d0730517 100644 --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c | |||
@@ -891,7 +891,7 @@ static void ci_dpm_powergate_uvd(struct amdgpu_device *adev, bool gate) | |||
891 | static bool ci_dpm_vblank_too_short(struct amdgpu_device *adev) | 891 | static bool ci_dpm_vblank_too_short(struct amdgpu_device *adev) |
892 | { | 892 | { |
893 | u32 vblank_time = amdgpu_dpm_get_vblank_time(adev); | 893 | u32 vblank_time = amdgpu_dpm_get_vblank_time(adev); |
894 | u32 switch_limit = adev->mc.is_gddr5 ? 450 : 300; | 894 | u32 switch_limit = adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5 ? 450 : 300; |
895 | 895 | ||
896 | if (vblank_time < switch_limit) | 896 | if (vblank_time < switch_limit) |
897 | return true; | 897 | return true; |
@@ -2920,7 +2920,7 @@ static int ci_calculate_mclk_params(struct amdgpu_device *adev, | |||
2920 | mpll_ad_func_cntl &= ~MPLL_AD_FUNC_CNTL__YCLK_POST_DIV_MASK; | 2920 | mpll_ad_func_cntl &= ~MPLL_AD_FUNC_CNTL__YCLK_POST_DIV_MASK; |
2921 | mpll_ad_func_cntl |= (mpll_param.post_div << MPLL_AD_FUNC_CNTL__YCLK_POST_DIV__SHIFT); | 2921 | mpll_ad_func_cntl |= (mpll_param.post_div << MPLL_AD_FUNC_CNTL__YCLK_POST_DIV__SHIFT); |
2922 | 2922 | ||
2923 | if (adev->mc.is_gddr5) { | 2923 | if (adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5) { |
2924 | mpll_dq_func_cntl &= ~(MPLL_DQ_FUNC_CNTL__YCLK_SEL_MASK | | 2924 | mpll_dq_func_cntl &= ~(MPLL_DQ_FUNC_CNTL__YCLK_SEL_MASK | |
2925 | MPLL_AD_FUNC_CNTL__YCLK_POST_DIV_MASK); | 2925 | MPLL_AD_FUNC_CNTL__YCLK_POST_DIV_MASK); |
2926 | mpll_dq_func_cntl |= (mpll_param.yclk_sel << MPLL_DQ_FUNC_CNTL__YCLK_SEL__SHIFT) | | 2926 | mpll_dq_func_cntl |= (mpll_param.yclk_sel << MPLL_DQ_FUNC_CNTL__YCLK_SEL__SHIFT) | |
@@ -3043,7 +3043,7 @@ static int ci_populate_single_memory_level(struct amdgpu_device *adev, | |||
3043 | (memory_clock <= pi->mclk_strobe_mode_threshold)) | 3043 | (memory_clock <= pi->mclk_strobe_mode_threshold)) |
3044 | memory_level->StrobeEnable = 1; | 3044 | memory_level->StrobeEnable = 1; |
3045 | 3045 | ||
3046 | if (adev->mc.is_gddr5) { | 3046 | if (adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5) { |
3047 | memory_level->StrobeRatio = | 3047 | memory_level->StrobeRatio = |
3048 | ci_get_mclk_frequency_ratio(memory_clock, memory_level->StrobeEnable); | 3048 | ci_get_mclk_frequency_ratio(memory_clock, memory_level->StrobeEnable); |
3049 | if (pi->mclk_edc_enable_threshold && | 3049 | if (pi->mclk_edc_enable_threshold && |
@@ -3681,7 +3681,7 @@ static int ci_init_smc_table(struct amdgpu_device *adev) | |||
3681 | if (adev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC) | 3681 | if (adev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC) |
3682 | table->SystemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC; | 3682 | table->SystemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC; |
3683 | 3683 | ||
3684 | if (adev->mc.is_gddr5) | 3684 | if (adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5) |
3685 | table->SystemFlags |= PPSMC_SYSTEMFLAG_GDDR5; | 3685 | table->SystemFlags |= PPSMC_SYSTEMFLAG_GDDR5; |
3686 | 3686 | ||
3687 | if (ulv->supported) { | 3687 | if (ulv->supported) { |
@@ -4498,14 +4498,14 @@ static int ci_set_mc_special_registers(struct amdgpu_device *adev, | |||
4498 | for (k = 0; k < table->num_entries; k++) { | 4498 | for (k = 0; k < table->num_entries; k++) { |
4499 | table->mc_reg_table_entry[k].mc_data[j] = | 4499 | table->mc_reg_table_entry[k].mc_data[j] = |
4500 | (temp_reg & 0xffff0000) | (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff); | 4500 | (temp_reg & 0xffff0000) | (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff); |
4501 | if (!adev->mc.is_gddr5) | 4501 | if (adev->mc.vram_type != AMDGPU_VRAM_TYPE_GDDR5) |
4502 | table->mc_reg_table_entry[k].mc_data[j] |= 0x100; | 4502 | table->mc_reg_table_entry[k].mc_data[j] |= 0x100; |
4503 | } | 4503 | } |
4504 | j++; | 4504 | j++; |
4505 | if (j > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE) | 4505 | if (j > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE) |
4506 | return -EINVAL; | 4506 | return -EINVAL; |
4507 | 4507 | ||
4508 | if (!adev->mc.is_gddr5) { | 4508 | if (adev->mc.vram_type != AMDGPU_VRAM_TYPE_GDDR5) { |
4509 | table->mc_reg_address[j].s1 = mmMC_PMG_AUTO_CMD; | 4509 | table->mc_reg_address[j].s1 = mmMC_PMG_AUTO_CMD; |
4510 | table->mc_reg_address[j].s0 = mmMC_PMG_AUTO_CMD; | 4510 | table->mc_reg_address[j].s0 = mmMC_PMG_AUTO_CMD; |
4511 | for (k = 0; k < table->num_entries; k++) { | 4511 | for (k = 0; k < table->num_entries; k++) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/cikd.h b/drivers/gpu/drm/amd/amdgpu/cikd.h index 11828e2cdf34..220865a44814 100644 --- a/drivers/gpu/drm/amd/amdgpu/cikd.h +++ b/drivers/gpu/drm/amd/amdgpu/cikd.h | |||
@@ -24,9 +24,14 @@ | |||
24 | #ifndef CIK_H | 24 | #ifndef CIK_H |
25 | #define CIK_H | 25 | #define CIK_H |
26 | 26 | ||
27 | #define MC_SEQ_MISC0__GDDR5__SHIFT 0x1c | 27 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 |
28 | #define MC_SEQ_MISC0__GDDR5_MASK 0xf0000000 | 28 | #define MC_SEQ_MISC0__MT__GDDR1 0x10000000 |
29 | #define MC_SEQ_MISC0__GDDR5_VALUE 5 | 29 | #define MC_SEQ_MISC0__MT__DDR2 0x20000000 |
30 | #define MC_SEQ_MISC0__MT__GDDR3 0x30000000 | ||
31 | #define MC_SEQ_MISC0__MT__GDDR4 0x40000000 | ||
32 | #define MC_SEQ_MISC0__MT__GDDR5 0x50000000 | ||
33 | #define MC_SEQ_MISC0__MT__HBM 0x60000000 | ||
34 | #define MC_SEQ_MISC0__MT__DDR3 0xB0000000 | ||
30 | 35 | ||
31 | #define CP_ME_TABLE_SIZE 96 | 36 | #define CP_ME_TABLE_SIZE 96 |
32 | 37 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index 01cd6b207d26..ae37fce36520 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | |||
@@ -812,6 +812,28 @@ static void gmc_v7_0_enable_hdp_ls(struct amdgpu_device *adev, | |||
812 | WREG32(mmHDP_MEM_POWER_LS, data); | 812 | WREG32(mmHDP_MEM_POWER_LS, data); |
813 | } | 813 | } |
814 | 814 | ||
815 | static int gmc_v7_0_convert_vram_type(int mc_seq_vram_type) | ||
816 | { | ||
817 | switch (mc_seq_vram_type) { | ||
818 | case MC_SEQ_MISC0__MT__GDDR1: | ||
819 | return AMDGPU_VRAM_TYPE_GDDR1; | ||
820 | case MC_SEQ_MISC0__MT__DDR2: | ||
821 | return AMDGPU_VRAM_TYPE_DDR2; | ||
822 | case MC_SEQ_MISC0__MT__GDDR3: | ||
823 | return AMDGPU_VRAM_TYPE_GDDR3; | ||
824 | case MC_SEQ_MISC0__MT__GDDR4: | ||
825 | return AMDGPU_VRAM_TYPE_GDDR4; | ||
826 | case MC_SEQ_MISC0__MT__GDDR5: | ||
827 | return AMDGPU_VRAM_TYPE_GDDR5; | ||
828 | case MC_SEQ_MISC0__MT__HBM: | ||
829 | return AMDGPU_VRAM_TYPE_HBM; | ||
830 | case MC_SEQ_MISC0__MT__DDR3: | ||
831 | return AMDGPU_VRAM_TYPE_DDR3; | ||
832 | default: | ||
833 | return AMDGPU_VRAM_TYPE_UNKNOWN; | ||
834 | } | ||
835 | } | ||
836 | |||
815 | static int gmc_v7_0_early_init(void *handle) | 837 | static int gmc_v7_0_early_init(void *handle) |
816 | { | 838 | { |
817 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 839 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
@@ -820,15 +842,11 @@ static int gmc_v7_0_early_init(void *handle) | |||
820 | gmc_v7_0_set_irq_funcs(adev); | 842 | gmc_v7_0_set_irq_funcs(adev); |
821 | 843 | ||
822 | if (adev->flags & AMDGPU_IS_APU) { | 844 | if (adev->flags & AMDGPU_IS_APU) { |
823 | adev->mc.is_gddr5 = false; | 845 | adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; |
824 | } else { | 846 | } else { |
825 | u32 tmp = RREG32(mmMC_SEQ_MISC0); | 847 | u32 tmp = RREG32(mmMC_SEQ_MISC0); |
826 | 848 | tmp &= MC_SEQ_MISC0__MT__MASK; | |
827 | if (((tmp & MC_SEQ_MISC0__GDDR5_MASK) >> | 849 | adev->mc.vram_type = gmc_v7_0_convert_vram_type(tmp); |
828 | MC_SEQ_MISC0__GDDR5__SHIFT) == MC_SEQ_MISC0__GDDR5_VALUE) | ||
829 | adev->mc.is_gddr5 = true; | ||
830 | else | ||
831 | adev->mc.is_gddr5 = false; | ||
832 | } | 850 | } |
833 | 851 | ||
834 | return 0; | 852 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 675483a612c2..6206fcd39df9 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include "vid.h" | 38 | #include "vid.h" |
39 | #include "vi.h" | 39 | #include "vi.h" |
40 | 40 | ||
41 | |||
41 | static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev); | 42 | static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev); |
42 | static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev); | 43 | static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev); |
43 | 44 | ||
@@ -786,6 +787,28 @@ static void gmc_v8_0_vm_decode_fault(struct amdgpu_device *adev, | |||
786 | "write" : "read", block, mc_client, mc_id); | 787 | "write" : "read", block, mc_client, mc_id); |
787 | } | 788 | } |
788 | 789 | ||
790 | static int gmc_v8_0_convert_vram_type(int mc_seq_vram_type) | ||
791 | { | ||
792 | switch (mc_seq_vram_type) { | ||
793 | case MC_SEQ_MISC0__MT__GDDR1: | ||
794 | return AMDGPU_VRAM_TYPE_GDDR1; | ||
795 | case MC_SEQ_MISC0__MT__DDR2: | ||
796 | return AMDGPU_VRAM_TYPE_DDR2; | ||
797 | case MC_SEQ_MISC0__MT__GDDR3: | ||
798 | return AMDGPU_VRAM_TYPE_GDDR3; | ||
799 | case MC_SEQ_MISC0__MT__GDDR4: | ||
800 | return AMDGPU_VRAM_TYPE_GDDR4; | ||
801 | case MC_SEQ_MISC0__MT__GDDR5: | ||
802 | return AMDGPU_VRAM_TYPE_GDDR5; | ||
803 | case MC_SEQ_MISC0__MT__HBM: | ||
804 | return AMDGPU_VRAM_TYPE_HBM; | ||
805 | case MC_SEQ_MISC0__MT__DDR3: | ||
806 | return AMDGPU_VRAM_TYPE_DDR3; | ||
807 | default: | ||
808 | return AMDGPU_VRAM_TYPE_UNKNOWN; | ||
809 | } | ||
810 | } | ||
811 | |||
789 | static int gmc_v8_0_early_init(void *handle) | 812 | static int gmc_v8_0_early_init(void *handle) |
790 | { | 813 | { |
791 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 814 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
@@ -794,15 +817,11 @@ static int gmc_v8_0_early_init(void *handle) | |||
794 | gmc_v8_0_set_irq_funcs(adev); | 817 | gmc_v8_0_set_irq_funcs(adev); |
795 | 818 | ||
796 | if (adev->flags & AMDGPU_IS_APU) { | 819 | if (adev->flags & AMDGPU_IS_APU) { |
797 | adev->mc.is_gddr5 = false; | 820 | adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; |
798 | } else { | 821 | } else { |
799 | u32 tmp = RREG32(mmMC_SEQ_MISC0); | 822 | u32 tmp = RREG32(mmMC_SEQ_MISC0); |
800 | 823 | tmp &= MC_SEQ_MISC0__MT__MASK; | |
801 | if (((tmp & MC_SEQ_MISC0__GDDR5_MASK) >> | 824 | adev->mc.vram_type = gmc_v8_0_convert_vram_type(tmp); |
802 | MC_SEQ_MISC0__GDDR5__SHIFT) == MC_SEQ_MISC0__GDDR5_VALUE) | ||
803 | adev->mc.is_gddr5 = true; | ||
804 | else | ||
805 | adev->mc.is_gddr5 = false; | ||
806 | } | 825 | } |
807 | 826 | ||
808 | return 0; | 827 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/vid.h b/drivers/gpu/drm/amd/amdgpu/vid.h index 385267c31d11..31bb89452e12 100644 --- a/drivers/gpu/drm/amd/amdgpu/vid.h +++ b/drivers/gpu/drm/amd/amdgpu/vid.h | |||
@@ -68,9 +68,14 @@ | |||
68 | 68 | ||
69 | #define RB_BITMAP_WIDTH_PER_SH 2 | 69 | #define RB_BITMAP_WIDTH_PER_SH 2 |
70 | 70 | ||
71 | #define MC_SEQ_MISC0__GDDR5__SHIFT 0x1c | 71 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 |
72 | #define MC_SEQ_MISC0__GDDR5_MASK 0xf0000000 | 72 | #define MC_SEQ_MISC0__MT__GDDR1 0x10000000 |
73 | #define MC_SEQ_MISC0__GDDR5_VALUE 5 | 73 | #define MC_SEQ_MISC0__MT__DDR2 0x20000000 |
74 | #define MC_SEQ_MISC0__MT__GDDR3 0x30000000 | ||
75 | #define MC_SEQ_MISC0__MT__GDDR4 0x40000000 | ||
76 | #define MC_SEQ_MISC0__MT__GDDR5 0x50000000 | ||
77 | #define MC_SEQ_MISC0__MT__HBM 0x60000000 | ||
78 | #define MC_SEQ_MISC0__MT__DDR3 0xB0000000 | ||
74 | 79 | ||
75 | /* | 80 | /* |
76 | * PM4 | 81 | * PM4 |
diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h index 3af5bd0e23a8..c90f4f0d059e 100644 --- a/include/uapi/drm/amdgpu_drm.h +++ b/include/uapi/drm/amdgpu_drm.h | |||
@@ -540,6 +540,15 @@ struct drm_amdgpu_info_firmware { | |||
540 | uint32_t feature; | 540 | uint32_t feature; |
541 | }; | 541 | }; |
542 | 542 | ||
543 | #define AMDGPU_VRAM_TYPE_UNKNOWN 0 | ||
544 | #define AMDGPU_VRAM_TYPE_GDDR1 1 | ||
545 | #define AMDGPU_VRAM_TYPE_DDR2 2 | ||
546 | #define AMDGPU_VRAM_TYPE_GDDR3 3 | ||
547 | #define AMDGPU_VRAM_TYPE_GDDR4 4 | ||
548 | #define AMDGPU_VRAM_TYPE_GDDR5 5 | ||
549 | #define AMDGPU_VRAM_TYPE_HBM 6 | ||
550 | #define AMDGPU_VRAM_TYPE_DDR3 7 | ||
551 | |||
543 | struct drm_amdgpu_info_device { | 552 | struct drm_amdgpu_info_device { |
544 | /** PCI Device ID */ | 553 | /** PCI Device ID */ |
545 | uint32_t device_id; | 554 | uint32_t device_id; |
@@ -575,6 +584,10 @@ struct drm_amdgpu_info_device { | |||
575 | uint32_t gart_page_size; | 584 | uint32_t gart_page_size; |
576 | /** constant engine ram size*/ | 585 | /** constant engine ram size*/ |
577 | uint32_t ce_ram_size; | 586 | uint32_t ce_ram_size; |
587 | /** video memory type infro*/ | ||
588 | uint32_t vram_type; | ||
589 | /** video memory bit width*/ | ||
590 | uint32_t vram_bit_width; | ||
578 | }; | 591 | }; |
579 | 592 | ||
580 | struct drm_amdgpu_info_hw_ip { | 593 | struct drm_amdgpu_info_hw_ip { |