linux/drivers/gpu/drm/radeon/ci_dpm.c
<<
>>
Prefs
   1/*
   2 * Copyright 2013 Advanced Micro Devices, Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 */
  23
  24#include <linux/firmware.h>
  25#include <linux/pci.h>
  26#include <linux/seq_file.h>
  27
  28#include "atom.h"
  29#include "ci_dpm.h"
  30#include "cikd.h"
  31#include "r600_dpm.h"
  32#include "radeon.h"
  33#include "radeon_asic.h"
  34#include "radeon_ucode.h"
  35
  36#define MC_CG_ARB_FREQ_F0           0x0a
  37#define MC_CG_ARB_FREQ_F1           0x0b
  38#define MC_CG_ARB_FREQ_F2           0x0c
  39#define MC_CG_ARB_FREQ_F3           0x0d
  40
  41#define SMC_RAM_END 0x40000
  42
  43#define VOLTAGE_SCALE               4
  44#define VOLTAGE_VID_OFFSET_SCALE1    625
  45#define VOLTAGE_VID_OFFSET_SCALE2    100
  46
  47static const struct ci_pt_defaults defaults_hawaii_xt =
  48{
  49        1, 0xF, 0xFD, 0x19, 5, 0x14, 0, 0xB0000,
  50        { 0x2E,  0x00,  0x00,  0x88,  0x00,  0x00,  0x72,  0x60,  0x51,  0xA7,  0x79,  0x6B,  0x90,  0xBD,  0x79  },
  51        { 0x217, 0x217, 0x217, 0x242, 0x242, 0x242, 0x269, 0x269, 0x269, 0x2A1, 0x2A1, 0x2A1, 0x2C9, 0x2C9, 0x2C9 }
  52};
  53
  54static const struct ci_pt_defaults defaults_hawaii_pro =
  55{
  56        1, 0xF, 0xFD, 0x19, 5, 0x14, 0, 0x65062,
  57        { 0x2E,  0x00,  0x00,  0x88,  0x00,  0x00,  0x72,  0x60,  0x51,  0xA7,  0x79,  0x6B,  0x90,  0xBD,  0x79  },
  58        { 0x217, 0x217, 0x217, 0x242, 0x242, 0x242, 0x269, 0x269, 0x269, 0x2A1, 0x2A1, 0x2A1, 0x2C9, 0x2C9, 0x2C9 }
  59};
  60
  61static const struct ci_pt_defaults defaults_bonaire_xt =
  62{
  63        1, 0xF, 0xFD, 0x19, 5, 45, 0, 0xB0000,
  64        { 0x79,  0x253, 0x25D, 0xAE,  0x72,  0x80,  0x83,  0x86,  0x6F,  0xC8,  0xC9,  0xC9,  0x2F,  0x4D,  0x61  },
  65        { 0x17C, 0x172, 0x180, 0x1BC, 0x1B3, 0x1BD, 0x206, 0x200, 0x203, 0x25D, 0x25A, 0x255, 0x2C3, 0x2C5, 0x2B4 }
  66};
  67
  68static const struct ci_pt_defaults defaults_bonaire_pro =
  69{
  70        1, 0xF, 0xFD, 0x19, 5, 45, 0, 0x65062,
  71        { 0x8C,  0x23F, 0x244, 0xA6,  0x83,  0x85,  0x86,  0x86,  0x83,  0xDB,  0xDB,  0xDA,  0x67,  0x60,  0x5F  },
  72        { 0x187, 0x193, 0x193, 0x1C7, 0x1D1, 0x1D1, 0x210, 0x219, 0x219, 0x266, 0x26C, 0x26C, 0x2C9, 0x2CB, 0x2CB }
  73};
  74
  75static const struct ci_pt_defaults defaults_saturn_xt =
  76{
  77        1, 0xF, 0xFD, 0x19, 5, 55, 0, 0x70000,
  78        { 0x8C,  0x247, 0x249, 0xA6,  0x80,  0x81,  0x8B,  0x89,  0x86,  0xC9,  0xCA,  0xC9,  0x4D,  0x4D,  0x4D  },
  79        { 0x187, 0x187, 0x187, 0x1C7, 0x1C7, 0x1C7, 0x210, 0x210, 0x210, 0x266, 0x266, 0x266, 0x2C9, 0x2C9, 0x2C9 }
  80};
  81
  82static const struct ci_pt_defaults defaults_saturn_pro =
  83{
  84        1, 0xF, 0xFD, 0x19, 5, 55, 0, 0x30000,
  85        { 0x96,  0x21D, 0x23B, 0xA1,  0x85,  0x87,  0x83,  0x84,  0x81,  0xE6,  0xE6,  0xE6,  0x71,  0x6A,  0x6A  },
  86        { 0x193, 0x19E, 0x19E, 0x1D2, 0x1DC, 0x1DC, 0x21A, 0x223, 0x223, 0x26E, 0x27E, 0x274, 0x2CF, 0x2D2, 0x2D2 }
  87};
  88
  89static const struct ci_pt_config_reg didt_config_ci[] =
  90{
  91        { 0x10, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
  92        { 0x10, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
  93        { 0x10, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
  94        { 0x10, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
  95        { 0x11, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
  96        { 0x11, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
  97        { 0x11, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
  98        { 0x11, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
  99        { 0x12, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 100        { 0x12, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 101        { 0x12, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 102        { 0x12, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 103        { 0x2, 0x00003fff, 0, 0x4, CISLANDS_CONFIGREG_DIDT_IND },
 104        { 0x2, 0x03ff0000, 16, 0x80, CISLANDS_CONFIGREG_DIDT_IND },
 105        { 0x2, 0x78000000, 27, 0x3, CISLANDS_CONFIGREG_DIDT_IND },
 106        { 0x1, 0x0000ffff, 0, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
 107        { 0x1, 0xffff0000, 16, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
 108        { 0x0, 0x00000001, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 109        { 0x30, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 110        { 0x30, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 111        { 0x30, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 112        { 0x30, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 113        { 0x31, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 114        { 0x31, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 115        { 0x31, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 116        { 0x31, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 117        { 0x32, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 118        { 0x32, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 119        { 0x32, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 120        { 0x32, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 121        { 0x22, 0x00003fff, 0, 0x4, CISLANDS_CONFIGREG_DIDT_IND },
 122        { 0x22, 0x03ff0000, 16, 0x80, CISLANDS_CONFIGREG_DIDT_IND },
 123        { 0x22, 0x78000000, 27, 0x3, CISLANDS_CONFIGREG_DIDT_IND },
 124        { 0x21, 0x0000ffff, 0, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
 125        { 0x21, 0xffff0000, 16, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
 126        { 0x20, 0x00000001, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 127        { 0x50, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 128        { 0x50, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 129        { 0x50, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 130        { 0x50, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 131        { 0x51, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 132        { 0x51, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 133        { 0x51, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 134        { 0x51, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 135        { 0x52, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 136        { 0x52, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 137        { 0x52, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 138        { 0x52, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 139        { 0x42, 0x00003fff, 0, 0x4, CISLANDS_CONFIGREG_DIDT_IND },
 140        { 0x42, 0x03ff0000, 16, 0x80, CISLANDS_CONFIGREG_DIDT_IND },
 141        { 0x42, 0x78000000, 27, 0x3, CISLANDS_CONFIGREG_DIDT_IND },
 142        { 0x41, 0x0000ffff, 0, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
 143        { 0x41, 0xffff0000, 16, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
 144        { 0x40, 0x00000001, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 145        { 0x70, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 146        { 0x70, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 147        { 0x70, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 148        { 0x70, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 149        { 0x71, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 150        { 0x71, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 151        { 0x71, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 152        { 0x71, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 153        { 0x72, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 154        { 0x72, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 155        { 0x72, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 156        { 0x72, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 157        { 0x62, 0x00003fff, 0, 0x4, CISLANDS_CONFIGREG_DIDT_IND },
 158        { 0x62, 0x03ff0000, 16, 0x80, CISLANDS_CONFIGREG_DIDT_IND },
 159        { 0x62, 0x78000000, 27, 0x3, CISLANDS_CONFIGREG_DIDT_IND },
 160        { 0x61, 0x0000ffff, 0, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
 161        { 0x61, 0xffff0000, 16, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
 162        { 0x60, 0x00000001, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
 163        { 0xFFFFFFFF }
 164};
 165
 166extern u8 rv770_get_memory_module_index(struct radeon_device *rdev);
 167extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev,
 168                                       u32 arb_freq_src, u32 arb_freq_dest);
 169extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock);
 170extern u8 si_get_mclk_frequency_ratio(u32 memory_clock, bool strobe_mode);
 171extern void si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev,
 172                                                     u32 max_voltage_steps,
 173                                                     struct atom_voltage_table *voltage_table);
 174extern void cik_enter_rlc_safe_mode(struct radeon_device *rdev);
 175extern void cik_exit_rlc_safe_mode(struct radeon_device *rdev);
 176extern int ci_mc_load_microcode(struct radeon_device *rdev);
 177extern void cik_update_cg(struct radeon_device *rdev,
 178                          u32 block, bool enable);
 179
 180static int ci_get_std_voltage_value_sidd(struct radeon_device *rdev,
 181                                         struct atom_voltage_table_entry *voltage_table,
 182                                         u16 *std_voltage_hi_sidd, u16 *std_voltage_lo_sidd);
 183static int ci_set_power_limit(struct radeon_device *rdev, u32 n);
 184static int ci_set_overdrive_target_tdp(struct radeon_device *rdev,
 185                                       u32 target_tdp);
 186static int ci_update_uvd_dpm(struct radeon_device *rdev, bool gate);
 187
 188static PPSMC_Result ci_send_msg_to_smc(struct radeon_device *rdev, PPSMC_Msg msg);
 189static PPSMC_Result ci_send_msg_to_smc_with_parameter(struct radeon_device *rdev,
 190                                                      PPSMC_Msg msg, u32 parameter);
 191
 192static void ci_thermal_start_smc_fan_control(struct radeon_device *rdev);
 193static void ci_fan_ctrl_set_default_mode(struct radeon_device *rdev);
 194
 195static struct ci_power_info *ci_get_pi(struct radeon_device *rdev)
 196{
 197        struct ci_power_info *pi = rdev->pm.dpm.priv;
 198
 199        return pi;
 200}
 201
 202static struct ci_ps *ci_get_ps(struct radeon_ps *rps)
 203{
 204        struct ci_ps *ps = rps->ps_priv;
 205
 206        return ps;
 207}
 208
 209static void ci_initialize_powertune_defaults(struct radeon_device *rdev)
 210{
 211        struct ci_power_info *pi = ci_get_pi(rdev);
 212
 213        switch (rdev->pdev->device) {
 214        case 0x6649:
 215        case 0x6650:
 216        case 0x6651:
 217        case 0x6658:
 218        case 0x665C:
 219        case 0x665D:
 220        default:
 221                pi->powertune_defaults = &defaults_bonaire_xt;
 222                break;
 223        case 0x6640:
 224        case 0x6641:
 225        case 0x6646:
 226        case 0x6647:
 227                pi->powertune_defaults = &defaults_saturn_xt;
 228                break;
 229        case 0x67B8:
 230        case 0x67B0:
 231                pi->powertune_defaults = &defaults_hawaii_xt;
 232                break;
 233        case 0x67BA:
 234        case 0x67B1:
 235                pi->powertune_defaults = &defaults_hawaii_pro;
 236                break;
 237        case 0x67A0:
 238        case 0x67A1:
 239        case 0x67A2:
 240        case 0x67A8:
 241        case 0x67A9:
 242        case 0x67AA:
 243        case 0x67B9:
 244        case 0x67BE:
 245                pi->powertune_defaults = &defaults_bonaire_xt;
 246                break;
 247        }
 248
 249        pi->dte_tj_offset = 0;
 250
 251        pi->caps_power_containment = true;
 252        pi->caps_cac = false;
 253        pi->caps_sq_ramping = false;
 254        pi->caps_db_ramping = false;
 255        pi->caps_td_ramping = false;
 256        pi->caps_tcp_ramping = false;
 257
 258        if (pi->caps_power_containment) {
 259                pi->caps_cac = true;
 260                if (rdev->family == CHIP_HAWAII)
 261                        pi->enable_bapm_feature = false;
 262                else
 263                        pi->enable_bapm_feature = true;
 264                pi->enable_tdc_limit_feature = true;
 265                pi->enable_pkg_pwr_tracking_feature = true;
 266        }
 267}
 268
 269static u8 ci_convert_to_vid(u16 vddc)
 270{
 271        return (6200 - (vddc * VOLTAGE_SCALE)) / 25;
 272}
 273
 274static int ci_populate_bapm_vddc_vid_sidd(struct radeon_device *rdev)
 275{
 276        struct ci_power_info *pi = ci_get_pi(rdev);
 277        u8 *hi_vid = pi->smc_powertune_table.BapmVddCVidHiSidd;
 278        u8 *lo_vid = pi->smc_powertune_table.BapmVddCVidLoSidd;
 279        u8 *hi2_vid = pi->smc_powertune_table.BapmVddCVidHiSidd2;
 280        u32 i;
 281
 282        if (rdev->pm.dpm.dyn_state.cac_leakage_table.entries == NULL)
 283                return -EINVAL;
 284        if (rdev->pm.dpm.dyn_state.cac_leakage_table.count > 8)
 285                return -EINVAL;
 286        if (rdev->pm.dpm.dyn_state.cac_leakage_table.count !=
 287            rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count)
 288                return -EINVAL;
 289
 290        for (i = 0; i < rdev->pm.dpm.dyn_state.cac_leakage_table.count; i++) {
 291                if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_EVV) {
 292                        lo_vid[i] = ci_convert_to_vid(rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc1);
 293                        hi_vid[i] = ci_convert_to_vid(rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc2);
 294                        hi2_vid[i] = ci_convert_to_vid(rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc3);
 295                } else {
 296                        lo_vid[i] = ci_convert_to_vid(rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc);
 297                        hi_vid[i] = ci_convert_to_vid((u16)rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].leakage);
 298                }
 299        }
 300        return 0;
 301}
 302
 303static int ci_populate_vddc_vid(struct radeon_device *rdev)
 304{
 305        struct ci_power_info *pi = ci_get_pi(rdev);
 306        u8 *vid = pi->smc_powertune_table.VddCVid;
 307        u32 i;
 308
 309        if (pi->vddc_voltage_table.count > 8)
 310                return -EINVAL;
 311
 312        for (i = 0; i < pi->vddc_voltage_table.count; i++)
 313                vid[i] = ci_convert_to_vid(pi->vddc_voltage_table.entries[i].value);
 314
 315        return 0;
 316}
 317
 318static int ci_populate_svi_load_line(struct radeon_device *rdev)
 319{
 320        struct ci_power_info *pi = ci_get_pi(rdev);
 321        const struct ci_pt_defaults *pt_defaults = pi->powertune_defaults;
 322
 323        pi->smc_powertune_table.SviLoadLineEn = pt_defaults->svi_load_line_en;
 324        pi->smc_powertune_table.SviLoadLineVddC = pt_defaults->svi_load_line_vddc;
 325        pi->smc_powertune_table.SviLoadLineTrimVddC = 3;
 326        pi->smc_powertune_table.SviLoadLineOffsetVddC = 0;
 327
 328        return 0;
 329}
 330
 331static int ci_populate_tdc_limit(struct radeon_device *rdev)
 332{
 333        struct ci_power_info *pi = ci_get_pi(rdev);
 334        const struct ci_pt_defaults *pt_defaults = pi->powertune_defaults;
 335        u16 tdc_limit;
 336
 337        tdc_limit = rdev->pm.dpm.dyn_state.cac_tdp_table->tdc * 256;
 338        pi->smc_powertune_table.TDC_VDDC_PkgLimit = cpu_to_be16(tdc_limit);
 339        pi->smc_powertune_table.TDC_VDDC_ThrottleReleaseLimitPerc =
 340                pt_defaults->tdc_vddc_throttle_release_limit_perc;
 341        pi->smc_powertune_table.TDC_MAWt = pt_defaults->tdc_mawt;
 342
 343        return 0;
 344}
 345
 346static int ci_populate_dw8(struct radeon_device *rdev)
 347{
 348        struct ci_power_info *pi = ci_get_pi(rdev);
 349        const struct ci_pt_defaults *pt_defaults = pi->powertune_defaults;
 350        int ret;
 351
 352        ret = ci_read_smc_sram_dword(rdev,
 353                                     SMU7_FIRMWARE_HEADER_LOCATION +
 354                                     offsetof(SMU7_Firmware_Header, PmFuseTable) +
 355                                     offsetof(SMU7_Discrete_PmFuses, TdcWaterfallCtl),
 356                                     (u32 *)&pi->smc_powertune_table.TdcWaterfallCtl,
 357                                     pi->sram_end);
 358        if (ret)
 359                return -EINVAL;
 360        else
 361                pi->smc_powertune_table.TdcWaterfallCtl = pt_defaults->tdc_waterfall_ctl;
 362
 363        return 0;
 364}
 365
 366static int ci_populate_fuzzy_fan(struct radeon_device *rdev)
 367{
 368        struct ci_power_info *pi = ci_get_pi(rdev);
 369
 370        if ((rdev->pm.dpm.fan.fan_output_sensitivity & (1 << 15)) ||
 371            (rdev->pm.dpm.fan.fan_output_sensitivity == 0))
 372                rdev->pm.dpm.fan.fan_output_sensitivity =
 373                        rdev->pm.dpm.fan.default_fan_output_sensitivity;
 374
 375        pi->smc_powertune_table.FuzzyFan_PwmSetDelta =
 376                cpu_to_be16(rdev->pm.dpm.fan.fan_output_sensitivity);
 377
 378        return 0;
 379}
 380
 381static int ci_min_max_v_gnbl_pm_lid_from_bapm_vddc(struct radeon_device *rdev)
 382{
 383        struct ci_power_info *pi = ci_get_pi(rdev);
 384        u8 *hi_vid = pi->smc_powertune_table.BapmVddCVidHiSidd;
 385        u8 *lo_vid = pi->smc_powertune_table.BapmVddCVidLoSidd;
 386        int i, min, max;
 387
 388        min = max = hi_vid[0];
 389        for (i = 0; i < 8; i++) {
 390                if (0 != hi_vid[i]) {
 391                        if (min > hi_vid[i])
 392                                min = hi_vid[i];
 393                        if (max < hi_vid[i])
 394                                max = hi_vid[i];
 395                }
 396
 397                if (0 != lo_vid[i]) {
 398                        if (min > lo_vid[i])
 399                                min = lo_vid[i];
 400                        if (max < lo_vid[i])
 401                                max = lo_vid[i];
 402                }
 403        }
 404
 405        if ((min == 0) || (max == 0))
 406                return -EINVAL;
 407        pi->smc_powertune_table.GnbLPMLMaxVid = (u8)max;
 408        pi->smc_powertune_table.GnbLPMLMinVid = (u8)min;
 409
 410        return 0;
 411}
 412
 413static int ci_populate_bapm_vddc_base_leakage_sidd(struct radeon_device *rdev)
 414{
 415        struct ci_power_info *pi = ci_get_pi(rdev);
 416        u16 hi_sidd = pi->smc_powertune_table.BapmVddCBaseLeakageHiSidd;
 417        u16 lo_sidd = pi->smc_powertune_table.BapmVddCBaseLeakageLoSidd;
 418        struct radeon_cac_tdp_table *cac_tdp_table =
 419                rdev->pm.dpm.dyn_state.cac_tdp_table;
 420
 421        hi_sidd = cac_tdp_table->high_cac_leakage / 100 * 256;
 422        lo_sidd = cac_tdp_table->low_cac_leakage / 100 * 256;
 423
 424        pi->smc_powertune_table.BapmVddCBaseLeakageHiSidd = cpu_to_be16(hi_sidd);
 425        pi->smc_powertune_table.BapmVddCBaseLeakageLoSidd = cpu_to_be16(lo_sidd);
 426
 427        return 0;
 428}
 429
 430static int ci_populate_bapm_parameters_in_dpm_table(struct radeon_device *rdev)
 431{
 432        struct ci_power_info *pi = ci_get_pi(rdev);
 433        const struct ci_pt_defaults *pt_defaults = pi->powertune_defaults;
 434        SMU7_Discrete_DpmTable  *dpm_table = &pi->smc_state_table;
 435        struct radeon_cac_tdp_table *cac_tdp_table =
 436                rdev->pm.dpm.dyn_state.cac_tdp_table;
 437        struct radeon_ppm_table *ppm = rdev->pm.dpm.dyn_state.ppm_table;
 438        int i, j, k;
 439        const u16 *def1;
 440        const u16 *def2;
 441
 442        dpm_table->DefaultTdp = cac_tdp_table->tdp * 256;
 443        dpm_table->TargetTdp = cac_tdp_table->configurable_tdp * 256;
 444
 445        dpm_table->DTETjOffset = (u8)pi->dte_tj_offset;
 446        dpm_table->GpuTjMax =
 447                (u8)(pi->thermal_temp_setting.temperature_high / 1000);
 448        dpm_table->GpuTjHyst = 8;
 449
 450        dpm_table->DTEAmbientTempBase = pt_defaults->dte_ambient_temp_base;
 451
 452        if (ppm) {
 453                dpm_table->PPM_PkgPwrLimit = cpu_to_be16((u16)ppm->dgpu_tdp * 256 / 1000);
 454                dpm_table->PPM_TemperatureLimit = cpu_to_be16((u16)ppm->tj_max * 256);
 455        } else {
 456                dpm_table->PPM_PkgPwrLimit = cpu_to_be16(0);
 457                dpm_table->PPM_TemperatureLimit = cpu_to_be16(0);
 458        }
 459
 460        dpm_table->BAPM_TEMP_GRADIENT = cpu_to_be32(pt_defaults->bapm_temp_gradient);
 461        def1 = pt_defaults->bapmti_r;
 462        def2 = pt_defaults->bapmti_rc;
 463
 464        for (i = 0; i < SMU7_DTE_ITERATIONS; i++) {
 465                for (j = 0; j < SMU7_DTE_SOURCES; j++) {
 466                        for (k = 0; k < SMU7_DTE_SINKS; k++) {
 467                                dpm_table->BAPMTI_R[i][j][k] = cpu_to_be16(*def1);
 468                                dpm_table->BAPMTI_RC[i][j][k] = cpu_to_be16(*def2);
 469                                def1++;
 470                                def2++;
 471                        }
 472                }
 473        }
 474
 475        return 0;
 476}
 477
 478static int ci_populate_pm_base(struct radeon_device *rdev)
 479{
 480        struct ci_power_info *pi = ci_get_pi(rdev);
 481        u32 pm_fuse_table_offset;
 482        int ret;
 483
 484        if (pi->caps_power_containment) {
 485                ret = ci_read_smc_sram_dword(rdev,
 486                                             SMU7_FIRMWARE_HEADER_LOCATION +
 487                                             offsetof(SMU7_Firmware_Header, PmFuseTable),
 488                                             &pm_fuse_table_offset, pi->sram_end);
 489                if (ret)
 490                        return ret;
 491                ret = ci_populate_bapm_vddc_vid_sidd(rdev);
 492                if (ret)
 493                        return ret;
 494                ret = ci_populate_vddc_vid(rdev);
 495                if (ret)
 496                        return ret;
 497                ret = ci_populate_svi_load_line(rdev);
 498                if (ret)
 499                        return ret;
 500                ret = ci_populate_tdc_limit(rdev);
 501                if (ret)
 502                        return ret;
 503                ret = ci_populate_dw8(rdev);
 504                if (ret)
 505                        return ret;
 506                ret = ci_populate_fuzzy_fan(rdev);
 507                if (ret)
 508                        return ret;
 509                ret = ci_min_max_v_gnbl_pm_lid_from_bapm_vddc(rdev);
 510                if (ret)
 511                        return ret;
 512                ret = ci_populate_bapm_vddc_base_leakage_sidd(rdev);
 513                if (ret)
 514                        return ret;
 515                ret = ci_copy_bytes_to_smc(rdev, pm_fuse_table_offset,
 516                                           (u8 *)&pi->smc_powertune_table,
 517                                           sizeof(SMU7_Discrete_PmFuses), pi->sram_end);
 518                if (ret)
 519                        return ret;
 520        }
 521
 522        return 0;
 523}
 524
 525static void ci_do_enable_didt(struct radeon_device *rdev, const bool enable)
 526{
 527        struct ci_power_info *pi = ci_get_pi(rdev);
 528        u32 data;
 529
 530        if (pi->caps_sq_ramping) {
 531                data = RREG32_DIDT(DIDT_SQ_CTRL0);
 532                if (enable)
 533                        data |= DIDT_CTRL_EN;
 534                else
 535                        data &= ~DIDT_CTRL_EN;
 536                WREG32_DIDT(DIDT_SQ_CTRL0, data);
 537        }
 538
 539        if (pi->caps_db_ramping) {
 540                data = RREG32_DIDT(DIDT_DB_CTRL0);
 541                if (enable)
 542                        data |= DIDT_CTRL_EN;
 543                else
 544                        data &= ~DIDT_CTRL_EN;
 545                WREG32_DIDT(DIDT_DB_CTRL0, data);
 546        }
 547
 548        if (pi->caps_td_ramping) {
 549                data = RREG32_DIDT(DIDT_TD_CTRL0);
 550                if (enable)
 551                        data |= DIDT_CTRL_EN;
 552                else
 553                        data &= ~DIDT_CTRL_EN;
 554                WREG32_DIDT(DIDT_TD_CTRL0, data);
 555        }
 556
 557        if (pi->caps_tcp_ramping) {
 558                data = RREG32_DIDT(DIDT_TCP_CTRL0);
 559                if (enable)
 560                        data |= DIDT_CTRL_EN;
 561                else
 562                        data &= ~DIDT_CTRL_EN;
 563                WREG32_DIDT(DIDT_TCP_CTRL0, data);
 564        }
 565}
 566
 567static int ci_program_pt_config_registers(struct radeon_device *rdev,
 568                                          const struct ci_pt_config_reg *cac_config_regs)
 569{
 570        const struct ci_pt_config_reg *config_regs = cac_config_regs;
 571        u32 data;
 572        u32 cache = 0;
 573
 574        if (config_regs == NULL)
 575                return -EINVAL;
 576
 577        while (config_regs->offset != 0xFFFFFFFF) {
 578                if (config_regs->type == CISLANDS_CONFIGREG_CACHE) {
 579                        cache |= ((config_regs->value << config_regs->shift) & config_regs->mask);
 580                } else {
 581                        switch (config_regs->type) {
 582                        case CISLANDS_CONFIGREG_SMC_IND:
 583                                data = RREG32_SMC(config_regs->offset);
 584                                break;
 585                        case CISLANDS_CONFIGREG_DIDT_IND:
 586                                data = RREG32_DIDT(config_regs->offset);
 587                                break;
 588                        default:
 589                                data = RREG32(config_regs->offset << 2);
 590                                break;
 591                        }
 592
 593                        data &= ~config_regs->mask;
 594                        data |= ((config_regs->value << config_regs->shift) & config_regs->mask);
 595                        data |= cache;
 596
 597                        switch (config_regs->type) {
 598                        case CISLANDS_CONFIGREG_SMC_IND:
 599                                WREG32_SMC(config_regs->offset, data);
 600                                break;
 601                        case CISLANDS_CONFIGREG_DIDT_IND:
 602                                WREG32_DIDT(config_regs->offset, data);
 603                                break;
 604                        default:
 605                                WREG32(config_regs->offset << 2, data);
 606                                break;
 607                        }
 608                        cache = 0;
 609                }
 610                config_regs++;
 611        }
 612        return 0;
 613}
 614
 615static int ci_enable_didt(struct radeon_device *rdev, bool enable)
 616{
 617        struct ci_power_info *pi = ci_get_pi(rdev);
 618        int ret;
 619
 620        if (pi->caps_sq_ramping || pi->caps_db_ramping ||
 621            pi->caps_td_ramping || pi->caps_tcp_ramping) {
 622                cik_enter_rlc_safe_mode(rdev);
 623
 624                if (enable) {
 625                        ret = ci_program_pt_config_registers(rdev, didt_config_ci);
 626                        if (ret) {
 627                                cik_exit_rlc_safe_mode(rdev);
 628                                return ret;
 629                        }
 630                }
 631
 632                ci_do_enable_didt(rdev, enable);
 633
 634                cik_exit_rlc_safe_mode(rdev);
 635        }
 636
 637        return 0;
 638}
 639
 640static int ci_enable_power_containment(struct radeon_device *rdev, bool enable)
 641{
 642        struct ci_power_info *pi = ci_get_pi(rdev);
 643        PPSMC_Result smc_result;
 644        int ret = 0;
 645
 646        if (enable) {
 647                pi->power_containment_features = 0;
 648                if (pi->caps_power_containment) {
 649                        if (pi->enable_bapm_feature) {
 650                                smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableDTE);
 651                                if (smc_result != PPSMC_Result_OK)
 652                                        ret = -EINVAL;
 653                                else
 654                                        pi->power_containment_features |= POWERCONTAINMENT_FEATURE_BAPM;
 655                        }
 656
 657                        if (pi->enable_tdc_limit_feature) {
 658                                smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_TDCLimitEnable);
 659                                if (smc_result != PPSMC_Result_OK)
 660                                        ret = -EINVAL;
 661                                else
 662                                        pi->power_containment_features |= POWERCONTAINMENT_FEATURE_TDCLimit;
 663                        }
 664
 665                        if (pi->enable_pkg_pwr_tracking_feature) {
 666                                smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_PkgPwrLimitEnable);
 667                                if (smc_result != PPSMC_Result_OK) {
 668                                        ret = -EINVAL;
 669                                } else {
 670                                        struct radeon_cac_tdp_table *cac_tdp_table =
 671                                                rdev->pm.dpm.dyn_state.cac_tdp_table;
 672                                        u32 default_pwr_limit =
 673                                                (u32)(cac_tdp_table->maximum_power_delivery_limit * 256);
 674
 675                                        pi->power_containment_features |= POWERCONTAINMENT_FEATURE_PkgPwrLimit;
 676
 677                                        ci_set_power_limit(rdev, default_pwr_limit);
 678                                }
 679                        }
 680                }
 681        } else {
 682                if (pi->caps_power_containment && pi->power_containment_features) {
 683                        if (pi->power_containment_features & POWERCONTAINMENT_FEATURE_TDCLimit)
 684                                ci_send_msg_to_smc(rdev, PPSMC_MSG_TDCLimitDisable);
 685
 686                        if (pi->power_containment_features & POWERCONTAINMENT_FEATURE_BAPM)
 687                                ci_send_msg_to_smc(rdev, PPSMC_MSG_DisableDTE);
 688
 689                        if (pi->power_containment_features & POWERCONTAINMENT_FEATURE_PkgPwrLimit)
 690                                ci_send_msg_to_smc(rdev, PPSMC_MSG_PkgPwrLimitDisable);
 691                        pi->power_containment_features = 0;
 692                }
 693        }
 694
 695        return ret;
 696}
 697
 698static int ci_enable_smc_cac(struct radeon_device *rdev, bool enable)
 699{
 700        struct ci_power_info *pi = ci_get_pi(rdev);
 701        PPSMC_Result smc_result;
 702        int ret = 0;
 703
 704        if (pi->caps_cac) {
 705                if (enable) {
 706                        smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableCac);
 707                        if (smc_result != PPSMC_Result_OK) {
 708                                ret = -EINVAL;
 709                                pi->cac_enabled = false;
 710                        } else {
 711                                pi->cac_enabled = true;
 712                        }
 713                } else if (pi->cac_enabled) {
 714                        ci_send_msg_to_smc(rdev, PPSMC_MSG_DisableCac);
 715                        pi->cac_enabled = false;
 716                }
 717        }
 718
 719        return ret;
 720}
 721
 722static int ci_enable_thermal_based_sclk_dpm(struct radeon_device *rdev,
 723                                            bool enable)
 724{
 725        struct ci_power_info *pi = ci_get_pi(rdev);
 726        PPSMC_Result smc_result = PPSMC_Result_OK;
 727
 728        if (pi->thermal_sclk_dpm_enabled) {
 729                if (enable)
 730                        smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_ENABLE_THERMAL_DPM);
 731                else
 732                        smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_DISABLE_THERMAL_DPM);
 733        }
 734
 735        if (smc_result == PPSMC_Result_OK)
 736                return 0;
 737        else
 738                return -EINVAL;
 739}
 740
 741static int ci_power_control_set_level(struct radeon_device *rdev)
 742{
 743        struct ci_power_info *pi = ci_get_pi(rdev);
 744        struct radeon_cac_tdp_table *cac_tdp_table =
 745                rdev->pm.dpm.dyn_state.cac_tdp_table;
 746        s32 adjust_percent;
 747        s32 target_tdp;
 748        int ret = 0;
 749        bool adjust_polarity = false; /* ??? */
 750
 751        if (pi->caps_power_containment) {
 752                adjust_percent = adjust_polarity ?
 753                        rdev->pm.dpm.tdp_adjustment : (-1 * rdev->pm.dpm.tdp_adjustment);
 754                target_tdp = ((100 + adjust_percent) *
 755                              (s32)cac_tdp_table->configurable_tdp) / 100;
 756
 757                ret = ci_set_overdrive_target_tdp(rdev, (u32)target_tdp);
 758        }
 759
 760        return ret;
 761}
 762
 763void ci_dpm_powergate_uvd(struct radeon_device *rdev, bool gate)
 764{
 765        struct ci_power_info *pi = ci_get_pi(rdev);
 766
 767        if (pi->uvd_power_gated == gate)
 768                return;
 769
 770        pi->uvd_power_gated = gate;
 771
 772        ci_update_uvd_dpm(rdev, gate);
 773}
 774
 775bool ci_dpm_vblank_too_short(struct radeon_device *rdev)
 776{
 777        struct ci_power_info *pi = ci_get_pi(rdev);
 778        u32 vblank_time = r600_dpm_get_vblank_time(rdev);
 779        u32 switch_limit = pi->mem_gddr5 ? 450 : 300;
 780
 781        /* disable mclk switching if the refresh is >120Hz, even if the
 782        * blanking period would allow it
 783        */
 784        if (r600_dpm_get_vrefresh(rdev) > 120)
 785                return true;
 786
 787        if (vblank_time < switch_limit)
 788                return true;
 789        else
 790                return false;
 791
 792}
 793
 794static void ci_apply_state_adjust_rules(struct radeon_device *rdev,
 795                                        struct radeon_ps *rps)
 796{
 797        struct ci_ps *ps = ci_get_ps(rps);
 798        struct ci_power_info *pi = ci_get_pi(rdev);
 799        struct radeon_clock_and_voltage_limits *max_limits;
 800        bool disable_mclk_switching;
 801        u32 sclk, mclk;
 802        int i;
 803
 804        if (rps->vce_active) {
 805                rps->evclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].evclk;
 806                rps->ecclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].ecclk;
 807        } else {
 808                rps->evclk = 0;
 809                rps->ecclk = 0;
 810        }
 811
 812        if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
 813            ci_dpm_vblank_too_short(rdev))
 814                disable_mclk_switching = true;
 815        else
 816                disable_mclk_switching = false;
 817
 818        if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) == ATOM_PPLIB_CLASSIFICATION_UI_BATTERY)
 819                pi->battery_state = true;
 820        else
 821                pi->battery_state = false;
 822
 823        if (rdev->pm.dpm.ac_power)
 824                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
 825        else
 826                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
 827
 828        if (rdev->pm.dpm.ac_power == false) {
 829                for (i = 0; i < ps->performance_level_count; i++) {
 830                        if (ps->performance_levels[i].mclk > max_limits->mclk)
 831                                ps->performance_levels[i].mclk = max_limits->mclk;
 832                        if (ps->performance_levels[i].sclk > max_limits->sclk)
 833                                ps->performance_levels[i].sclk = max_limits->sclk;
 834                }
 835        }
 836
 837        /* XXX validate the min clocks required for display */
 838
 839        if (disable_mclk_switching) {
 840                mclk  = ps->performance_levels[ps->performance_level_count - 1].mclk;
 841                sclk = ps->performance_levels[0].sclk;
 842        } else {
 843                mclk = ps->performance_levels[0].mclk;
 844                sclk = ps->performance_levels[0].sclk;
 845        }
 846
 847        if (rps->vce_active) {
 848                if (sclk < rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].sclk)
 849                        sclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].sclk;
 850                if (mclk < rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].mclk)
 851                        mclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].mclk;
 852        }
 853
 854        ps->performance_levels[0].sclk = sclk;
 855        ps->performance_levels[0].mclk = mclk;
 856
 857        if (ps->performance_levels[1].sclk < ps->performance_levels[0].sclk)
 858                ps->performance_levels[1].sclk = ps->performance_levels[0].sclk;
 859
 860        if (disable_mclk_switching) {
 861                if (ps->performance_levels[0].mclk < ps->performance_levels[1].mclk)
 862                        ps->performance_levels[0].mclk = ps->performance_levels[1].mclk;
 863        } else {
 864                if (ps->performance_levels[1].mclk < ps->performance_levels[0].mclk)
 865                        ps->performance_levels[1].mclk = ps->performance_levels[0].mclk;
 866        }
 867}
 868
 869static int ci_thermal_set_temperature_range(struct radeon_device *rdev,
 870                                            int min_temp, int max_temp)
 871{
 872        int low_temp = 0 * 1000;
 873        int high_temp = 255 * 1000;
 874        u32 tmp;
 875
 876        if (low_temp < min_temp)
 877                low_temp = min_temp;
 878        if (high_temp > max_temp)
 879                high_temp = max_temp;
 880        if (high_temp < low_temp) {
 881                DRM_ERROR("invalid thermal range: %d - %d\n", low_temp, high_temp);
 882                return -EINVAL;
 883        }
 884
 885        tmp = RREG32_SMC(CG_THERMAL_INT);
 886        tmp &= ~(CI_DIG_THERM_INTH_MASK | CI_DIG_THERM_INTL_MASK);
 887        tmp |= CI_DIG_THERM_INTH(high_temp / 1000) |
 888                CI_DIG_THERM_INTL(low_temp / 1000);
 889        WREG32_SMC(CG_THERMAL_INT, tmp);
 890
 891#if 0
 892        /* XXX: need to figure out how to handle this properly */
 893        tmp = RREG32_SMC(CG_THERMAL_CTRL);
 894        tmp &= DIG_THERM_DPM_MASK;
 895        tmp |= DIG_THERM_DPM(high_temp / 1000);
 896        WREG32_SMC(CG_THERMAL_CTRL, tmp);
 897#endif
 898
 899        rdev->pm.dpm.thermal.min_temp = low_temp;
 900        rdev->pm.dpm.thermal.max_temp = high_temp;
 901
 902        return 0;
 903}
 904
 905static int ci_thermal_enable_alert(struct radeon_device *rdev,
 906                                   bool enable)
 907{
 908        u32 thermal_int = RREG32_SMC(CG_THERMAL_INT);
 909        PPSMC_Result result;
 910
 911        if (enable) {
 912                thermal_int &= ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
 913                WREG32_SMC(CG_THERMAL_INT, thermal_int);
 914                rdev->irq.dpm_thermal = false;
 915                result = ci_send_msg_to_smc(rdev, PPSMC_MSG_Thermal_Cntl_Enable);
 916                if (result != PPSMC_Result_OK) {
 917                        DRM_DEBUG_KMS("Could not enable thermal interrupts.\n");
 918                        return -EINVAL;
 919                }
 920        } else {
 921                thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
 922                WREG32_SMC(CG_THERMAL_INT, thermal_int);
 923                rdev->irq.dpm_thermal = true;
 924                result = ci_send_msg_to_smc(rdev, PPSMC_MSG_Thermal_Cntl_Disable);
 925                if (result != PPSMC_Result_OK) {
 926                        DRM_DEBUG_KMS("Could not disable thermal interrupts.\n");
 927                        return -EINVAL;
 928                }
 929        }
 930
 931        return 0;
 932}
 933
 934static void ci_fan_ctrl_set_static_mode(struct radeon_device *rdev, u32 mode)
 935{
 936        struct ci_power_info *pi = ci_get_pi(rdev);
 937        u32 tmp;
 938
 939        if (pi->fan_ctrl_is_in_default_mode) {
 940                tmp = (RREG32_SMC(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK) >> FDO_PWM_MODE_SHIFT;
 941                pi->fan_ctrl_default_mode = tmp;
 942                tmp = (RREG32_SMC(CG_FDO_CTRL2) & TMIN_MASK) >> TMIN_SHIFT;
 943                pi->t_min = tmp;
 944                pi->fan_ctrl_is_in_default_mode = false;
 945        }
 946
 947        tmp = RREG32_SMC(CG_FDO_CTRL2) & ~TMIN_MASK;
 948        tmp |= TMIN(0);
 949        WREG32_SMC(CG_FDO_CTRL2, tmp);
 950
 951        tmp = RREG32_SMC(CG_FDO_CTRL2) & ~FDO_PWM_MODE_MASK;
 952        tmp |= FDO_PWM_MODE(mode);
 953        WREG32_SMC(CG_FDO_CTRL2, tmp);
 954}
 955
 956static int ci_thermal_setup_fan_table(struct radeon_device *rdev)
 957{
 958        struct ci_power_info *pi = ci_get_pi(rdev);
 959        SMU7_Discrete_FanTable fan_table = { FDO_MODE_HARDWARE };
 960        u32 duty100;
 961        u32 t_diff1, t_diff2, pwm_diff1, pwm_diff2;
 962        u16 fdo_min, slope1, slope2;
 963        u32 reference_clock, tmp;
 964        int ret;
 965        u64 tmp64;
 966
 967        if (!pi->fan_table_start) {
 968                rdev->pm.dpm.fan.ucode_fan_control = false;
 969                return 0;
 970        }
 971
 972        duty100 = (RREG32_SMC(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT;
 973
 974        if (duty100 == 0) {
 975                rdev->pm.dpm.fan.ucode_fan_control = false;
 976                return 0;
 977        }
 978
 979        tmp64 = (u64)rdev->pm.dpm.fan.pwm_min * duty100;
 980        do_div(tmp64, 10000);
 981        fdo_min = (u16)tmp64;
 982
 983        t_diff1 = rdev->pm.dpm.fan.t_med - rdev->pm.dpm.fan.t_min;
 984        t_diff2 = rdev->pm.dpm.fan.t_high - rdev->pm.dpm.fan.t_med;
 985
 986        pwm_diff1 = rdev->pm.dpm.fan.pwm_med - rdev->pm.dpm.fan.pwm_min;
 987        pwm_diff2 = rdev->pm.dpm.fan.pwm_high - rdev->pm.dpm.fan.pwm_med;
 988
 989        slope1 = (u16)((50 + ((16 * duty100 * pwm_diff1) / t_diff1)) / 100);
 990        slope2 = (u16)((50 + ((16 * duty100 * pwm_diff2) / t_diff2)) / 100);
 991
 992        fan_table.TempMin = cpu_to_be16((50 + rdev->pm.dpm.fan.t_min) / 100);
 993        fan_table.TempMed = cpu_to_be16((50 + rdev->pm.dpm.fan.t_med) / 100);
 994        fan_table.TempMax = cpu_to_be16((50 + rdev->pm.dpm.fan.t_max) / 100);
 995
 996        fan_table.Slope1 = cpu_to_be16(slope1);
 997        fan_table.Slope2 = cpu_to_be16(slope2);
 998
 999        fan_table.FdoMin = cpu_to_be16(fdo_min);
1000
1001        fan_table.HystDown = cpu_to_be16(rdev->pm.dpm.fan.t_hyst);
1002
1003        fan_table.HystUp = cpu_to_be16(1);
1004
1005        fan_table.HystSlope = cpu_to_be16(1);
1006
1007        fan_table.TempRespLim = cpu_to_be16(5);
1008
1009        reference_clock = radeon_get_xclk(rdev);
1010
1011        fan_table.RefreshPeriod = cpu_to_be32((rdev->pm.dpm.fan.cycle_delay *
1012                                               reference_clock) / 1600);
1013
1014        fan_table.FdoMax = cpu_to_be16((u16)duty100);
1015
1016        tmp = (RREG32_SMC(CG_MULT_THERMAL_CTRL) & TEMP_SEL_MASK) >> TEMP_SEL_SHIFT;
1017        fan_table.TempSrc = (uint8_t)tmp;
1018
1019        ret = ci_copy_bytes_to_smc(rdev,
1020                                   pi->fan_table_start,
1021                                   (u8 *)(&fan_table),
1022                                   sizeof(fan_table),
1023                                   pi->sram_end);
1024
1025        if (ret) {
1026                DRM_ERROR("Failed to load fan table to the SMC.");
1027                rdev->pm.dpm.fan.ucode_fan_control = false;
1028        }
1029
1030        return 0;
1031}
1032
1033static int ci_fan_ctrl_start_smc_fan_control(struct radeon_device *rdev)
1034{
1035        struct ci_power_info *pi = ci_get_pi(rdev);
1036        PPSMC_Result ret;
1037
1038        if (pi->caps_od_fuzzy_fan_control_support) {
1039                ret = ci_send_msg_to_smc_with_parameter(rdev,
1040                                                        PPSMC_StartFanControl,
1041                                                        FAN_CONTROL_FUZZY);
1042                if (ret != PPSMC_Result_OK)
1043                        return -EINVAL;
1044                ret = ci_send_msg_to_smc_with_parameter(rdev,
1045                                                        PPSMC_MSG_SetFanPwmMax,
1046                                                        rdev->pm.dpm.fan.default_max_fan_pwm);
1047                if (ret != PPSMC_Result_OK)
1048                        return -EINVAL;
1049        } else {
1050                ret = ci_send_msg_to_smc_with_parameter(rdev,
1051                                                        PPSMC_StartFanControl,
1052                                                        FAN_CONTROL_TABLE);
1053                if (ret != PPSMC_Result_OK)
1054                        return -EINVAL;
1055        }
1056
1057        pi->fan_is_controlled_by_smc = true;
1058        return 0;
1059}
1060
1061static int ci_fan_ctrl_stop_smc_fan_control(struct radeon_device *rdev)
1062{
1063        PPSMC_Result ret;
1064        struct ci_power_info *pi = ci_get_pi(rdev);
1065
1066        ret = ci_send_msg_to_smc(rdev, PPSMC_StopFanControl);
1067        if (ret == PPSMC_Result_OK) {
1068                pi->fan_is_controlled_by_smc = false;
1069                return 0;
1070        } else
1071                return -EINVAL;
1072}
1073
1074int ci_fan_ctrl_get_fan_speed_percent(struct radeon_device *rdev,
1075                                             u32 *speed)
1076{
1077        u32 duty, duty100;
1078        u64 tmp64;
1079
1080        if (rdev->pm.no_fan)
1081                return -ENOENT;
1082
1083        duty100 = (RREG32_SMC(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT;
1084        duty = (RREG32_SMC(CG_THERMAL_STATUS) & FDO_PWM_DUTY_MASK) >> FDO_PWM_DUTY_SHIFT;
1085
1086        if (duty100 == 0)
1087                return -EINVAL;
1088
1089        tmp64 = (u64)duty * 100;
1090        do_div(tmp64, duty100);
1091        *speed = (u32)tmp64;
1092
1093        if (*speed > 100)
1094                *speed = 100;
1095
1096        return 0;
1097}
1098
1099int ci_fan_ctrl_set_fan_speed_percent(struct radeon_device *rdev,
1100                                             u32 speed)
1101{
1102        u32 tmp;
1103        u32 duty, duty100;
1104        u64 tmp64;
1105        struct ci_power_info *pi = ci_get_pi(rdev);
1106
1107        if (rdev->pm.no_fan)
1108                return -ENOENT;
1109
1110        if (pi->fan_is_controlled_by_smc)
1111                return -EINVAL;
1112
1113        if (speed > 100)
1114                return -EINVAL;
1115
1116        duty100 = (RREG32_SMC(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT;
1117
1118        if (duty100 == 0)
1119                return -EINVAL;
1120
1121        tmp64 = (u64)speed * duty100;
1122        do_div(tmp64, 100);
1123        duty = (u32)tmp64;
1124
1125        tmp = RREG32_SMC(CG_FDO_CTRL0) & ~FDO_STATIC_DUTY_MASK;
1126        tmp |= FDO_STATIC_DUTY(duty);
1127        WREG32_SMC(CG_FDO_CTRL0, tmp);
1128
1129        return 0;
1130}
1131
1132void ci_fan_ctrl_set_mode(struct radeon_device *rdev, u32 mode)
1133{
1134        if (mode) {
1135                /* stop auto-manage */
1136                if (rdev->pm.dpm.fan.ucode_fan_control)
1137                        ci_fan_ctrl_stop_smc_fan_control(rdev);
1138                ci_fan_ctrl_set_static_mode(rdev, mode);
1139        } else {
1140                /* restart auto-manage */
1141                if (rdev->pm.dpm.fan.ucode_fan_control)
1142                        ci_thermal_start_smc_fan_control(rdev);
1143                else
1144                        ci_fan_ctrl_set_default_mode(rdev);
1145        }
1146}
1147
1148u32 ci_fan_ctrl_get_mode(struct radeon_device *rdev)
1149{
1150        struct ci_power_info *pi = ci_get_pi(rdev);
1151        u32 tmp;
1152
1153        if (pi->fan_is_controlled_by_smc)
1154                return 0;
1155
1156        tmp = RREG32_SMC(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK;
1157        return (tmp >> FDO_PWM_MODE_SHIFT);
1158}
1159
1160#if 0
1161static int ci_fan_ctrl_get_fan_speed_rpm(struct radeon_device *rdev,
1162                                         u32 *speed)
1163{
1164        u32 tach_period;
1165        u32 xclk = radeon_get_xclk(rdev);
1166
1167        if (rdev->pm.no_fan)
1168                return -ENOENT;
1169
1170        if (rdev->pm.fan_pulses_per_revolution == 0)
1171                return -ENOENT;
1172
1173        tach_period = (RREG32_SMC(CG_TACH_STATUS) & TACH_PERIOD_MASK) >> TACH_PERIOD_SHIFT;
1174        if (tach_period == 0)
1175                return -ENOENT;
1176
1177        *speed = 60 * xclk * 10000 / tach_period;
1178
1179        return 0;
1180}
1181
1182static int ci_fan_ctrl_set_fan_speed_rpm(struct radeon_device *rdev,
1183                                         u32 speed)
1184{
1185        u32 tach_period, tmp;
1186        u32 xclk = radeon_get_xclk(rdev);
1187
1188        if (rdev->pm.no_fan)
1189                return -ENOENT;
1190
1191        if (rdev->pm.fan_pulses_per_revolution == 0)
1192                return -ENOENT;
1193
1194        if ((speed < rdev->pm.fan_min_rpm) ||
1195            (speed > rdev->pm.fan_max_rpm))
1196                return -EINVAL;
1197
1198        if (rdev->pm.dpm.fan.ucode_fan_control)
1199                ci_fan_ctrl_stop_smc_fan_control(rdev);
1200
1201        tach_period = 60 * xclk * 10000 / (8 * speed);
1202        tmp = RREG32_SMC(CG_TACH_CTRL) & ~TARGET_PERIOD_MASK;
1203        tmp |= TARGET_PERIOD(tach_period);
1204        WREG32_SMC(CG_TACH_CTRL, tmp);
1205
1206        ci_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC_RPM);
1207
1208        return 0;
1209}
1210#endif
1211
1212static void ci_fan_ctrl_set_default_mode(struct radeon_device *rdev)
1213{
1214        struct ci_power_info *pi = ci_get_pi(rdev);
1215        u32 tmp;
1216
1217        if (!pi->fan_ctrl_is_in_default_mode) {
1218                tmp = RREG32_SMC(CG_FDO_CTRL2) & ~FDO_PWM_MODE_MASK;
1219                tmp |= FDO_PWM_MODE(pi->fan_ctrl_default_mode);
1220                WREG32_SMC(CG_FDO_CTRL2, tmp);
1221
1222                tmp = RREG32_SMC(CG_FDO_CTRL2) & ~TMIN_MASK;
1223                tmp |= TMIN(pi->t_min);
1224                WREG32_SMC(CG_FDO_CTRL2, tmp);
1225                pi->fan_ctrl_is_in_default_mode = true;
1226        }
1227}
1228
1229static void ci_thermal_start_smc_fan_control(struct radeon_device *rdev)
1230{
1231        if (rdev->pm.dpm.fan.ucode_fan_control) {
1232                ci_fan_ctrl_start_smc_fan_control(rdev);
1233                ci_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC);
1234        }
1235}
1236
1237static void ci_thermal_initialize(struct radeon_device *rdev)
1238{
1239        u32 tmp;
1240
1241        if (rdev->pm.fan_pulses_per_revolution) {
1242                tmp = RREG32_SMC(CG_TACH_CTRL) & ~EDGE_PER_REV_MASK;
1243                tmp |= EDGE_PER_REV(rdev->pm.fan_pulses_per_revolution -1);
1244                WREG32_SMC(CG_TACH_CTRL, tmp);
1245        }
1246
1247        tmp = RREG32_SMC(CG_FDO_CTRL2) & ~TACH_PWM_RESP_RATE_MASK;
1248        tmp |= TACH_PWM_RESP_RATE(0x28);
1249        WREG32_SMC(CG_FDO_CTRL2, tmp);
1250}
1251
1252static int ci_thermal_start_thermal_controller(struct radeon_device *rdev)
1253{
1254        int ret;
1255
1256        ci_thermal_initialize(rdev);
1257        ret = ci_thermal_set_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX);
1258        if (ret)
1259                return ret;
1260        ret = ci_thermal_enable_alert(rdev, true);
1261        if (ret)
1262                return ret;
1263        if (rdev->pm.dpm.fan.ucode_fan_control) {
1264                ret = ci_thermal_setup_fan_table(rdev);
1265                if (ret)
1266                        return ret;
1267                ci_thermal_start_smc_fan_control(rdev);
1268        }
1269
1270        return 0;
1271}
1272
1273static void ci_thermal_stop_thermal_controller(struct radeon_device *rdev)
1274{
1275        if (!rdev->pm.no_fan)
1276                ci_fan_ctrl_set_default_mode(rdev);
1277}
1278
1279#if 0
1280static int ci_read_smc_soft_register(struct radeon_device *rdev,
1281                                     u16 reg_offset, u32 *value)
1282{
1283        struct ci_power_info *pi = ci_get_pi(rdev);
1284
1285        return ci_read_smc_sram_dword(rdev,
1286                                      pi->soft_regs_start + reg_offset,
1287                                      value, pi->sram_end);
1288}
1289#endif
1290
1291static int ci_write_smc_soft_register(struct radeon_device *rdev,
1292                                      u16 reg_offset, u32 value)
1293{
1294        struct ci_power_info *pi = ci_get_pi(rdev);
1295
1296        return ci_write_smc_sram_dword(rdev,
1297                                       pi->soft_regs_start + reg_offset,
1298                                       value, pi->sram_end);
1299}
1300
1301static void ci_init_fps_limits(struct radeon_device *rdev)
1302{
1303        struct ci_power_info *pi = ci_get_pi(rdev);
1304        SMU7_Discrete_DpmTable *table = &pi->smc_state_table;
1305
1306        if (pi->caps_fps) {
1307                u16 tmp;
1308
1309                tmp = 45;
1310                table->FpsHighT = cpu_to_be16(tmp);
1311
1312                tmp = 30;
1313                table->FpsLowT = cpu_to_be16(tmp);
1314        }
1315}
1316
1317static int ci_update_sclk_t(struct radeon_device *rdev)
1318{
1319        struct ci_power_info *pi = ci_get_pi(rdev);
1320        int ret = 0;
1321        u32 low_sclk_interrupt_t = 0;
1322
1323        if (pi->caps_sclk_throttle_low_notification) {
1324                low_sclk_interrupt_t = cpu_to_be32(pi->low_sclk_interrupt_t);
1325
1326                ret = ci_copy_bytes_to_smc(rdev,
1327                                           pi->dpm_table_start +
1328                                           offsetof(SMU7_Discrete_DpmTable, LowSclkInterruptT),
1329                                           (u8 *)&low_sclk_interrupt_t,
1330                                           sizeof(u32), pi->sram_end);
1331
1332        }
1333
1334        return ret;
1335}
1336
1337static void ci_get_leakage_voltages(struct radeon_device *rdev)
1338{
1339        struct ci_power_info *pi = ci_get_pi(rdev);
1340        u16 leakage_id, virtual_voltage_id;
1341        u16 vddc, vddci;
1342        int i;
1343
1344        pi->vddc_leakage.count = 0;
1345        pi->vddci_leakage.count = 0;
1346
1347        if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_EVV) {
1348                for (i = 0; i < CISLANDS_MAX_LEAKAGE_COUNT; i++) {
1349                        virtual_voltage_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
1350                        if (radeon_atom_get_voltage_evv(rdev, virtual_voltage_id, &vddc) != 0)
1351                                continue;
1352                        if (vddc != 0 && vddc != virtual_voltage_id) {
1353                                pi->vddc_leakage.actual_voltage[pi->vddc_leakage.count] = vddc;
1354                                pi->vddc_leakage.leakage_id[pi->vddc_leakage.count] = virtual_voltage_id;
1355                                pi->vddc_leakage.count++;
1356                        }
1357                }
1358        } else if (radeon_atom_get_leakage_id_from_vbios(rdev, &leakage_id) == 0) {
1359                for (i = 0; i < CISLANDS_MAX_LEAKAGE_COUNT; i++) {
1360                        virtual_voltage_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
1361                        if (radeon_atom_get_leakage_vddc_based_on_leakage_params(rdev, &vddc, &vddci,
1362                                                                                 virtual_voltage_id,
1363                                                                                 leakage_id) == 0) {
1364                                if (vddc != 0 && vddc != virtual_voltage_id) {
1365                                        pi->vddc_leakage.actual_voltage[pi->vddc_leakage.count] = vddc;
1366                                        pi->vddc_leakage.leakage_id[pi->vddc_leakage.count] = virtual_voltage_id;
1367                                        pi->vddc_leakage.count++;
1368                                }
1369                                if (vddci != 0 && vddci != virtual_voltage_id) {
1370                                        pi->vddci_leakage.actual_voltage[pi->vddci_leakage.count] = vddci;
1371                                        pi->vddci_leakage.leakage_id[pi->vddci_leakage.count] = virtual_voltage_id;
1372                                        pi->vddci_leakage.count++;
1373                                }
1374                        }
1375                }
1376        }
1377}
1378
1379static void ci_set_dpm_event_sources(struct radeon_device *rdev, u32 sources)
1380{
1381        struct ci_power_info *pi = ci_get_pi(rdev);
1382        bool want_thermal_protection;
1383        enum radeon_dpm_event_src dpm_event_src;
1384        u32 tmp;
1385
1386        switch (sources) {
1387        case 0:
1388        default:
1389                want_thermal_protection = false;
1390                break;
1391        case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL):
1392                want_thermal_protection = true;
1393                dpm_event_src = RADEON_DPM_EVENT_SRC_DIGITAL;
1394                break;
1395        case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL):
1396                want_thermal_protection = true;
1397                dpm_event_src = RADEON_DPM_EVENT_SRC_EXTERNAL;
1398                break;
1399        case ((1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL) |
1400              (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL)):
1401                want_thermal_protection = true;
1402                dpm_event_src = RADEON_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL;
1403                break;
1404        }
1405
1406        if (want_thermal_protection) {
1407#if 0
1408                /* XXX: need to figure out how to handle this properly */
1409                tmp = RREG32_SMC(CG_THERMAL_CTRL);
1410                tmp &= DPM_EVENT_SRC_MASK;
1411                tmp |= DPM_EVENT_SRC(dpm_event_src);
1412                WREG32_SMC(CG_THERMAL_CTRL, tmp);
1413#endif
1414
1415                tmp = RREG32_SMC(GENERAL_PWRMGT);
1416                if (pi->thermal_protection)
1417                        tmp &= ~THERMAL_PROTECTION_DIS;
1418                else
1419                        tmp |= THERMAL_PROTECTION_DIS;
1420                WREG32_SMC(GENERAL_PWRMGT, tmp);
1421        } else {
1422                tmp = RREG32_SMC(GENERAL_PWRMGT);
1423                tmp |= THERMAL_PROTECTION_DIS;
1424                WREG32_SMC(GENERAL_PWRMGT, tmp);
1425        }
1426}
1427
1428static void ci_enable_auto_throttle_source(struct radeon_device *rdev,
1429                                           enum radeon_dpm_auto_throttle_src source,
1430                                           bool enable)
1431{
1432        struct ci_power_info *pi = ci_get_pi(rdev);
1433
1434        if (enable) {
1435                if (!(pi->active_auto_throttle_sources & (1 << source))) {
1436                        pi->active_auto_throttle_sources |= 1 << source;
1437                        ci_set_dpm_event_sources(rdev, pi->active_auto_throttle_sources);
1438                }
1439        } else {
1440                if (pi->active_auto_throttle_sources & (1 << source)) {
1441                        pi->active_auto_throttle_sources &= ~(1 << source);
1442                        ci_set_dpm_event_sources(rdev, pi->active_auto_throttle_sources);
1443                }
1444        }
1445}
1446
1447static void ci_enable_vr_hot_gpio_interrupt(struct radeon_device *rdev)
1448{
1449        if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REGULATOR_HOT)
1450                ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableVRHotGPIOInterrupt);
1451}
1452
1453static int ci_unfreeze_sclk_mclk_dpm(struct radeon_device *rdev)
1454{
1455        struct ci_power_info *pi = ci_get_pi(rdev);
1456        PPSMC_Result smc_result;
1457
1458        if (!pi->need_update_smu7_dpm_table)
1459                return 0;
1460
1461        if ((!pi->sclk_dpm_key_disabled) &&
1462            (pi->need_update_smu7_dpm_table & (DPMTABLE_OD_UPDATE_SCLK | DPMTABLE_UPDATE_SCLK))) {
1463                smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_SCLKDPM_UnfreezeLevel);
1464                if (smc_result != PPSMC_Result_OK)
1465                        return -EINVAL;
1466        }
1467
1468        if ((!pi->mclk_dpm_key_disabled) &&
1469            (pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK)) {
1470                smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_MCLKDPM_UnfreezeLevel);
1471                if (smc_result != PPSMC_Result_OK)
1472                        return -EINVAL;
1473        }
1474
1475        pi->need_update_smu7_dpm_table = 0;
1476        return 0;
1477}
1478
1479static int ci_enable_sclk_mclk_dpm(struct radeon_device *rdev, bool enable)
1480{
1481        struct ci_power_info *pi = ci_get_pi(rdev);
1482        PPSMC_Result smc_result;
1483
1484        if (enable) {
1485                if (!pi->sclk_dpm_key_disabled) {
1486                        smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_DPM_Enable);
1487                        if (smc_result != PPSMC_Result_OK)
1488                                return -EINVAL;
1489                }
1490
1491                if (!pi->mclk_dpm_key_disabled) {
1492                        smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_MCLKDPM_Enable);
1493                        if (smc_result != PPSMC_Result_OK)
1494                                return -EINVAL;
1495
1496                        WREG32_P(MC_SEQ_CNTL_3, CAC_EN, ~CAC_EN);
1497
1498                        WREG32_SMC(LCAC_MC0_CNTL, 0x05);
1499                        WREG32_SMC(LCAC_MC1_CNTL, 0x05);
1500                        WREG32_SMC(LCAC_CPL_CNTL, 0x100005);
1501
1502                        udelay(10);
1503
1504                        WREG32_SMC(LCAC_MC0_CNTL, 0x400005);
1505                        WREG32_SMC(LCAC_MC1_CNTL, 0x400005);
1506                        WREG32_SMC(LCAC_CPL_CNTL, 0x500005);
1507                }
1508        } else {
1509                if (!pi->sclk_dpm_key_disabled) {
1510                        smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_DPM_Disable);
1511                        if (smc_result != PPSMC_Result_OK)
1512                                return -EINVAL;
1513                }
1514
1515                if (!pi->mclk_dpm_key_disabled) {
1516                        smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_MCLKDPM_Disable);
1517                        if (smc_result != PPSMC_Result_OK)
1518                                return -EINVAL;
1519                }
1520        }
1521
1522        return 0;
1523}
1524
1525static int ci_start_dpm(struct radeon_device *rdev)
1526{
1527        struct ci_power_info *pi = ci_get_pi(rdev);
1528        PPSMC_Result smc_result;
1529        int ret;
1530        u32 tmp;
1531
1532        tmp = RREG32_SMC(GENERAL_PWRMGT);
1533        tmp |= GLOBAL_PWRMGT_EN;
1534        WREG32_SMC(GENERAL_PWRMGT, tmp);
1535
1536        tmp = RREG32_SMC(SCLK_PWRMGT_CNTL);
1537        tmp |= DYNAMIC_PM_EN;
1538        WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
1539
1540        ci_write_smc_soft_register(rdev, offsetof(SMU7_SoftRegisters, VoltageChangeTimeout), 0x1000);
1541
1542        WREG32_P(BIF_LNCNT_RESET, 0, ~RESET_LNCNT_EN);
1543
1544        smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_Voltage_Cntl_Enable);
1545        if (smc_result != PPSMC_Result_OK)
1546                return -EINVAL;
1547
1548        ret = ci_enable_sclk_mclk_dpm(rdev, true);
1549        if (ret)
1550                return ret;
1551
1552        if (!pi->pcie_dpm_key_disabled) {
1553                smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_PCIeDPM_Enable);
1554                if (smc_result != PPSMC_Result_OK)
1555                        return -EINVAL;
1556        }
1557
1558        return 0;
1559}
1560
1561static int ci_freeze_sclk_mclk_dpm(struct radeon_device *rdev)
1562{
1563        struct ci_power_info *pi = ci_get_pi(rdev);
1564        PPSMC_Result smc_result;
1565
1566        if (!pi->need_update_smu7_dpm_table)
1567                return 0;
1568
1569        if ((!pi->sclk_dpm_key_disabled) &&
1570            (pi->need_update_smu7_dpm_table & (DPMTABLE_OD_UPDATE_SCLK | DPMTABLE_UPDATE_SCLK))) {
1571                smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_SCLKDPM_FreezeLevel);
1572                if (smc_result != PPSMC_Result_OK)
1573                        return -EINVAL;
1574        }
1575
1576        if ((!pi->mclk_dpm_key_disabled) &&
1577            (pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK)) {
1578                smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_MCLKDPM_FreezeLevel);
1579                if (smc_result != PPSMC_Result_OK)
1580                        return -EINVAL;
1581        }
1582
1583        return 0;
1584}
1585
1586static int ci_stop_dpm(struct radeon_device *rdev)
1587{
1588        struct ci_power_info *pi = ci_get_pi(rdev);
1589        PPSMC_Result smc_result;
1590        int ret;
1591        u32 tmp;
1592
1593        tmp = RREG32_SMC(GENERAL_PWRMGT);
1594        tmp &= ~GLOBAL_PWRMGT_EN;
1595        WREG32_SMC(GENERAL_PWRMGT, tmp);
1596
1597        tmp = RREG32_SMC(SCLK_PWRMGT_CNTL);
1598        tmp &= ~DYNAMIC_PM_EN;
1599        WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
1600
1601        if (!pi->pcie_dpm_key_disabled) {
1602                smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_PCIeDPM_Disable);
1603                if (smc_result != PPSMC_Result_OK)
1604                        return -EINVAL;
1605        }
1606
1607        ret = ci_enable_sclk_mclk_dpm(rdev, false);
1608        if (ret)
1609                return ret;
1610
1611        smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_Voltage_Cntl_Disable);
1612        if (smc_result != PPSMC_Result_OK)
1613                return -EINVAL;
1614
1615        return 0;
1616}
1617
1618static void ci_enable_sclk_control(struct radeon_device *rdev, bool enable)
1619{
1620        u32 tmp = RREG32_SMC(SCLK_PWRMGT_CNTL);
1621
1622        if (enable)
1623                tmp &= ~SCLK_PWRMGT_OFF;
1624        else
1625                tmp |= SCLK_PWRMGT_OFF;
1626        WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
1627}
1628
1629#if 0
1630static int ci_notify_hw_of_power_source(struct radeon_device *rdev,
1631                                        bool ac_power)
1632{
1633        struct ci_power_info *pi = ci_get_pi(rdev);
1634        struct radeon_cac_tdp_table *cac_tdp_table =
1635                rdev->pm.dpm.dyn_state.cac_tdp_table;
1636        u32 power_limit;
1637
1638        if (ac_power)
1639                power_limit = (u32)(cac_tdp_table->maximum_power_delivery_limit * 256);
1640        else
1641                power_limit = (u32)(cac_tdp_table->battery_power_limit * 256);
1642
1643        ci_set_power_limit(rdev, power_limit);
1644
1645        if (pi->caps_automatic_dc_transition) {
1646                if (ac_power)
1647                        ci_send_msg_to_smc(rdev, PPSMC_MSG_RunningOnAC);
1648                else
1649                        ci_send_msg_to_smc(rdev, PPSMC_MSG_Remove_DC_Clamp);
1650        }
1651
1652        return 0;
1653}
1654#endif
1655
1656static PPSMC_Result ci_send_msg_to_smc(struct radeon_device *rdev, PPSMC_Msg msg)
1657{
1658        u32 tmp;
1659        int i;
1660
1661        if (!ci_is_smc_running(rdev))
1662                return PPSMC_Result_Failed;
1663
1664        WREG32(SMC_MESSAGE_0, msg);
1665
1666        for (i = 0; i < rdev->usec_timeout; i++) {
1667                tmp = RREG32(SMC_RESP_0);
1668                if (tmp != 0)
1669                        break;
1670                udelay(1);
1671        }
1672        tmp = RREG32(SMC_RESP_0);
1673
1674        return (PPSMC_Result)tmp;
1675}
1676
1677static PPSMC_Result ci_send_msg_to_smc_with_parameter(struct radeon_device *rdev,
1678                                                      PPSMC_Msg msg, u32 parameter)
1679{
1680        WREG32(SMC_MSG_ARG_0, parameter);
1681        return ci_send_msg_to_smc(rdev, msg);
1682}
1683
1684static PPSMC_Result ci_send_msg_to_smc_return_parameter(struct radeon_device *rdev,
1685                                                        PPSMC_Msg msg, u32 *parameter)
1686{
1687        PPSMC_Result smc_result;
1688
1689        smc_result = ci_send_msg_to_smc(rdev, msg);
1690
1691        if ((smc_result == PPSMC_Result_OK) && parameter)
1692                *parameter = RREG32(SMC_MSG_ARG_0);
1693
1694        return smc_result;
1695}
1696
1697static int ci_dpm_force_state_sclk(struct radeon_device *rdev, u32 n)
1698{
1699        struct ci_power_info *pi = ci_get_pi(rdev);
1700
1701        if (!pi->sclk_dpm_key_disabled) {
1702                PPSMC_Result smc_result =
1703                        ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SCLKDPM_SetEnabledMask, 1 << n);
1704                if (smc_result != PPSMC_Result_OK)
1705                        return -EINVAL;
1706        }
1707
1708        return 0;
1709}
1710
1711static int ci_dpm_force_state_mclk(struct radeon_device *rdev, u32 n)
1712{
1713        struct ci_power_info *pi = ci_get_pi(rdev);
1714
1715        if (!pi->mclk_dpm_key_disabled) {
1716                PPSMC_Result smc_result =
1717                        ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_MCLKDPM_SetEnabledMask, 1 << n);
1718                if (smc_result != PPSMC_Result_OK)
1719                        return -EINVAL;
1720        }
1721
1722        return 0;
1723}
1724
1725static int ci_dpm_force_state_pcie(struct radeon_device *rdev, u32 n)
1726{
1727        struct ci_power_info *pi = ci_get_pi(rdev);
1728
1729        if (!pi->pcie_dpm_key_disabled) {
1730                PPSMC_Result smc_result =
1731                        ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_PCIeDPM_ForceLevel, n);
1732                if (smc_result != PPSMC_Result_OK)
1733                        return -EINVAL;
1734        }
1735
1736        return 0;
1737}
1738
1739static int ci_set_power_limit(struct radeon_device *rdev, u32 n)
1740{
1741        struct ci_power_info *pi = ci_get_pi(rdev);
1742
1743        if (pi->power_containment_features & POWERCONTAINMENT_FEATURE_PkgPwrLimit) {
1744                PPSMC_Result smc_result =
1745                        ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_PkgPwrSetLimit, n);
1746                if (smc_result != PPSMC_Result_OK)
1747                        return -EINVAL;
1748        }
1749
1750        return 0;
1751}
1752
1753static int ci_set_overdrive_target_tdp(struct radeon_device *rdev,
1754                                       u32 target_tdp)
1755{
1756        PPSMC_Result smc_result =
1757                ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_OverDriveSetTargetTdp, target_tdp);
1758        if (smc_result != PPSMC_Result_OK)
1759                return -EINVAL;
1760        return 0;
1761}
1762
1763#if 0
1764static int ci_set_boot_state(struct radeon_device *rdev)
1765{
1766        return ci_enable_sclk_mclk_dpm(rdev, false);
1767}
1768#endif
1769
1770static u32 ci_get_average_sclk_freq(struct radeon_device *rdev)
1771{
1772        u32 sclk_freq;
1773        PPSMC_Result smc_result =
1774                ci_send_msg_to_smc_return_parameter(rdev,
1775                                                    PPSMC_MSG_API_GetSclkFrequency,
1776                                                    &sclk_freq);
1777        if (smc_result != PPSMC_Result_OK)
1778                sclk_freq = 0;
1779
1780        return sclk_freq;
1781}
1782
1783static u32 ci_get_average_mclk_freq(struct radeon_device *rdev)
1784{
1785        u32 mclk_freq;
1786        PPSMC_Result smc_result =
1787                ci_send_msg_to_smc_return_parameter(rdev,
1788                                                    PPSMC_MSG_API_GetMclkFrequency,
1789                                                    &mclk_freq);
1790        if (smc_result != PPSMC_Result_OK)
1791                mclk_freq = 0;
1792
1793        return mclk_freq;
1794}
1795
1796static void ci_dpm_start_smc(struct radeon_device *rdev)
1797{
1798        int i;
1799
1800        ci_program_jump_on_start(rdev);
1801        ci_start_smc_clock(rdev);
1802        ci_start_smc(rdev);
1803        for (i = 0; i < rdev->usec_timeout; i++) {
1804                if (RREG32_SMC(FIRMWARE_FLAGS) & INTERRUPTS_ENABLED)
1805                        break;
1806        }
1807}
1808
1809static void ci_dpm_stop_smc(struct radeon_device *rdev)
1810{
1811        ci_reset_smc(rdev);
1812        ci_stop_smc_clock(rdev);
1813}
1814
1815static int ci_process_firmware_header(struct radeon_device *rdev)
1816{
1817        struct ci_power_info *pi = ci_get_pi(rdev);
1818        u32 tmp;
1819        int ret;
1820
1821        ret = ci_read_smc_sram_dword(rdev,
1822                                     SMU7_FIRMWARE_HEADER_LOCATION +
1823                                     offsetof(SMU7_Firmware_Header, DpmTable),
1824                                     &tmp, pi->sram_end);
1825        if (ret)
1826                return ret;
1827
1828        pi->dpm_table_start = tmp;
1829
1830        ret = ci_read_smc_sram_dword(rdev,
1831                                     SMU7_FIRMWARE_HEADER_LOCATION +
1832                                     offsetof(SMU7_Firmware_Header, SoftRegisters),
1833                                     &tmp, pi->sram_end);
1834        if (ret)
1835                return ret;
1836
1837        pi->soft_regs_start = tmp;
1838
1839        ret = ci_read_smc_sram_dword(rdev,
1840                                     SMU7_FIRMWARE_HEADER_LOCATION +
1841                                     offsetof(SMU7_Firmware_Header, mcRegisterTable),
1842                                     &tmp, pi->sram_end);
1843        if (ret)
1844                return ret;
1845
1846        pi->mc_reg_table_start = tmp;
1847
1848        ret = ci_read_smc_sram_dword(rdev,
1849                                     SMU7_FIRMWARE_HEADER_LOCATION +
1850                                     offsetof(SMU7_Firmware_Header, FanTable),
1851                                     &tmp, pi->sram_end);
1852        if (ret)
1853                return ret;
1854
1855        pi->fan_table_start = tmp;
1856
1857        ret = ci_read_smc_sram_dword(rdev,
1858                                     SMU7_FIRMWARE_HEADER_LOCATION +
1859                                     offsetof(SMU7_Firmware_Header, mcArbDramTimingTable),
1860                                     &tmp, pi->sram_end);
1861        if (ret)
1862                return ret;
1863
1864        pi->arb_table_start = tmp;
1865
1866        return 0;
1867}
1868
1869static void ci_read_clock_registers(struct radeon_device *rdev)
1870{
1871        struct ci_power_info *pi = ci_get_pi(rdev);
1872
1873        pi->clock_registers.cg_spll_func_cntl =
1874                RREG32_SMC(CG_SPLL_FUNC_CNTL);
1875        pi->clock_registers.cg_spll_func_cntl_2 =
1876                RREG32_SMC(CG_SPLL_FUNC_CNTL_2);
1877        pi->clock_registers.cg_spll_func_cntl_3 =
1878                RREG32_SMC(CG_SPLL_FUNC_CNTL_3);
1879        pi->clock_registers.cg_spll_func_cntl_4 =
1880                RREG32_SMC(CG_SPLL_FUNC_CNTL_4);
1881        pi->clock_registers.cg_spll_spread_spectrum =
1882                RREG32_SMC(CG_SPLL_SPREAD_SPECTRUM);
1883        pi->clock_registers.cg_spll_spread_spectrum_2 =
1884                RREG32_SMC(CG_SPLL_SPREAD_SPECTRUM_2);
1885        pi->clock_registers.dll_cntl = RREG32(DLL_CNTL);
1886        pi->clock_registers.mclk_pwrmgt_cntl = RREG32(MCLK_PWRMGT_CNTL);
1887        pi->clock_registers.mpll_ad_func_cntl = RREG32(MPLL_AD_FUNC_CNTL);
1888        pi->clock_registers.mpll_dq_func_cntl = RREG32(MPLL_DQ_FUNC_CNTL);
1889        pi->clock_registers.mpll_func_cntl = RREG32(MPLL_FUNC_CNTL);
1890        pi->clock_registers.mpll_func_cntl_1 = RREG32(MPLL_FUNC_CNTL_1);
1891        pi->clock_registers.mpll_func_cntl_2 = RREG32(MPLL_FUNC_CNTL_2);
1892        pi->clock_registers.mpll_ss1 = RREG32(MPLL_SS1);
1893        pi->clock_registers.mpll_ss2 = RREG32(MPLL_SS2);
1894}
1895
1896static void ci_init_sclk_t(struct radeon_device *rdev)
1897{
1898        struct ci_power_info *pi = ci_get_pi(rdev);
1899
1900        pi->low_sclk_interrupt_t = 0;
1901}
1902
1903static void ci_enable_thermal_protection(struct radeon_device *rdev,
1904                                         bool enable)
1905{
1906        u32 tmp = RREG32_SMC(GENERAL_PWRMGT);
1907
1908        if (enable)
1909                tmp &= ~THERMAL_PROTECTION_DIS;
1910        else
1911                tmp |= THERMAL_PROTECTION_DIS;
1912        WREG32_SMC(GENERAL_PWRMGT, tmp);
1913}
1914
1915static void ci_enable_acpi_power_management(struct radeon_device *rdev)
1916{
1917        u32 tmp = RREG32_SMC(GENERAL_PWRMGT);
1918
1919        tmp |= STATIC_PM_EN;
1920
1921        WREG32_SMC(GENERAL_PWRMGT, tmp);
1922}
1923
1924#if 0
1925static int ci_enter_ulp_state(struct radeon_device *rdev)
1926{
1927
1928        WREG32(SMC_MESSAGE_0, PPSMC_MSG_SwitchToMinimumPower);
1929
1930        udelay(25000);
1931
1932        return 0;
1933}
1934
1935static int ci_exit_ulp_state(struct radeon_device *rdev)
1936{
1937        int i;
1938
1939        WREG32(SMC_MESSAGE_0, PPSMC_MSG_ResumeFromMinimumPower);
1940
1941        udelay(7000);
1942
1943        for (i = 0; i < rdev->usec_timeout; i++) {
1944                if (RREG32(SMC_RESP_0) == 1)
1945                        break;
1946                udelay(1000);
1947        }
1948
1949        return 0;
1950}
1951#endif
1952
1953static int ci_notify_smc_display_change(struct radeon_device *rdev,
1954                                        bool has_display)
1955{
1956        PPSMC_Msg msg = has_display ? PPSMC_MSG_HasDisplay : PPSMC_MSG_NoDisplay;
1957
1958        return (ci_send_msg_to_smc(rdev, msg) == PPSMC_Result_OK) ?  0 : -EINVAL;
1959}
1960
1961static int ci_enable_ds_master_switch(struct radeon_device *rdev,
1962                                      bool enable)
1963{
1964        struct ci_power_info *pi = ci_get_pi(rdev);
1965
1966        if (enable) {
1967                if (pi->caps_sclk_ds) {
1968                        if (ci_send_msg_to_smc(rdev, PPSMC_MSG_MASTER_DeepSleep_ON) != PPSMC_Result_OK)
1969                                return -EINVAL;
1970                } else {
1971                        if (ci_send_msg_to_smc(rdev, PPSMC_MSG_MASTER_DeepSleep_OFF) != PPSMC_Result_OK)
1972                                return -EINVAL;
1973                }
1974        } else {
1975                if (pi->caps_sclk_ds) {
1976                        if (ci_send_msg_to_smc(rdev, PPSMC_MSG_MASTER_DeepSleep_OFF) != PPSMC_Result_OK)
1977                                return -EINVAL;
1978                }
1979        }
1980
1981        return 0;
1982}
1983
1984static void ci_program_display_gap(struct radeon_device *rdev)
1985{
1986        u32 tmp = RREG32_SMC(CG_DISPLAY_GAP_CNTL);
1987        u32 pre_vbi_time_in_us;
1988        u32 frame_time_in_us;
1989        u32 ref_clock = rdev->clock.spll.reference_freq;
1990        u32 refresh_rate = r600_dpm_get_vrefresh(rdev);
1991        u32 vblank_time = r600_dpm_get_vblank_time(rdev);
1992
1993        tmp &= ~DISP_GAP_MASK;
1994        if (rdev->pm.dpm.new_active_crtc_count > 0)
1995                tmp |= DISP_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM);
1996        else
1997                tmp |= DISP_GAP(R600_PM_DISPLAY_GAP_IGNORE);
1998        WREG32_SMC(CG_DISPLAY_GAP_CNTL, tmp);
1999
2000        if (refresh_rate == 0)
2001                refresh_rate = 60;
2002        if (vblank_time == 0xffffffff)
2003                vblank_time = 500;
2004        frame_time_in_us = 1000000 / refresh_rate;
2005        pre_vbi_time_in_us =
2006                frame_time_in_us - 200 - vblank_time;
2007        tmp = pre_vbi_time_in_us * (ref_clock / 100);
2008
2009        WREG32_SMC(CG_DISPLAY_GAP_CNTL2, tmp);
2010        ci_write_smc_soft_register(rdev, offsetof(SMU7_SoftRegisters, PreVBlankGap), 0x64);
2011        ci_write_smc_soft_register(rdev, offsetof(SMU7_SoftRegisters, VBlankTimeout), (frame_time_in_us - pre_vbi_time_in_us));
2012
2013
2014        ci_notify_smc_display_change(rdev, (rdev->pm.dpm.new_active_crtc_count == 1));
2015
2016}
2017
2018static void ci_enable_spread_spectrum(struct radeon_device *rdev, bool enable)
2019{
2020        struct ci_power_info *pi = ci_get_pi(rdev);
2021        u32 tmp;
2022
2023        if (enable) {
2024                if (pi->caps_sclk_ss_support) {
2025                        tmp = RREG32_SMC(GENERAL_PWRMGT);
2026                        tmp |= DYN_SPREAD_SPECTRUM_EN;
2027                        WREG32_SMC(GENERAL_PWRMGT, tmp);
2028                }
2029        } else {
2030                tmp = RREG32_SMC(CG_SPLL_SPREAD_SPECTRUM);
2031                tmp &= ~SSEN;
2032                WREG32_SMC(CG_SPLL_SPREAD_SPECTRUM, tmp);
2033
2034                tmp = RREG32_SMC(GENERAL_PWRMGT);
2035                tmp &= ~DYN_SPREAD_SPECTRUM_EN;
2036                WREG32_SMC(GENERAL_PWRMGT, tmp);
2037        }
2038}
2039
2040static void ci_program_sstp(struct radeon_device *rdev)
2041{
2042        WREG32_SMC(CG_SSP, (SSTU(R600_SSTU_DFLT) | SST(R600_SST_DFLT)));
2043}
2044
2045static void ci_enable_display_gap(struct radeon_device *rdev)
2046{
2047        u32 tmp = RREG32_SMC(CG_DISPLAY_GAP_CNTL);
2048
2049        tmp &= ~(DISP_GAP_MASK | DISP_GAP_MCHG_MASK);
2050        tmp |= (DISP_GAP(R600_PM_DISPLAY_GAP_IGNORE) |
2051                DISP_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK));
2052
2053        WREG32_SMC(CG_DISPLAY_GAP_CNTL, tmp);
2054}
2055
2056static void ci_program_vc(struct radeon_device *rdev)
2057{
2058        u32 tmp;
2059
2060        tmp = RREG32_SMC(SCLK_PWRMGT_CNTL);
2061        tmp &= ~(RESET_SCLK_CNT | RESET_BUSY_CNT);
2062        WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
2063
2064        WREG32_SMC(CG_FTV_0, CISLANDS_VRC_DFLT0);
2065        WREG32_SMC(CG_FTV_1, CISLANDS_VRC_DFLT1);
2066        WREG32_SMC(CG_FTV_2, CISLANDS_VRC_DFLT2);
2067        WREG32_SMC(CG_FTV_3, CISLANDS_VRC_DFLT3);
2068        WREG32_SMC(CG_FTV_4, CISLANDS_VRC_DFLT4);
2069        WREG32_SMC(CG_FTV_5, CISLANDS_VRC_DFLT5);
2070        WREG32_SMC(CG_FTV_6, CISLANDS_VRC_DFLT6);
2071        WREG32_SMC(CG_FTV_7, CISLANDS_VRC_DFLT7);
2072}
2073
2074static void ci_clear_vc(struct radeon_device *rdev)
2075{
2076        u32 tmp;
2077
2078        tmp = RREG32_SMC(SCLK_PWRMGT_CNTL);
2079        tmp |= (RESET_SCLK_CNT | RESET_BUSY_CNT);
2080        WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
2081
2082        WREG32_SMC(CG_FTV_0, 0);
2083        WREG32_SMC(CG_FTV_1, 0);
2084        WREG32_SMC(CG_FTV_2, 0);
2085        WREG32_SMC(CG_FTV_3, 0);
2086        WREG32_SMC(CG_FTV_4, 0);
2087        WREG32_SMC(CG_FTV_5, 0);
2088        WREG32_SMC(CG_FTV_6, 0);
2089        WREG32_SMC(CG_FTV_7, 0);
2090}
2091
2092static int ci_upload_firmware(struct radeon_device *rdev)
2093{
2094        struct ci_power_info *pi = ci_get_pi(rdev);
2095        int i, ret;
2096
2097        for (i = 0; i < rdev->usec_timeout; i++) {
2098                if (RREG32_SMC(RCU_UC_EVENTS) & BOOT_SEQ_DONE)
2099                        break;
2100        }
2101        WREG32_SMC(SMC_SYSCON_MISC_CNTL, 1);
2102
2103        ci_stop_smc_clock(rdev);
2104        ci_reset_smc(rdev);
2105
2106        ret = ci_load_smc_ucode(rdev, pi->sram_end);
2107
2108        return ret;
2109
2110}
2111
2112static int ci_get_svi2_voltage_table(struct radeon_device *rdev,
2113                                     struct radeon_clock_voltage_dependency_table *voltage_dependency_table,
2114                                     struct atom_voltage_table *voltage_table)
2115{
2116        u32 i;
2117
2118        if (voltage_dependency_table == NULL)
2119                return -EINVAL;
2120
2121        voltage_table->mask_low = 0;
2122        voltage_table->phase_delay = 0;
2123
2124        voltage_table->count = voltage_dependency_table->count;
2125        for (i = 0; i < voltage_table->count; i++) {
2126                voltage_table->entries[i].value = voltage_dependency_table->entries[i].v;
2127                voltage_table->entries[i].smio_low = 0;
2128        }
2129
2130        return 0;
2131}
2132
2133static int ci_construct_voltage_tables(struct radeon_device *rdev)
2134{
2135        struct ci_power_info *pi = ci_get_pi(rdev);
2136        int ret;
2137
2138        if (pi->voltage_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO) {
2139                ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDC,
2140                                                    VOLTAGE_OBJ_GPIO_LUT,
2141                                                    &pi->vddc_voltage_table);
2142                if (ret)
2143                        return ret;
2144        } else if (pi->voltage_control == CISLANDS_VOLTAGE_CONTROL_BY_SVID2) {
2145                ret = ci_get_svi2_voltage_table(rdev,
2146                                                &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2147                                                &pi->vddc_voltage_table);
2148                if (ret)
2149                        return ret;
2150        }
2151
2152        if (pi->vddc_voltage_table.count > SMU7_MAX_LEVELS_VDDC)
2153                si_trim_voltage_table_to_fit_state_table(rdev, SMU7_MAX_LEVELS_VDDC,
2154                                                         &pi->vddc_voltage_table);
2155
2156        if (pi->vddci_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO) {
2157                ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDCI,
2158                                                    VOLTAGE_OBJ_GPIO_LUT,
2159                                                    &pi->vddci_voltage_table);
2160                if (ret)
2161                        return ret;
2162        } else if (pi->vddci_control == CISLANDS_VOLTAGE_CONTROL_BY_SVID2) {
2163                ret = ci_get_svi2_voltage_table(rdev,
2164                                                &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2165                                                &pi->vddci_voltage_table);
2166                if (ret)
2167                        return ret;
2168        }
2169
2170        if (pi->vddci_voltage_table.count > SMU7_MAX_LEVELS_VDDCI)
2171                si_trim_voltage_table_to_fit_state_table(rdev, SMU7_MAX_LEVELS_VDDCI,
2172                                                         &pi->vddci_voltage_table);
2173
2174        if (pi->mvdd_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO) {
2175                ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_MVDDC,
2176                                                    VOLTAGE_OBJ_GPIO_LUT,
2177                                                    &pi->mvdd_voltage_table);
2178                if (ret)
2179                        return ret;
2180        } else if (pi->mvdd_control == CISLANDS_VOLTAGE_CONTROL_BY_SVID2) {
2181                ret = ci_get_svi2_voltage_table(rdev,
2182                                                &rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk,
2183                                                &pi->mvdd_voltage_table);
2184                if (ret)
2185                        return ret;
2186        }
2187
2188        if (pi->mvdd_voltage_table.count > SMU7_MAX_LEVELS_MVDD)
2189                si_trim_voltage_table_to_fit_state_table(rdev, SMU7_MAX_LEVELS_MVDD,
2190                                                         &pi->mvdd_voltage_table);
2191
2192        return 0;
2193}
2194
2195static void ci_populate_smc_voltage_table(struct radeon_device *rdev,
2196                                          struct atom_voltage_table_entry *voltage_table,
2197                                          SMU7_Discrete_VoltageLevel *smc_voltage_table)
2198{
2199        int ret;
2200
2201        ret = ci_get_std_voltage_value_sidd(rdev, voltage_table,
2202                                            &smc_voltage_table->StdVoltageHiSidd,
2203                                            &smc_voltage_table->StdVoltageLoSidd);
2204
2205        if (ret) {
2206                smc_voltage_table->StdVoltageHiSidd = voltage_table->value * VOLTAGE_SCALE;
2207                smc_voltage_table->StdVoltageLoSidd = voltage_table->value * VOLTAGE_SCALE;
2208        }
2209
2210        smc_voltage_table->Voltage = cpu_to_be16(voltage_table->value * VOLTAGE_SCALE);
2211        smc_voltage_table->StdVoltageHiSidd =
2212                cpu_to_be16(smc_voltage_table->StdVoltageHiSidd);
2213        smc_voltage_table->StdVoltageLoSidd =
2214                cpu_to_be16(smc_voltage_table->StdVoltageLoSidd);
2215}
2216
2217static int ci_populate_smc_vddc_table(struct radeon_device *rdev,
2218                                      SMU7_Discrete_DpmTable *table)
2219{
2220        struct ci_power_info *pi = ci_get_pi(rdev);
2221        unsigned int count;
2222
2223        table->VddcLevelCount = pi->vddc_voltage_table.count;
2224        for (count = 0; count < table->VddcLevelCount; count++) {
2225                ci_populate_smc_voltage_table(rdev,
2226                                              &pi->vddc_voltage_table.entries[count],
2227                                              &table->VddcLevel[count]);
2228
2229                if (pi->voltage_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO)
2230                        table->VddcLevel[count].Smio |=
2231                                pi->vddc_voltage_table.entries[count].smio_low;
2232                else
2233                        table->VddcLevel[count].Smio = 0;
2234        }
2235        table->VddcLevelCount = cpu_to_be32(table->VddcLevelCount);
2236
2237        return 0;
2238}
2239
2240static int ci_populate_smc_vddci_table(struct radeon_device *rdev,
2241                                       SMU7_Discrete_DpmTable *table)
2242{
2243        unsigned int count;
2244        struct ci_power_info *pi = ci_get_pi(rdev);
2245
2246        table->VddciLevelCount = pi->vddci_voltage_table.count;
2247        for (count = 0; count < table->VddciLevelCount; count++) {
2248                ci_populate_smc_voltage_table(rdev,
2249                                              &pi->vddci_voltage_table.entries[count],
2250                                              &table->VddciLevel[count]);
2251
2252                if (pi->vddci_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO)
2253                        table->VddciLevel[count].Smio |=
2254                                pi->vddci_voltage_table.entries[count].smio_low;
2255                else
2256                        table->VddciLevel[count].Smio = 0;
2257        }
2258        table->VddciLevelCount = cpu_to_be32(table->VddciLevelCount);
2259
2260        return 0;
2261}
2262
2263static int ci_populate_smc_mvdd_table(struct radeon_device *rdev,
2264                                      SMU7_Discrete_DpmTable *table)
2265{
2266        struct ci_power_info *pi = ci_get_pi(rdev);
2267        unsigned int count;
2268
2269        table->MvddLevelCount = pi->mvdd_voltage_table.count;
2270        for (count = 0; count < table->MvddLevelCount; count++) {
2271                ci_populate_smc_voltage_table(rdev,
2272                                              &pi->mvdd_voltage_table.entries[count],
2273                                              &table->MvddLevel[count]);
2274
2275                if (pi->mvdd_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO)
2276                        table->MvddLevel[count].Smio |=
2277                                pi->mvdd_voltage_table.entries[count].smio_low;
2278                else
2279                        table->MvddLevel[count].Smio = 0;
2280        }
2281        table->MvddLevelCount = cpu_to_be32(table->MvddLevelCount);
2282
2283        return 0;
2284}
2285
2286static int ci_populate_smc_voltage_tables(struct radeon_device *rdev,
2287                                          SMU7_Discrete_DpmTable *table)
2288{
2289        int ret;
2290
2291        ret = ci_populate_smc_vddc_table(rdev, table);
2292        if (ret)
2293                return ret;
2294
2295        ret = ci_populate_smc_vddci_table(rdev, table);
2296        if (ret)
2297                return ret;
2298
2299        ret = ci_populate_smc_mvdd_table(rdev, table);
2300        if (ret)
2301                return ret;
2302
2303        return 0;
2304}
2305
2306static int ci_populate_mvdd_value(struct radeon_device *rdev, u32 mclk,
2307                                  SMU7_Discrete_VoltageLevel *voltage)
2308{
2309        struct ci_power_info *pi = ci_get_pi(rdev);
2310        u32 i = 0;
2311
2312        if (pi->mvdd_control != CISLANDS_VOLTAGE_CONTROL_NONE) {
2313                for (i = 0; i < rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.count; i++) {
2314                        if (mclk <= rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.entries[i].clk) {
2315                                voltage->Voltage = pi->mvdd_voltage_table.entries[i].value;
2316                                break;
2317                        }
2318                }
2319
2320                if (i >= rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.count)
2321                        return -EINVAL;
2322        }
2323
2324        return -EINVAL;
2325}
2326
2327static int ci_get_std_voltage_value_sidd(struct radeon_device *rdev,
2328                                         struct atom_voltage_table_entry *voltage_table,
2329                                         u16 *std_voltage_hi_sidd, u16 *std_voltage_lo_sidd)
2330{
2331        u16 v_index, idx;
2332        bool voltage_found = false;
2333        *std_voltage_hi_sidd = voltage_table->value * VOLTAGE_SCALE;
2334        *std_voltage_lo_sidd = voltage_table->value * VOLTAGE_SCALE;
2335
2336        if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries == NULL)
2337                return -EINVAL;
2338
2339        if (rdev->pm.dpm.dyn_state.cac_leakage_table.entries) {
2340                for (v_index = 0; (u32)v_index < rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; v_index++) {
2341                        if (voltage_table->value ==
2342                            rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[v_index].v) {
2343                                voltage_found = true;
2344                                if ((u32)v_index < rdev->pm.dpm.dyn_state.cac_leakage_table.count)
2345                                        idx = v_index;
2346                                else
2347                                        idx = rdev->pm.dpm.dyn_state.cac_leakage_table.count - 1;
2348                                *std_voltage_lo_sidd =
2349                                        rdev->pm.dpm.dyn_state.cac_leakage_table.entries[idx].vddc * VOLTAGE_SCALE;
2350                                *std_voltage_hi_sidd =
2351                                        rdev->pm.dpm.dyn_state.cac_leakage_table.entries[idx].leakage * VOLTAGE_SCALE;
2352                                break;
2353                        }
2354                }
2355
2356                if (!voltage_found) {
2357                        for (v_index = 0; (u32)v_index < rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; v_index++) {
2358                                if (voltage_table->value <=
2359                                    rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[v_index].v) {
2360                                        voltage_found = true;
2361                                        if ((u32)v_index < rdev->pm.dpm.dyn_state.cac_leakage_table.count)
2362                                                idx = v_index;
2363                                        else
2364                                                idx = rdev->pm.dpm.dyn_state.cac_leakage_table.count - 1;
2365                                        *std_voltage_lo_sidd =
2366                                                rdev->pm.dpm.dyn_state.cac_leakage_table.entries[idx].vddc * VOLTAGE_SCALE;
2367                                        *std_voltage_hi_sidd =
2368                                                rdev->pm.dpm.dyn_state.cac_leakage_table.entries[idx].leakage * VOLTAGE_SCALE;
2369                                        break;
2370                                }
2371                        }
2372                }
2373        }
2374
2375        return 0;
2376}
2377
2378static void ci_populate_phase_value_based_on_sclk(struct radeon_device *rdev,
2379                                                  const struct radeon_phase_shedding_limits_table *limits,
2380                                                  u32 sclk,
2381                                                  u32 *phase_shedding)
2382{
2383        unsigned int i;
2384
2385        *phase_shedding = 1;
2386
2387        for (i = 0; i < limits->count; i++) {
2388                if (sclk < limits->entries[i].sclk) {
2389                        *phase_shedding = i;
2390                        break;
2391                }
2392        }
2393}
2394
2395static void ci_populate_phase_value_based_on_mclk(struct radeon_device *rdev,
2396                                                  const struct radeon_phase_shedding_limits_table *limits,
2397                                                  u32 mclk,
2398                                                  u32 *phase_shedding)
2399{
2400        unsigned int i;
2401
2402        *phase_shedding = 1;
2403
2404        for (i = 0; i < limits->count; i++) {
2405                if (mclk < limits->entries[i].mclk) {
2406                        *phase_shedding = i;
2407                        break;
2408                }
2409        }
2410}
2411
2412static int ci_init_arb_table_index(struct radeon_device *rdev)
2413{
2414        struct ci_power_info *pi = ci_get_pi(rdev);
2415        u32 tmp;
2416        int ret;
2417
2418        ret = ci_read_smc_sram_dword(rdev, pi->arb_table_start,
2419                                     &tmp, pi->sram_end);
2420        if (ret)
2421                return ret;
2422
2423        tmp &= 0x00FFFFFF;
2424        tmp |= MC_CG_ARB_FREQ_F1 << 24;
2425
2426        return ci_write_smc_sram_dword(rdev, pi->arb_table_start,
2427                                       tmp, pi->sram_end);
2428}
2429
2430static int ci_get_dependency_volt_by_clk(struct radeon_device *rdev,
2431                                         struct radeon_clock_voltage_dependency_table *allowed_clock_voltage_table,
2432                                         u32 clock, u32 *voltage)
2433{
2434        u32 i = 0;
2435
2436        if (allowed_clock_voltage_table->count == 0)
2437                return -EINVAL;
2438
2439        for (i = 0; i < allowed_clock_voltage_table->count; i++) {
2440                if (allowed_clock_voltage_table->entries[i].clk >= clock) {
2441                        *voltage = allowed_clock_voltage_table->entries[i].v;
2442                        return 0;
2443                }
2444        }
2445
2446        *voltage = allowed_clock_voltage_table->entries[i-1].v;
2447
2448        return 0;
2449}
2450
2451static u8 ci_get_sleep_divider_id_from_clock(struct radeon_device *rdev,
2452                                             u32 sclk, u32 min_sclk_in_sr)
2453{
2454        u32 i;
2455        u32 tmp;
2456        u32 min = (min_sclk_in_sr > CISLAND_MINIMUM_ENGINE_CLOCK) ?
2457                min_sclk_in_sr : CISLAND_MINIMUM_ENGINE_CLOCK;
2458
2459        if (sclk < min)
2460                return 0;
2461
2462        for (i = CISLAND_MAX_DEEPSLEEP_DIVIDER_ID;  ; i--) {
2463                tmp = sclk / (1 << i);
2464                if (tmp >= min || i == 0)
2465                        break;
2466        }
2467
2468        return (u8)i;
2469}
2470
2471static int ci_initial_switch_from_arb_f0_to_f1(struct radeon_device *rdev)
2472{
2473        return ni_copy_and_switch_arb_sets(rdev, MC_CG_ARB_FREQ_F0, MC_CG_ARB_FREQ_F1);
2474}
2475
2476static int ci_reset_to_default(struct radeon_device *rdev)
2477{
2478        return (ci_send_msg_to_smc(rdev, PPSMC_MSG_ResetToDefaults) == PPSMC_Result_OK) ?
2479                0 : -EINVAL;
2480}
2481
2482static int ci_force_switch_to_arb_f0(struct radeon_device *rdev)
2483{
2484        u32 tmp;
2485
2486        tmp = (RREG32_SMC(SMC_SCRATCH9) & 0x0000ff00) >> 8;
2487
2488        if (tmp == MC_CG_ARB_FREQ_F0)
2489                return 0;
2490
2491        return ni_copy_and_switch_arb_sets(rdev, tmp, MC_CG_ARB_FREQ_F0);
2492}
2493
2494static void ci_register_patching_mc_arb(struct radeon_device *rdev,
2495                                        const u32 engine_clock,
2496                                        const u32 memory_clock,
2497                                        u32 *dram_timimg2)
2498{
2499        bool patch;
2500        u32 tmp, tmp2;
2501
2502        tmp = RREG32(MC_SEQ_MISC0);
2503        patch = ((tmp & 0x0000f00) == 0x300) ? true : false;
2504
2505        if (patch &&
2506            ((rdev->pdev->device == 0x67B0) ||
2507             (rdev->pdev->device == 0x67B1))) {
2508                if ((memory_clock > 100000) && (memory_clock <= 125000)) {
2509                        tmp2 = (((0x31 * engine_clock) / 125000) - 1) & 0xff;
2510                        *dram_timimg2 &= ~0x00ff0000;
2511                        *dram_timimg2 |= tmp2 << 16;
2512                } else if ((memory_clock > 125000) && (memory_clock <= 137500)) {
2513                        tmp2 = (((0x36 * engine_clock) / 137500) - 1) & 0xff;
2514                        *dram_timimg2 &= ~0x00ff0000;
2515                        *dram_timimg2 |= tmp2 << 16;
2516                }
2517        }
2518}
2519
2520
2521static int ci_populate_memory_timing_parameters(struct radeon_device *rdev,
2522                                                u32 sclk,
2523                                                u32 mclk,
2524                                                SMU7_Discrete_MCArbDramTimingTableEntry *arb_regs)
2525{
2526        u32 dram_timing;
2527        u32 dram_timing2;
2528        u32 burst_time;
2529
2530        radeon_atom_set_engine_dram_timings(rdev, sclk, mclk);
2531
2532        dram_timing  = RREG32(MC_ARB_DRAM_TIMING);
2533        dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
2534        burst_time = RREG32(MC_ARB_BURST_TIME) & STATE0_MASK;
2535
2536        ci_register_patching_mc_arb(rdev, sclk, mclk, &dram_timing2);
2537
2538        arb_regs->McArbDramTiming  = cpu_to_be32(dram_timing);
2539        arb_regs->McArbDramTiming2 = cpu_to_be32(dram_timing2);
2540        arb_regs->McArbBurstTime = (u8)burst_time;
2541
2542        return 0;
2543}
2544
2545static int ci_do_program_memory_timing_parameters(struct radeon_device *rdev)
2546{
2547        struct ci_power_info *pi = ci_get_pi(rdev);
2548        SMU7_Discrete_MCArbDramTimingTable arb_regs;
2549        u32 i, j;
2550        int ret =  0;
2551
2552        memset(&arb_regs, 0, sizeof(SMU7_Discrete_MCArbDramTimingTable));
2553
2554        for (i = 0; i < pi->dpm_table.sclk_table.count; i++) {
2555                for (j = 0; j < pi->dpm_table.mclk_table.count; j++) {
2556                        ret = ci_populate_memory_timing_parameters(rdev,
2557                                                                   pi->dpm_table.sclk_table.dpm_levels[i].value,
2558                                                                   pi->dpm_table.mclk_table.dpm_levels[j].value,
2559                                                                   &arb_regs.entries[i][j]);
2560                        if (ret)
2561                                break;
2562                }
2563        }
2564
2565        if (ret == 0)
2566                ret = ci_copy_bytes_to_smc(rdev,
2567                                           pi->arb_table_start,
2568                                           (u8 *)&arb_regs,
2569                                           sizeof(SMU7_Discrete_MCArbDramTimingTable),
2570                                           pi->sram_end);
2571
2572        return ret;
2573}
2574
2575static int ci_program_memory_timing_parameters(struct radeon_device *rdev)
2576{
2577        struct ci_power_info *pi = ci_get_pi(rdev);
2578
2579        if (pi->need_update_smu7_dpm_table == 0)
2580                return 0;
2581
2582        return ci_do_program_memory_timing_parameters(rdev);
2583}
2584
2585static void ci_populate_smc_initial_state(struct radeon_device *rdev,
2586                                          struct radeon_ps *radeon_boot_state)
2587{
2588        struct ci_ps *boot_state = ci_get_ps(radeon_boot_state);
2589        struct ci_power_info *pi = ci_get_pi(rdev);
2590        u32 level = 0;
2591
2592        for (level = 0; level < rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; level++) {
2593                if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[level].clk >=
2594                    boot_state->performance_levels[0].sclk) {
2595                        pi->smc_state_table.GraphicsBootLevel = level;
2596                        break;
2597                }
2598        }
2599
2600        for (level = 0; level < rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.count; level++) {
2601                if (rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries[level].clk >=
2602                    boot_state->performance_levels[0].mclk) {
2603                        pi->smc_state_table.MemoryBootLevel = level;
2604                        break;
2605                }
2606        }
2607}
2608
2609static u32 ci_get_dpm_level_enable_mask_value(struct ci_single_dpm_table *dpm_table)
2610{
2611        u32 i;
2612        u32 mask_value = 0;
2613
2614        for (i = dpm_table->count; i > 0; i--) {
2615                mask_value = mask_value << 1;
2616                if (dpm_table->dpm_levels[i-1].enabled)
2617                        mask_value |= 0x1;
2618                else
2619                        mask_value &= 0xFFFFFFFE;
2620        }
2621
2622        return mask_value;
2623}
2624
2625static void ci_populate_smc_link_level(struct radeon_device *rdev,
2626                                       SMU7_Discrete_DpmTable *table)
2627{
2628        struct ci_power_info *pi = ci_get_pi(rdev);
2629        struct ci_dpm_table *dpm_table = &pi->dpm_table;
2630        u32 i;
2631
2632        for (i = 0; i < dpm_table->pcie_speed_table.count; i++) {
2633                table->LinkLevel[i].PcieGenSpeed =
2634                        (u8)dpm_table->pcie_speed_table.dpm_levels[i].value;
2635                table->LinkLevel[i].PcieLaneCount =
2636                        r600_encode_pci_lane_width(dpm_table->pcie_speed_table.dpm_levels[i].param1);
2637                table->LinkLevel[i].EnabledForActivity = 1;
2638                table->LinkLevel[i].DownT = cpu_to_be32(5);
2639                table->LinkLevel[i].UpT = cpu_to_be32(30);
2640        }
2641
2642        pi->smc_state_table.LinkLevelCount = (u8)dpm_table->pcie_speed_table.count;
2643        pi->dpm_level_enable_mask.pcie_dpm_enable_mask =
2644                ci_get_dpm_level_enable_mask_value(&dpm_table->pcie_speed_table);
2645}
2646
2647static int ci_populate_smc_uvd_level(struct radeon_device *rdev,
2648                                     SMU7_Discrete_DpmTable *table)
2649{
2650        u32 count;
2651        struct atom_clock_dividers dividers;
2652        int ret = -EINVAL;
2653
2654        table->UvdLevelCount =
2655                rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count;
2656
2657        for (count = 0; count < table->UvdLevelCount; count++) {
2658                table->UvdLevel[count].VclkFrequency =
2659                        rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[count].vclk;
2660                table->UvdLevel[count].DclkFrequency =
2661                        rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[count].dclk;
2662                table->UvdLevel[count].MinVddc =
2663                        rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[count].v * VOLTAGE_SCALE;
2664                table->UvdLevel[count].MinVddcPhases = 1;
2665
2666                ret = radeon_atom_get_clock_dividers(rdev,
2667                                                     COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2668                                                     table->UvdLevel[count].VclkFrequency, false, &dividers);
2669                if (ret)
2670                        return ret;
2671
2672                table->UvdLevel[count].VclkDivider = (u8)dividers.post_divider;
2673
2674                ret = radeon_atom_get_clock_dividers(rdev,
2675                                                     COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2676                                                     table->UvdLevel[count].DclkFrequency, false, &dividers);
2677                if (ret)
2678                        return ret;
2679
2680                table->UvdLevel[count].DclkDivider = (u8)dividers.post_divider;
2681
2682                table->UvdLevel[count].VclkFrequency = cpu_to_be32(table->UvdLevel[count].VclkFrequency);
2683                table->UvdLevel[count].DclkFrequency = cpu_to_be32(table->UvdLevel[count].DclkFrequency);
2684                table->UvdLevel[count].MinVddc = cpu_to_be16(table->UvdLevel[count].MinVddc);
2685        }
2686
2687        return ret;
2688}
2689
2690static int ci_populate_smc_vce_level(struct radeon_device *rdev,
2691                                     SMU7_Discrete_DpmTable *table)
2692{
2693        u32 count;
2694        struct atom_clock_dividers dividers;
2695        int ret = -EINVAL;
2696
2697        table->VceLevelCount =
2698                rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.count;
2699
2700        for (count = 0; count < table->VceLevelCount; count++) {
2701                table->VceLevel[count].Frequency =
2702                        rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries[count].evclk;
2703                table->VceLevel[count].MinVoltage =
2704                        (u16)rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries[count].v * VOLTAGE_SCALE;
2705                table->VceLevel[count].MinPhases = 1;
2706
2707                ret = radeon_atom_get_clock_dividers(rdev,
2708                                                     COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2709                                                     table->VceLevel[count].Frequency, false, &dividers);
2710                if (ret)
2711                        return ret;
2712
2713                table->VceLevel[count].Divider = (u8)dividers.post_divider;
2714
2715                table->VceLevel[count].Frequency = cpu_to_be32(table->VceLevel[count].Frequency);
2716                table->VceLevel[count].MinVoltage = cpu_to_be16(table->VceLevel[count].MinVoltage);
2717        }
2718
2719        return ret;
2720
2721}
2722
2723static int ci_populate_smc_acp_level(struct radeon_device *rdev,
2724                                     SMU7_Discrete_DpmTable *table)
2725{
2726        u32 count;
2727        struct atom_clock_dividers dividers;
2728        int ret = -EINVAL;
2729
2730        table->AcpLevelCount = (u8)
2731                (rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.count);
2732
2733        for (count = 0; count < table->AcpLevelCount; count++) {
2734                table->AcpLevel[count].Frequency =
2735                        rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[count].clk;
2736                table->AcpLevel[count].MinVoltage =
2737                        rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[count].v;
2738                table->AcpLevel[count].MinPhases = 1;
2739
2740                ret = radeon_atom_get_clock_dividers(rdev,
2741                                                     COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2742                                                     table->AcpLevel[count].Frequency, false, &dividers);
2743                if (ret)
2744                        return ret;
2745
2746                table->AcpLevel[count].Divider = (u8)dividers.post_divider;
2747
2748                table->AcpLevel[count].Frequency = cpu_to_be32(table->AcpLevel[count].Frequency);
2749                table->AcpLevel[count].MinVoltage = cpu_to_be16(table->AcpLevel[count].MinVoltage);
2750        }
2751
2752        return ret;
2753}
2754
2755static int ci_populate_smc_samu_level(struct radeon_device *rdev,
2756                                      SMU7_Discrete_DpmTable *table)
2757{
2758        u32 count;
2759        struct atom_clock_dividers dividers;
2760        int ret = -EINVAL;
2761
2762        table->SamuLevelCount =
2763                rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.count;
2764
2765        for (count = 0; count < table->SamuLevelCount; count++) {
2766                table->SamuLevel[count].Frequency =
2767                        rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries[count].clk;
2768                table->SamuLevel[count].MinVoltage =
2769                        rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries[count].v * VOLTAGE_SCALE;
2770                table->SamuLevel[count].MinPhases = 1;
2771
2772                ret = radeon_atom_get_clock_dividers(rdev,
2773                                                     COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2774                                                     table->SamuLevel[count].Frequency, false, &dividers);
2775                if (ret)
2776                        return ret;
2777
2778                table->SamuLevel[count].Divider = (u8)dividers.post_divider;
2779
2780                table->SamuLevel[count].Frequency = cpu_to_be32(table->SamuLevel[count].Frequency);
2781                table->SamuLevel[count].MinVoltage = cpu_to_be16(table->SamuLevel[count].MinVoltage);
2782        }
2783
2784        return ret;
2785}
2786
2787static int ci_calculate_mclk_params(struct radeon_device *rdev,
2788                                    u32 memory_clock,
2789                                    SMU7_Discrete_MemoryLevel *mclk,
2790                                    bool strobe_mode,
2791                                    bool dll_state_on)
2792{
2793        struct ci_power_info *pi = ci_get_pi(rdev);
2794        u32  dll_cntl = pi->clock_registers.dll_cntl;
2795        u32  mclk_pwrmgt_cntl = pi->clock_registers.mclk_pwrmgt_cntl;
2796        u32  mpll_ad_func_cntl = pi->clock_registers.mpll_ad_func_cntl;
2797        u32  mpll_dq_func_cntl = pi->clock_registers.mpll_dq_func_cntl;
2798        u32  mpll_func_cntl = pi->clock_registers.mpll_func_cntl;
2799        u32  mpll_func_cntl_1 = pi->clock_registers.mpll_func_cntl_1;
2800        u32  mpll_func_cntl_2 = pi->clock_registers.mpll_func_cntl_2;
2801        u32  mpll_ss1 = pi->clock_registers.mpll_ss1;
2802        u32  mpll_ss2 = pi->clock_registers.mpll_ss2;
2803        struct atom_mpll_param mpll_param;
2804        int ret;
2805
2806        ret = radeon_atom_get_memory_pll_dividers(rdev, memory_clock, strobe_mode, &mpll_param);
2807        if (ret)
2808                return ret;
2809
2810        mpll_func_cntl &= ~BWCTRL_MASK;
2811        mpll_func_cntl |= BWCTRL(mpll_param.bwcntl);
2812
2813        mpll_func_cntl_1 &= ~(CLKF_MASK | CLKFRAC_MASK | VCO_MODE_MASK);
2814        mpll_func_cntl_1 |= CLKF(mpll_param.clkf) |
2815                CLKFRAC(mpll_param.clkfrac) | VCO_MODE(mpll_param.vco_mode);
2816
2817        mpll_ad_func_cntl &= ~YCLK_POST_DIV_MASK;
2818        mpll_ad_func_cntl |= YCLK_POST_DIV(mpll_param.post_div);
2819
2820        if (pi->mem_gddr5) {
2821                mpll_dq_func_cntl &= ~(YCLK_SEL_MASK | YCLK_POST_DIV_MASK);
2822                mpll_dq_func_cntl |= YCLK_SEL(mpll_param.yclk_sel) |
2823                        YCLK_POST_DIV(mpll_param.post_div);
2824        }
2825
2826        if (pi->caps_mclk_ss_support) {
2827                struct radeon_atom_ss ss;
2828                u32 freq_nom;
2829                u32 tmp;
2830                u32 reference_clock = rdev->clock.mpll.reference_freq;
2831
2832                if (mpll_param.qdr == 1)
2833                        freq_nom = memory_clock * 4 * (1 << mpll_param.post_div);
2834                else
2835                        freq_nom = memory_clock * 2 * (1 << mpll_param.post_div);
2836
2837                tmp = (freq_nom / reference_clock);
2838                tmp = tmp * tmp;
2839                if (radeon_atombios_get_asic_ss_info(rdev, &ss,
2840                                                     ASIC_INTERNAL_MEMORY_SS, freq_nom)) {
2841                        u32 clks = reference_clock * 5 / ss.rate;
2842                        u32 clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom);
2843
2844                        mpll_ss1 &= ~CLKV_MASK;
2845                        mpll_ss1 |= CLKV(clkv);
2846
2847                        mpll_ss2 &= ~CLKS_MASK;
2848                        mpll_ss2 |= CLKS(clks);
2849                }
2850        }
2851
2852        mclk_pwrmgt_cntl &= ~DLL_SPEED_MASK;
2853        mclk_pwrmgt_cntl |= DLL_SPEED(mpll_param.dll_speed);
2854
2855        if (dll_state_on)
2856                mclk_pwrmgt_cntl |= MRDCK0_PDNB | MRDCK1_PDNB;
2857        else
2858                mclk_pwrmgt_cntl &= ~(MRDCK0_PDNB | MRDCK1_PDNB);
2859
2860        mclk->MclkFrequency = memory_clock;
2861        mclk->MpllFuncCntl = mpll_func_cntl;
2862        mclk->MpllFuncCntl_1 = mpll_func_cntl_1;
2863        mclk->MpllFuncCntl_2 = mpll_func_cntl_2;
2864        mclk->MpllAdFuncCntl = mpll_ad_func_cntl;
2865        mclk->MpllDqFuncCntl = mpll_dq_func_cntl;
2866        mclk->MclkPwrmgtCntl = mclk_pwrmgt_cntl;
2867        mclk->DllCntl = dll_cntl;
2868        mclk->MpllSs1 = mpll_ss1;
2869        mclk->MpllSs2 = mpll_ss2;
2870
2871        return 0;
2872}
2873
2874static int ci_populate_single_memory_level(struct radeon_device *rdev,
2875                                           u32 memory_clock,
2876                                           SMU7_Discrete_MemoryLevel *memory_level)
2877{
2878        struct ci_power_info *pi = ci_get_pi(rdev);
2879        int ret;
2880        bool dll_state_on;
2881
2882        if (rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries) {
2883                ret = ci_get_dependency_volt_by_clk(rdev,
2884                                                    &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2885                                                    memory_clock, &memory_level->MinVddc);
2886                if (ret)
2887                        return ret;
2888        }
2889
2890        if (rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries) {
2891                ret = ci_get_dependency_volt_by_clk(rdev,
2892                                                    &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2893                                                    memory_clock, &memory_level->MinVddci);
2894                if (ret)
2895                        return ret;
2896        }
2897
2898        if (rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.entries) {
2899                ret = ci_get_dependency_volt_by_clk(rdev,
2900                                                    &rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk,
2901                                                    memory_clock, &memory_level->MinMvdd);
2902                if (ret)
2903                        return ret;
2904        }
2905
2906        memory_level->MinVddcPhases = 1;
2907
2908        if (pi->vddc_phase_shed_control)
2909                ci_populate_phase_value_based_on_mclk(rdev,
2910                                                      &rdev->pm.dpm.dyn_state.phase_shedding_limits_table,
2911                                                      memory_clock,
2912                                                      &memory_level->MinVddcPhases);
2913
2914        memory_level->EnabledForThrottle = 1;
2915        memory_level->UpH = 0;
2916        memory_level->DownH = 100;
2917        memory_level->VoltageDownH = 0;
2918        memory_level->ActivityLevel = (u16)pi->mclk_activity_target;
2919
2920        memory_level->StutterEnable = false;
2921        memory_level->StrobeEnable = false;
2922        memory_level->EdcReadEnable = false;
2923        memory_level->EdcWriteEnable = false;
2924        memory_level->RttEnable = false;
2925
2926        memory_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
2927
2928        if (pi->mclk_stutter_mode_threshold &&
2929            (memory_clock <= pi->mclk_stutter_mode_threshold) &&
2930            (pi->uvd_enabled == false) &&
2931            (RREG32(DPG_PIPE_STUTTER_CONTROL) & STUTTER_ENABLE) &&
2932            (rdev->pm.dpm.new_active_crtc_count <= 2))
2933                memory_level->StutterEnable = true;
2934
2935        if (pi->mclk_strobe_mode_threshold &&
2936            (memory_clock <= pi->mclk_strobe_mode_threshold))
2937                memory_level->StrobeEnable = 1;
2938
2939        if (pi->mem_gddr5) {
2940                memory_level->StrobeRatio =
2941                        si_get_mclk_frequency_ratio(memory_clock, memory_level->StrobeEnable);
2942                if (pi->mclk_edc_enable_threshold &&
2943                    (memory_clock > pi->mclk_edc_enable_threshold))
2944                        memory_level->EdcReadEnable = true;
2945
2946                if (pi->mclk_edc_wr_enable_threshold &&
2947                    (memory_clock > pi->mclk_edc_wr_enable_threshold))
2948                        memory_level->EdcWriteEnable = true;
2949
2950                if (memory_level->StrobeEnable) {
2951                        if (si_get_mclk_frequency_ratio(memory_clock, true) >=
2952                            ((RREG32(MC_SEQ_MISC7) >> 16) & 0xf))
2953                                dll_state_on = ((RREG32(MC_SEQ_MISC5) >> 1) & 0x1) ? true : false;
2954                        else
2955                                dll_state_on = ((RREG32(MC_SEQ_MISC6) >> 1) & 0x1) ? true : false;
2956                } else {
2957                        dll_state_on = pi->dll_default_on;
2958                }
2959        } else {
2960                memory_level->StrobeRatio = si_get_ddr3_mclk_frequency_ratio(memory_clock);
2961                dll_state_on = ((RREG32(MC_SEQ_MISC5) >> 1) & 0x1) ? true : false;
2962        }
2963
2964        ret = ci_calculate_mclk_params(rdev, memory_clock, memory_level, memory_level->StrobeEnable, dll_state_on);
2965        if (ret)
2966                return ret;
2967
2968        memory_level->MinVddc = cpu_to_be32(memory_level->MinVddc * VOLTAGE_SCALE);
2969        memory_level->MinVddcPhases = cpu_to_be32(memory_level->MinVddcPhases);
2970        memory_level->MinVddci = cpu_to_be32(memory_level->MinVddci * VOLTAGE_SCALE);
2971        memory_level->MinMvdd = cpu_to_be32(memory_level->MinMvdd * VOLTAGE_SCALE);
2972
2973        memory_level->MclkFrequency = cpu_to_be32(memory_level->MclkFrequency);
2974        memory_level->ActivityLevel = cpu_to_be16(memory_level->ActivityLevel);
2975        memory_level->MpllFuncCntl = cpu_to_be32(memory_level->MpllFuncCntl);
2976        memory_level->MpllFuncCntl_1 = cpu_to_be32(memory_level->MpllFuncCntl_1);
2977        memory_level->MpllFuncCntl_2 = cpu_to_be32(memory_level->MpllFuncCntl_2);
2978        memory_level->MpllAdFuncCntl = cpu_to_be32(memory_level->MpllAdFuncCntl);
2979        memory_level->MpllDqFuncCntl = cpu_to_be32(memory_level->MpllDqFuncCntl);
2980        memory_level->MclkPwrmgtCntl = cpu_to_be32(memory_level->MclkPwrmgtCntl);
2981        memory_level->DllCntl = cpu_to_be32(memory_level->DllCntl);
2982        memory_level->MpllSs1 = cpu_to_be32(memory_level->MpllSs1);
2983        memory_level->MpllSs2 = cpu_to_be32(memory_level->MpllSs2);
2984
2985        return 0;
2986}
2987
2988static int ci_populate_smc_acpi_level(struct radeon_device *rdev,
2989                                      SMU7_Discrete_DpmTable *table)
2990{
2991        struct ci_power_info *pi = ci_get_pi(rdev);
2992        struct atom_clock_dividers dividers;
2993        SMU7_Discrete_VoltageLevel voltage_level;
2994        u32 spll_func_cntl = pi->clock_registers.cg_spll_func_cntl;
2995        u32 spll_func_cntl_2 = pi->clock_registers.cg_spll_func_cntl_2;
2996        u32 dll_cntl = pi->clock_registers.dll_cntl;
2997        u32 mclk_pwrmgt_cntl = pi->clock_registers.mclk_pwrmgt_cntl;
2998        int ret;
2999
3000        table->ACPILevel.Flags &= ~PPSMC_SWSTATE_FLAG_DC;
3001
3002        if (pi->acpi_vddc)
3003                table->ACPILevel.MinVddc = cpu_to_be32(pi->acpi_vddc * VOLTAGE_SCALE);
3004        else
3005                table->ACPILevel.MinVddc = cpu_to_be32(pi->min_vddc_in_pp_table * VOLTAGE_SCALE);
3006
3007        table->ACPILevel.MinVddcPhases = pi->vddc_phase_shed_control ? 0 : 1;
3008
3009        table->ACPILevel.SclkFrequency = rdev->clock.spll.reference_freq;
3010
3011        ret = radeon_atom_get_clock_dividers(rdev,
3012                                             COMPUTE_GPUCLK_INPUT_FLAG_SCLK,
3013                                             table->ACPILevel.SclkFrequency, false, &dividers);
3014        if (ret)
3015                return ret;
3016
3017        table->ACPILevel.SclkDid = (u8)dividers.post_divider;
3018        table->ACPILevel.DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
3019        table->ACPILevel.DeepSleepDivId = 0;
3020
3021        spll_func_cntl &= ~SPLL_PWRON;
3022        spll_func_cntl |= SPLL_RESET;
3023
3024        spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
3025        spll_func_cntl_2 |= SCLK_MUX_SEL(4);
3026
3027        table->ACPILevel.CgSpllFuncCntl = spll_func_cntl;
3028        table->ACPILevel.CgSpllFuncCntl2 = spll_func_cntl_2;
3029        table->ACPILevel.CgSpllFuncCntl3 = pi->clock_registers.cg_spll_func_cntl_3;
3030        table->ACPILevel.CgSpllFuncCntl4 = pi->clock_registers.cg_spll_func_cntl_4;
3031        table->ACPILevel.SpllSpreadSpectrum = pi->clock_registers.cg_spll_spread_spectrum;
3032        table->ACPILevel.SpllSpreadSpectrum2 = pi->clock_registers.cg_spll_spread_spectrum_2;
3033        table->ACPILevel.CcPwrDynRm = 0;
3034        table->ACPILevel.CcPwrDynRm1 = 0;
3035
3036        table->ACPILevel.Flags = cpu_to_be32(table->ACPILevel.Flags);
3037        table->ACPILevel.MinVddcPhases = cpu_to_be32(table->ACPILevel.MinVddcPhases);
3038        table->ACPILevel.SclkFrequency = cpu_to_be32(table->ACPILevel.SclkFrequency);
3039        table->ACPILevel.CgSpllFuncCntl = cpu_to_be32(table->ACPILevel.CgSpllFuncCntl);
3040        table->ACPILevel.CgSpllFuncCntl2 = cpu_to_be32(table->ACPILevel.CgSpllFuncCntl2);
3041        table->ACPILevel.CgSpllFuncCntl3 = cpu_to_be32(table->ACPILevel.CgSpllFuncCntl3);
3042        table->ACPILevel.CgSpllFuncCntl4 = cpu_to_be32(table->ACPILevel.CgSpllFuncCntl4);
3043        table->ACPILevel.SpllSpreadSpectrum = cpu_to_be32(table->ACPILevel.SpllSpreadSpectrum);
3044        table->ACPILevel.SpllSpreadSpectrum2 = cpu_to_be32(table->ACPILevel.SpllSpreadSpectrum2);
3045        table->ACPILevel.CcPwrDynRm = cpu_to_be32(table->ACPILevel.CcPwrDynRm);
3046        table->ACPILevel.CcPwrDynRm1 = cpu_to_be32(table->ACPILevel.CcPwrDynRm1);
3047
3048        table->MemoryACPILevel.MinVddc = table->ACPILevel.MinVddc;
3049        table->MemoryACPILevel.MinVddcPhases = table->ACPILevel.MinVddcPhases;
3050
3051        if (pi->vddci_control != CISLANDS_VOLTAGE_CONTROL_NONE) {
3052                if (pi->acpi_vddci)
3053                        table->MemoryACPILevel.MinVddci =
3054                                cpu_to_be32(pi->acpi_vddci * VOLTAGE_SCALE);
3055                else
3056                        table->MemoryACPILevel.MinVddci =
3057                                cpu_to_be32(pi->min_vddci_in_pp_table * VOLTAGE_SCALE);
3058        }
3059
3060        if (ci_populate_mvdd_value(rdev, 0, &voltage_level))
3061                table->MemoryACPILevel.MinMvdd = 0;
3062        else
3063                table->MemoryACPILevel.MinMvdd =
3064                        cpu_to_be32(voltage_level.Voltage * VOLTAGE_SCALE);
3065
3066        mclk_pwrmgt_cntl |= MRDCK0_RESET | MRDCK1_RESET;
3067        mclk_pwrmgt_cntl &= ~(MRDCK0_PDNB | MRDCK1_PDNB);
3068
3069        dll_cntl &= ~(MRDCK0_BYPASS | MRDCK1_BYPASS);
3070
3071        table->MemoryACPILevel.DllCntl = cpu_to_be32(dll_cntl);
3072        table->MemoryACPILevel.MclkPwrmgtCntl = cpu_to_be32(mclk_pwrmgt_cntl);
3073        table->MemoryACPILevel.MpllAdFuncCntl =
3074                cpu_to_be32(pi->clock_registers.mpll_ad_func_cntl);
3075        table->MemoryACPILevel.MpllDqFuncCntl =
3076                cpu_to_be32(pi->clock_registers.mpll_dq_func_cntl);
3077        table->MemoryACPILevel.MpllFuncCntl =
3078                cpu_to_be32(pi->clock_registers.mpll_func_cntl);
3079        table->MemoryACPILevel.MpllFuncCntl_1 =
3080                cpu_to_be32(pi->clock_registers.mpll_func_cntl_1);
3081        table->MemoryACPILevel.MpllFuncCntl_2 =
3082                cpu_to_be32(pi->clock_registers.mpll_func_cntl_2);
3083        table->MemoryACPILevel.MpllSs1 = cpu_to_be32(pi->clock_registers.mpll_ss1);
3084        table->MemoryACPILevel.MpllSs2 = cpu_to_be32(pi->clock_registers.mpll_ss2);
3085
3086        table->MemoryACPILevel.EnabledForThrottle = 0;
3087        table->MemoryACPILevel.EnabledForActivity = 0;
3088        table->MemoryACPILevel.UpH = 0;
3089        table->MemoryACPILevel.DownH = 100;
3090        table->MemoryACPILevel.VoltageDownH = 0;
3091        table->MemoryACPILevel.ActivityLevel =
3092                cpu_to_be16((u16)pi->mclk_activity_target);
3093
3094        table->MemoryACPILevel.StutterEnable = false;
3095        table->MemoryACPILevel.StrobeEnable = false;
3096        table->MemoryACPILevel.EdcReadEnable = false;
3097        table->MemoryACPILevel.EdcWriteEnable = false;
3098        table->MemoryACPILevel.RttEnable = false;
3099
3100        return 0;
3101}
3102
3103
3104static int ci_enable_ulv(struct radeon_device *rdev, bool enable)
3105{
3106        struct ci_power_info *pi = ci_get_pi(rdev);
3107        struct ci_ulv_parm *ulv = &pi->ulv;
3108
3109        if (ulv->supported) {
3110                if (enable)
3111                        return (ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableULV) == PPSMC_Result_OK) ?
3112                                0 : -EINVAL;
3113                else
3114                        return (ci_send_msg_to_smc(rdev, PPSMC_MSG_DisableULV) == PPSMC_Result_OK) ?
3115                                0 : -EINVAL;
3116        }
3117
3118        return 0;
3119}
3120
3121static int ci_populate_ulv_level(struct radeon_device *rdev,
3122                                 SMU7_Discrete_Ulv *state)
3123{
3124        struct ci_power_info *pi = ci_get_pi(rdev);
3125        u16 ulv_voltage = rdev->pm.dpm.backbias_response_time;
3126
3127        state->CcPwrDynRm = 0;
3128        state->CcPwrDynRm1 = 0;
3129
3130        if (ulv_voltage == 0) {
3131                pi->ulv.supported = false;
3132                return 0;
3133        }
3134
3135        if (pi->voltage_control != CISLANDS_VOLTAGE_CONTROL_BY_SVID2) {
3136                if (ulv_voltage > rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[0].v)
3137                        state->VddcOffset = 0;
3138                else
3139                        state->VddcOffset =
3140                                rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[0].v - ulv_voltage;
3141        } else {
3142                if (ulv_voltage > rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[0].v)
3143                        state->VddcOffsetVid = 0;
3144                else
3145                        state->VddcOffsetVid = (u8)
3146                                ((rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[0].v - ulv_voltage) *
3147                                 VOLTAGE_VID_OFFSET_SCALE2 / VOLTAGE_VID_OFFSET_SCALE1);
3148        }
3149        state->VddcPhase = pi->vddc_phase_shed_control ? 0 : 1;
3150
3151        state->CcPwrDynRm = cpu_to_be32(state->CcPwrDynRm);
3152        state->CcPwrDynRm1 = cpu_to_be32(state->CcPwrDynRm1);
3153        state->VddcOffset = cpu_to_be16(state->VddcOffset);
3154
3155        return 0;
3156}
3157
3158static int ci_calculate_sclk_params(struct radeon_device *rdev,
3159                                    u32 engine_clock,
3160                                    SMU7_Discrete_GraphicsLevel *sclk)
3161{
3162        struct ci_power_info *pi = ci_get_pi(rdev);
3163        struct atom_clock_dividers dividers;
3164        u32 spll_func_cntl_3 = pi->clock_registers.cg_spll_func_cntl_3;
3165        u32 spll_func_cntl_4 = pi->clock_registers.cg_spll_func_cntl_4;
3166        u32 cg_spll_spread_spectrum = pi->clock_registers.cg_spll_spread_spectrum;
3167        u32 cg_spll_spread_spectrum_2 = pi->clock_registers.cg_spll_spread_spectrum_2;
3168        u32 reference_clock = rdev->clock.spll.reference_freq;
3169        u32 reference_divider;
3170        u32 fbdiv;
3171        int ret;
3172
3173        ret = radeon_atom_get_clock_dividers(rdev,
3174                                             COMPUTE_GPUCLK_INPUT_FLAG_SCLK,
3175                                             engine_clock, false, &dividers);
3176        if (ret)
3177                return ret;
3178
3179        reference_divider = 1 + dividers.ref_div;
3180        fbdiv = dividers.fb_div & 0x3FFFFFF;
3181
3182        spll_func_cntl_3 &= ~SPLL_FB_DIV_MASK;
3183        spll_func_cntl_3 |= SPLL_FB_DIV(fbdiv);
3184        spll_func_cntl_3 |= SPLL_DITHEN;
3185
3186        if (pi->caps_sclk_ss_support) {
3187                struct radeon_atom_ss ss;
3188                u32 vco_freq = engine_clock * dividers.post_div;
3189
3190                if (radeon_atombios_get_asic_ss_info(rdev, &ss,
3191                                                     ASIC_INTERNAL_ENGINE_SS, vco_freq)) {
3192                        u32 clk_s = reference_clock * 5 / (reference_divider * ss.rate);
3193                        u32 clk_v = 4 * ss.percentage * fbdiv / (clk_s * 10000);
3194
3195                        cg_spll_spread_spectrum &= ~CLK_S_MASK;
3196                        cg_spll_spread_spectrum |= CLK_S(clk_s);
3197                        cg_spll_spread_spectrum |= SSEN;
3198
3199                        cg_spll_spread_spectrum_2 &= ~CLK_V_MASK;
3200                        cg_spll_spread_spectrum_2 |= CLK_V(clk_v);
3201                }
3202        }
3203
3204        sclk->SclkFrequency = engine_clock;
3205        sclk->CgSpllFuncCntl3 = spll_func_cntl_3;
3206        sclk->CgSpllFuncCntl4 = spll_func_cntl_4;
3207        sclk->SpllSpreadSpectrum = cg_spll_spread_spectrum;
3208        sclk->SpllSpreadSpectrum2  = cg_spll_spread_spectrum_2;
3209        sclk->SclkDid = (u8)dividers.post_divider;
3210
3211        return 0;
3212}
3213
3214static int ci_populate_single_graphic_level(struct radeon_device *rdev,
3215                                            u32 engine_clock,
3216                                            u16 sclk_activity_level_t,
3217                                            SMU7_Discrete_GraphicsLevel *graphic_level)
3218{
3219        struct ci_power_info *pi = ci_get_pi(rdev);
3220        int ret;
3221
3222        ret = ci_calculate_sclk_params(rdev, engine_clock, graphic_level);
3223        if (ret)
3224                return ret;
3225
3226        ret = ci_get_dependency_volt_by_clk(rdev,
3227                                            &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
3228                                            engine_clock, &graphic_level->MinVddc);
3229        if (ret)
3230                return ret;
3231
3232        graphic_level->SclkFrequency = engine_clock;
3233
3234        graphic_level->Flags =  0;
3235        graphic_level->MinVddcPhases = 1;
3236
3237        if (pi->vddc_phase_shed_control)
3238                ci_populate_phase_value_based_on_sclk(rdev,
3239                                                      &rdev->pm.dpm.dyn_state.phase_shedding_limits_table,
3240                                                      engine_clock,
3241                                                      &graphic_level->MinVddcPhases);
3242
3243        graphic_level->ActivityLevel = sclk_activity_level_t;
3244
3245        graphic_level->CcPwrDynRm = 0;
3246        graphic_level->CcPwrDynRm1 = 0;
3247        graphic_level->EnabledForThrottle = 1;
3248        graphic_level->UpH = 0;
3249        graphic_level->DownH = 0;
3250        graphic_level->VoltageDownH = 0;
3251        graphic_level->PowerThrottle = 0;
3252
3253        if (pi->caps_sclk_ds)
3254                graphic_level->DeepSleepDivId = ci_get_sleep_divider_id_from_clock(rdev,
3255                                                                                   engine_clock,
3256                                                                                   CISLAND_MINIMUM_ENGINE_CLOCK);
3257
3258        graphic_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
3259
3260        graphic_level->Flags = cpu_to_be32(graphic_level->Flags);
3261        graphic_level->MinVddc = cpu_to_be32(graphic_level->MinVddc * VOLTAGE_SCALE);
3262        graphic_level->MinVddcPhases = cpu_to_be32(graphic_level->MinVddcPhases);
3263        graphic_level->SclkFrequency = cpu_to_be32(graphic_level->SclkFrequency);
3264        graphic_level->ActivityLevel = cpu_to_be16(graphic_level->ActivityLevel);
3265        graphic_level->CgSpllFuncCntl3 = cpu_to_be32(graphic_level->CgSpllFuncCntl3);
3266        graphic_level->CgSpllFuncCntl4 = cpu_to_be32(graphic_level->CgSpllFuncCntl4);
3267        graphic_level->SpllSpreadSpectrum = cpu_to_be32(graphic_level->SpllSpreadSpectrum);
3268        graphic_level->SpllSpreadSpectrum2 = cpu_to_be32(graphic_level->SpllSpreadSpectrum2);
3269        graphic_level->CcPwrDynRm = cpu_to_be32(graphic_level->CcPwrDynRm);
3270        graphic_level->CcPwrDynRm1 = cpu_to_be32(graphic_level->CcPwrDynRm1);
3271
3272        return 0;
3273}
3274
3275static int ci_populate_all_graphic_levels(struct radeon_device *rdev)
3276{
3277        struct ci_power_info *pi = ci_get_pi(rdev);
3278        struct ci_dpm_table *dpm_table = &pi->dpm_table;
3279        u32 level_array_address = pi->dpm_table_start +
3280                offsetof(SMU7_Discrete_DpmTable, GraphicsLevel);
3281        u32 level_array_size = sizeof(SMU7_Discrete_GraphicsLevel) *
3282                SMU7_MAX_LEVELS_GRAPHICS;
3283        SMU7_Discrete_GraphicsLevel *levels = pi->smc_state_table.GraphicsLevel;
3284        u32 i, ret;
3285
3286        memset(levels, 0, level_array_size);
3287
3288        for (i = 0; i < dpm_table->sclk_table.count; i++) {
3289                ret = ci_populate_single_graphic_level(rdev,
3290                                                       dpm_table->sclk_table.dpm_levels[i].value,
3291                                                       (u16)pi->activity_target[i],
3292                                                       &pi->smc_state_table.GraphicsLevel[i]);
3293                if (ret)
3294                        return ret;
3295                if (i > 1)
3296                        pi->smc_state_table.GraphicsLevel[i].DeepSleepDivId = 0;
3297                if (i == (dpm_table->sclk_table.count - 1))
3298                        pi->smc_state_table.GraphicsLevel[i].DisplayWatermark =
3299                                PPSMC_DISPLAY_WATERMARK_HIGH;
3300        }
3301        pi->smc_state_table.GraphicsLevel[0].EnabledForActivity = 1;
3302
3303        pi->smc_state_table.GraphicsDpmLevelCount = (u8)dpm_table->sclk_table.count;
3304        pi->dpm_level_enable_mask.sclk_dpm_enable_mask =
3305                ci_get_dpm_level_enable_mask_value(&dpm_table->sclk_table);
3306
3307        ret = ci_copy_bytes_to_smc(rdev, level_array_address,
3308                                   (u8 *)levels, level_array_size,
3309                                   pi->sram_end);
3310        if (ret)
3311                return ret;
3312
3313        return 0;
3314}
3315
3316static int ci_populate_ulv_state(struct radeon_device *rdev,
3317                                 SMU7_Discrete_Ulv *ulv_level)
3318{
3319        return ci_populate_ulv_level(rdev, ulv_level);
3320}
3321
3322static int ci_populate_all_memory_levels(struct radeon_device *rdev)
3323{
3324        struct ci_power_info *pi = ci_get_pi(rdev);
3325        struct ci_dpm_table *dpm_table = &pi->dpm_table;
3326        u32 level_array_address = pi->dpm_table_start +
3327                offsetof(SMU7_Discrete_DpmTable, MemoryLevel);
3328        u32 level_array_size = sizeof(SMU7_Discrete_MemoryLevel) *
3329                SMU7_MAX_LEVELS_MEMORY;
3330        SMU7_Discrete_MemoryLevel *levels = pi->smc_state_table.MemoryLevel;
3331        u32 i, ret;
3332
3333        memset(levels, 0, level_array_size);
3334
3335        for (i = 0; i < dpm_table->mclk_table.count; i++) {
3336                if (dpm_table->mclk_table.dpm_levels[i].value == 0)
3337                        return -EINVAL;
3338                ret = ci_populate_single_memory_level(rdev,
3339                                                      dpm_table->mclk_table.dpm_levels[i].value,
3340                                                      &pi->smc_state_table.MemoryLevel[i]);
3341                if (ret)
3342                        return ret;
3343        }
3344
3345        pi->smc_state_table.MemoryLevel[0].EnabledForActivity = 1;
3346
3347        if ((dpm_table->mclk_table.count >= 2) &&
3348            ((rdev->pdev->device == 0x67B0) || (rdev->pdev->device == 0x67B1))) {
3349                pi->smc_state_table.MemoryLevel[1].MinVddc =
3350                        pi->smc_state_table.MemoryLevel[0].MinVddc;
3351                pi->smc_state_table.MemoryLevel[1].MinVddcPhases =
3352                        pi->smc_state_table.MemoryLevel[0].MinVddcPhases;
3353        }
3354
3355        pi->smc_state_table.MemoryLevel[0].ActivityLevel = cpu_to_be16(0x1F);
3356
3357        pi->smc_state_table.MemoryDpmLevelCount = (u8)dpm_table->mclk_table.count;
3358        pi->dpm_level_enable_mask.mclk_dpm_enable_mask =
3359                ci_get_dpm_level_enable_mask_value(&dpm_table->mclk_table);
3360
3361        pi->smc_state_table.MemoryLevel[dpm_table->mclk_table.count - 1].DisplayWatermark =
3362                PPSMC_DISPLAY_WATERMARK_HIGH;
3363
3364        ret = ci_copy_bytes_to_smc(rdev, level_array_address,
3365                                   (u8 *)levels, level_array_size,
3366                                   pi->sram_end);
3367        if (ret)
3368                return ret;
3369
3370        return 0;
3371}
3372
3373static void ci_reset_single_dpm_table(struct radeon_device *rdev,
3374                                      struct ci_single_dpm_table* dpm_table,
3375                                      u32 count)
3376{
3377        u32 i;
3378
3379        dpm_table->count = count;
3380        for (i = 0; i < MAX_REGULAR_DPM_NUMBER; i++)
3381                dpm_table->dpm_levels[i].enabled = false;
3382}
3383
3384static void ci_setup_pcie_table_entry(struct ci_single_dpm_table* dpm_table,
3385                                      u32 index, u32 pcie_gen, u32 pcie_lanes)
3386{
3387        dpm_table->dpm_levels[index].value = pcie_gen;
3388        dpm_table->dpm_levels[index].param1 = pcie_lanes;
3389        dpm_table->dpm_levels[index].enabled = true;
3390}
3391
3392static int ci_setup_default_pcie_tables(struct radeon_device *rdev)
3393{
3394        struct ci_power_info *pi = ci_get_pi(rdev);
3395
3396        if (!pi->use_pcie_performance_levels && !pi->use_pcie_powersaving_levels)
3397                return -EINVAL;
3398
3399        if (pi->use_pcie_performance_levels && !pi->use_pcie_powersaving_levels) {
3400                pi->pcie_gen_powersaving = pi->pcie_gen_performance;
3401                pi->pcie_lane_powersaving = pi->pcie_lane_performance;
3402        } else if (!pi->use_pcie_performance_levels && pi->use_pcie_powersaving_levels) {
3403                pi->pcie_gen_performance = pi->pcie_gen_powersaving;
3404                pi->pcie_lane_performance = pi->pcie_lane_powersaving;
3405        }
3406
3407        ci_reset_single_dpm_table(rdev,
3408                                  &pi->dpm_table.pcie_speed_table,
3409                                  SMU7_MAX_LEVELS_LINK);
3410
3411        if (rdev->family == CHIP_BONAIRE)
3412                ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 0,
3413                                          pi->pcie_gen_powersaving.min,
3414                                          pi->pcie_lane_powersaving.max);
3415        else
3416                ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 0,
3417                                          pi->pcie_gen_powersaving.min,
3418                                          pi->pcie_lane_powersaving.min);
3419        ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 1,
3420                                  pi->pcie_gen_performance.min,
3421                                  pi->pcie_lane_performance.min);
3422        ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 2,
3423                                  pi->pcie_gen_powersaving.min,
3424                                  pi->pcie_lane_powersaving.max);
3425        ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 3,
3426                                  pi->pcie_gen_performance.min,
3427                                  pi->pcie_lane_performance.max);
3428        ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 4,
3429                                  pi->pcie_gen_powersaving.max,
3430                                  pi->pcie_lane_powersaving.max);
3431        ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 5,
3432                                  pi->pcie_gen_performance.max,
3433                                  pi->pcie_lane_performance.max);
3434
3435        pi->dpm_table.pcie_speed_table.count = 6;
3436
3437        return 0;
3438}
3439
3440static int ci_setup_default_dpm_tables(struct radeon_device *rdev)
3441{
3442        struct ci_power_info *pi = ci_get_pi(rdev);
3443        struct radeon_clock_voltage_dependency_table *allowed_sclk_vddc_table =
3444                &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
3445        struct radeon_clock_voltage_dependency_table *allowed_mclk_table =
3446                &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk;
3447        struct radeon_cac_leakage_table *std_voltage_table =
3448                &rdev->pm.dpm.dyn_state.cac_leakage_table;
3449        u32 i;
3450
3451        if (allowed_sclk_vddc_table == NULL)
3452                return -EINVAL;
3453        if (allowed_sclk_vddc_table->count < 1)
3454                return -EINVAL;
3455        if (allowed_mclk_table == NULL)
3456                return -EINVAL;
3457        if (allowed_mclk_table->count < 1)
3458                return -EINVAL;
3459
3460        memset(&pi->dpm_table, 0, sizeof(struct ci_dpm_table));
3461
3462        ci_reset_single_dpm_table(rdev,
3463                                  &pi->dpm_table.sclk_table,
3464                                  SMU7_MAX_LEVELS_GRAPHICS);
3465        ci_reset_single_dpm_table(rdev,
3466                                  &pi->dpm_table.mclk_table,
3467                                  SMU7_MAX_LEVELS_MEMORY);
3468        ci_reset_single_dpm_table(rdev,
3469                                  &pi->dpm_table.vddc_table,
3470                                  SMU7_MAX_LEVELS_VDDC);
3471        ci_reset_single_dpm_table(rdev,
3472                                  &pi->dpm_table.vddci_table,
3473                                  SMU7_MAX_LEVELS_VDDCI);
3474        ci_reset_single_dpm_table(rdev,
3475                                  &pi->dpm_table.mvdd_table,
3476                                  SMU7_MAX_LEVELS_MVDD);
3477
3478        pi->dpm_table.sclk_table.count = 0;
3479        for (i = 0; i < allowed_sclk_vddc_table->count; i++) {
3480                if ((i == 0) ||
3481                    (pi->dpm_table.sclk_table.dpm_levels[pi->dpm_table.sclk_table.count-1].value !=
3482                     allowed_sclk_vddc_table->entries[i].clk)) {
3483                        pi->dpm_table.sclk_table.dpm_levels[pi->dpm_table.sclk_table.count].value =
3484                                allowed_sclk_vddc_table->entries[i].clk;
3485                        pi->dpm_table.sclk_table.dpm_levels[pi->dpm_table.sclk_table.count].enabled =
3486                                (i == 0) ? true : false;
3487                        pi->dpm_table.sclk_table.count++;
3488                }
3489        }
3490
3491        pi->dpm_table.mclk_table.count = 0;
3492        for (i = 0; i < allowed_mclk_table->count; i++) {
3493                if ((i == 0) ||
3494                    (pi->dpm_table.mclk_table.dpm_levels[pi->dpm_table.mclk_table.count-1].value !=
3495                     allowed_mclk_table->entries[i].clk)) {
3496                        pi->dpm_table.mclk_table.dpm_levels[pi->dpm_table.mclk_table.count].value =
3497                                allowed_mclk_table->entries[i].clk;
3498                        pi->dpm_table.mclk_table.dpm_levels[pi->dpm_table.mclk_table.count].enabled =
3499                                (i == 0) ? true : false;
3500                        pi->dpm_table.mclk_table.count++;
3501                }
3502        }
3503
3504        for (i = 0; i < allowed_sclk_vddc_table->count; i++) {
3505                pi->dpm_table.vddc_table.dpm_levels[i].value =
3506                        allowed_sclk_vddc_table->entries[i].v;
3507                pi->dpm_table.vddc_table.dpm_levels[i].param1 =
3508                        std_voltage_table->entries[i].leakage;
3509                pi->dpm_table.vddc_table.dpm_levels[i].enabled = true;
3510        }
3511        pi->dpm_table.vddc_table.count = allowed_sclk_vddc_table->count;
3512
3513        allowed_mclk_table = &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk;
3514        if (allowed_mclk_table) {
3515                for (i = 0; i < allowed_mclk_table->count; i++) {
3516                        pi->dpm_table.vddci_table.dpm_levels[i].value =
3517                                allowed_mclk_table->entries[i].v;
3518                        pi->dpm_table.vddci_table.dpm_levels[i].enabled = true;
3519                }
3520                pi->dpm_table.vddci_table.count = allowed_mclk_table->count;
3521        }
3522
3523        allowed_mclk_table = &rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk;
3524        if (allowed_mclk_table) {
3525                for (i = 0; i < allowed_mclk_table->count; i++) {
3526                        pi->dpm_table.mvdd_table.dpm_levels[i].value =
3527                                allowed_mclk_table->entries[i].v;
3528                        pi->dpm_table.mvdd_table.dpm_levels[i].enabled = true;
3529                }
3530                pi->dpm_table.mvdd_table.count = allowed_mclk_table->count;
3531        }
3532
3533        ci_setup_default_pcie_tables(rdev);
3534
3535        return 0;
3536}
3537
3538static int ci_find_boot_level(struct ci_single_dpm_table *table,
3539                              u32 value, u32 *boot_level)
3540{
3541        u32 i;
3542        int ret = -EINVAL;
3543
3544        for(i = 0; i < table->count; i++) {
3545                if (value == table->dpm_levels[i].value) {
3546                        *boot_level = i;
3547                        ret = 0;
3548                }
3549        }
3550
3551        return ret;
3552}
3553
3554static int ci_init_smc_table(struct radeon_device *rdev)
3555{
3556        struct ci_power_info *pi = ci_get_pi(rdev);
3557        struct ci_ulv_parm *ulv = &pi->ulv;
3558        struct radeon_ps *radeon_boot_state = rdev->pm.dpm.boot_ps;
3559        SMU7_Discrete_DpmTable *table = &pi->smc_state_table;
3560        int ret;
3561
3562        ret = ci_setup_default_dpm_tables(rdev);
3563        if (ret)
3564                return ret;
3565
3566        if (pi->voltage_control != CISLANDS_VOLTAGE_CONTROL_NONE)
3567                ci_populate_smc_voltage_tables(rdev, table);
3568
3569        ci_init_fps_limits(rdev);
3570
3571        if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_HARDWAREDC)
3572                table->SystemFlags |= PPSMC_SYSTEMFLAG_GPIO_DC;
3573
3574        if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC)
3575                table->SystemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC;
3576
3577        if (pi->mem_gddr5)
3578                table->SystemFlags |= PPSMC_SYSTEMFLAG_GDDR5;
3579
3580        if (ulv->supported) {
3581                ret = ci_populate_ulv_state(rdev, &pi->smc_state_table.Ulv);
3582                if (ret)
3583                        return ret;
3584                WREG32_SMC(CG_ULV_PARAMETER, ulv->cg_ulv_parameter);
3585        }
3586
3587        ret = ci_populate_all_graphic_levels(rdev);
3588        if (ret)
3589                return ret;
3590
3591        ret = ci_populate_all_memory_levels(rdev);
3592        if (ret)
3593                return ret;
3594
3595        ci_populate_smc_link_level(rdev, table);
3596
3597        ret = ci_populate_smc_acpi_level(rdev, table);
3598        if (ret)
3599                return ret;
3600
3601        ret = ci_populate_smc_vce_level(rdev, table);
3602        if (ret)
3603                return ret;
3604
3605        ret = ci_populate_smc_acp_level(rdev, table);
3606        if (ret)
3607                return ret;
3608
3609        ret = ci_populate_smc_samu_level(rdev, table);
3610        if (ret)
3611                return ret;
3612
3613        ret = ci_do_program_memory_timing_parameters(rdev);
3614        if (ret)
3615                return ret;
3616
3617        ret = ci_populate_smc_uvd_level(rdev, table);
3618        if (ret)
3619                return ret;
3620
3621        table->UvdBootLevel  = 0;
3622        table->VceBootLevel  = 0;
3623        table->AcpBootLevel  = 0;
3624        table->SamuBootLevel  = 0;
3625        table->GraphicsBootLevel  = 0;
3626        table->MemoryBootLevel  = 0;
3627
3628        ret = ci_find_boot_level(&pi->dpm_table.sclk_table,
3629                                 pi->vbios_boot_state.sclk_bootup_value,
3630                                 (u32 *)&pi->smc_state_table.GraphicsBootLevel);
3631
3632        ret = ci_find_boot_level(&pi->dpm_table.mclk_table,
3633                                 pi->vbios_boot_state.mclk_bootup_value,
3634                                 (u32 *)&pi->smc_state_table.MemoryBootLevel);
3635
3636        table->BootVddc = pi->vbios_boot_state.vddc_bootup_value;
3637        table->BootVddci = pi->vbios_boot_state.vddci_bootup_value;
3638        table->BootMVdd = pi->vbios_boot_state.mvdd_bootup_value;
3639
3640        ci_populate_smc_initial_state(rdev, radeon_boot_state);
3641
3642        ret = ci_populate_bapm_parameters_in_dpm_table(rdev);
3643        if (ret)
3644                return ret;
3645
3646        table->UVDInterval = 1;
3647        table->VCEInterval = 1;
3648        table->ACPInterval = 1;
3649        table->SAMUInterval = 1;
3650        table->GraphicsVoltageChangeEnable = 1;
3651        table->GraphicsThermThrottleEnable = 1;
3652        table->GraphicsInterval = 1;
3653        table->VoltageInterval = 1;
3654        table->ThermalInterval = 1;
3655        table->TemperatureLimitHigh = (u16)((pi->thermal_temp_setting.temperature_high *
3656                                             CISLANDS_Q88_FORMAT_CONVERSION_UNIT) / 1000);
3657        table->TemperatureLimitLow = (u16)((pi->thermal_temp_setting.temperature_low *
3658                                            CISLANDS_Q88_FORMAT_CONVERSION_UNIT) / 1000);
3659        table->MemoryVoltageChangeEnable = 1;
3660        table->MemoryInterval = 1;
3661        table->VoltageResponseTime = 0;
3662        table->VddcVddciDelta = 4000;
3663        table->PhaseResponseTime = 0;
3664        table->MemoryThermThrottleEnable = 1;
3665        table->PCIeBootLinkLevel = pi->dpm_table.pcie_speed_table.count - 1;
3666        table->PCIeGenInterval = 1;
3667        if (pi->voltage_control == CISLANDS_VOLTAGE_CONTROL_BY_SVID2)
3668                table->SVI2Enable  = 1;
3669        else
3670                table->SVI2Enable  = 0;
3671
3672        table->ThermGpio = 17;
3673        table->SclkStepSize = 0x4000;
3674
3675        table->SystemFlags = cpu_to_be32(table->SystemFlags);
3676        table->SmioMaskVddcVid = cpu_to_be32(table->SmioMaskVddcVid);
3677        table->SmioMaskVddcPhase = cpu_to_be32(table->SmioMaskVddcPhase);
3678        table->SmioMaskVddciVid = cpu_to_be32(table->SmioMaskVddciVid);
3679        table->SmioMaskMvddVid = cpu_to_be32(table->SmioMaskMvddVid);
3680        table->SclkStepSize = cpu_to_be32(table->SclkStepSize);
3681        table->TemperatureLimitHigh = cpu_to_be16(table->TemperatureLimitHigh);
3682        table->TemperatureLimitLow = cpu_to_be16(table->TemperatureLimitLow);
3683        table->VddcVddciDelta = cpu_to_be16(table->VddcVddciDelta);
3684        table->VoltageResponseTime = cpu_to_be16(table->VoltageResponseTime);
3685        table->PhaseResponseTime = cpu_to_be16(table->PhaseResponseTime);
3686        table->BootVddc = cpu_to_be16(table->BootVddc * VOLTAGE_SCALE);
3687        table->BootVddci = cpu_to_be16(table->BootVddci * VOLTAGE_SCALE);
3688        table->BootMVdd = cpu_to_be16(table->BootMVdd * VOLTAGE_SCALE);
3689
3690        ret = ci_copy_bytes_to_smc(rdev,
3691                                   pi->dpm_table_start +
3692                                   offsetof(SMU7_Discrete_DpmTable, SystemFlags),
3693                                   (u8 *)&table->SystemFlags,
3694                                   sizeof(SMU7_Discrete_DpmTable) - 3 * sizeof(SMU7_PIDController),
3695                                   pi->sram_end);
3696        if (ret)
3697                return ret;
3698
3699        return 0;
3700}
3701
3702static void ci_trim_single_dpm_states(struct radeon_device *rdev,
3703                                      struct ci_single_dpm_table *dpm_table,
3704                                      u32 low_limit, u32 high_limit)
3705{
3706        u32 i;
3707
3708        for (i = 0; i < dpm_table->count; i++) {
3709                if ((dpm_table->dpm_levels[i].value < low_limit) ||
3710                    (dpm_table->dpm_levels[i].value > high_limit))
3711                        dpm_table->dpm_levels[i].enabled = false;
3712                else
3713                        dpm_table->dpm_levels[i].enabled = true;
3714        }
3715}
3716
3717static void ci_trim_pcie_dpm_states(struct radeon_device *rdev,
3718                                    u32 speed_low, u32 lanes_low,
3719                                    u32 speed_high, u32 lanes_high)
3720{
3721        struct ci_power_info *pi = ci_get_pi(rdev);
3722        struct ci_single_dpm_table *pcie_table = &pi->dpm_table.pcie_speed_table;
3723        u32 i, j;
3724
3725        for (i = 0; i < pcie_table->count; i++) {
3726                if ((pcie_table->dpm_levels[i].value < speed_low) ||
3727                    (pcie_table->dpm_levels[i].param1 < lanes_low) ||
3728                    (pcie_table->dpm_levels[i].value > speed_high) ||
3729                    (pcie_table->dpm_levels[i].param1 > lanes_high))
3730                        pcie_table->dpm_levels[i].enabled = false;
3731                else
3732                        pcie_table->dpm_levels[i].enabled = true;
3733        }
3734
3735        for (i = 0; i < pcie_table->count; i++) {
3736                if (pcie_table->dpm_levels[i].enabled) {
3737                        for (j = i + 1; j < pcie_table->count; j++) {
3738                                if (pcie_table->dpm_levels[j].enabled) {
3739                                        if ((pcie_table->dpm_levels[i].value == pcie_table->dpm_levels[j].value) &&
3740                                            (pcie_table->dpm_levels[i].param1 == pcie_table->dpm_levels[j].param1))
3741                                                pcie_table->dpm_levels[j].enabled = false;
3742                                }
3743                        }
3744                }
3745        }
3746}
3747
3748static int ci_trim_dpm_states(struct radeon_device *rdev,
3749                              struct radeon_ps *radeon_state)
3750{
3751        struct ci_ps *state = ci_get_ps(radeon_state);
3752        struct ci_power_info *pi = ci_get_pi(rdev);
3753        u32 high_limit_count;
3754
3755        if (state->performance_level_count < 1)
3756                return -EINVAL;
3757
3758        if (state->performance_level_count == 1)
3759                high_limit_count = 0;
3760        else
3761                high_limit_count = 1;
3762
3763        ci_trim_single_dpm_states(rdev,
3764                                  &pi->dpm_table.sclk_table,
3765                                  state->performance_levels[0].sclk,
3766                                  state->performance_levels[high_limit_count].sclk);
3767
3768        ci_trim_single_dpm_states(rdev,
3769                                  &pi->dpm_table.mclk_table,
3770                                  state->performance_levels[0].mclk,
3771                                  state->performance_levels[high_limit_count].mclk);
3772
3773        ci_trim_pcie_dpm_states(rdev,
3774                                state->performance_levels[0].pcie_gen,
3775                                state->performance_levels[0].pcie_lane,
3776                                state->performance_levels[high_limit_count].pcie_gen,
3777                                state->performance_levels[high_limit_count].pcie_lane);
3778
3779        return 0;
3780}
3781
3782static int ci_apply_disp_minimum_voltage_request(struct radeon_device *rdev)
3783{
3784        struct radeon_clock_voltage_dependency_table *disp_voltage_table =
3785                &rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk;
3786        struct radeon_clock_voltage_dependency_table *vddc_table =
3787                &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
3788        u32 requested_voltage = 0;
3789        u32 i;
3790
3791        if (disp_voltage_table == NULL)
3792                return -EINVAL;
3793        if (!disp_voltage_table->count)
3794                return -EINVAL;
3795
3796        for (i = 0; i < disp_voltage_table->count; i++) {
3797                if (rdev->clock.current_dispclk == disp_voltage_table->entries[i].clk)
3798                        requested_voltage = disp_voltage_table->entries[i].v;
3799        }
3800
3801        for (i = 0; i < vddc_table->count; i++) {
3802                if (requested_voltage <= vddc_table->entries[i].v) {
3803                        requested_voltage = vddc_table->entries[i].v;
3804                        return (ci_send_msg_to_smc_with_parameter(rdev,
3805                                                                  PPSMC_MSG_VddC_Request,
3806                                                                  requested_voltage * VOLTAGE_SCALE) == PPSMC_Result_OK) ?
3807                                0 : -EINVAL;
3808                }
3809        }
3810
3811        return -EINVAL;
3812}
3813
3814static int ci_upload_dpm_level_enable_mask(struct radeon_device *rdev)
3815{
3816        struct ci_power_info *pi = ci_get_pi(rdev);
3817        PPSMC_Result result;
3818
3819        ci_apply_disp_minimum_voltage_request(rdev);
3820
3821        if (!pi->sclk_dpm_key_disabled) {
3822                if (pi->dpm_level_enable_mask.sclk_dpm_enable_mask) {
3823                        result = ci_send_msg_to_smc_with_parameter(rdev,
3824                                                                   PPSMC_MSG_SCLKDPM_SetEnabledMask,
3825                                                                   pi->dpm_level_enable_mask.sclk_dpm_enable_mask);
3826                        if (result != PPSMC_Result_OK)
3827                                return -EINVAL;
3828                }
3829        }
3830
3831        if (!pi->mclk_dpm_key_disabled) {
3832                if (pi->dpm_level_enable_mask.mclk_dpm_enable_mask) {
3833                        result = ci_send_msg_to_smc_with_parameter(rdev,
3834                                                                   PPSMC_MSG_MCLKDPM_SetEnabledMask,
3835                                                                   pi->dpm_level_enable_mask.mclk_dpm_enable_mask);
3836                        if (result != PPSMC_Result_OK)
3837                                return -EINVAL;
3838                }
3839        }
3840#if 0
3841        if (!pi->pcie_dpm_key_disabled) {
3842                if (pi->dpm_level_enable_mask.pcie_dpm_enable_mask) {
3843                        result = ci_send_msg_to_smc_with_parameter(rdev,
3844                                                                   PPSMC_MSG_PCIeDPM_SetEnabledMask,
3845                                                                   pi->dpm_level_enable_mask.pcie_dpm_enable_mask);
3846                        if (result != PPSMC_Result_OK)
3847                                return -EINVAL;
3848                }
3849        }
3850#endif
3851        return 0;
3852}
3853
3854static void ci_find_dpm_states_clocks_in_dpm_table(struct radeon_device *rdev,
3855                                                   struct radeon_ps *radeon_state)
3856{
3857        struct ci_power_info *pi = ci_get_pi(rdev);
3858        struct ci_ps *state = ci_get_ps(radeon_state);
3859        struct ci_single_dpm_table *sclk_table = &pi->dpm_table.sclk_table;
3860        u32 sclk = state->performance_levels[state->performance_level_count-1].sclk;
3861        struct ci_single_dpm_table *mclk_table = &pi->dpm_table.mclk_table;
3862        u32 mclk = state->performance_levels[state->performance_level_count-1].mclk;
3863        u32 i;
3864
3865        pi->need_update_smu7_dpm_table = 0;
3866
3867        for (i = 0; i < sclk_table->count; i++) {
3868                if (sclk == sclk_table->dpm_levels[i].value)
3869                        break;
3870        }
3871
3872        if (i >= sclk_table->count) {
3873                pi->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_SCLK;
3874        } else {
3875                /* XXX The current code always reprogrammed the sclk levels,
3876                 * but we don't currently handle disp sclk requirements
3877                 * so just skip it.
3878                 */
3879                if (CISLAND_MINIMUM_ENGINE_CLOCK != CISLAND_MINIMUM_ENGINE_CLOCK)
3880                        pi->need_update_smu7_dpm_table |= DPMTABLE_UPDATE_SCLK;
3881        }
3882
3883        for (i = 0; i < mclk_table->count; i++) {
3884                if (mclk == mclk_table->dpm_levels[i].value)
3885                        break;
3886        }
3887
3888        if (i >= mclk_table->count)
3889                pi->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_MCLK;
3890
3891        if (rdev->pm.dpm.current_active_crtc_count !=
3892            rdev->pm.dpm.new_active_crtc_count)
3893                pi->need_update_smu7_dpm_table |= DPMTABLE_UPDATE_MCLK;
3894}
3895
3896static int ci_populate_and_upload_sclk_mclk_dpm_levels(struct radeon_device *rdev,
3897                                                       struct radeon_ps *radeon_state)
3898{
3899        struct ci_power_info *pi = ci_get_pi(rdev);
3900        struct ci_ps *state = ci_get_ps(radeon_state);
3901        u32 sclk = state->performance_levels[state->performance_level_count-1].sclk;
3902        u32 mclk = state->performance_levels[state->performance_level_count-1].mclk;
3903        struct ci_dpm_table *dpm_table = &pi->dpm_table;
3904        int ret;
3905
3906        if (!pi->need_update_smu7_dpm_table)
3907                return 0;
3908
3909        if (pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_SCLK)
3910                dpm_table->sclk_table.dpm_levels[dpm_table->sclk_table.count-1].value = sclk;
3911
3912        if (pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK)
3913                dpm_table->mclk_table.dpm_levels[dpm_table->mclk_table.count-1].value = mclk;
3914
3915        if (pi->need_update_smu7_dpm_table & (DPMTABLE_OD_UPDATE_SCLK | DPMTABLE_UPDATE_SCLK)) {
3916                ret = ci_populate_all_graphic_levels(rdev);
3917                if (ret)
3918                        return ret;
3919        }
3920
3921        if (pi->need_update_smu7_dpm_table & (DPMTABLE_OD_UPDATE_MCLK | DPMTABLE_UPDATE_MCLK)) {
3922                ret = ci_populate_all_memory_levels(rdev);
3923                if (ret)
3924                        return ret;
3925        }
3926
3927        return 0;
3928}
3929
3930static int ci_enable_uvd_dpm(struct radeon_device *rdev, bool enable)
3931{
3932        struct ci_power_info *pi = ci_get_pi(rdev);
3933        const struct radeon_clock_and_voltage_limits *max_limits;
3934        int i;
3935
3936        if (rdev->pm.dpm.ac_power)
3937                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
3938        else
3939                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
3940
3941        if (enable) {
3942                pi->dpm_level_enable_mask.uvd_dpm_enable_mask = 0;
3943
3944                for (i = rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count - 1; i >= 0; i--) {
3945                        if (rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].v <= max_limits->vddc) {
3946                                pi->dpm_level_enable_mask.uvd_dpm_enable_mask |= 1 << i;
3947
3948                                if (!pi->caps_uvd_dpm)
3949                                        break;
3950                        }
3951                }
3952
3953                ci_send_msg_to_smc_with_parameter(rdev,
3954                                                  PPSMC_MSG_UVDDPM_SetEnabledMask,
3955                                                  pi->dpm_level_enable_mask.uvd_dpm_enable_mask);
3956
3957                if (pi->last_mclk_dpm_enable_mask & 0x1) {
3958                        pi->uvd_enabled = true;
3959                        pi->dpm_level_enable_mask.mclk_dpm_enable_mask &= 0xFFFFFFFE;
3960                        ci_send_msg_to_smc_with_parameter(rdev,
3961                                                          PPSMC_MSG_MCLKDPM_SetEnabledMask,
3962                                                          pi->dpm_level_enable_mask.mclk_dpm_enable_mask);
3963                }
3964        } else {
3965                if (pi->last_mclk_dpm_enable_mask & 0x1) {
3966                        pi->uvd_enabled = false;
3967                        pi->dpm_level_enable_mask.mclk_dpm_enable_mask |= 1;
3968                        ci_send_msg_to_smc_with_parameter(rdev,
3969                                                          PPSMC_MSG_MCLKDPM_SetEnabledMask,
3970                                                          pi->dpm_level_enable_mask.mclk_dpm_enable_mask);
3971                }
3972        }
3973
3974        return (ci_send_msg_to_smc(rdev, enable ?
3975                                   PPSMC_MSG_UVDDPM_Enable : PPSMC_MSG_UVDDPM_Disable) == PPSMC_Result_OK) ?
3976                0 : -EINVAL;
3977}
3978
3979static int ci_enable_vce_dpm(struct radeon_device *rdev, bool enable)
3980{
3981        struct ci_power_info *pi = ci_get_pi(rdev);
3982        const struct radeon_clock_and_voltage_limits *max_limits;
3983        int i;
3984
3985        if (rdev->pm.dpm.ac_power)
3986                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
3987        else
3988                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
3989
3990        if (enable) {
3991                pi->dpm_level_enable_mask.vce_dpm_enable_mask = 0;
3992                for (i = rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.count - 1; i >= 0; i--) {
3993                        if (rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries[i].v <= max_limits->vddc) {
3994                                pi->dpm_level_enable_mask.vce_dpm_enable_mask |= 1 << i;
3995
3996                                if (!pi->caps_vce_dpm)
3997                                        break;
3998                        }
3999                }
4000
4001                ci_send_msg_to_smc_with_parameter(rdev,
4002                                                  PPSMC_MSG_VCEDPM_SetEnabledMask,
4003                                                  pi->dpm_level_enable_mask.vce_dpm_enable_mask);
4004        }
4005
4006        return (ci_send_msg_to_smc(rdev, enable ?
4007                                   PPSMC_MSG_VCEDPM_Enable : PPSMC_MSG_VCEDPM_Disable) == PPSMC_Result_OK) ?
4008                0 : -EINVAL;
4009}
4010
4011#if 0
4012static int ci_enable_samu_dpm(struct radeon_device *rdev, bool enable)
4013{
4014        struct ci_power_info *pi = ci_get_pi(rdev);
4015        const struct radeon_clock_and_voltage_limits *max_limits;
4016        int i;
4017
4018        if (rdev->pm.dpm.ac_power)
4019                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
4020        else
4021                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
4022
4023        if (enable) {
4024                pi->dpm_level_enable_mask.samu_dpm_enable_mask = 0;
4025                for (i = rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.count - 1; i >= 0; i--) {
4026                        if (rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries[i].v <= max_limits->vddc) {
4027                                pi->dpm_level_enable_mask.samu_dpm_enable_mask |= 1 << i;
4028
4029                                if (!pi->caps_samu_dpm)
4030                                        break;
4031                        }
4032                }
4033
4034                ci_send_msg_to_smc_with_parameter(rdev,
4035                                                  PPSMC_MSG_SAMUDPM_SetEnabledMask,
4036                                                  pi->dpm_level_enable_mask.samu_dpm_enable_mask);
4037        }
4038        return (ci_send_msg_to_smc(rdev, enable ?
4039                                   PPSMC_MSG_SAMUDPM_Enable : PPSMC_MSG_SAMUDPM_Disable) == PPSMC_Result_OK) ?
4040                0 : -EINVAL;
4041}
4042
4043static int ci_enable_acp_dpm(struct radeon_device *rdev, bool enable)
4044{
4045        struct ci_power_info *pi = ci_get_pi(rdev);
4046        const struct radeon_clock_and_voltage_limits *max_limits;
4047        int i;
4048
4049        if (rdev->pm.dpm.ac_power)
4050                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
4051        else
4052                max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
4053
4054        if (enable) {
4055                pi->dpm_level_enable_mask.acp_dpm_enable_mask = 0;
4056                for (i = rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.count - 1; i >= 0; i--) {
4057                        if (rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[i].v <= max_limits->vddc) {
4058                                pi->dpm_level_enable_mask.acp_dpm_enable_mask |= 1 << i;
4059
4060                                if (!pi->caps_acp_dpm)
4061                                        break;
4062                        }
4063                }
4064
4065                ci_send_msg_to_smc_with_parameter(rdev,
4066                                                  PPSMC_MSG_ACPDPM_SetEnabledMask,
4067                                                  pi->dpm_level_enable_mask.acp_dpm_enable_mask);
4068        }
4069
4070        return (ci_send_msg_to_smc(rdev, enable ?
4071                                   PPSMC_MSG_ACPDPM_Enable : PPSMC_MSG_ACPDPM_Disable) == PPSMC_Result_OK) ?
4072                0 : -EINVAL;
4073}
4074#endif
4075
4076static int ci_update_uvd_dpm(struct radeon_device *rdev, bool gate)
4077{
4078        struct ci_power_info *pi = ci_get_pi(rdev);
4079        u32 tmp;
4080
4081        if (!gate) {
4082                if (pi->caps_uvd_dpm ||
4083                    (rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count <= 0))
4084                        pi->smc_state_table.UvdBootLevel = 0;
4085                else
4086                        pi->smc_state_table.UvdBootLevel =
4087                                rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count - 1;
4088
4089                tmp = RREG32_SMC(DPM_TABLE_475);
4090                tmp &= ~UvdBootLevel_MASK;
4091                tmp |= UvdBootLevel(pi->smc_state_table.UvdBootLevel);
4092                WREG32_SMC(DPM_TABLE_475, tmp);
4093        }
4094
4095        return ci_enable_uvd_dpm(rdev, !gate);
4096}
4097
4098static u8 ci_get_vce_boot_level(struct radeon_device *rdev)
4099{
4100        u8 i;
4101        u32 min_evclk = 30000; /* ??? */
4102        struct radeon_vce_clock_voltage_dependency_table *table =
4103                &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table;
4104
4105        for (i = 0; i < table->count; i++) {
4106                if (table->entries[i].evclk >= min_evclk)
4107                        return i;
4108        }
4109
4110        return table->count - 1;
4111}
4112
4113static int ci_update_vce_dpm(struct radeon_device *rdev,
4114                             struct radeon_ps *radeon_new_state,
4115                             struct radeon_ps *radeon_current_state)
4116{
4117        struct ci_power_info *pi = ci_get_pi(rdev);
4118        int ret = 0;
4119        u32 tmp;
4120
4121        if (radeon_current_state->evclk != radeon_new_state->evclk) {
4122                if (radeon_new_state->evclk) {
4123                        /* turn the clocks on when encoding */
4124                        cik_update_cg(rdev, RADEON_CG_BLOCK_VCE, false);
4125
4126                        pi->smc_state_table.VceBootLevel = ci_get_vce_boot_level(rdev);
4127                        tmp = RREG32_SMC(DPM_TABLE_475);
4128                        tmp &= ~VceBootLevel_MASK;
4129                        tmp |= VceBootLevel(pi->smc_state_table.VceBootLevel);
4130                        WREG32_SMC(DPM_TABLE_475, tmp);
4131
4132                        ret = ci_enable_vce_dpm(rdev, true);
4133                } else {
4134                        /* turn the clocks off when not encoding */
4135                        cik_update_cg(rdev, RADEON_CG_BLOCK_VCE, true);
4136
4137                        ret = ci_enable_vce_dpm(rdev, false);
4138                }
4139        }
4140        return ret;
4141}
4142
4143#if 0
4144static int ci_update_samu_dpm(struct radeon_device *rdev, bool gate)
4145{
4146        return ci_enable_samu_dpm(rdev, gate);
4147}
4148
4149static int ci_update_acp_dpm(struct radeon_device *rdev, bool gate)
4150{
4151        struct ci_power_info *pi = ci_get_pi(rdev);
4152        u32 tmp;
4153
4154        if (!gate) {
4155                pi->smc_state_table.AcpBootLevel = 0;
4156
4157                tmp = RREG32_SMC(DPM_TABLE_475);
4158                tmp &= ~AcpBootLevel_MASK;
4159                tmp |= AcpBootLevel(pi->smc_state_table.AcpBootLevel);
4160                WREG32_SMC(DPM_TABLE_475, tmp);
4161        }
4162
4163        return ci_enable_acp_dpm(rdev, !gate);
4164}
4165#endif
4166
4167static int ci_generate_dpm_level_enable_mask(struct radeon_device *rdev,
4168                                             struct radeon_ps *radeon_state)
4169{
4170        struct ci_power_info *pi = ci_get_pi(rdev);
4171        int ret;
4172
4173        ret = ci_trim_dpm_states(rdev, radeon_state);
4174        if (ret)
4175                return ret;
4176
4177        pi->dpm_level_enable_mask.sclk_dpm_enable_mask =
4178                ci_get_dpm_level_enable_mask_value(&pi->dpm_table.sclk_table);
4179        pi->dpm_level_enable_mask.mclk_dpm_enable_mask =
4180                ci_get_dpm_level_enable_mask_value(&pi->dpm_table.mclk_table);
4181        pi->last_mclk_dpm_enable_mask =
4182                pi->dpm_level_enable_mask.mclk_dpm_enable_mask;
4183        if (pi->uvd_enabled) {
4184                if (pi->dpm_level_enable_mask.mclk_dpm_enable_mask & 1)
4185                        pi->dpm_level_enable_mask.mclk_dpm_enable_mask &= 0xFFFFFFFE;
4186        }
4187        pi->dpm_level_enable_mask.pcie_dpm_enable_mask =
4188                ci_get_dpm_level_enable_mask_value(&pi->dpm_table.pcie_speed_table);
4189
4190        return 0;
4191}
4192
4193static u32 ci_get_lowest_enabled_level(struct radeon_device *rdev,
4194                                       u32 level_mask)
4195{
4196        u32 level = 0;
4197
4198        while ((level_mask & (1 << level)) == 0)
4199                level++;
4200
4201        return level;
4202}
4203
4204
4205int ci_dpm_force_performance_level(struct radeon_device *rdev,
4206                                   enum radeon_dpm_forced_level level)
4207{
4208        struct ci_power_info *pi = ci_get_pi(rdev);
4209        u32 tmp, levels, i;
4210        int ret;
4211
4212        if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
4213                if ((!pi->pcie_dpm_key_disabled) &&
4214                    pi->dpm_level_enable_mask.pcie_dpm_enable_mask) {
4215                        levels = 0;
4216                        tmp = pi->dpm_level_enable_mask.pcie_dpm_enable_mask;
4217                        while (tmp >>= 1)
4218                                levels++;
4219                        if (levels) {
4220                                ret = ci_dpm_force_state_pcie(rdev, level);
4221                                if (ret)
4222                                        return ret;
4223                                for (i = 0; i < rdev->usec_timeout; i++) {
4224                                        tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX_1) &
4225                                               CURR_PCIE_INDEX_MASK) >> CURR_PCIE_INDEX_SHIFT;
4226                                        if (tmp == levels)
4227                                                break;
4228                                        udelay(1);
4229                                }
4230                        }
4231                }
4232                if ((!pi->sclk_dpm_key_disabled) &&
4233                    pi->dpm_level_enable_mask.sclk_dpm_enable_mask) {
4234                        levels = 0;
4235                        tmp = pi->dpm_level_enable_mask.sclk_dpm_enable_mask;
4236                        while (tmp >>= 1)
4237                                levels++;
4238                        if (levels) {
4239                                ret = ci_dpm_force_state_sclk(rdev, levels);
4240                                if (ret)
4241                                        return ret;
4242                                for (i = 0; i < rdev->usec_timeout; i++) {
4243                                        tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX) &
4244                                               CURR_SCLK_INDEX_MASK) >> CURR_SCLK_INDEX_SHIFT;
4245                                        if (tmp == levels)
4246                                                break;
4247                                        udelay(1);
4248                                }
4249                        }
4250                }
4251                if ((!pi->mclk_dpm_key_disabled) &&
4252                    pi->dpm_level_enable_mask.mclk_dpm_enable_mask) {
4253                        levels = 0;
4254                        tmp = pi->dpm_level_enable_mask.mclk_dpm_enable_mask;
4255                        while (tmp >>= 1)
4256                                levels++;
4257                        if (levels) {
4258                                ret = ci_dpm_force_state_mclk(rdev, levels);
4259                                if (ret)
4260                                        return ret;
4261                                for (i = 0; i < rdev->usec_timeout; i++) {
4262                                        tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX) &
4263                                               CURR_MCLK_INDEX_MASK) >> CURR_MCLK_INDEX_SHIFT;
4264                                        if (tmp == levels)
4265                                                break;
4266                                        udelay(1);
4267                                }
4268                        }
4269                }
4270        } else if (level == RADEON_DPM_FORCED_LEVEL_LOW) {
4271                if ((!pi->sclk_dpm_key_disabled) &&
4272                    pi->dpm_level_enable_mask.sclk_dpm_enable_mask) {
4273                        levels = ci_get_lowest_enabled_level(rdev,
4274                                                             pi->dpm_level_enable_mask.sclk_dpm_enable_mask);
4275                        ret = ci_dpm_force_state_sclk(rdev, levels);
4276                        if (ret)
4277                                return ret;
4278                        for (i = 0; i < rdev->usec_timeout; i++) {
4279                                tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX) &
4280                                       CURR_SCLK_INDEX_MASK) >> CURR_SCLK_INDEX_SHIFT;
4281                                if (tmp == levels)
4282                                        break;
4283                                udelay(1);
4284                        }
4285                }
4286                if ((!pi->mclk_dpm_key_disabled) &&
4287                    pi->dpm_level_enable_mask.mclk_dpm_enable_mask) {
4288                        levels = ci_get_lowest_enabled_level(rdev,
4289                                                             pi->dpm_level_enable_mask.mclk_dpm_enable_mask);
4290                        ret = ci_dpm_force_state_mclk(rdev, levels);
4291                        if (ret)
4292                                return ret;
4293                        for (i = 0; i < rdev->usec_timeout; i++) {
4294                                tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX) &
4295                                       CURR_MCLK_INDEX_MASK) >> CURR_MCLK_INDEX_SHIFT;
4296                                if (tmp == levels)
4297                                        break;
4298                                udelay(1);
4299                        }
4300                }
4301                if ((!pi->pcie_dpm_key_disabled) &&
4302                    pi->dpm_level_enable_mask.pcie_dpm_enable_mask) {
4303                        levels = ci_get_lowest_enabled_level(rdev,
4304                                                             pi->dpm_level_enable_mask.pcie_dpm_enable_mask);
4305                        ret = ci_dpm_force_state_pcie(rdev, levels);
4306                        if (ret)
4307                                return ret;
4308                        for (i = 0; i < rdev->usec_timeout; i++) {
4309                                tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX_1) &
4310                                       CURR_PCIE_INDEX_MASK) >> CURR_PCIE_INDEX_SHIFT;
4311                                if (tmp == levels)
4312                                        break;
4313                                udelay(1);
4314                        }
4315                }
4316        } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
4317                if (!pi->pcie_dpm_key_disabled) {
4318                        PPSMC_Result smc_result;
4319
4320                        smc_result = ci_send_msg_to_smc(rdev,
4321                                                        PPSMC_MSG_PCIeDPM_UnForceLevel);
4322                        if (smc_result != PPSMC_Result_OK)
4323                                return -EINVAL;
4324                }
4325                ret = ci_upload_dpm_level_enable_mask(rdev);
4326                if (ret)
4327                        return ret;
4328        }
4329
4330        rdev->pm.dpm.forced_level = level;
4331
4332        return 0;
4333}
4334
4335static int ci_set_mc_special_registers(struct radeon_device *rdev,
4336                                       struct ci_mc_reg_table *table)
4337{
4338        struct ci_power_info *pi = ci_get_pi(rdev);
4339        u8 i, j, k;
4340        u32 temp_reg;
4341
4342        for (i = 0, j = table->last; i < table->last; i++) {
4343                if (j >= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
4344                        return -EINVAL;
4345                switch(table->mc_reg_address[i].s1 << 2) {
4346                case MC_SEQ_MISC1:
4347                        temp_reg = RREG32(MC_PMG_CMD_EMRS);
4348                        table->mc_reg_address[j].s1 = MC_PMG_CMD_EMRS >> 2;
4349                        table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
4350                        for (k = 0; k < table->num_entries; k++) {
4351                                table->mc_reg_table_entry[k].mc_data[j] =
4352                                        ((temp_reg & 0xffff0000)) | ((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16);
4353                        }
4354                        j++;
4355                        if (j >= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
4356                                return -EINVAL;
4357
4358                        temp_reg = RREG32(MC_PMG_CMD_MRS);
4359                        table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS >> 2;
4360                        table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS_LP >> 2;
4361                        for (k = 0; k < table->num_entries; k++) {
4362                                table->mc_reg_table_entry[k].mc_data[j] =
4363                                        (temp_reg & 0xffff0000) | (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
4364                                if (!pi->mem_gddr5)
4365                                        table->mc_reg_table_entry[k].mc_data[j] |= 0x100;
4366                        }
4367                        j++;
4368                        if (j > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
4369                                return -EINVAL;
4370
4371                        if (!pi->mem_gddr5) {
4372                                table->mc_reg_address[j].s1 = MC_PMG_AUTO_CMD >> 2;
4373                                table->mc_reg_address[j].s0 = MC_PMG_AUTO_CMD >> 2;
4374                                for (k = 0; k < table->num_entries; k++) {
4375                                        table->mc_reg_table_entry[k].mc_data[j] =
4376                                                (table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16;
4377                                }
4378                                j++;
4379                                if (j > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
4380                                        return -EINVAL;
4381                        }
4382                        break;
4383                case MC_SEQ_RESERVE_M:
4384                        temp_reg = RREG32(MC_PMG_CMD_MRS1);
4385                        table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1 >> 2;
4386                        table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
4387                        for (k = 0; k < table->num_entries; k++) {
4388                                table->mc_reg_table_entry[k].mc_data[j] =
4389                                        (temp_reg & 0xffff0000) | (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
4390                        }
4391                        j++;
4392                        if (j > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
4393                                return -EINVAL;
4394                        break;
4395                default:
4396                        break;
4397                }
4398
4399        }
4400
4401        table->last = j;
4402
4403        return 0;
4404}
4405
4406static bool ci_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
4407{
4408        bool result = true;
4409
4410        switch(in_reg) {
4411        case MC_SEQ_RAS_TIMING >> 2:
4412                *out_reg = MC_SEQ_RAS_TIMING_LP >> 2;
4413                break;
4414        case MC_SEQ_DLL_STBY >> 2:
4415                *out_reg = MC_SEQ_DLL_STBY_LP >> 2;
4416                break;
4417        case MC_SEQ_G5PDX_CMD0 >> 2:
4418                *out_reg = MC_SEQ_G5PDX_CMD0_LP >> 2;
4419                break;
4420        case MC_SEQ_G5PDX_CMD1 >> 2:
4421                *out_reg = MC_SEQ_G5PDX_CMD1_LP >> 2;
4422                break;
4423        case MC_SEQ_G5PDX_CTRL >> 2:
4424                *out_reg = MC_SEQ_G5PDX_CTRL_LP >> 2;
4425                break;
4426        case MC_SEQ_CAS_TIMING >> 2:
4427                *out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
4428                break;
4429        case MC_SEQ_MISC_TIMING >> 2:
4430                *out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
4431                break;
4432        case MC_SEQ_MISC_TIMING2 >> 2:
4433                *out_reg = MC_SEQ_MISC_TIMING2_LP >> 2;
4434                break;
4435        case MC_SEQ_PMG_DVS_CMD >> 2:
4436                *out_reg = MC_SEQ_PMG_DVS_CMD_LP >> 2;
4437                break;
4438        case MC_SEQ_PMG_DVS_CTL >> 2:
4439                *out_reg = MC_SEQ_PMG_DVS_CTL_LP >> 2;
4440                break;
4441        case MC_SEQ_RD_CTL_D0 >> 2:
4442                *out_reg = MC_SEQ_RD_CTL_D0_LP >> 2;
4443                break;
4444        case MC_SEQ_RD_CTL_D1 >> 2:
4445                *out_reg = MC_SEQ_RD_CTL_D1_LP >> 2;
4446                break;
4447        case MC_SEQ_WR_CTL_D0 >> 2:
4448                *out_reg = MC_SEQ_WR_CTL_D0_LP >> 2;
4449                break;
4450        case MC_SEQ_WR_CTL_D1 >> 2:
4451                *out_reg = MC_SEQ_WR_CTL_D1_LP >> 2;
4452                break;
4453        case MC_PMG_CMD_EMRS >> 2:
4454                *out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
4455                break;
4456        case MC_PMG_CMD_MRS >> 2:
4457                *out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2;
4458                break;
4459        case MC_PMG_CMD_MRS1 >> 2:
4460                *out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
4461                break;
4462        case MC_SEQ_PMG_TIMING >> 2:
4463                *out_reg = MC_SEQ_PMG_TIMING_LP >> 2;
4464                break;
4465        case MC_PMG_CMD_MRS2 >> 2:
4466                *out_reg = MC_SEQ_PMG_CMD_MRS2_LP >> 2;
4467                break;
4468        case MC_SEQ_WR_CTL_2 >> 2:
4469                *out_reg = MC_SEQ_WR_CTL_2_LP >> 2;
4470                break;
4471        default:
4472                result = false;
4473                break;
4474        }
4475
4476        return result;
4477}
4478
4479static void ci_set_valid_flag(struct ci_mc_reg_table *table)
4480{
4481        u8 i, j;
4482
4483        for (i = 0; i < table->last; i++) {
4484                for (j = 1; j < table->num_entries; j++) {
4485                        if (table->mc_reg_table_entry[j-1].mc_data[i] !=
4486                            table->mc_reg_table_entry[j].mc_data[i]) {
4487                                table->valid_flag |= 1 << i;
4488                                break;
4489                        }
4490                }
4491        }
4492}
4493
4494static void ci_set_s0_mc_reg_index(struct ci_mc_reg_table *table)
4495{
4496        u32 i;
4497        u16 address;
4498
4499        for (i = 0; i < table->last; i++) {
4500                table->mc_reg_address[i].s0 =
4501                        ci_check_s0_mc_reg_index(table->mc_reg_address[i].s1, &address) ?
4502                        address : table->mc_reg_address[i].s1;
4503        }
4504}
4505
4506static int ci_copy_vbios_mc_reg_table(const struct atom_mc_reg_table *table,
4507                                      struct ci_mc_reg_table *ci_table)
4508{
4509        u8 i, j;
4510
4511        if (table->last > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
4512                return -EINVAL;
4513        if (table->num_entries > MAX_AC_TIMING_ENTRIES)
4514                return -EINVAL;
4515
4516        for (i = 0; i < table->last; i++)
4517                ci_table->mc_reg_address[i].s1 = table->mc_reg_address[i].s1;
4518
4519        ci_table->last = table->last;
4520
4521        for (i = 0; i < table->num_entries; i++) {
4522                ci_table->mc_reg_table_entry[i].mclk_max =
4523                        table->mc_reg_table_entry[i].mclk_max;
4524                for (j = 0; j < table->last; j++)
4525                        ci_table->mc_reg_table_entry[i].mc_data[j] =
4526                                table->mc_reg_table_entry[i].mc_data[j];
4527        }
4528        ci_table->num_entries = table->num_entries;
4529
4530        return 0;
4531}
4532
4533static int ci_register_patching_mc_seq(struct radeon_device *rdev,
4534                                       struct ci_mc_reg_table *table)
4535{
4536        u8 i, k;
4537        u32 tmp;
4538        bool patch;
4539
4540        tmp = RREG32(MC_SEQ_MISC0);
4541        patch = ((tmp & 0x0000f00) == 0x300) ? true : false;
4542
4543        if (patch &&
4544            ((rdev->pdev->device == 0x67B0) ||
4545             (rdev->pdev->device == 0x67B1))) {
4546                for (i = 0; i < table->last; i++) {
4547                        if (table->last >= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
4548                                return -EINVAL;
4549                        switch(table->mc_reg_address[i].s1 >> 2) {
4550                        case MC_SEQ_MISC1:
4551                                for (k = 0; k < table->num_entries; k++) {
4552                                        if ((table->mc_reg_table_entry[k].mclk_max == 125000) ||
4553                                            (table->mc_reg_table_entry[k].mclk_max == 137500))
4554                                                table->mc_reg_table_entry[k].mc_data[i] =
4555                                                        (table->mc_reg_table_entry[k].mc_data[i] & 0xFFFFFFF8) |
4556                                                        0x00000007;
4557                                }
4558                                break;
4559                        case MC_SEQ_WR_CTL_D0:
4560                                for (k = 0; k < table->num_entries; k++) {
4561                                        if ((table->mc_reg_table_entry[k].mclk_max == 125000) ||
4562                                            (table->mc_reg_table_entry[k].mclk_max == 137500))
4563                                                table->mc_reg_table_entry[k].mc_data[i] =
4564                                                        (table->mc_reg_table_entry[k].mc_data[i] & 0xFFFF0F00) |
4565                                                        0x0000D0DD;
4566                                }
4567                                break;
4568                        case MC_SEQ_WR_CTL_D1:
4569                                for (k = 0; k < table->num_entries; k++) {
4570                                        if ((table->mc_reg_table_entry[k].mclk_max == 125000) ||
4571                                            (table->mc_reg_table_entry[k].mclk_max == 137500))
4572                                                table->mc_reg_table_entry[k].mc_data[i] =
4573                                                        (table->mc_reg_table_entry[k].mc_data[i] & 0xFFFF0F00) |
4574                                                        0x0000D0DD;
4575                                }
4576                                break;
4577                        case MC_SEQ_WR_CTL_2:
4578                                for (k = 0; k < table->num_entries; k++) {
4579                                        if ((table->mc_reg_table_entry[k].mclk_max == 125000) ||
4580                                            (table->mc_reg_table_entry[k].mclk_max == 137500))
4581                                                table->mc_reg_table_entry[k].mc_data[i] = 0;
4582                                }
4583                                break;
4584                        case MC_SEQ_CAS_TIMING:
4585                                for (k = 0; k < table->num_entries; k++) {
4586                                        if (table->mc_reg_table_entry[k].mclk_max == 125000)
4587                                                table->mc_reg_table_entry[k].mc_data[i] =
4588                                                        (table->mc_reg_table_entry[k].mc_data[i] & 0xFFE0FE0F) |
4589                                                        0x000C0140;
4590                                        else if (table->mc_reg_table_entry[k].mclk_max == 137500)
4591                                                table->mc_reg_table_entry[k].mc_data[i] =
4592                                                        (table->mc_reg_table_entry[k].mc_data[i] & 0xFFE0FE0F) |
4593                                                        0x000C0150;
4594                                }
4595                                break;
4596                        case MC_SEQ_MISC_TIMING:
4597                                for (k = 0; k < table->num_entries; k++) {
4598                                        if (table->mc_reg_table_entry[k].mclk_max == 125000)
4599                                                table->mc_reg_table_entry[k].mc_data[i] =
4600                                                        (table->mc_reg_table_entry[k].mc_data[i] & 0xFFFFFFE0) |
4601                                                        0x00000030;
4602                                        else if (table->mc_reg_table_entry[k].mclk_max == 137500)
4603                                                table->mc_reg_table_entry[k].mc_data[i] =
4604                                                        (table->mc_reg_table_entry[k].mc_data[i] & 0xFFFFFFE0) |
4605                                                        0x00000035;
4606                                }
4607                                break;
4608                        default:
4609                                break;
4610                        }
4611                }
4612
4613                WREG32(MC_SEQ_IO_DEBUG_INDEX, 3);
4614                tmp = RREG32(MC_SEQ_IO_DEBUG_DATA);
4615                tmp = (tmp & 0xFFF8FFFF) | (1 << 16);
4616                WREG32(MC_SEQ_IO_DEBUG_INDEX, 3);
4617                WREG32(MC_SEQ_IO_DEBUG_DATA, tmp);
4618        }
4619
4620        return 0;
4621}
4622
4623static int ci_initialize_mc_reg_table(struct radeon_device *rdev)
4624{
4625        struct ci_power_info *pi = ci_get_pi(rdev);
4626        struct atom_mc_reg_table *table;
4627        struct ci_mc_reg_table *ci_table = &pi->mc_reg_table;
4628        u8 module_index = rv770_get_memory_module_index(rdev);
4629        int ret;
4630
4631        table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL);
4632        if (!table)
4633                return -ENOMEM;
4634
4635        WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING));
4636        WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING));
4637        WREG32(MC_SEQ_DLL_STBY_LP, RREG32(MC_SEQ_DLL_STBY));
4638        WREG32(MC_SEQ_G5PDX_CMD0_LP, RREG32(MC_SEQ_G5PDX_CMD0));
4639        WREG32(MC_SEQ_G5PDX_CMD1_LP, RREG32(MC_SEQ_G5PDX_CMD1));
4640        WREG32(MC_SEQ_G5PDX_CTRL_LP, RREG32(MC_SEQ_G5PDX_CTRL));
4641        WREG32(MC_SEQ_PMG_DVS_CMD_LP, RREG32(MC_SEQ_PMG_DVS_CMD));
4642        WREG32(MC_SEQ_PMG_DVS_CTL_LP, RREG32(MC_SEQ_PMG_DVS_CTL));
4643        WREG32(MC_SEQ_MISC_TIMING_LP, RREG32(MC_SEQ_MISC_TIMING));
4644        WREG32(MC_SEQ_MISC_TIMING2_LP, RREG32(MC_SEQ_MISC_TIMING2));
4645        WREG32(MC_SEQ_PMG_CMD_EMRS_LP, RREG32(MC_PMG_CMD_EMRS));
4646        WREG32(MC_SEQ_PMG_CMD_MRS_LP, RREG32(MC_PMG_CMD_MRS));
4647        WREG32(MC_SEQ_PMG_CMD_MRS1_LP, RREG32(MC_PMG_CMD_MRS1));
4648        WREG32(MC_SEQ_WR_CTL_D0_LP, RREG32(MC_SEQ_WR_CTL_D0));
4649        WREG32(MC_SEQ_WR_CTL_D1_LP, RREG32(MC_SEQ_WR_CTL_D1));
4650        WREG32(MC_SEQ_RD_CTL_D0_LP, RREG32(MC_SEQ_RD_CTL_D0));
4651        WREG32(MC_SEQ_RD_CTL_D1_LP, RREG32(MC_SEQ_RD_CTL_D1));
4652        WREG32(MC_SEQ_PMG_TIMING_LP, RREG32(MC_SEQ_PMG_TIMING));
4653        WREG32(MC_SEQ_PMG_CMD_MRS2_LP, RREG32(MC_PMG_CMD_MRS2));
4654        WREG32(MC_SEQ_WR_CTL_2_LP, RREG32(MC_SEQ_WR_CTL_2));
4655
4656        ret = radeon_atom_init_mc_reg_table(rdev, module_index, table);
4657        if (ret)
4658                goto init_mc_done;
4659
4660        ret = ci_copy_vbios_mc_reg_table(table, ci_table);
4661        if (ret)
4662                goto init_mc_done;
4663
4664        ci_set_s0_mc_reg_index(ci_table);
4665
4666        ret = ci_register_patching_mc_seq(rdev, ci_table);
4667        if (ret)
4668                goto init_mc_done;
4669
4670        ret = ci_set_mc_special_registers(rdev, ci_table);
4671        if (ret)
4672                goto init_mc_done;
4673
4674        ci_set_valid_flag(ci_table);
4675
4676init_mc_done:
4677        kfree(table);
4678
4679        return ret;
4680}
4681
4682static int ci_populate_mc_reg_addresses(struct radeon_device *rdev,
4683                                        SMU7_Discrete_MCRegisters *mc_reg_table)
4684{
4685        struct ci_power_info *pi = ci_get_pi(rdev);
4686        u32 i, j;
4687
4688        for (i = 0, j = 0; j < pi->mc_reg_table.last; j++) {
4689                if (pi->mc_reg_table.valid_flag & (1 << j)) {
4690                        if (i >= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
4691                                return -EINVAL;
4692                        mc_reg_table->address[i].s0 = cpu_to_be16(pi->mc_reg_table.mc_reg_address[j].s0);
4693                        mc_reg_table->address[i].s1 = cpu_to_be16(pi->mc_reg_table.mc_reg_address[j].s1);
4694                        i++;
4695                }
4696        }
4697
4698        mc_reg_table->last = (u8)i;
4699
4700        return 0;
4701}
4702
4703static void ci_convert_mc_registers(const struct ci_mc_reg_entry *entry,
4704                                    SMU7_Discrete_MCRegisterSet *data,
4705                                    u32 num_entries, u32 valid_flag)
4706{
4707        u32 i, j;
4708
4709        for (i = 0, j = 0; j < num_entries; j++) {
4710                if (valid_flag & (1 << j)) {
4711                        data->value[i] = cpu_to_be32(entry->mc_data[j]);
4712                        i++;
4713                }
4714        }
4715}
4716
4717static void ci_convert_mc_reg_table_entry_to_smc(struct radeon_device *rdev,
4718                                                 const u32 memory_clock,
4719                                                 SMU7_Discrete_MCRegisterSet *mc_reg_table_data)
4720{
4721        struct ci_power_info *pi = ci_get_pi(rdev);
4722        u32 i = 0;
4723
4724        for(i = 0; i < pi->mc_reg_table.num_entries; i++) {
4725                if (memory_clock <= pi->mc_reg_table.mc_reg_table_entry[i].mclk_max)
4726                        break;
4727        }
4728
4729        if ((i == pi->mc_reg_table.num_entries) && (i > 0))
4730                --i;
4731
4732        ci_convert_mc_registers(&pi->mc_reg_table.mc_reg_table_entry[i],
4733                                mc_reg_table_data, pi->mc_reg_table.last,
4734                                pi->mc_reg_table.valid_flag);
4735}
4736
4737static void ci_convert_mc_reg_table_to_smc(struct radeon_device *rdev,
4738                                           SMU7_Discrete_MCRegisters *mc_reg_table)
4739{
4740        struct ci_power_info *pi = ci_get_pi(rdev);
4741        u32 i;
4742
4743        for (i = 0; i < pi->dpm_table.mclk_table.count; i++)
4744                ci_convert_mc_reg_table_entry_to_smc(rdev,
4745                                                     pi->dpm_table.mclk_table.dpm_levels[i].value,
4746                                                     &mc_reg_table->data[i]);
4747}
4748
4749static int ci_populate_initial_mc_reg_table(struct radeon_device *rdev)
4750{
4751        struct ci_power_info *pi = ci_get_pi(rdev);
4752        int ret;
4753
4754        memset(&pi->smc_mc_reg_table, 0, sizeof(SMU7_Discrete_MCRegisters));
4755
4756        ret = ci_populate_mc_reg_addresses(rdev, &pi->smc_mc_reg_table);
4757        if (ret)
4758                return ret;
4759        ci_convert_mc_reg_table_to_smc(rdev, &pi->smc_mc_reg_table);
4760
4761        return ci_copy_bytes_to_smc(rdev,
4762                                    pi->mc_reg_table_start,
4763                                    (u8 *)&pi->smc_mc_reg_table,
4764                                    sizeof(SMU7_Discrete_MCRegisters),
4765                                    pi->sram_end);
4766}
4767
4768static int ci_update_and_upload_mc_reg_table(struct radeon_device *rdev)
4769{
4770        struct ci_power_info *pi = ci_get_pi(rdev);
4771
4772        if (!(pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK))
4773                return 0;
4774
4775        memset(&pi->smc_mc_reg_table, 0, sizeof(SMU7_Discrete_MCRegisters));
4776
4777        ci_convert_mc_reg_table_to_smc(rdev, &pi->smc_mc_reg_table);
4778
4779        return ci_copy_bytes_to_smc(rdev,
4780                                    pi->mc_reg_table_start +
4781                                    offsetof(SMU7_Discrete_MCRegisters, data[0]),
4782                                    (u8 *)&pi->smc_mc_reg_table.data[0],
4783                                    sizeof(SMU7_Discrete_MCRegisterSet) *
4784                                    pi->dpm_table.mclk_table.count,
4785                                    pi->sram_end);
4786}
4787
4788static void ci_enable_voltage_control(struct radeon_device *rdev)
4789{
4790        u32 tmp = RREG32_SMC(GENERAL_PWRMGT);
4791
4792        tmp |= VOLT_PWRMGT_EN;
4793        WREG32_SMC(GENERAL_PWRMGT, tmp);
4794}
4795
4796static enum radeon_pcie_gen ci_get_maximum_link_speed(struct radeon_device *rdev,
4797                                                      struct radeon_ps *radeon_state)
4798{
4799        struct ci_ps *state = ci_get_ps(radeon_state);
4800        int i;
4801        u16 pcie_speed, max_speed = 0;
4802
4803        for (i = 0; i < state->performance_level_count; i++) {
4804                pcie_speed = state->performance_levels[i].pcie_gen;
4805                if (max_speed < pcie_speed)
4806                        max_speed = pcie_speed;
4807        }
4808
4809        return max_speed;
4810}
4811
4812static u16 ci_get_current_pcie_speed(struct radeon_device *rdev)
4813{
4814        u32 speed_cntl = 0;
4815
4816        speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL) & LC_CURRENT_DATA_RATE_MASK;
4817        speed_cntl >>= LC_CURRENT_DATA_RATE_SHIFT;
4818
4819        return (u16)speed_cntl;
4820}
4821
4822static int ci_get_current_pcie_lane_number(struct radeon_device *rdev)
4823{
4824        u32 link_width = 0;
4825
4826        link_width = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL) & LC_LINK_WIDTH_RD_MASK;
4827        link_width >>= LC_LINK_WIDTH_RD_SHIFT;
4828
4829        switch (link_width) {
4830        case RADEON_PCIE_LC_LINK_WIDTH_X1:
4831                return 1;
4832        case RADEON_PCIE_LC_LINK_WIDTH_X2:
4833                return 2;
4834        case RADEON_PCIE_LC_LINK_WIDTH_X4:
4835                return 4;
4836        case RADEON_PCIE_LC_LINK_WIDTH_X8:
4837                return 8;
4838        case RADEON_PCIE_LC_LINK_WIDTH_X12:
4839                /* not actually supported */
4840                return 12;
4841        case RADEON_PCIE_LC_LINK_WIDTH_X0:
4842        case RADEON_PCIE_LC_LINK_WIDTH_X16:
4843        default:
4844                return 16;
4845        }
4846}
4847
4848static void ci_request_link_speed_change_before_state_change(struct radeon_device *rdev,
4849                                                             struct radeon_ps *radeon_new_state,
4850                                                             struct radeon_ps *radeon_current_state)
4851{
4852        struct ci_power_info *pi = ci_get_pi(rdev);
4853        enum radeon_pcie_gen target_link_speed =
4854                ci_get_maximum_link_speed(rdev, radeon_new_state);
4855        enum radeon_pcie_gen current_link_speed;
4856
4857        if (pi->force_pcie_gen == RADEON_PCIE_GEN_INVALID)
4858                current_link_speed = ci_get_maximum_link_speed(rdev, radeon_current_state);
4859        else
4860                current_link_speed = pi->force_pcie_gen;
4861
4862        pi->force_pcie_gen = RADEON_PCIE_GEN_INVALID;
4863        pi->pspp_notify_required = false;
4864        if (target_link_speed > current_link_speed) {
4865                switch (target_link_speed) {
4866#ifdef CONFIG_ACPI
4867                case RADEON_PCIE_GEN3:
4868                        if (radeon_acpi_pcie_performance_request(rdev, PCIE_PERF_REQ_PECI_GEN3, false) == 0)
4869                                break;
4870                        pi->force_pcie_gen = RADEON_PCIE_GEN2;
4871                        if (current_link_speed == RADEON_PCIE_GEN2)
4872                                break;
4873                        /* fall through */
4874                case RADEON_PCIE_GEN2:
4875                        if (radeon_acpi_pcie_performance_request(rdev, PCIE_PERF_REQ_PECI_GEN2, false) == 0)
4876                                break;
4877#endif
4878                        /* fall through */
4879                default:
4880                        pi->force_pcie_gen = ci_get_current_pcie_speed(rdev);
4881                        break;
4882                }
4883        } else {
4884                if (target_link_speed < current_link_speed)
4885                        pi->pspp_notify_required = true;
4886        }
4887}
4888
4889static void ci_notify_link_speed_change_after_state_change(struct radeon_device *rdev,
4890                                                           struct radeon_ps *radeon_new_state,
4891                                                           struct radeon_ps *radeon_current_state)
4892{
4893        struct ci_power_info *pi = ci_get_pi(rdev);
4894        enum radeon_pcie_gen target_link_speed =
4895                ci_get_maximum_link_speed(rdev, radeon_new_state);
4896        u8 request;
4897
4898        if (pi->pspp_notify_required) {
4899                if (target_link_speed == RADEON_PCIE_GEN3)
4900                        request = PCIE_PERF_REQ_PECI_GEN3;
4901                else if (target_link_speed == RADEON_PCIE_GEN2)
4902                        request = PCIE_PERF_REQ_PECI_GEN2;
4903                else
4904                        request = PCIE_PERF_REQ_PECI_GEN1;
4905
4906                if ((request == PCIE_PERF_REQ_PECI_GEN1) &&
4907                    (ci_get_current_pcie_speed(rdev) > 0))
4908                        return;
4909
4910#ifdef CONFIG_ACPI
4911                radeon_acpi_pcie_performance_request(rdev, request, false);
4912#endif
4913        }
4914}
4915
4916static int ci_set_private_data_variables_based_on_pptable(struct radeon_device *rdev)
4917{
4918        struct ci_power_info *pi = ci_get_pi(rdev);
4919        struct radeon_clock_voltage_dependency_table *allowed_sclk_vddc_table =
4920                &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
4921        struct radeon_clock_voltage_dependency_table *allowed_mclk_vddc_table =
4922                &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk;
4923        struct radeon_clock_voltage_dependency_table *allowed_mclk_vddci_table =
4924                &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk;
4925
4926        if (allowed_sclk_vddc_table == NULL)
4927                return -EINVAL;
4928        if (allowed_sclk_vddc_table->count < 1)
4929                return -EINVAL;
4930        if (allowed_mclk_vddc_table == NULL)
4931                return -EINVAL;
4932        if (allowed_mclk_vddc_table->count < 1)
4933                return -EINVAL;
4934        if (allowed_mclk_vddci_table == NULL)
4935                return -EINVAL;
4936        if (allowed_mclk_vddci_table->count < 1)
4937                return -EINVAL;
4938
4939        pi->min_vddc_in_pp_table = allowed_sclk_vddc_table->entries[0].v;
4940        pi->max_vddc_in_pp_table =
4941                allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].v;
4942
4943        pi->min_vddci_in_pp_table = allowed_mclk_vddci_table->entries[0].v;
4944        pi->max_vddci_in_pp_table =
4945                allowed_mclk_vddci_table->entries[allowed_mclk_vddci_table->count - 1].v;
4946
4947        rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk =
4948                allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].clk;
4949        rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk =
4950                allowed_mclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].clk;
4951        rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc =
4952                allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].v;
4953        rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci =
4954                allowed_mclk_vddci_table->entries[allowed_mclk_vddci_table->count - 1].v;
4955
4956        return 0;
4957}
4958
4959static void ci_patch_with_vddc_leakage(struct radeon_device *rdev, u16 *vddc)
4960{
4961        struct ci_power_info *pi = ci_get_pi(rdev);
4962        struct ci_leakage_voltage *leakage_table = &pi->vddc_leakage;
4963        u32 leakage_index;
4964
4965        for (leakage_index = 0; leakage_index < leakage_table->count; leakage_index++) {
4966                if (leakage_table->leakage_id[leakage_index] == *vddc) {
4967                        *vddc = leakage_table->actual_voltage[leakage_index];
4968                        break;
4969                }
4970        }
4971}
4972
4973static void ci_patch_with_vddci_leakage(struct radeon_device *rdev, u16 *vddci)
4974{
4975        struct ci_power_info *pi = ci_get_pi(rdev);
4976        struct ci_leakage_voltage *leakage_table = &pi->vddci_leakage;
4977        u32 leakage_index;
4978
4979        for (leakage_index = 0; leakage_index < leakage_table->count; leakage_index++) {
4980                if (leakage_table->leakage_id[leakage_index] == *vddci) {
4981                        *vddci = leakage_table->actual_voltage[leakage_index];
4982                        break;
4983                }
4984        }
4985}
4986
4987static void ci_patch_clock_voltage_dependency_table_with_vddc_leakage(struct radeon_device *rdev,
4988                                                                      struct radeon_clock_voltage_dependency_table *table)
4989{
4990        u32 i;
4991
4992        if (table) {
4993                for (i = 0; i < table->count; i++)
4994                        ci_patch_with_vddc_leakage(rdev, &table->entries[i].v);
4995        }
4996}
4997
4998static void ci_patch_clock_voltage_dependency_table_with_vddci_leakage(struct radeon_device *rdev,
4999                                                                       struct radeon_clock_voltage_dependency_table *table)
5000{
5001        u32 i;
5002
5003        if (table) {
5004                for (i = 0; i < table->count; i++)
5005                        ci_patch_with_vddci_leakage(rdev, &table->entries[i].v);
5006        }
5007}
5008
5009static void ci_patch_vce_clock_voltage_dependency_table_with_vddc_leakage(struct radeon_device *rdev,
5010                                                                          struct radeon_vce_clock_voltage_dependency_table *table)
5011{
5012        u32 i;
5013
5014        if (table) {
5015                for (i = 0; i < table->count; i++)
5016                        ci_patch_with_vddc_leakage(rdev, &table->entries[i].v);
5017        }
5018}
5019
5020static void ci_patch_uvd_clock_voltage_dependency_table_with_vddc_leakage(struct radeon_device *rdev,
5021                                                                          struct radeon_uvd_clock_voltage_dependency_table *table)
5022{
5023        u32 i;
5024
5025        if (table) {
5026                for (i = 0; i < table->count; i++)
5027                        ci_patch_with_vddc_leakage(rdev, &table->entries[i].v);
5028        }
5029}
5030
5031static void ci_patch_vddc_phase_shed_limit_table_with_vddc_leakage(struct radeon_device *rdev,
5032                                                                   struct radeon_phase_shedding_limits_table *table)
5033{
5034        u32 i;
5035
5036        if (table) {
5037                for (i = 0; i < table->count; i++)
5038                        ci_patch_with_vddc_leakage(rdev, &table->entries[i].voltage);
5039        }
5040}
5041
5042static void ci_patch_clock_voltage_limits_with_vddc_leakage(struct radeon_device *rdev,
5043                                                            struct radeon_clock_and_voltage_limits *table)
5044{
5045        if (table) {
5046                ci_patch_with_vddc_leakage(rdev, (u16 *)&table->vddc);
5047                ci_patch_with_vddci_leakage(rdev, (u16 *)&table->vddci);
5048        }
5049}
5050
5051static void ci_patch_cac_leakage_table_with_vddc_leakage(struct radeon_device *rdev,
5052                                                         struct radeon_cac_leakage_table *table)
5053{
5054        u32 i;
5055
5056        if (table) {
5057                for (i = 0; i < table->count; i++)
5058                        ci_patch_with_vddc_leakage(rdev, &table->entries[i].vddc);
5059        }
5060}
5061
5062static void ci_patch_dependency_tables_with_leakage(struct radeon_device *rdev)
5063{
5064
5065        ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
5066                                                                  &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk);
5067        ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
5068                                                                  &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk);
5069        ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
5070                                                                  &rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk);
5071        ci_patch_clock_voltage_dependency_table_with_vddci_leakage(rdev,
5072                                                                   &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk);
5073        ci_patch_vce_clock_voltage_dependency_table_with_vddc_leakage(rdev,
5074                                                                      &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table);
5075        ci_patch_uvd_clock_voltage_dependency_table_with_vddc_leakage(rdev,
5076                                                                      &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table);
5077        ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
5078                                                                  &rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table);
5079        ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
5080                                                                  &rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table);
5081        ci_patch_vddc_phase_shed_limit_table_with_vddc_leakage(rdev,
5082                                                               &rdev->pm.dpm.dyn_state.phase_shedding_limits_table);
5083        ci_patch_clock_voltage_limits_with_vddc_leakage(rdev,
5084                                                        &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac);
5085        ci_patch_clock_voltage_limits_with_vddc_leakage(rdev,
5086                                                        &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc);
5087        ci_patch_cac_leakage_table_with_vddc_leakage(rdev,
5088                                                     &rdev->pm.dpm.dyn_state.cac_leakage_table);
5089
5090}
5091
5092static void ci_get_memory_type(struct radeon_device *rdev)
5093{
5094        struct ci_power_info *pi = ci_get_pi(rdev);
5095        u32 tmp;
5096
5097        tmp = RREG32(MC_SEQ_MISC0);
5098
5099        if (((tmp & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT) ==
5100            MC_SEQ_MISC0_GDDR5_VALUE)
5101                pi->mem_gddr5 = true;
5102        else
5103                pi->mem_gddr5 = false;
5104
5105}
5106
5107static void ci_update_current_ps(struct radeon_device *rdev,
5108                                 struct radeon_ps *rps)
5109{
5110        struct ci_ps *new_ps = ci_get_ps(rps);
5111        struct ci_power_info *pi = ci_get_pi(rdev);
5112
5113        pi->current_rps = *rps;
5114        pi->current_ps = *new_ps;
5115        pi->current_rps.ps_priv = &pi->current_ps;
5116}
5117
5118static void ci_update_requested_ps(struct radeon_device *rdev,
5119                                   struct radeon_ps *rps)
5120{
5121        struct ci_ps *new_ps = ci_get_ps(rps);
5122        struct ci_power_info *pi = ci_get_pi(rdev);
5123
5124        pi->requested_rps = *rps;
5125        pi->requested_ps = *new_ps;
5126        pi->requested_rps.ps_priv = &pi->requested_ps;
5127}
5128
5129int ci_dpm_pre_set_power_state(struct radeon_device *rdev)
5130{
5131        struct ci_power_info *pi = ci_get_pi(rdev);
5132        struct radeon_ps requested_ps = *rdev->pm.dpm.requested_ps;
5133        struct radeon_ps *new_ps = &requested_ps;
5134
5135        ci_update_requested_ps(rdev, new_ps);
5136
5137        ci_apply_state_adjust_rules(rdev, &pi->requested_rps);
5138
5139        return 0;
5140}
5141
5142void ci_dpm_post_set_power_state(struct radeon_device *rdev)
5143{
5144        struct ci_power_info *pi = ci_get_pi(rdev);
5145        struct radeon_ps *new_ps = &pi->requested_rps;
5146
5147        ci_update_current_ps(rdev, new_ps);
5148}
5149
5150
5151void ci_dpm_setup_asic(struct radeon_device *rdev)
5152{
5153        int r;
5154
5155        r = ci_mc_load_microcode(rdev);
5156        if (r)
5157                DRM_ERROR("Failed to load MC firmware!\n");
5158        ci_read_clock_registers(rdev);
5159        ci_get_memory_type(rdev);
5160        ci_enable_acpi_power_management(rdev);
5161        ci_init_sclk_t(rdev);
5162}
5163
5164int ci_dpm_enable(struct radeon_device *rdev)
5165{
5166        struct ci_power_info *pi = ci_get_pi(rdev);
5167        struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
5168        int ret;
5169
5170        if (ci_is_smc_running(rdev))
5171                return -EINVAL;
5172        if (pi->voltage_control != CISLANDS_VOLTAGE_CONTROL_NONE) {
5173                ci_enable_voltage_control(rdev);
5174                ret = ci_construct_voltage_tables(rdev);
5175                if (ret) {
5176                        DRM_ERROR("ci_construct_voltage_tables failed\n");
5177                        return ret;
5178                }
5179        }
5180        if (pi->caps_dynamic_ac_timing) {
5181                ret = ci_initialize_mc_reg_table(rdev);
5182                if (ret)
5183                        pi->caps_dynamic_ac_timing = false;
5184        }
5185        if (pi->dynamic_ss)
5186                ci_enable_spread_spectrum(rdev, true);
5187        if (pi->thermal_protection)
5188                ci_enable_thermal_protection(rdev, true);
5189        ci_program_sstp(rdev);
5190        ci_enable_display_gap(rdev);
5191        ci_program_vc(rdev);
5192        ret = ci_upload_firmware(rdev);
5193        if (ret) {
5194                DRM_ERROR("ci_upload_firmware failed\n");
5195                return ret;
5196        }
5197        ret = ci_process_firmware_header(rdev);
5198        if (ret) {
5199                DRM_ERROR("ci_process_firmware_header failed\n");
5200                return ret;
5201        }
5202        ret = ci_initial_switch_from_arb_f0_to_f1(rdev);
5203        if (ret) {
5204                DRM_ERROR("ci_initial_switch_from_arb_f0_to_f1 failed\n");
5205                return ret;
5206        }
5207        ret = ci_init_smc_table(rdev);
5208        if (ret) {
5209                DRM_ERROR("ci_init_smc_table failed\n");
5210                return ret;
5211        }
5212        ret = ci_init_arb_table_index(rdev);
5213        if (ret) {
5214                DRM_ERROR("ci_init_arb_table_index failed\n");
5215                return ret;
5216        }
5217        if (pi->caps_dynamic_ac_timing) {
5218                ret = ci_populate_initial_mc_reg_table(rdev);
5219                if (ret) {
5220                        DRM_ERROR("ci_populate_initial_mc_reg_table failed\n");
5221                        return ret;
5222                }
5223        }
5224        ret = ci_populate_pm_base(rdev);
5225        if (ret) {
5226                DRM_ERROR("ci_populate_pm_base failed\n");
5227                return ret;
5228        }
5229        ci_dpm_start_smc(rdev);
5230        ci_enable_vr_hot_gpio_interrupt(rdev);
5231        ret = ci_notify_smc_display_change(rdev, false);
5232        if (ret) {
5233                DRM_ERROR("ci_notify_smc_display_change failed\n");
5234                return ret;
5235        }
5236        ci_enable_sclk_control(rdev, true);
5237        ret = ci_enable_ulv(rdev, true);
5238        if (ret) {
5239                DRM_ERROR("ci_enable_ulv failed\n");
5240                return ret;
5241        }
5242        ret = ci_enable_ds_master_switch(rdev, true);
5243        if (ret) {
5244                DRM_ERROR("ci_enable_ds_master_switch failed\n");
5245                return ret;
5246        }
5247        ret = ci_start_dpm(rdev);
5248        if (ret) {
5249                DRM_ERROR("ci_start_dpm failed\n");
5250                return ret;
5251        }
5252        ret = ci_enable_didt(rdev, true);
5253        if (ret) {
5254                DRM_ERROR("ci_enable_didt failed\n");
5255                return ret;
5256        }
5257        ret = ci_enable_smc_cac(rdev, true);
5258        if (ret) {
5259                DRM_ERROR("ci_enable_smc_cac failed\n");
5260                return ret;
5261        }
5262        ret = ci_enable_power_containment(rdev, true);
5263        if (ret) {
5264                DRM_ERROR("ci_enable_power_containment failed\n");
5265                return ret;
5266        }
5267
5268        ret = ci_power_control_set_level(rdev);
5269        if (ret) {
5270                DRM_ERROR("ci_power_control_set_level failed\n");
5271                return ret;
5272        }
5273
5274        ci_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
5275
5276        ret = ci_enable_thermal_based_sclk_dpm(rdev, true);
5277        if (ret) {
5278                DRM_ERROR("ci_enable_thermal_based_sclk_dpm failed\n");
5279                return ret;
5280        }
5281
5282        ci_thermal_start_thermal_controller(rdev);
5283
5284        ci_update_current_ps(rdev, boot_ps);
5285
5286        return 0;
5287}
5288
5289static int ci_set_temperature_range(struct radeon_device *rdev)
5290{
5291        int ret;
5292
5293        ret = ci_thermal_enable_alert(rdev, false);
5294        if (ret)
5295                return ret;
5296        ret = ci_thermal_set_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX);
5297        if (ret)
5298                return ret;
5299        ret = ci_thermal_enable_alert(rdev, true);
5300        if (ret)
5301                return ret;
5302
5303        return ret;
5304}
5305
5306int ci_dpm_late_enable(struct radeon_device *rdev)
5307{
5308        int ret;
5309
5310        ret = ci_set_temperature_range(rdev);
5311        if (ret)
5312                return ret;
5313
5314        ci_dpm_powergate_uvd(rdev, true);
5315
5316        return 0;
5317}
5318
5319void ci_dpm_disable(struct radeon_device *rdev)
5320{
5321        struct ci_power_info *pi = ci_get_pi(rdev);
5322        struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
5323
5324        ci_dpm_powergate_uvd(rdev, false);
5325
5326        if (!ci_is_smc_running(rdev))
5327                return;
5328
5329        ci_thermal_stop_thermal_controller(rdev);
5330
5331        if (pi->thermal_protection)
5332                ci_enable_thermal_protection(rdev, false);
5333        ci_enable_power_containment(rdev, false);
5334        ci_enable_smc_cac(rdev, false);
5335        ci_enable_didt(rdev, false);
5336        ci_enable_spread_spectrum(rdev, false);
5337        ci_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, false);
5338        ci_stop_dpm(rdev);
5339        ci_enable_ds_master_switch(rdev, false);
5340        ci_enable_ulv(rdev, false);
5341        ci_clear_vc(rdev);
5342        ci_reset_to_default(rdev);
5343        ci_dpm_stop_smc(rdev);
5344        ci_force_switch_to_arb_f0(rdev);
5345        ci_enable_thermal_based_sclk_dpm(rdev, false);
5346
5347        ci_update_current_ps(rdev, boot_ps);
5348}
5349
5350int ci_dpm_set_power_state(struct radeon_device *rdev)
5351{
5352        struct ci_power_info *pi = ci_get_pi(rdev);
5353        struct radeon_ps *new_ps = &pi->requested_rps;
5354        struct radeon_ps *old_ps = &pi->current_rps;
5355        int ret;
5356
5357        ci_find_dpm_states_clocks_in_dpm_table(rdev, new_ps);
5358        if (pi->pcie_performance_request)
5359                ci_request_link_speed_change_before_state_change(rdev, new_ps, old_ps);
5360        ret = ci_freeze_sclk_mclk_dpm(rdev);
5361        if (ret) {
5362                DRM_ERROR("ci_freeze_sclk_mclk_dpm failed\n");
5363                return ret;
5364        }
5365        ret = ci_populate_and_upload_sclk_mclk_dpm_levels(rdev, new_ps);
5366        if (ret) {
5367                DRM_ERROR("ci_populate_and_upload_sclk_mclk_dpm_levels failed\n");
5368                return ret;
5369        }
5370        ret = ci_generate_dpm_level_enable_mask(rdev, new_ps);
5371        if (ret) {
5372                DRM_ERROR("ci_generate_dpm_level_enable_mask failed\n");
5373                return ret;
5374        }
5375
5376        ret = ci_update_vce_dpm(rdev, new_ps, old_ps);
5377        if (ret) {
5378                DRM_ERROR("ci_update_vce_dpm failed\n");
5379                return ret;
5380        }
5381
5382        ret = ci_update_sclk_t(rdev);
5383        if (ret) {
5384                DRM_ERROR("ci_update_sclk_t failed\n");
5385                return ret;
5386        }
5387        if (pi->caps_dynamic_ac_timing) {
5388                ret = ci_update_and_upload_mc_reg_table(rdev);
5389                if (ret) {
5390                        DRM_ERROR("ci_update_and_upload_mc_reg_table failed\n");
5391                        return ret;
5392                }
5393        }
5394        ret = ci_program_memory_timing_parameters(rdev);
5395        if (ret) {
5396                DRM_ERROR("ci_program_memory_timing_parameters failed\n");
5397                return ret;
5398        }
5399        ret = ci_unfreeze_sclk_mclk_dpm(rdev);
5400        if (ret) {
5401                DRM_ERROR("ci_unfreeze_sclk_mclk_dpm failed\n");
5402                return ret;
5403        }
5404        ret = ci_upload_dpm_level_enable_mask(rdev);
5405        if (ret) {
5406                DRM_ERROR("ci_upload_dpm_level_enable_mask failed\n");
5407                return ret;
5408        }
5409        if (pi->pcie_performance_request)
5410                ci_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps);
5411
5412        return 0;
5413}
5414
5415#if 0
5416void ci_dpm_reset_asic(struct radeon_device *rdev)
5417{
5418        ci_set_boot_state(rdev);
5419}
5420#endif
5421
5422void ci_dpm_display_configuration_changed(struct radeon_device *rdev)
5423{
5424        ci_program_display_gap(rdev);
5425}
5426
5427union power_info {
5428        struct _ATOM_POWERPLAY_INFO info;
5429        struct _ATOM_POWERPLAY_INFO_V2 info_2;
5430        struct _ATOM_POWERPLAY_INFO_V3 info_3;
5431        struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
5432        struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
5433        struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
5434};
5435
5436union pplib_clock_info {
5437        struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
5438        struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
5439        struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
5440        struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
5441        struct _ATOM_PPLIB_SI_CLOCK_INFO si;
5442        struct _ATOM_PPLIB_CI_CLOCK_INFO ci;
5443};
5444
5445union pplib_power_state {
5446        struct _ATOM_PPLIB_STATE v1;
5447        struct _ATOM_PPLIB_STATE_V2 v2;
5448};
5449
5450static void ci_parse_pplib_non_clock_info(struct radeon_device *rdev,
5451                                          struct radeon_ps *rps,
5452                                          struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info,
5453                                          u8 table_rev)
5454{
5455        rps->caps = le32_to_cpu(non_clock_info->ulCapsAndSettings);
5456        rps->class = le16_to_cpu(non_clock_info->usClassification);
5457        rps->class2 = le16_to_cpu(non_clock_info->usClassification2);
5458
5459        if (ATOM_PPLIB_NONCLOCKINFO_VER1 < table_rev) {
5460                rps->vclk = le32_to_cpu(non_clock_info->ulVCLK);
5461                rps->dclk = le32_to_cpu(non_clock_info->ulDCLK);
5462        } else {
5463                rps->vclk = 0;
5464                rps->dclk = 0;
5465        }
5466
5467        if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT)
5468                rdev->pm.dpm.boot_ps = rps;
5469        if (rps->class & ATOM_PPLIB_CLASSIFICATION_UVDSTATE)
5470                rdev->pm.dpm.uvd_ps = rps;
5471}
5472
5473static void ci_parse_pplib_clock_info(struct radeon_device *rdev,
5474                                      struct radeon_ps *rps, int index,
5475                                      union pplib_clock_info *clock_info)
5476{
5477        struct ci_power_info *pi = ci_get_pi(rdev);
5478        struct ci_ps *ps = ci_get_ps(rps);
5479        struct ci_pl *pl = &ps->performance_levels[index];
5480
5481        ps->performance_level_count = index + 1;
5482
5483        pl->sclk = le16_to_cpu(clock_info->ci.usEngineClockLow);
5484        pl->sclk |= clock_info->ci.ucEngineClockHigh << 16;
5485        pl->mclk = le16_to_cpu(clock_info->ci.usMemoryClockLow);
5486        pl->mclk |= clock_info->ci.ucMemoryClockHigh << 16;
5487
5488        pl->pcie_gen = r600_get_pcie_gen_support(rdev,
5489                                                 pi->sys_pcie_mask,
5490                                                 pi->vbios_boot_state.pcie_gen_bootup_value,
5491                                                 clock_info->ci.ucPCIEGen);
5492        pl->pcie_lane = r600_get_pcie_lane_support(rdev,
5493                                                   pi->vbios_boot_state.pcie_lane_bootup_value,
5494                                                   le16_to_cpu(clock_info->ci.usPCIELane));
5495
5496        if (rps->class & ATOM_PPLIB_CLASSIFICATION_ACPI) {
5497                pi->acpi_pcie_gen = pl->pcie_gen;
5498        }
5499
5500        if (rps->class2 & ATOM_PPLIB_CLASSIFICATION2_ULV) {
5501                pi->ulv.supported = true;
5502                pi->ulv.pl = *pl;
5503                pi->ulv.cg_ulv_parameter = CISLANDS_CGULVPARAMETER_DFLT;
5504        }
5505
5506        /* patch up boot state */
5507        if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT) {
5508                pl->mclk = pi->vbios_boot_state.mclk_bootup_value;
5509                pl->sclk = pi->vbios_boot_state.sclk_bootup_value;
5510                pl->pcie_gen = pi->vbios_boot_state.pcie_gen_bootup_value;
5511                pl->pcie_lane = pi->vbios_boot_state.pcie_lane_bootup_value;
5512        }
5513
5514        switch (rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
5515        case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
5516                pi->use_pcie_powersaving_levels = true;
5517                if (pi->pcie_gen_powersaving.max < pl->pcie_gen)
5518                        pi->pcie_gen_powersaving.max = pl->pcie_gen;
5519                if (pi->pcie_gen_powersaving.min > pl->pcie_gen)
5520                        pi->pcie_gen_powersaving.min = pl->pcie_gen;
5521                if (pi->pcie_lane_powersaving.max < pl->pcie_lane)
5522                        pi->pcie_lane_powersaving.max = pl->pcie_lane;
5523                if (pi->pcie_lane_powersaving.min > pl->pcie_lane)
5524                        pi->pcie_lane_powersaving.min = pl->pcie_lane;
5525                break;
5526        case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
5527                pi->use_pcie_performance_levels = true;
5528                if (pi->pcie_gen_performance.max < pl->pcie_gen)
5529                        pi->pcie_gen_performance.max = pl->pcie_gen;
5530                if (pi->pcie_gen_performance.min > pl->pcie_gen)
5531                        pi->pcie_gen_performance.min = pl->pcie_gen;
5532                if (pi->pcie_lane_performance.max < pl->pcie_lane)
5533                        pi->pcie_lane_performance.max = pl->pcie_lane;
5534                if (pi->pcie_lane_performance.min > pl->pcie_lane)
5535                        pi->pcie_lane_performance.min = pl->pcie_lane;
5536                break;
5537        default:
5538                break;
5539        }
5540}
5541
5542static int ci_parse_power_table(struct radeon_device *rdev)
5543{
5544        struct radeon_mode_info *mode_info = &rdev->mode_info;
5545        struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
5546        union pplib_power_state *power_state;
5547        int i, j, k, non_clock_array_index, clock_array_index;
5548        union pplib_clock_info *clock_info;
5549        struct _StateArray *state_array;
5550        struct _ClockInfoArray *clock_info_array;
5551        struct _NonClockInfoArray *non_clock_info_array;
5552        union power_info *power_info;
5553        int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
5554        u16 data_offset;
5555        u8 frev, crev;
5556        u8 *power_state_offset;
5557        struct ci_ps *ps;
5558
5559        if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
5560                                   &frev, &crev, &data_offset))
5561                return -EINVAL;
5562        power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
5563
5564        state_array = (struct _StateArray *)
5565                (mode_info->atom_context->bios + data_offset +
5566                 le16_to_cpu(power_info->pplib.usStateArrayOffset));
5567        clock_info_array = (struct _ClockInfoArray *)
5568                (mode_info->atom_context->bios + data_offset +
5569                 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
5570        non_clock_info_array = (struct _NonClockInfoArray *)
5571                (mode_info->atom_context->bios + data_offset +
5572                 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
5573
5574        rdev->pm.dpm.ps = kcalloc(state_array->ucNumEntries,
5575                                  sizeof(struct radeon_ps),
5576                                  GFP_KERNEL);
5577        if (!rdev->pm.dpm.ps)
5578                return -ENOMEM;
5579        power_state_offset = (u8 *)state_array->states;
5580        rdev->pm.dpm.num_ps = 0;
5581        for (i = 0; i < state_array->ucNumEntries; i++) {
5582                u8 *idx;
5583                power_state = (union pplib_power_state *)power_state_offset;
5584                non_clock_array_index = power_state->v2.nonClockInfoIndex;
5585                non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
5586                        &non_clock_info_array->nonClockInfo[non_clock_array_index];
5587                if (!rdev->pm.power_state[i].clock_info)
5588                        return -EINVAL;
5589                ps = kzalloc(sizeof(struct ci_ps), GFP_KERNEL);
5590                if (ps == NULL)
5591                        return -ENOMEM;
5592                rdev->pm.dpm.ps[i].ps_priv = ps;
5593                ci_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
5594                                              non_clock_info,
5595                                              non_clock_info_array->ucEntrySize);
5596                k = 0;
5597                idx = (u8 *)&power_state->v2.clockInfoIndex[0];
5598                for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
5599                        clock_array_index = idx[j];
5600                        if (clock_array_index >= clock_info_array->ucNumEntries)
5601                                continue;
5602                        if (k >= CISLANDS_MAX_HARDWARE_POWERLEVELS)
5603                                break;
5604                        clock_info = (union pplib_clock_info *)
5605                                ((u8 *)&clock_info_array->clockInfo[0] +
5606                                 (clock_array_index * clock_info_array->ucEntrySize));
5607                        ci_parse_pplib_clock_info(rdev,
5608                                                  &rdev->pm.dpm.ps[i], k,
5609                                                  clock_info);
5610                        k++;
5611                }
5612                power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
5613                rdev->pm.dpm.num_ps = i + 1;
5614        }
5615
5616        /* fill in the vce power states */
5617        for (i = 0; i < RADEON_MAX_VCE_LEVELS; i++) {
5618                u32 sclk, mclk;
5619                clock_array_index = rdev->pm.dpm.vce_states[i].clk_idx;
5620                clock_info = (union pplib_clock_info *)
5621                        &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize];
5622                sclk = le16_to_cpu(clock_info->ci.usEngineClockLow);
5623                sclk |= clock_info->ci.ucEngineClockHigh << 16;
5624                mclk = le16_to_cpu(clock_info->ci.usMemoryClockLow);
5625                mclk |= clock_info->ci.ucMemoryClockHigh << 16;
5626                rdev->pm.dpm.vce_states[i].sclk = sclk;
5627                rdev->pm.dpm.vce_states[i].mclk = mclk;
5628        }
5629
5630        return 0;
5631}
5632
5633static int ci_get_vbios_boot_values(struct radeon_device *rdev,
5634                                    struct ci_vbios_boot_state *boot_state)
5635{
5636        struct radeon_mode_info *mode_info = &rdev->mode_info;
5637        int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
5638        ATOM_FIRMWARE_INFO_V2_2 *firmware_info;
5639        u8 frev, crev;
5640        u16 data_offset;
5641
5642        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
5643                                   &frev, &crev, &data_offset)) {
5644                firmware_info =
5645                        (ATOM_FIRMWARE_INFO_V2_2 *)(mode_info->atom_context->bios +
5646                                                    data_offset);
5647                boot_state->mvdd_bootup_value = le16_to_cpu(firmware_info->usBootUpMVDDCVoltage);
5648                boot_state->vddc_bootup_value = le16_to_cpu(firmware_info->usBootUpVDDCVoltage);
5649                boot_state->vddci_bootup_value = le16_to_cpu(firmware_info->usBootUpVDDCIVoltage);
5650                boot_state->pcie_gen_bootup_value = ci_get_current_pcie_speed(rdev);
5651                boot_state->pcie_lane_bootup_value = ci_get_current_pcie_lane_number(rdev);
5652                boot_state->sclk_bootup_value = le32_to_cpu(firmware_info->ulDefaultEngineClock);
5653                boot_state->mclk_bootup_value = le32_to_cpu(firmware_info->ulDefaultMemoryClock);
5654
5655                return 0;
5656        }
5657        return -EINVAL;
5658}
5659
5660void ci_dpm_fini(struct radeon_device *rdev)
5661{
5662        int i;
5663
5664        for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
5665                kfree(rdev->pm.dpm.ps[i].ps_priv);
5666        }
5667        kfree(rdev->pm.dpm.ps);
5668        kfree(rdev->pm.dpm.priv);
5669        kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
5670        r600_free_extended_power_table(rdev);
5671}
5672
5673int ci_dpm_init(struct radeon_device *rdev)
5674{
5675        int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
5676        SMU7_Discrete_DpmTable  *dpm_table;
5677        struct radeon_gpio_rec gpio;
5678        u16 data_offset, size;
5679        u8 frev, crev;
5680        struct ci_power_info *pi;
5681        enum pci_bus_speed speed_cap = PCI_SPEED_UNKNOWN;
5682        struct pci_dev *root = rdev->pdev->bus->self;
5683        int ret;
5684
5685        pi = kzalloc(sizeof(struct ci_power_info), GFP_KERNEL);
5686        if (pi == NULL)
5687                return -ENOMEM;
5688        rdev->pm.dpm.priv = pi;
5689
5690        if (!pci_is_root_bus(rdev->pdev->bus))
5691                speed_cap = pcie_get_speed_cap(root);
5692        if (speed_cap == PCI_SPEED_UNKNOWN) {
5693                pi->sys_pcie_mask = 0;
5694        } else {
5695                if (speed_cap == PCIE_SPEED_8_0GT)
5696                        pi->sys_pcie_mask = RADEON_PCIE_SPEED_25 |
5697                                RADEON_PCIE_SPEED_50 |
5698                                RADEON_PCIE_SPEED_80;
5699                else if (speed_cap == PCIE_SPEED_5_0GT)
5700                        pi->sys_pcie_mask = RADEON_PCIE_SPEED_25 |
5701                                RADEON_PCIE_SPEED_50;
5702                else
5703                        pi->sys_pcie_mask = RADEON_PCIE_SPEED_25;
5704        }
5705        pi->force_pcie_gen = RADEON_PCIE_GEN_INVALID;
5706
5707        pi->pcie_gen_performance.max = RADEON_PCIE_GEN1;
5708        pi->pcie_gen_performance.min = RADEON_PCIE_GEN3;
5709        pi->pcie_gen_powersaving.max = RADEON_PCIE_GEN1;
5710        pi->pcie_gen_powersaving.min = RADEON_PCIE_GEN3;
5711
5712        pi->pcie_lane_performance.max = 0;
5713        pi->pcie_lane_performance.min = 16;
5714        pi->pcie_lane_powersaving.max = 0;
5715        pi->pcie_lane_powersaving.min = 16;
5716
5717        ret = ci_get_vbios_boot_values(rdev, &pi->vbios_boot_state);
5718        if (ret) {
5719                ci_dpm_fini(rdev);
5720                return ret;
5721        }
5722
5723        ret = r600_get_platform_caps(rdev);
5724        if (ret) {
5725                ci_dpm_fini(rdev);
5726                return ret;
5727        }
5728
5729        ret = r600_parse_extended_power_table(rdev);
5730        if (ret) {
5731                ci_dpm_fini(rdev);
5732                return ret;
5733        }
5734
5735        ret = ci_parse_power_table(rdev);
5736        if (ret) {
5737                ci_dpm_fini(rdev);
5738                return ret;
5739        }
5740
5741        pi->dll_default_on = false;
5742        pi->sram_end = SMC_RAM_END;
5743
5744        pi->activity_target[0] = CISLAND_TARGETACTIVITY_DFLT;
5745        pi->activity_target[1] = CISLAND_TARGETACTIVITY_DFLT;
5746        pi->activity_target[2] = CISLAND_TARGETACTIVITY_DFLT;
5747        pi->activity_target[3] = CISLAND_TARGETACTIVITY_DFLT;
5748        pi->activity_target[4] = CISLAND_TARGETACTIVITY_DFLT;
5749        pi->activity_target[5] = CISLAND_TARGETACTIVITY_DFLT;
5750        pi->activity_target[6] = CISLAND_TARGETACTIVITY_DFLT;
5751        pi->activity_target[7] = CISLAND_TARGETACTIVITY_DFLT;
5752
5753        pi->mclk_activity_target = CISLAND_MCLK_TARGETACTIVITY_DFLT;
5754
5755        pi->sclk_dpm_key_disabled = 0;
5756        pi->mclk_dpm_key_disabled = 0;
5757        pi->pcie_dpm_key_disabled = 0;
5758        pi->thermal_sclk_dpm_enabled = 0;
5759
5760        /* mclk dpm is unstable on some R7 260X cards with the old mc ucode */
5761        if ((rdev->pdev->device == 0x6658) &&
5762            (rdev->mc_fw->size == (BONAIRE_MC_UCODE_SIZE * 4))) {
5763                pi->mclk_dpm_key_disabled = 1;
5764        }
5765
5766        pi->caps_sclk_ds = true;
5767
5768        pi->mclk_strobe_mode_threshold = 40000;
5769        pi->mclk_stutter_mode_threshold = 40000;
5770        pi->mclk_edc_enable_threshold = 40000;
5771        pi->mclk_edc_wr_enable_threshold = 40000;
5772
5773        ci_initialize_powertune_defaults(rdev);
5774
5775        pi->caps_fps = false;
5776
5777        pi->caps_sclk_throttle_low_notification = false;
5778
5779        pi->caps_uvd_dpm = true;
5780        pi->caps_vce_dpm = true;
5781
5782        ci_get_leakage_voltages(rdev);
5783        ci_patch_dependency_tables_with_leakage(rdev);
5784        ci_set_private_data_variables_based_on_pptable(rdev);
5785
5786        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
5787                kcalloc(4,
5788                        sizeof(struct radeon_clock_voltage_dependency_entry),
5789                        GFP_KERNEL);
5790        if (!rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
5791                ci_dpm_fini(rdev);
5792                return -ENOMEM;
5793        }
5794        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
5795        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
5796        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
5797        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000;
5798        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 720;
5799        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000;
5800        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 810;
5801        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000;
5802        rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 900;
5803
5804        rdev->pm.dpm.dyn_state.mclk_sclk_ratio = 4;
5805        rdev->pm.dpm.dyn_state.sclk_mclk_delta = 15000;
5806        rdev->pm.dpm.dyn_state.vddc_vddci_delta = 200;
5807
5808        rdev->pm.dpm.dyn_state.valid_sclk_values.count = 0;
5809        rdev->pm.dpm.dyn_state.valid_sclk_values.values = NULL;
5810        rdev->pm.dpm.dyn_state.valid_mclk_values.count = 0;
5811        rdev->pm.dpm.dyn_state.valid_mclk_values.values = NULL;
5812
5813        if (rdev->family == CHIP_HAWAII) {
5814                pi->thermal_temp_setting.temperature_low = 94500;
5815                pi->thermal_temp_setting.temperature_high = 95000;
5816                pi->thermal_temp_setting.temperature_shutdown = 104000;
5817        } else {
5818                pi->thermal_temp_setting.temperature_low = 99500;
5819                pi->thermal_temp_setting.temperature_high = 100000;
5820                pi->thermal_temp_setting.temperature_shutdown = 104000;
5821        }
5822
5823        pi->uvd_enabled = false;
5824
5825        dpm_table = &pi->smc_state_table;
5826
5827        gpio = radeon_atombios_lookup_gpio(rdev, VDDC_VRHOT_GPIO_PINID);
5828        if (gpio.valid) {
5829                dpm_table->VRHotGpio = gpio.shift;
5830                rdev->pm.dpm.platform_caps |= ATOM_PP_PLATFORM_CAP_REGULATOR_HOT;
5831        } else {
5832                dpm_table->VRHotGpio = CISLANDS_UNUSED_GPIO_PIN;
5833                rdev->pm.dpm.platform_caps &= ~ATOM_PP_PLATFORM_CAP_REGULATOR_HOT;
5834        }
5835
5836        gpio = radeon_atombios_lookup_gpio(rdev, PP_AC_DC_SWITCH_GPIO_PINID);
5837        if (gpio.valid) {
5838                dpm_table->AcDcGpio = gpio.shift;
5839                rdev->pm.dpm.platform_caps |= ATOM_PP_PLATFORM_CAP_HARDWAREDC;
5840        } else {
5841                dpm_table->AcDcGpio = CISLANDS_UNUSED_GPIO_PIN;
5842                rdev->pm.dpm.platform_caps &= ~ATOM_PP_PLATFORM_CAP_HARDWAREDC;
5843        }
5844
5845        gpio = radeon_atombios_lookup_gpio(rdev, VDDC_PCC_GPIO_PINID);
5846        if (gpio.valid) {
5847                u32 tmp = RREG32_SMC(CNB_PWRMGT_CNTL);
5848
5849                switch (gpio.shift) {
5850                case 0:
5851                        tmp &= ~GNB_SLOW_MODE_MASK;
5852                        tmp |= GNB_SLOW_MODE(1);
5853                        break;
5854                case 1:
5855                        tmp &= ~GNB_SLOW_MODE_MASK;
5856                        tmp |= GNB_SLOW_MODE(2);
5857                        break;
5858                case 2:
5859                        tmp |= GNB_SLOW;
5860                        break;
5861                case 3:
5862                        tmp |= FORCE_NB_PS1;
5863                        break;
5864                case 4:
5865                        tmp |= DPM_ENABLED;
5866                        break;
5867                default:
5868                        DRM_DEBUG("Invalid PCC GPIO: %u!\n", gpio.shift);
5869                        break;
5870                }
5871                WREG32_SMC(CNB_PWRMGT_CNTL, tmp);
5872        }
5873
5874        pi->voltage_control = CISLANDS_VOLTAGE_CONTROL_NONE;
5875        pi->vddci_control = CISLANDS_VOLTAGE_CONTROL_NONE;
5876        pi->mvdd_control = CISLANDS_VOLTAGE_CONTROL_NONE;
5877        if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_GPIO_LUT))
5878                pi->voltage_control = CISLANDS_VOLTAGE_CONTROL_BY_GPIO;
5879        else if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2))
5880                pi->voltage_control = CISLANDS_VOLTAGE_CONTROL_BY_SVID2;
5881
5882        if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL) {
5883                if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_VDDCI, VOLTAGE_OBJ_GPIO_LUT))
5884                        pi->vddci_control = CISLANDS_VOLTAGE_CONTROL_BY_GPIO;
5885                else if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_VDDCI, VOLTAGE_OBJ_SVID2))
5886                        pi->vddci_control = CISLANDS_VOLTAGE_CONTROL_BY_SVID2;
5887                else
5888                        rdev->pm.dpm.platform_caps &= ~ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL;
5889        }
5890
5891        if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_MVDDCONTROL) {
5892                if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_MVDDC, VOLTAGE_OBJ_GPIO_LUT))
5893                        pi->mvdd_control = CISLANDS_VOLTAGE_CONTROL_BY_GPIO;
5894                else if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_MVDDC, VOLTAGE_OBJ_SVID2))
5895                        pi->mvdd_control = CISLANDS_VOLTAGE_CONTROL_BY_SVID2;
5896                else
5897                        rdev->pm.dpm.platform_caps &= ~ATOM_PP_PLATFORM_CAP_MVDDCONTROL;
5898        }
5899
5900        pi->vddc_phase_shed_control = true;
5901
5902#if defined(CONFIG_ACPI)
5903        pi->pcie_performance_request =
5904                radeon_acpi_is_pcie_performance_request_supported(rdev);
5905#else
5906        pi->pcie_performance_request = false;
5907#endif
5908
5909        if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
5910                                   &frev, &crev, &data_offset)) {
5911                pi->caps_sclk_ss_support = true;
5912                pi->caps_mclk_ss_support = true;
5913                pi->dynamic_ss = true;
5914        } else {
5915                pi->caps_sclk_ss_support = false;
5916                pi->caps_mclk_ss_support = false;
5917                pi->dynamic_ss = true;
5918        }
5919
5920        if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
5921                pi->thermal_protection = true;
5922        else
5923                pi->thermal_protection = false;
5924
5925        pi->caps_dynamic_ac_timing = true;
5926
5927        pi->uvd_power_gated = false;
5928
5929        /* make sure dc limits are valid */
5930        if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
5931            (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
5932                rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
5933                        rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
5934
5935        pi->fan_ctrl_is_in_default_mode = true;
5936
5937        return 0;
5938}
5939
5940void ci_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
5941                                                    struct seq_file *m)
5942{
5943        struct ci_power_info *pi = ci_get_pi(rdev);
5944        struct radeon_ps *rps = &pi->current_rps;
5945        u32 sclk = ci_get_average_sclk_freq(rdev);
5946        u32 mclk = ci_get_average_mclk_freq(rdev);
5947
5948        seq_printf(m, "uvd    %sabled\n", pi->uvd_enabled ? "en" : "dis");
5949        seq_printf(m, "vce    %sabled\n", rps->vce_active ? "en" : "dis");
5950        seq_printf(m, "power level avg    sclk: %u mclk: %u\n",
5951                   sclk, mclk);
5952}
5953
5954void ci_dpm_print_power_state(struct radeon_device *rdev,
5955                              struct radeon_ps *rps)
5956{
5957        struct ci_ps *ps = ci_get_ps(rps);
5958        struct ci_pl *pl;
5959        int i;
5960
5961        r600_dpm_print_class_info(rps->class, rps->class2);
5962        r600_dpm_print_cap_info(rps->caps);
5963        printk("\tuvd    vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
5964        for (i = 0; i < ps->performance_level_count; i++) {
5965                pl = &ps->performance_levels[i];
5966                printk("\t\tpower level %d    sclk: %u mclk: %u pcie gen: %u pcie lanes: %u\n",
5967                       i, pl->sclk, pl->mclk, pl->pcie_gen + 1, pl->pcie_lane);
5968        }
5969        r600_dpm_print_ps_status(rdev, rps);
5970}
5971
5972u32 ci_dpm_get_current_sclk(struct radeon_device *rdev)
5973{
5974        u32 sclk = ci_get_average_sclk_freq(rdev);
5975
5976        return sclk;
5977}
5978
5979u32 ci_dpm_get_current_mclk(struct radeon_device *rdev)
5980{
5981        u32 mclk = ci_get_average_mclk_freq(rdev);
5982
5983        return mclk;
5984}
5985
5986u32 ci_dpm_get_sclk(struct radeon_device *rdev, bool low)
5987{
5988        struct ci_power_info *pi = ci_get_pi(rdev);
5989        struct ci_ps *requested_state = ci_get_ps(&pi->requested_rps);
5990
5991        if (low)
5992                return requested_state->performance_levels[0].sclk;
5993        else
5994                return requested_state->performance_levels[requested_state->performance_level_count - 1].sclk;
5995}
5996
5997u32 ci_dpm_get_mclk(struct radeon_device *rdev, bool low)
5998{
5999        struct ci_power_info *pi = ci_get_pi(rdev);
6000        struct ci_ps *requested_state = ci_get_ps(&pi->requested_rps);
6001
6002        if (low)
6003                return requested_state->performance_levels[0].mclk;
6004        else
6005                return requested_state->performance_levels[requested_state->performance_level_count - 1].mclk;
6006}
6007