#define smnMP0_FW_INTF                 0x30101c0
 #define smnMP1_PUB_CTRL                        0x3010b14
 
+
+struct smu_11_0_dpm_table {
+       uint32_t    min;        /* MHz */
+       uint32_t    max;        /* MHz */
+};
+
+struct smu_11_0_dpm_tables {
+       struct smu_11_0_dpm_table        soc_table;
+       struct smu_11_0_dpm_table        gfx_table;
+       struct smu_11_0_dpm_table        uclk_table;
+       struct smu_11_0_dpm_table        eclk_table;
+       struct smu_11_0_dpm_table        vclk_table;
+       struct smu_11_0_dpm_table        dclk_table;
+       struct smu_11_0_dpm_table        dcef_table;
+       struct smu_11_0_dpm_table        pixel_table;
+       struct smu_11_0_dpm_table        display_table;
+       struct smu_11_0_dpm_table        phy_table;
+       struct smu_11_0_dpm_table        fclk_table;
+};
+
+struct smu_11_0_dpm_context {
+       struct smu_11_0_dpm_tables  dpm_tables;
+       uint32_t                    workload_policy_mask;
+       uint32_t                    dcef_min_ds_clk;
+};
+
 void smu_v11_0_set_smu_funcs(struct smu_context *smu);
 
 #endif
 
        return 0;
 }
 
+static int smu_v11_0_init_dpm_context(struct smu_context *smu)
+{
+       struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
+
+       if (smu_dpm->dpm_context || smu_dpm->dpm_context_size != 0)
+               return -EINVAL;
+
+       smu_dpm->dpm_context = kzalloc(sizeof(struct smu_11_0_dpm_context), GFP_KERNEL);
+       if (!smu_dpm->dpm_context)
+               return -ENOMEM;
+       smu_dpm->dpm_context_size = sizeof(struct smu_11_0_dpm_context);
+
+       return 0;
+}
+
+static int smu_v11_0_fini_dpm_context(struct smu_context *smu)
+{
+       struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
+
+       if (!smu_dpm->dpm_context || smu_dpm->dpm_context_size == 0)
+               return -EINVAL;
+
+       kfree(smu_dpm->dpm_context);
+       smu_dpm->dpm_context = NULL;
+       smu_dpm->dpm_context_size = 0;
+
+       return 0;
+}
+
 static int smu_v11_0_init_smc_tables(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
        struct smu_table *tables = NULL;
+       int ret = 0;
 
        if (smu_table->tables || smu_table->table_count != 0)
                return -EINVAL;
        SMU_TABLE_INIT(tables, TABLE_OVERDRIVE, sizeof(OverDriveTable_t),
                       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
 
+       ret = smu_v11_0_init_dpm_context(smu);
+       if (ret)
+               return ret;
+
        return 0;
 }
 
 static int smu_v11_0_fini_smc_tables(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
+       int ret = 0;
 
        if (!smu_table->tables || smu_table->table_count == 0)
                return -EINVAL;
        smu_table->tables = NULL;
        smu_table->table_count = 0;
 
+       ret = smu_v11_0_fini_dpm_context(smu);
+       if (ret)
+               return ret;
        return 0;
 
 }