]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
drm/amd/powerplay: add powerplay valid check to avoid null point. (v2)
authorRex Zhu <Rex.Zhu@amd.com>
Tue, 29 Dec 2015 05:56:03 +0000 (13:56 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 8 Jan 2016 20:39:23 +0000 (15:39 -0500)
In case CONFIG_DRM_AMD_POWERPLAY is defined and amdgpu.powerplay=0.
some functions in powrplay can also be called by DAL. and the input parameter is *adev.
if just check point not NULL was not enough and will lead to NULL point error.

V2: AGD: rebase on upstream

Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/amd_powerplay.c
drivers/gpu/drm/amd/powerplay/inc/pp_instance.h

index db0370bd60e358d07f4cf1b486faea890cc6e066..2764bd32703415064d9456f1ddd469773f5b7112 100644 (file)
 #include "power_state.h"
 #include "eventmanager.h"
 
+#define PP_CHECK(handle)                                               \
+       do {                                                            \
+               if ((handle) == NULL || (handle)->pp_valid != PP_VALID) \
+                       return -EINVAL;                                 \
+       } while (0)
+
 static int pp_early_init(void *handle)
 {
        return 0;
@@ -537,6 +543,8 @@ static int amd_pp_instance_init(struct amd_pp_init *pp_init,
        if (handle == NULL)
                return -ENOMEM;
 
+       handle->pp_valid = PP_VALID;
+
        ret = smum_init(pp_init, handle);
        if (ret)
                goto fail_smum;
@@ -611,8 +619,7 @@ int amd_powerplay_display_configuration_change(void *handle, const void *input)
        struct pp_hwmgr  *hwmgr;
        const struct amd_pp_display_configuration *display_config = input;
 
-       if (handle == NULL)
-               return -EINVAL;
+       PP_CHECK((struct pp_instance *)handle);
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
@@ -625,7 +632,9 @@ int amd_powerplay_get_display_power_level(void *handle,
 {
        struct pp_hwmgr  *hwmgr;
 
-       if (handle == NULL || output == NULL)
+       PP_CHECK((struct pp_instance *)handle);
+
+       if (output == NULL)
                return -EINVAL;
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
index 7b60b617dff6178e2d3b00740ce2738fa6ca5105..4d8ed1f33de44648a6a7b388aab593236e065d27 100644 (file)
 #include "hwmgr.h"
 #include "eventmgr.h"
 
+#define PP_VALID  0x1F1F1F1F
+
 struct pp_instance {
+       uint32_t pp_valid;
        struct pp_smumgr *smu_mgr;
        struct pp_hwmgr *hwmgr;
        struct pp_eventmgr *eventmgr;