core_link_enable_stream(dc->current_state, &dc->current_state->res_ctx.pipe_ctx[i]);
 }
 
-bool dc_is_plane_eligible_for_idle_optimizaitons(struct dc *dc,
-                                                struct dc_plane_state *plane)
+bool dc_is_plane_eligible_for_idle_optimizaitons(struct dc *dc, struct dc_plane_state *plane)
 {
+       if (dc->hwss.does_plane_fit_in_mall && dc->hwss.does_plane_fit_in_mall(dc, plane))
+               return true;
+
        return false;
 }
 
 
        bool dmcub_support;
        uint32_t num_of_internal_disp;
        enum dp_protocol_version max_dp_protocol_version;
+       unsigned int mall_size_per_mem_channel;
+       unsigned int mall_size_total;
+       unsigned int cursor_cache_size;
        struct dc_plane_cap planes[MAX_PLANES];
        struct dc_color_caps color;
 };
        bool dmcub_emulation;
 #if defined(CONFIG_DRM_AMD_DC_DCN)
        bool disable_idle_power_optimizations;
+       unsigned int mall_size_override;
 #endif
        bool dmub_command_table; /* for testing only */
        struct dc_bw_validation_profile bw_val_profile;
 
        union {
                struct{
                        PHYSICAL_ADDRESS_LOC addr;
+                       PHYSICAL_ADDRESS_LOC cursor_cache_addr;
                        PHYSICAL_ADDRESS_LOC meta_addr;
                        union large_integer dcc_const_color;
                } grph;
 
        return true;
 }
 
+bool dcn30_does_plane_fit_in_mall(struct dc *dc, struct dc_plane_state *plane)
+{
+       // add meta size?
+       unsigned int surface_size = plane->plane_size.surface_pitch * plane->plane_size.surface_size.height *
+                       (plane->format >= SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616 ? 8 : 4);
+       unsigned int mall_size = dc->caps.mall_size_total;
+
+       if (dc->debug.mall_size_override)
+               mall_size = 1024 * 1024 * dc->debug.mall_size_override;
+
+       return (surface_size + dc->caps.cursor_cache_size) < mall_size;
+}
+
 void dcn30_hardware_release(struct dc *dc)
 {
        /* if pstate unsupported, force it supported */
 
 void dcn30_update_info_frame(struct pipe_ctx *pipe_ctx);
 void dcn30_program_dmdata_engine(struct pipe_ctx *pipe_ctx);
 
+bool dcn30_does_plane_fit_in_mall(struct dc *dc, struct dc_plane_state *plane);
+
 bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable);
 
 void dcn30_hardware_release(struct dc *dc);
 
        .get_vupdate_offset_from_vsync = dcn10_get_vupdate_offset_from_vsync,
        .calc_vupdate_position = dcn10_calc_vupdate_position,
        .apply_idle_power_optimizations = dcn30_apply_idle_power_optimizations,
+       .does_plane_fit_in_mall = dcn30_does_plane_fit_in_mall,
        .set_backlight_level = dcn21_set_backlight_level,
        .set_abm_immediate_disable = dcn21_set_abm_immediate_disable,
        .hardware_release = dcn30_hardware_release,
 
        dc->caps.max_cursor_size = 256;
        dc->caps.min_horizontal_blanking_period = 80;
        dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.mall_size_per_mem_channel = 8;
+       /* total size = mall per channel * num channels * 1024 * 1024 */
+       dc->caps.mall_size_total = dc->caps.mall_size_per_mem_channel * dc->ctx->dc_bios->vram_info.num_chans * 1048576;
+       dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
 
        dc->caps.max_slave_planes = 1;
        dc->caps.post_blend_color_processing = true;
 
        /* Idle Optimization Related */
        bool (*apply_idle_power_optimizations)(struct dc *dc, bool enable);
 
+       bool (*does_plane_fit_in_mall)(struct dc *dc, struct dc_plane_state *plane);
+
        bool (*is_abm_supported)(struct dc *dc,
                        struct dc_state *context, struct dc_stream_state *stream);