drm/amdgpu: change memory training to common function
authorLikun Gao <Likun.Gao@amd.com>
Thu, 21 May 2020 07:40:41 +0000 (15:40 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 28 May 2020 18:00:49 +0000 (14:00 -0400)
Change memory training init and finit a common function, as it only have
software behavior do not relay on the IP version of PSP.

Signed-off-by: Likun Gao <Likun.Gao@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@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
drivers/gpu/drm/amd/amdgpu/psp_v11_0.c

index 7301fdc..679d967 100644 (file)
@@ -115,6 +115,44 @@ static int psp_early_init(void *handle)
        return 0;
 }
 
+static void psp_memory_training_fini(struct psp_context *psp)
+{
+       struct psp_memory_training_context *ctx = &psp->mem_train_ctx;
+
+       ctx->init = PSP_MEM_TRAIN_NOT_SUPPORT;
+       kfree(ctx->sys_cache);
+       ctx->sys_cache = NULL;
+}
+
+static int psp_memory_training_init(struct psp_context *psp)
+{
+       int ret;
+       struct psp_memory_training_context *ctx = &psp->mem_train_ctx;
+
+       if (ctx->init != PSP_MEM_TRAIN_RESERVE_SUCCESS) {
+               DRM_DEBUG("memory training is not supported!\n");
+               return 0;
+       }
+
+       ctx->sys_cache = kzalloc(ctx->train_data_size, GFP_KERNEL);
+       if (ctx->sys_cache == NULL) {
+               DRM_ERROR("alloc mem_train_ctx.sys_cache failed!\n");
+               ret = -ENOMEM;
+               goto Err_out;
+       }
+
+       DRM_DEBUG("train_data_size:%llx,p2c_train_data_offset:%llx,c2p_train_data_offset:%llx.\n",
+                 ctx->train_data_size,
+                 ctx->p2c_train_data_offset,
+                 ctx->c2p_train_data_offset);
+       ctx->init = PSP_MEM_TRAIN_INIT_SUCCESS;
+       return 0;
+
+Err_out:
+       psp_memory_training_fini(psp);
+       return ret;
+}
+
 static int psp_sw_init(void *handle)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -127,7 +165,7 @@ static int psp_sw_init(void *handle)
                return ret;
        }
 
-       ret = psp_mem_training_init(psp);
+       ret = psp_memory_training_init(psp);
        if (ret) {
                DRM_ERROR("Failed to initialize memory training!\n");
                return ret;
@@ -152,7 +190,7 @@ static int psp_sw_fini(void *handle)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
-       psp_mem_training_fini(&adev->psp);
+       psp_memory_training_fini(&adev->psp);
        release_firmware(adev->psp.sos_fw);
        adev->psp.sos_fw = NULL;
        release_firmware(adev->psp.asd_fw);
index 2a56ad9..e19b98d 100644 (file)
@@ -95,8 +95,6 @@ struct psp_funcs
                            enum psp_ring_type ring_type);
        bool (*smu_reload_quirk)(struct psp_context *psp);
        int (*mode1_reset)(struct psp_context *psp);
-       int (*mem_training_init)(struct psp_context *psp);
-       void (*mem_training_fini)(struct psp_context *psp);
        int (*mem_training)(struct psp_context *psp, uint32_t ops);
        uint32_t (*ring_get_wptr)(struct psp_context *psp);
        void (*ring_set_wptr)(struct psp_context *psp, uint32_t value);
@@ -306,10 +304,6 @@ struct amdgpu_psp_funcs {
                ((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false)
 #define psp_mode1_reset(psp) \
                ((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false)
-#define psp_mem_training_init(psp) \
-       ((psp)->funcs->mem_training_init ? (psp)->funcs->mem_training_init((psp)) : 0)
-#define psp_mem_training_fini(psp) \
-       ((psp)->funcs->mem_training_fini ? (psp)->funcs->mem_training_fini((psp)) : 0)
 #define psp_mem_training(psp, ops) \
        ((psp)->funcs->mem_training ? (psp)->funcs->mem_training((psp), (ops)) : 0)
 
index 1de89cc..9ec6e38 100644 (file)
@@ -555,44 +555,6 @@ static int psp_v11_0_memory_training_send_msg(struct psp_context *psp, int msg)
        return ret;
 }
 
-static void psp_v11_0_memory_training_fini(struct psp_context *psp)
-{
-       struct psp_memory_training_context *ctx = &psp->mem_train_ctx;
-
-       ctx->init = PSP_MEM_TRAIN_NOT_SUPPORT;
-       kfree(ctx->sys_cache);
-       ctx->sys_cache = NULL;
-}
-
-static int psp_v11_0_memory_training_init(struct psp_context *psp)
-{
-       int ret;
-       struct psp_memory_training_context *ctx = &psp->mem_train_ctx;
-
-       if (ctx->init != PSP_MEM_TRAIN_RESERVE_SUCCESS) {
-               DRM_DEBUG("memory training is not supported!\n");
-               return 0;
-       }
-
-       ctx->sys_cache = kzalloc(ctx->train_data_size, GFP_KERNEL);
-       if (ctx->sys_cache == NULL) {
-               DRM_ERROR("alloc mem_train_ctx.sys_cache failed!\n");
-               ret = -ENOMEM;
-               goto Err_out;
-       }
-
-       DRM_DEBUG("train_data_size:%llx,p2c_train_data_offset:%llx,c2p_train_data_offset:%llx.\n",
-                 ctx->train_data_size,
-                 ctx->p2c_train_data_offset,
-                 ctx->c2p_train_data_offset);
-       ctx->init = PSP_MEM_TRAIN_INIT_SUCCESS;
-       return 0;
-
-Err_out:
-       psp_v11_0_memory_training_fini(psp);
-       return ret;
-}
-
 /*
  * save and restore proces
  */
@@ -820,8 +782,6 @@ static const struct psp_funcs psp_v11_0_funcs = {
        .ring_stop = psp_v11_0_ring_stop,
        .ring_destroy = psp_v11_0_ring_destroy,
        .mode1_reset = psp_v11_0_mode1_reset,
-       .mem_training_init = psp_v11_0_memory_training_init,
-       .mem_training_fini = psp_v11_0_memory_training_fini,
        .mem_training = psp_v11_0_memory_training,
        .ring_get_wptr = psp_v11_0_ring_get_wptr,
        .ring_set_wptr = psp_v11_0_ring_set_wptr,