From: Eric Huang <jinhuieric.hu...@amd.com>

This fixes a bug in the pptable access interface that could lead to
a crash.  Check the pointer before using it.

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
Signed-off-by: Eric Huang <JinHuiEric.Huang at amd.com>
Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
---
 .../gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c   | 15 +++++++++------
 drivers/gpu/drm/amd/powerplay/inc/hwmgr.h                 |  1 +
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
index 96a2787..10e3630 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
@@ -138,12 +138,15 @@ const void *get_powerplay_table(struct pp_hwmgr *hwmgr)

        u16 size;
        u8 frev, crev;
-       void *table_address;
-
-       table_address = (ATOM_Tonga_POWERPLAYTABLE *)
-               cgs_atom_get_data_table(hwmgr->device, index, &size, &frev, 
&crev);
-
-       hwmgr->soft_pp_table = table_address;   /*Cache the result in RAM.*/
+       void *table_address = (void *)hwmgr->soft_pp_table;
+
+       if (!table_address) {
+               table_address = (ATOM_Tonga_POWERPLAYTABLE *)
+                               cgs_atom_get_data_table(hwmgr->device,
+                                               index, &size, &frev, &crev);
+               hwmgr->soft_pp_table = table_address;   /*Cache the result in 
RAM.*/
+               hwmgr->soft_pp_table_size = size;
+       }

        return table_address;
 }
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h 
b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
index b1a9ae5..c96e5b1 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
@@ -577,6 +577,7 @@ struct pp_hwmgr {
        void *device;
        struct pp_smumgr *smumgr;
        const void *soft_pp_table;
+       uint32_t soft_pp_table_size;
        bool need_pp_table_upload;
        enum amd_dpm_forced_level dpm_level;
        bool block_hw_access;
-- 
2.5.5

Reply via email to