From: Roman Li <roman...@amd.com>

[Why]
"BUG: sleeping function called from invalid context" error.
after:
"drm/amd/display: Protect FPU in dml2_validate()/dml21_validate()"

The populate_dml_plane_cfg_from_plane_state() uses the GFP_KERNEL flag
for memory allocation, which shouldn't be used in atomic contexts.

The allocation is needed only for using another helper function
get_scaler_data_for_plane().

[How]
Modify helpers to pass a pointer to scaler_data within existing context,
eliminating the need for dynamic memory allocation/deallocation
and copying.

Fixes: d1df16640462 ("drm/amd/display: Protect FPU in 
dml2_validate()/dml21_validate()")

Reviewed-by: Aurabindo Pillai <aurabindo.pil...@amd.com>
Signed-off-by: Roman Li <roman...@amd.com>
Signed-off-by: Ray Wu <ray...@amd.com>
---
 .../amd/display/dc/dml2/dml2_translation_helper.c  | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c 
b/drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c
index 857ce1695fd5..5de775fd8fce 100644
--- a/drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c
+++ b/drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c
@@ -973,7 +973,9 @@ static void populate_dml_surface_cfg_from_plane_state(enum 
dml_project_id dml2_p
        }
 }
 
-static void get_scaler_data_for_plane(const struct dc_plane_state *in, struct 
dc_state *context, struct scaler_data *out)
+static struct scaler_data *get_scaler_data_for_plane(
+               const struct dc_plane_state *in,
+               struct dc_state *context)
 {
        int i;
        struct pipe_ctx *temp_pipe = &context->res_ctx.temp_pipe;
@@ -994,7 +996,7 @@ static void get_scaler_data_for_plane(const struct 
dc_plane_state *in, struct dc
        }
 
        ASSERT(i < MAX_PIPES);
-       memcpy(out, &temp_pipe->plane_res.scl_data, sizeof(*out));
+       return &temp_pipe->plane_res.scl_data;
 }
 
 static void populate_dummy_dml_plane_cfg(struct dml_plane_cfg_st *out, 
unsigned int location,
@@ -1057,11 +1059,7 @@ static void 
populate_dml_plane_cfg_from_plane_state(struct dml_plane_cfg_st *out
                                                    const struct dc_plane_state 
*in, struct dc_state *context,
                                                    const struct 
soc_bounding_box_st *soc)
 {
-       struct scaler_data *scaler_data = kzalloc(sizeof(*scaler_data), 
GFP_KERNEL);
-       if (!scaler_data)
-               return;
-
-       get_scaler_data_for_plane(in, context, scaler_data);
+       struct scaler_data *scaler_data = get_scaler_data_for_plane(in, 
context);
 
        out->CursorBPP[location] = dml_cur_32bit;
        out->CursorWidth[location] = 256;
@@ -1126,8 +1124,6 @@ static void 
populate_dml_plane_cfg_from_plane_state(struct dml_plane_cfg_st *out
        out->DynamicMetadataTransmittedBytes[location] = 0;
 
        out->NumberOfCursors[location] = 1;
-
-       kfree(scaler_data);
 }
 
 static unsigned int map_stream_to_dml_display_cfg(const struct dml2_context 
*dml2,
-- 
2.43.0

Reply via email to