It can support different NV1x ASIC better. And this can guard
no member got missing.

Change-Id: Id5e6608f6be1b31ef1c0a5c1d399da295524ff43
Signed-off-by: Evan Quan <evan.q...@amd.com>
---
 drivers/gpu/drm/amd/include/atomfirmware.h | 102 +++++++++++++++++++++
 drivers/gpu/drm/amd/powerplay/navi10_ppt.c |  99 ++++++--------------
 2 files changed, 130 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h 
b/drivers/gpu/drm/amd/include/atomfirmware.h
index 70146518174c..a6f6e6bf5992 100644
--- a/drivers/gpu/drm/amd/include/atomfirmware.h
+++ b/drivers/gpu/drm/amd/include/atomfirmware.h
@@ -1876,6 +1876,108 @@ struct atom_smc_dpm_info_v4_6
   uint32_t   boardreserved[10];
 };
 
+struct atom_smc_dpm_info_v4_7
+{
+  struct   atom_common_table_header  table_header;
+    // SECTION: BOARD PARAMETERS
+    // I2C Control
+  struct smudpm_i2c_controller_config_v2  I2cControllers[8];
+
+  // SVI2 Board Parameters
+  uint16_t     MaxVoltageStepGfx; // In mV(Q2) Max voltage step that SMU will 
request. Multiple steps are taken if voltage change exceeds this value.
+  uint16_t     MaxVoltageStepSoc; // In mV(Q2) Max voltage step that SMU will 
request. Multiple steps are taken if voltage change exceeds this value.
+
+  uint8_t      VddGfxVrMapping;   // Use VR_MAPPING* bitfields
+  uint8_t      VddSocVrMapping;   // Use VR_MAPPING* bitfields
+  uint8_t      VddMem0VrMapping;  // Use VR_MAPPING* bitfields
+  uint8_t      VddMem1VrMapping;  // Use VR_MAPPING* bitfields
+
+  uint8_t      GfxUlvPhaseSheddingMask; // set this to 1 to set PSI0/1 to 1 in 
ULV mode
+  uint8_t      SocUlvPhaseSheddingMask; // set this to 1 to set PSI0/1 to 1 in 
ULV mode
+  uint8_t      ExternalSensorPresent; // External RDI connected to TMON (aka 
TEMP IN)
+  uint8_t      Padding8_V;
+
+  // Telemetry Settings
+  uint16_t     GfxMaxCurrent;   // in Amps
+  uint8_t      GfxOffset;       // in Amps
+  uint8_t      Padding_TelemetryGfx;
+  uint16_t     SocMaxCurrent;   // in Amps
+  uint8_t      SocOffset;       // in Amps
+  uint8_t      Padding_TelemetrySoc;
+
+  uint16_t     Mem0MaxCurrent;   // in Amps
+  uint8_t      Mem0Offset;       // in Amps
+  uint8_t      Padding_TelemetryMem0;
+
+  uint16_t     Mem1MaxCurrent;   // in Amps
+  uint8_t      Mem1Offset;       // in Amps
+  uint8_t      Padding_TelemetryMem1;
+
+  // GPIO Settings
+  uint8_t      AcDcGpio;        // GPIO pin configured for AC/DC switching
+  uint8_t      AcDcPolarity;    // GPIO polarity for AC/DC switching
+  uint8_t      VR0HotGpio;      // GPIO pin configured for VR0 HOT event
+  uint8_t      VR0HotPolarity;  // GPIO polarity for VR0 HOT event
+
+  uint8_t      VR1HotGpio;      // GPIO pin configured for VR1 HOT event
+  uint8_t      VR1HotPolarity;  // GPIO polarity for VR1 HOT event
+  uint8_t      GthrGpio;        // GPIO pin configured for GTHR Event
+  uint8_t      GthrPolarity;    // replace GPIO polarity for GTHR
+
+  // LED Display Settings
+  uint8_t      LedPin0;         // GPIO number for LedPin[0]
+  uint8_t      LedPin1;         // GPIO number for LedPin[1]
+  uint8_t      LedPin2;         // GPIO number for LedPin[2]
+  uint8_t      padding8_4;
+
+  // GFXCLK PLL Spread Spectrum
+  uint8_t      PllGfxclkSpreadEnabled;   // on or off
+  uint8_t      PllGfxclkSpreadPercent;   // Q4.4
+  uint16_t     PllGfxclkSpreadFreq;      // kHz
+
+  // GFXCLK DFLL Spread Spectrum
+  uint8_t      DfllGfxclkSpreadEnabled;   // on or off
+  uint8_t      DfllGfxclkSpreadPercent;   // Q4.4
+  uint16_t     DfllGfxclkSpreadFreq;      // kHz
+
+  // UCLK Spread Spectrum
+  uint8_t      UclkSpreadEnabled;   // on or off
+  uint8_t      UclkSpreadPercent;   // Q4.4
+  uint16_t     UclkSpreadFreq;      // kHz
+
+  // SOCCLK Spread Spectrum
+  uint8_t      SoclkSpreadEnabled;   // on or off
+  uint8_t      SocclkSpreadPercent;   // Q4.4
+  uint16_t     SocclkSpreadFreq;      // kHz
+
+  // Total board power
+  uint16_t     TotalBoardPower;     //Only needed for TCP Estimated case, 
where TCP = TGP+Total Board Power
+  uint16_t     BoardPadding;
+
+  // Mvdd Svi2 Div Ratio Setting
+  uint32_t     MvddRatio; // This is used for MVDD Vid workaround. It has 16 
fractional bits (Q16.16)
+
+  // GPIO pins for I2C communications with 2nd controller for Input Telemetry 
Sequence
+  uint8_t      GpioI2cScl;          // Serial Clock
+  uint8_t      GpioI2cSda;          // Serial Data
+  uint16_t     GpioPadding;
+
+  // Additional LED Display Settings
+  uint8_t      LedPin3;         // GPIO number for LedPin[3] - PCIE GEN Speed
+  uint8_t      LedPin4;         // GPIO number for LedPin[4] - PMFW Error 
Status
+  uint16_t     LedEnableMask;
+
+  // Power Limit Scalars
+  uint8_t      PowerLimitScalar[4];    //[PPT_THROTTLER_COUNT]
+
+  uint8_t      MvddUlvPhaseSheddingMask;
+  uint8_t      VddciUlvPhaseSheddingMask;
+  uint8_t      Padding8_Psi1;
+  uint8_t      Padding8_Psi2;
+
+  uint32_t     BoardReserved[5];
+};
+
 /* 
   ***************************************************************************
     Data Table asic_profiling_info  structure
diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c 
b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
index 6e41f3c9ff1b..dd709e253888 100644
--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
@@ -421,6 +421,7 @@ static int navi10_append_powerplay_table(struct smu_context 
*smu)
        struct smu_table_context *table_context = &smu->smu_table;
        PPTable_t *smc_pptable = table_context->driver_pptable;
        struct atom_smc_dpm_info_v4_5 *smc_dpm_table;
+       struct atom_smc_dpm_info_v4_7 *smc_dpm_table_v4_7;
        int index, ret;
 
        index = 
get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
@@ -431,77 +432,33 @@ static int navi10_append_powerplay_table(struct 
smu_context *smu)
        if (ret)
                return ret;
 
-       memcpy(smc_pptable->I2cControllers, smc_dpm_table->I2cControllers,
-              sizeof(I2cControllerConfig_t) * NUM_I2C_CONTROLLERS);
-
-       /* SVI2 Board Parameters */
-       smc_pptable->MaxVoltageStepGfx = smc_dpm_table->MaxVoltageStepGfx;
-       smc_pptable->MaxVoltageStepSoc = smc_dpm_table->MaxVoltageStepSoc;
-       smc_pptable->VddGfxVrMapping = smc_dpm_table->VddGfxVrMapping;
-       smc_pptable->VddSocVrMapping = smc_dpm_table->VddSocVrMapping;
-       smc_pptable->VddMem0VrMapping = smc_dpm_table->VddMem0VrMapping;
-       smc_pptable->VddMem1VrMapping = smc_dpm_table->VddMem1VrMapping;
-       smc_pptable->GfxUlvPhaseSheddingMask = 
smc_dpm_table->GfxUlvPhaseSheddingMask;
-       smc_pptable->SocUlvPhaseSheddingMask = 
smc_dpm_table->SocUlvPhaseSheddingMask;
-       smc_pptable->ExternalSensorPresent = 
smc_dpm_table->ExternalSensorPresent;
-       smc_pptable->Padding8_V = smc_dpm_table->Padding8_V;
-
-       /* Telemetry Settings */
-       smc_pptable->GfxMaxCurrent = smc_dpm_table->GfxMaxCurrent;
-       smc_pptable->GfxOffset = smc_dpm_table->GfxOffset;
-       smc_pptable->Padding_TelemetryGfx = smc_dpm_table->Padding_TelemetryGfx;
-       smc_pptable->SocMaxCurrent = smc_dpm_table->SocMaxCurrent;
-       smc_pptable->SocOffset = smc_dpm_table->SocOffset;
-       smc_pptable->Padding_TelemetrySoc = smc_dpm_table->Padding_TelemetrySoc;
-       smc_pptable->Mem0MaxCurrent = smc_dpm_table->Mem0MaxCurrent;
-       smc_pptable->Mem0Offset = smc_dpm_table->Mem0Offset;
-       smc_pptable->Padding_TelemetryMem0 = 
smc_dpm_table->Padding_TelemetryMem0;
-       smc_pptable->Mem1MaxCurrent = smc_dpm_table->Mem1MaxCurrent;
-       smc_pptable->Mem1Offset = smc_dpm_table->Mem1Offset;
-       smc_pptable->Padding_TelemetryMem1 = 
smc_dpm_table->Padding_TelemetryMem1;
-
-       /* GPIO Settings */
-       smc_pptable->AcDcGpio = smc_dpm_table->AcDcGpio;
-       smc_pptable->AcDcPolarity = smc_dpm_table->AcDcPolarity;
-       smc_pptable->VR0HotGpio = smc_dpm_table->VR0HotGpio;
-       smc_pptable->VR0HotPolarity = smc_dpm_table->VR0HotPolarity;
-       smc_pptable->VR1HotGpio = smc_dpm_table->VR1HotGpio;
-       smc_pptable->VR1HotPolarity = smc_dpm_table->VR1HotPolarity;
-       smc_pptable->GthrGpio = smc_dpm_table->GthrGpio;
-       smc_pptable->GthrPolarity = smc_dpm_table->GthrPolarity;
-
-       /* LED Display Settings */
-       smc_pptable->LedPin0 = smc_dpm_table->LedPin0;
-       smc_pptable->LedPin1 = smc_dpm_table->LedPin1;
-       smc_pptable->LedPin2 = smc_dpm_table->LedPin2;
-       smc_pptable->padding8_4 = smc_dpm_table->padding8_4;
-
-       /* GFXCLK PLL Spread Spectrum */
-       smc_pptable->PllGfxclkSpreadEnabled = 
smc_dpm_table->PllGfxclkSpreadEnabled;
-       smc_pptable->PllGfxclkSpreadPercent = 
smc_dpm_table->PllGfxclkSpreadPercent;
-       smc_pptable->PllGfxclkSpreadFreq = smc_dpm_table->PllGfxclkSpreadFreq;
-
-       /* GFXCLK DFLL Spread Spectrum */
-       smc_pptable->DfllGfxclkSpreadEnabled = 
smc_dpm_table->DfllGfxclkSpreadEnabled;
-       smc_pptable->DfllGfxclkSpreadPercent = 
smc_dpm_table->DfllGfxclkSpreadPercent;
-       smc_pptable->DfllGfxclkSpreadFreq = smc_dpm_table->DfllGfxclkSpreadFreq;
-
-       /* UCLK Spread Spectrum */
-       smc_pptable->UclkSpreadEnabled = smc_dpm_table->UclkSpreadEnabled;
-       smc_pptable->UclkSpreadPercent = smc_dpm_table->UclkSpreadPercent;
-       smc_pptable->UclkSpreadFreq = smc_dpm_table->UclkSpreadFreq;
-
-       /* SOCCLK Spread Spectrum */
-       smc_pptable->SoclkSpreadEnabled = smc_dpm_table->SoclkSpreadEnabled;
-       smc_pptable->SocclkSpreadPercent = smc_dpm_table->SocclkSpreadPercent;
-       smc_pptable->SocclkSpreadFreq = smc_dpm_table->SocclkSpreadFreq;
-
-       /* Total board power */
-       smc_pptable->TotalBoardPower = smc_dpm_table->TotalBoardPower;
-       smc_pptable->BoardPadding = smc_dpm_table->BoardPadding;
-
-       /* Mvdd Svi2 Div Ratio Setting */
-       smc_pptable->MvddRatio = smc_dpm_table->MvddRatio;
+       pr_info("smc_dpm_info table revision(format.content): %d.%d\n",
+                       smc_dpm_table->table_header.format_revision,
+                       smc_dpm_table->table_header.content_revision);
+
+       if (smc_dpm_table->table_header.format_revision != 4) {
+               pr_err("smc_dpm_info table format revision is not 4!\n");
+               return -EINVAL;
+       }
+
+       switch (smc_dpm_table->table_header.content_revision) {
+       case 5: /* nv10 and nv14 */
+               memcpy(smc_pptable->I2cControllers, 
smc_dpm_table->I2cControllers,
+                       sizeof(*smc_dpm_table) - 
sizeof(smc_dpm_table->table_header));
+               break;
+       case 7: /* nv12 */
+               ret = smu_get_atom_data_table(smu, index, NULL, NULL, NULL,
+                                             (uint8_t **)&smc_dpm_table_v4_7);
+               if (ret)
+                       return ret;
+               memcpy(smc_pptable->I2cControllers, 
smc_dpm_table_v4_7->I2cControllers,
+                       sizeof(*smc_dpm_table_v4_7) - 
sizeof(smc_dpm_table_v4_7->table_header));
+               break;
+       default:
+               pr_err("smc_dpm_info with unsupported content revision %d!\n",
+                               smc_dpm_table->table_header.content_revision);
+               return -EINVAL;
+       }
 
        if (adev->pm.pp_feature & PP_GFXOFF_MASK) {
                /* TODO: remove it once SMU fw fix it */
-- 
2.25.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to