aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKen Wang <Qingqing.Wang@amd.com>2015-06-03 09:02:01 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-06-03 21:04:04 -0400
commit81c59f54125f9ff84546b6ba26c321662562703d (patch)
tree5155dcf6e4f917f073d401342b412691e9757383
parent71062f435eaf0ff7867a1188e5c7887b0a5871ff (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.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ci_dpm.c12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cikd.h11
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c32
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c33
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vid.h11
-rw-r--r--include/uapi/drm/amdgpu_drm.h13
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)
891static bool ci_dpm_vblank_too_short(struct amdgpu_device *adev) 891static 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
815static 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
815static int gmc_v7_0_early_init(void *handle) 837static 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
41static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev); 42static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev);
42static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev); 43static 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
790static 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
789static int gmc_v8_0_early_init(void *handle) 812static 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
543struct drm_amdgpu_info_device { 552struct 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
580struct drm_amdgpu_info_hw_ip { 593struct drm_amdgpu_info_hw_ip {