drm/amd/powerplay: add avfs profiling_info_v4_2 support on Vega10.
authorRex Zhu <Rex.Zhu@amd.com>
Sat, 24 Jun 2017 08:45:58 +0000 (16:45 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 14 Jul 2017 15:06:07 +0000 (11:06 -0400)
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/include/atomfirmware.h
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h

index 0021a1c63356e8cee086dfc50c0dd5c09329abfa..837296db9628b98a37bdc7d2941aba759adcc405 100644 (file)
@@ -1233,6 +1233,69 @@ struct  atom_asic_profiling_info_v4_1
   uint32_t  phyclk2gfxclk_c;
 };
 
+struct  atom_asic_profiling_info_v4_2 {
+       struct  atom_common_table_header  table_header;
+       uint32_t  maxvddc;
+       uint32_t  minvddc;
+       uint32_t  avfs_meannsigma_acontant0;
+       uint32_t  avfs_meannsigma_acontant1;
+       uint32_t  avfs_meannsigma_acontant2;
+       uint16_t  avfs_meannsigma_dc_tol_sigma;
+       uint16_t  avfs_meannsigma_platform_mean;
+       uint16_t  avfs_meannsigma_platform_sigma;
+       uint32_t  gb_vdroop_table_cksoff_a0;
+       uint32_t  gb_vdroop_table_cksoff_a1;
+       uint32_t  gb_vdroop_table_cksoff_a2;
+       uint32_t  gb_vdroop_table_ckson_a0;
+       uint32_t  gb_vdroop_table_ckson_a1;
+       uint32_t  gb_vdroop_table_ckson_a2;
+       uint32_t  avfsgb_fuse_table_cksoff_m1;
+       uint32_t  avfsgb_fuse_table_cksoff_m2;
+       uint32_t  avfsgb_fuse_table_cksoff_b;
+       uint32_t  avfsgb_fuse_table_ckson_m1;
+       uint32_t  avfsgb_fuse_table_ckson_m2;
+       uint32_t  avfsgb_fuse_table_ckson_b;
+       uint16_t  max_voltage_0_25mv;
+       uint8_t   enable_gb_vdroop_table_cksoff;
+       uint8_t   enable_gb_vdroop_table_ckson;
+       uint8_t   enable_gb_fuse_table_cksoff;
+       uint8_t   enable_gb_fuse_table_ckson;
+       uint16_t  psm_age_comfactor;
+       uint8_t   enable_apply_avfs_cksoff_voltage;
+       uint8_t   reserved;
+       uint32_t  dispclk2gfxclk_a;
+       uint32_t  dispclk2gfxclk_b;
+       uint32_t  dispclk2gfxclk_c;
+       uint32_t  pixclk2gfxclk_a;
+       uint32_t  pixclk2gfxclk_b;
+       uint32_t  pixclk2gfxclk_c;
+       uint32_t  dcefclk2gfxclk_a;
+       uint32_t  dcefclk2gfxclk_b;
+       uint32_t  dcefclk2gfxclk_c;
+       uint32_t  phyclk2gfxclk_a;
+       uint32_t  phyclk2gfxclk_b;
+       uint32_t  phyclk2gfxclk_c;
+       uint32_t  acg_gb_vdroop_table_a0;
+       uint32_t  acg_gb_vdroop_table_a1;
+       uint32_t  acg_gb_vdroop_table_a2;
+       uint32_t  acg_avfsgb_fuse_table_m1;
+       uint32_t  acg_avfsgb_fuse_table_m2;
+       uint32_t  acg_avfsgb_fuse_table_b;
+       uint8_t   enable_acg_gb_vdroop_table;
+       uint8_t   enable_acg_gb_fuse_table;
+       uint32_t  acg_dispclk2gfxclk_a;
+       uint32_t  acg_dispclk2gfxclk_b;
+       uint32_t  acg_dispclk2gfxclk_c;
+       uint32_t  acg_pixclk2gfxclk_a;
+       uint32_t  acg_pixclk2gfxclk_b;
+       uint32_t  acg_pixclk2gfxclk_c;
+       uint32_t  acg_dcefclk2gfxclk_a;
+       uint32_t  acg_dcefclk2gfxclk_b;
+       uint32_t  acg_dcefclk2gfxclk_c;
+       uint32_t  acg_phyclk2gfxclk_a;
+       uint32_t  acg_phyclk2gfxclk_b;
+       uint32_t  acg_phyclk2gfxclk_c;
+};
 
 /* 
   ***************************************************************************
index 720d5006ff62842efbf46bdc47ea03bba6ad5bb1..cd33eb179db27259ed8e6ee3ae8e10961c2714a5 100644 (file)
@@ -276,7 +276,10 @@ int pp_atomfwctrl_get_avfs_information(struct pp_hwmgr *hwmgr,
                struct pp_atomfwctrl_avfs_parameters *param)
 {
        uint16_t idx;
+       uint8_t format_revision, content_revision;
+
        struct atom_asic_profiling_info_v4_1 *profile;
+       struct atom_asic_profiling_info_v4_2 *profile_v4_2;
 
        idx = GetIndexIntoMasterDataTable(asic_profiling_info);
        profile = (struct atom_asic_profiling_info_v4_1 *)
@@ -286,76 +289,172 @@ int pp_atomfwctrl_get_avfs_information(struct pp_hwmgr *hwmgr,
        if (!profile)
                return -1;
 
-       param->ulMaxVddc = le32_to_cpu(profile->maxvddc);
-       param->ulMinVddc = le32_to_cpu(profile->minvddc);
-       param->ulMeanNsigmaAcontant0 =
-                       le32_to_cpu(profile->avfs_meannsigma_acontant0);
-       param->ulMeanNsigmaAcontant1 =
-                       le32_to_cpu(profile->avfs_meannsigma_acontant1);
-       param->ulMeanNsigmaAcontant2 =
-                       le32_to_cpu(profile->avfs_meannsigma_acontant2);
-       param->usMeanNsigmaDcTolSigma =
-                       le16_to_cpu(profile->avfs_meannsigma_dc_tol_sigma);
-       param->usMeanNsigmaPlatformMean =
-                       le16_to_cpu(profile->avfs_meannsigma_platform_mean);
-       param->usMeanNsigmaPlatformSigma =
-                       le16_to_cpu(profile->avfs_meannsigma_platform_sigma);
-       param->ulGbVdroopTableCksoffA0 =
-                       le32_to_cpu(profile->gb_vdroop_table_cksoff_a0);
-       param->ulGbVdroopTableCksoffA1 =
-                       le32_to_cpu(profile->gb_vdroop_table_cksoff_a1);
-       param->ulGbVdroopTableCksoffA2 =
-                       le32_to_cpu(profile->gb_vdroop_table_cksoff_a2);
-       param->ulGbVdroopTableCksonA0 =
-                       le32_to_cpu(profile->gb_vdroop_table_ckson_a0);
-       param->ulGbVdroopTableCksonA1 =
-                       le32_to_cpu(profile->gb_vdroop_table_ckson_a1);
-       param->ulGbVdroopTableCksonA2 =
-                       le32_to_cpu(profile->gb_vdroop_table_ckson_a2);
-       param->ulGbFuseTableCksoffM1 =
-                       le32_to_cpu(profile->avfsgb_fuse_table_cksoff_m1);
-       param->ulGbFuseTableCksoffM2 =
-                       le32_to_cpu(profile->avfsgb_fuse_table_cksoff_m2);
-       param->ulGbFuseTableCksoffB =
-                       le32_to_cpu(profile->avfsgb_fuse_table_cksoff_b);
-       param->ulGbFuseTableCksonM1 =
-                       le32_to_cpu(profile->avfsgb_fuse_table_ckson_m1);
-       param->ulGbFuseTableCksonM2 =
-                       le32_to_cpu(profile->avfsgb_fuse_table_ckson_m2);
-       param->ulGbFuseTableCksonB =
-                       le32_to_cpu(profile->avfsgb_fuse_table_ckson_b);
-
-       param->ucEnableGbVdroopTableCkson =
-                       profile->enable_gb_vdroop_table_ckson;
-       param->ucEnableGbFuseTableCkson =
-                       profile->enable_gb_fuse_table_ckson;
-       param->usPsmAgeComfactor =
-                       le16_to_cpu(profile->psm_age_comfactor);
-
-       param->ulDispclk2GfxclkM1 =
-                       le32_to_cpu(profile->dispclk2gfxclk_a);
-       param->ulDispclk2GfxclkM2 =
-                       le32_to_cpu(profile->dispclk2gfxclk_b);
-       param->ulDispclk2GfxclkB =
-                       le32_to_cpu(profile->dispclk2gfxclk_c);
-       param->ulDcefclk2GfxclkM1 =
-                       le32_to_cpu(profile->dcefclk2gfxclk_a);
-       param->ulDcefclk2GfxclkM2 =
-                       le32_to_cpu(profile->dcefclk2gfxclk_b);
-       param->ulDcefclk2GfxclkB =
-                       le32_to_cpu(profile->dcefclk2gfxclk_c);
-       param->ulPixelclk2GfxclkM1 =
-                       le32_to_cpu(profile->pixclk2gfxclk_a);
-       param->ulPixelclk2GfxclkM2 =
-                       le32_to_cpu(profile->pixclk2gfxclk_b);
-       param->ulPixelclk2GfxclkB =
-                       le32_to_cpu(profile->pixclk2gfxclk_c);
-       param->ulPhyclk2GfxclkM1 =
-                       le32_to_cpu(profile->phyclk2gfxclk_a);
-       param->ulPhyclk2GfxclkM2 =
-                       le32_to_cpu(profile->phyclk2gfxclk_b);
-       param->ulPhyclk2GfxclkB =
-                       le32_to_cpu(profile->phyclk2gfxclk_c);
+       format_revision = ((struct atom_common_table_header *)profile)->format_revision;
+       content_revision = ((struct atom_common_table_header *)profile)->content_revision;
+
+       if (format_revision == 4 && content_revision == 1) {
+               param->ulMaxVddc = le32_to_cpu(profile->maxvddc);
+               param->ulMinVddc = le32_to_cpu(profile->minvddc);
+               param->ulMeanNsigmaAcontant0 =
+                               le32_to_cpu(profile->avfs_meannsigma_acontant0);
+               param->ulMeanNsigmaAcontant1 =
+                               le32_to_cpu(profile->avfs_meannsigma_acontant1);
+               param->ulMeanNsigmaAcontant2 =
+                               le32_to_cpu(profile->avfs_meannsigma_acontant2);
+               param->usMeanNsigmaDcTolSigma =
+                               le16_to_cpu(profile->avfs_meannsigma_dc_tol_sigma);
+               param->usMeanNsigmaPlatformMean =
+                               le16_to_cpu(profile->avfs_meannsigma_platform_mean);
+               param->usMeanNsigmaPlatformSigma =
+                               le16_to_cpu(profile->avfs_meannsigma_platform_sigma);
+               param->ulGbVdroopTableCksoffA0 =
+                               le32_to_cpu(profile->gb_vdroop_table_cksoff_a0);
+               param->ulGbVdroopTableCksoffA1 =
+                               le32_to_cpu(profile->gb_vdroop_table_cksoff_a1);
+               param->ulGbVdroopTableCksoffA2 =
+                               le32_to_cpu(profile->gb_vdroop_table_cksoff_a2);
+               param->ulGbVdroopTableCksonA0 =
+                               le32_to_cpu(profile->gb_vdroop_table_ckson_a0);
+               param->ulGbVdroopTableCksonA1 =
+                               le32_to_cpu(profile->gb_vdroop_table_ckson_a1);
+               param->ulGbVdroopTableCksonA2 =
+                               le32_to_cpu(profile->gb_vdroop_table_ckson_a2);
+               param->ulGbFuseTableCksoffM1 =
+                               le32_to_cpu(profile->avfsgb_fuse_table_cksoff_m1);
+               param->ulGbFuseTableCksoffM2 =
+                               le32_to_cpu(profile->avfsgb_fuse_table_cksoff_m2);
+               param->ulGbFuseTableCksoffB =
+                               le32_to_cpu(profile->avfsgb_fuse_table_cksoff_b);
+               param->ulGbFuseTableCksonM1 =
+                               le32_to_cpu(profile->avfsgb_fuse_table_ckson_m1);
+               param->ulGbFuseTableCksonM2 =
+                               le32_to_cpu(profile->avfsgb_fuse_table_ckson_m2);
+               param->ulGbFuseTableCksonB =
+                               le32_to_cpu(profile->avfsgb_fuse_table_ckson_b);
+
+               param->ucEnableGbVdroopTableCkson =
+                               profile->enable_gb_vdroop_table_ckson;
+               param->ucEnableGbFuseTableCkson =
+                               profile->enable_gb_fuse_table_ckson;
+               param->usPsmAgeComfactor =
+                               le16_to_cpu(profile->psm_age_comfactor);
+
+               param->ulDispclk2GfxclkM1 =
+                               le32_to_cpu(profile->dispclk2gfxclk_a);
+               param->ulDispclk2GfxclkM2 =
+                               le32_to_cpu(profile->dispclk2gfxclk_b);
+               param->ulDispclk2GfxclkB =
+                               le32_to_cpu(profile->dispclk2gfxclk_c);
+               param->ulDcefclk2GfxclkM1 =
+                               le32_to_cpu(profile->dcefclk2gfxclk_a);
+               param->ulDcefclk2GfxclkM2 =
+                               le32_to_cpu(profile->dcefclk2gfxclk_b);
+               param->ulDcefclk2GfxclkB =
+                               le32_to_cpu(profile->dcefclk2gfxclk_c);
+               param->ulPixelclk2GfxclkM1 =
+                               le32_to_cpu(profile->pixclk2gfxclk_a);
+               param->ulPixelclk2GfxclkM2 =
+                               le32_to_cpu(profile->pixclk2gfxclk_b);
+               param->ulPixelclk2GfxclkB =
+                               le32_to_cpu(profile->pixclk2gfxclk_c);
+               param->ulPhyclk2GfxclkM1 =
+                               le32_to_cpu(profile->phyclk2gfxclk_a);
+               param->ulPhyclk2GfxclkM2 =
+                               le32_to_cpu(profile->phyclk2gfxclk_b);
+               param->ulPhyclk2GfxclkB =
+                               le32_to_cpu(profile->phyclk2gfxclk_c);
+               param->ulAcgGbVdroopTableA0           = 0;
+               param->ulAcgGbVdroopTableA1           = 0;
+               param->ulAcgGbVdroopTableA2           = 0;
+               param->ulAcgGbFuseTableM1             = 0;
+               param->ulAcgGbFuseTableM2             = 0;
+               param->ulAcgGbFuseTableB              = 0;
+               param->ucAcgEnableGbVdroopTable       = 0;
+               param->ucAcgEnableGbFuseTable         = 0;
+       } else if (format_revision == 4 && content_revision == 2) {
+               profile_v4_2 = (struct atom_asic_profiling_info_v4_2 *)profile;
+               param->ulMaxVddc = le32_to_cpu(profile_v4_2->maxvddc);
+               param->ulMinVddc = le32_to_cpu(profile_v4_2->minvddc);
+               param->ulMeanNsigmaAcontant0 =
+                               le32_to_cpu(profile_v4_2->avfs_meannsigma_acontant0);
+               param->ulMeanNsigmaAcontant1 =
+                               le32_to_cpu(profile_v4_2->avfs_meannsigma_acontant1);
+               param->ulMeanNsigmaAcontant2 =
+                               le32_to_cpu(profile_v4_2->avfs_meannsigma_acontant2);
+               param->usMeanNsigmaDcTolSigma =
+                               le16_to_cpu(profile_v4_2->avfs_meannsigma_dc_tol_sigma);
+               param->usMeanNsigmaPlatformMean =
+                               le16_to_cpu(profile_v4_2->avfs_meannsigma_platform_mean);
+               param->usMeanNsigmaPlatformSigma =
+                               le16_to_cpu(profile_v4_2->avfs_meannsigma_platform_sigma);
+               param->ulGbVdroopTableCksoffA0 =
+                               le32_to_cpu(profile_v4_2->gb_vdroop_table_cksoff_a0);
+               param->ulGbVdroopTableCksoffA1 =
+                               le32_to_cpu(profile_v4_2->gb_vdroop_table_cksoff_a1);
+               param->ulGbVdroopTableCksoffA2 =
+                               le32_to_cpu(profile_v4_2->gb_vdroop_table_cksoff_a2);
+               param->ulGbVdroopTableCksonA0 =
+                               le32_to_cpu(profile_v4_2->gb_vdroop_table_ckson_a0);
+               param->ulGbVdroopTableCksonA1 =
+                               le32_to_cpu(profile_v4_2->gb_vdroop_table_ckson_a1);
+               param->ulGbVdroopTableCksonA2 =
+                               le32_to_cpu(profile_v4_2->gb_vdroop_table_ckson_a2);
+               param->ulGbFuseTableCksoffM1 =
+                               le32_to_cpu(profile_v4_2->avfsgb_fuse_table_cksoff_m1);
+               param->ulGbFuseTableCksoffM2 =
+                               le32_to_cpu(profile_v4_2->avfsgb_fuse_table_cksoff_m2);
+               param->ulGbFuseTableCksoffB =
+                               le32_to_cpu(profile_v4_2->avfsgb_fuse_table_cksoff_b);
+               param->ulGbFuseTableCksonM1 =
+                               le32_to_cpu(profile_v4_2->avfsgb_fuse_table_ckson_m1);
+               param->ulGbFuseTableCksonM2 =
+                               le32_to_cpu(profile_v4_2->avfsgb_fuse_table_ckson_m2);
+               param->ulGbFuseTableCksonB =
+                               le32_to_cpu(profile_v4_2->avfsgb_fuse_table_ckson_b);
+
+               param->ucEnableGbVdroopTableCkson =
+                               profile_v4_2->enable_gb_vdroop_table_ckson;
+               param->ucEnableGbFuseTableCkson =
+                               profile_v4_2->enable_gb_fuse_table_ckson;
+               param->usPsmAgeComfactor =
+                               le16_to_cpu(profile_v4_2->psm_age_comfactor);
+
+               param->ulDispclk2GfxclkM1 =
+                               le32_to_cpu(profile_v4_2->dispclk2gfxclk_a);
+               param->ulDispclk2GfxclkM2 =
+                               le32_to_cpu(profile_v4_2->dispclk2gfxclk_b);
+               param->ulDispclk2GfxclkB =
+                               le32_to_cpu(profile_v4_2->dispclk2gfxclk_c);
+               param->ulDcefclk2GfxclkM1 =
+                               le32_to_cpu(profile_v4_2->dcefclk2gfxclk_a);
+               param->ulDcefclk2GfxclkM2 =
+                               le32_to_cpu(profile_v4_2->dcefclk2gfxclk_b);
+               param->ulDcefclk2GfxclkB =
+                               le32_to_cpu(profile_v4_2->dcefclk2gfxclk_c);
+               param->ulPixelclk2GfxclkM1 =
+                               le32_to_cpu(profile_v4_2->pixclk2gfxclk_a);
+               param->ulPixelclk2GfxclkM2 =
+                               le32_to_cpu(profile_v4_2->pixclk2gfxclk_b);
+               param->ulPixelclk2GfxclkB =
+                               le32_to_cpu(profile_v4_2->pixclk2gfxclk_c);
+               param->ulPhyclk2GfxclkM1 =
+                               le32_to_cpu(profile->phyclk2gfxclk_a);
+               param->ulPhyclk2GfxclkM2 =
+                               le32_to_cpu(profile_v4_2->phyclk2gfxclk_b);
+               param->ulPhyclk2GfxclkB =
+                               le32_to_cpu(profile_v4_2->phyclk2gfxclk_c);
+               param->ulAcgGbVdroopTableA0 = le32_to_cpu(profile_v4_2->acg_gb_vdroop_table_a0);
+               param->ulAcgGbVdroopTableA1 = le32_to_cpu(profile_v4_2->acg_gb_vdroop_table_a1);
+               param->ulAcgGbVdroopTableA2 = le32_to_cpu(profile_v4_2->acg_gb_vdroop_table_a2);
+               param->ulAcgGbFuseTableM1 = le32_to_cpu(profile_v4_2->acg_avfsgb_fuse_table_m1);
+               param->ulAcgGbFuseTableM2 = le32_to_cpu(profile_v4_2->acg_avfsgb_fuse_table_m2);
+               param->ulAcgGbFuseTableB = le32_to_cpu(profile_v4_2->acg_avfsgb_fuse_table_b);
+               param->ucAcgEnableGbVdroopTable = le32_to_cpu(profile_v4_2->enable_acg_gb_vdroop_table);
+               param->ucAcgEnableGbFuseTable = le32_to_cpu(profile_v4_2->enable_acg_gb_fuse_table);
+       } else {
+               pr_info("Invalid VBIOS AVFS ProfilingInfo Revision!\n");
+               return -EINVAL;
+       }
 
        return 0;
 }
index 81908b5cfd5f11f226df1b9c4054588802394701..8e6b1f0ddebc00769bee23d1b48162421a47d8b5 100644 (file)
@@ -109,6 +109,14 @@ struct pp_atomfwctrl_avfs_parameters {
        uint32_t   ulPhyclk2GfxclkM1;
        uint32_t   ulPhyclk2GfxclkM2;
        uint32_t   ulPhyclk2GfxclkB;
+       uint32_t   ulAcgGbVdroopTableA0;
+       uint32_t   ulAcgGbVdroopTableA1;
+       uint32_t   ulAcgGbVdroopTableA2;
+       uint32_t   ulAcgGbFuseTableM1;
+       uint32_t   ulAcgGbFuseTableM2;
+       uint32_t   ulAcgGbFuseTableB;
+       uint32_t   ucAcgEnableGbVdroopTable;
+       uint32_t   ucAcgEnableGbFuseTable;
 };
 
 struct pp_atomfwctrl_gpio_parameters {