drm/amdgpu: split psp asd function
authorHuang Rui <ray.huang@amd.com>
Tue, 21 Mar 2017 10:02:04 +0000 (18:02 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 28 Apr 2017 20:37:58 +0000 (16:37 -0400)
Rework in order to properly support suspend.

Signed-off-by: Huang Rui <ray.huang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h

index ed9c04b7a286754f3ba6f5fa47ddcd8418283298..ea5616036bf6de255d1b6c8fc761af1c20cb004e 100644 (file)
@@ -206,48 +206,43 @@ static void psp_prep_asd_cmd_buf(struct psp_gfx_cmd_resp *cmd,
        cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size;
 }
 
+static int psp_asd_init(struct psp_context *psp)
+{
+       int ret;
+
+       /*
+        * Allocate 16k memory aligned to 4k from Frame Buffer (local
+        * physical) for shared ASD <-> Driver
+        */
+       ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_SHARED_MEM_SIZE,
+                                     PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
+                                     &psp->asd_shared_bo,
+                                     &psp->asd_shared_mc_addr,
+                                     &psp->asd_shared_buf);
+
+       return ret;
+}
+
 static int psp_asd_load(struct psp_context *psp)
 {
        int ret;
-       struct amdgpu_bo *asd_shared_bo;
-       uint64_t asd_shared_mc_addr;
-       void *asd_shared_buf;
        struct psp_gfx_cmd_resp *cmd;
 
        cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
        if (!cmd)
                return -ENOMEM;
 
-       /*
-        * Allocate 16k memory aligned to 4k from Frame Buffer (local
-        * physical) for shared ASD <-> Driver
-        */
-       ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_SHARED_MEM_SIZE, PAGE_SIZE,
-                                     AMDGPU_GEM_DOMAIN_VRAM,
-                                     &asd_shared_bo, &asd_shared_mc_addr, &asd_shared_buf);
-       if (ret)
-               goto failed;
-
        memset(psp->fw_pri_buf, 0, PSP_1_MEG);
        memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size);
 
-       psp_prep_asd_cmd_buf(cmd, psp->fw_pri_mc_addr, asd_shared_mc_addr,
+       psp_prep_asd_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->asd_shared_mc_addr,
                             psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE);
 
        ret = psp_cmd_submit_buf(psp, NULL, cmd,
                                 psp->fence_buf_mc_addr, 2);
-       if (ret)
-               goto failed_mem;
 
-       amdgpu_bo_free_kernel(&asd_shared_bo, &asd_shared_mc_addr, &asd_shared_buf);
        kfree(cmd);
 
-       return 0;
-
-failed_mem:
-       amdgpu_bo_free_kernel(&asd_shared_bo, &asd_shared_mc_addr, &asd_shared_buf);
-failed:
-       kfree(cmd);
        return ret;
 }
 
@@ -301,6 +296,10 @@ static int psp_load_fw(struct amdgpu_device *adev)
        if (ret)
                goto failed_mem;
 
+       ret = psp_asd_init(psp);
+       if (ret)
+               goto failed_mem;
+
        ret = psp_asd_load(psp);
        if (ret)
                goto failed_mem;
index 125a5dc0c0e1ab6f8cefb81df332fb63aae3561a..1f1f057c7c424e42573986ca1e412f4cacfef9cf 100644 (file)
@@ -90,12 +90,15 @@ struct psp_context
        uint64_t                        tmr_mc_addr;
        void                            *tmr_buf;
 
-       /* asd firmware */
+       /* asd firmware and buffer */
        const struct firmware           *asd_fw;
        uint32_t                        asd_fw_version;
        uint32_t                        asd_feature_version;
        uint32_t                        asd_ucode_size;
        uint8_t                         *asd_start_addr;
+       struct amdgpu_bo                *asd_shared_bo;
+       uint64_t                        asd_shared_mc_addr;
+       void                            *asd_shared_buf;
 
        /* fence buffer */
        struct amdgpu_bo                *fence_buf_bo;