if (!plane->blends_with_above || !plane->blends_with_below)
                        continue;
 
-               if (!plane->supports_argb8888)
+               if (!plane->pixel_format_support.argb8888)
                        continue;
 
                if (initialize_plane(dm, NULL, primary_planes + i,
                        formats[num_formats++] = rgb_formats[i];
                }
 
-               if (plane_cap && plane_cap->supports_nv12)
+               if (plane_cap && plane_cap->pixel_format_support.nv12)
                        formats[num_formats++] = DRM_FORMAT_NV12;
                break;
 
        }
 
        if (plane->type == DRM_PLANE_TYPE_PRIMARY &&
-           plane_cap && plane_cap->supports_nv12) {
+           plane_cap && plane_cap->pixel_format_support.nv12) {
                /* This only affects YUV formats. */
                drm_plane_create_color_properties(
                        plane,
 
        uint32_t blends_with_above : 1;
        uint32_t blends_with_below : 1;
        uint32_t per_pixel_alpha : 1;
-       uint32_t supports_argb8888 : 1;
-       uint32_t supports_nv12 : 1;
+       struct {
+               uint32_t argb8888 : 1;
+               uint32_t nv12 : 1;
+               uint32_t fp16 : 1;
+       } pixel_format_support;
+       // max upscaling factor x1000
+       // upscaling factors are always >= 1
+       // for example, 1080p -> 8K is 4.0, or 4000 raw value
+       struct {
+               uint32_t argb8888;
+               uint32_t nv12;
+               uint32_t fp16;
+       } max_upscale_factor;
+       // max downscale factor x1000
+       // downscale factors are always <= 1
+       // for example, 8K -> 1080p is 0.25, or 250 raw value
+       struct {
+               uint32_t argb8888;
+               uint32_t nv12;
+               uint32_t fp16;
+       } max_downscale_factor;
 };
 
 struct dc_caps {
 
 
 static const struct dc_plane_cap plane_cap = {
        .type = DC_PLANE_TYPE_DCE_RGB,
-       .supports_argb8888 = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = false,
+                       .fp16 = false
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 1,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 1,
+                       .fp16 = 1
+       }
 };
 
 #define CTX  ctx
 
                .blends_with_below = true,
                .blends_with_above = true,
                .per_pixel_alpha = 1,
-               .supports_argb8888 = true,
+
+               .pixel_format_support = {
+                               .argb8888 = true,
+                               .nv12 = false,
+                               .fp16 = false
+               },
+
+               .max_upscale_factor = {
+                               .argb8888 = 16000,
+                               .nv12 = 1,
+                               .fp16 = 1
+               },
+
+               .max_downscale_factor = {
+                               .argb8888 = 250,
+                               .nv12 = 1,
+                               .fp16 = 1
+               }
 };
 
 static const struct dc_plane_cap underlay_plane_cap = {
                .type = DC_PLANE_TYPE_DCE_UNDERLAY,
                .blends_with_above = true,
                .per_pixel_alpha = 1,
-               .supports_nv12 = true
+
+               .pixel_format_support = {
+                               .argb8888 = false,
+                               .nv12 = true,
+                               .fp16 = false
+               },
+
+               .max_upscale_factor = {
+                               .argb8888 = 1,
+                               .nv12 = 16000,
+                               .fp16 = 1
+               },
+
+               .max_downscale_factor = {
+                               .argb8888 = 1,
+                               .nv12 = 250,
+                               .fp16 = 1
+               }
 };
 
 #define CTX  ctx
 
 
 static const struct dc_plane_cap plane_cap = {
        .type = DC_PLANE_TYPE_DCE_RGB,
-       .supports_argb8888 = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = false,
+                       .fp16 = false
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 1,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 1,
+                       .fp16 = 1
+       }
 };
 
 #define CTX  ctx
 
 
 static const struct dc_plane_cap plane_cap = {
        .type = DC_PLANE_TYPE_DCE_RGB,
-       .supports_argb8888 = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = false,
+                       .fp16 = false
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 1,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 1,
+                       .fp16 = 1
+       }
 };
 
 static const struct dc_debug_options debug_defaults = {
 
 
 static const struct dc_plane_cap plane_cap = {
        .type = DC_PLANE_TYPE_DCE_RGB,
-       .supports_argb8888 = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = false,
+                       .fp16 = false
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 1,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 1,
+                       .fp16 = 1
+       }
 };
 
 static const struct dce_dmcu_registers dmcu_regs = {
 
        .blends_with_above = true,
        .blends_with_below = true,
        .per_pixel_alpha = true,
-       .supports_argb8888 = true,
-       .supports_nv12 = true
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 250,
+                       .fp16 = 1
+       }
 };
 
 static const struct dc_debug_options debug_defaults_drv = {