.hsub = 1, .vsub = 1, .has_alpha = true },
 };
 
+static const struct drm_format_info gen12_flat_ccs_cc_formats[] = {
+       { .format = DRM_FORMAT_XRGB8888, .depth = 24, .num_planes = 2,
+         .char_per_block = { 4, 0 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
+         .hsub = 1, .vsub = 1, },
+       { .format = DRM_FORMAT_XBGR8888, .depth = 24, .num_planes = 2,
+         .char_per_block = { 4, 0 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
+         .hsub = 1, .vsub = 1, },
+       { .format = DRM_FORMAT_ARGB8888, .depth = 32, .num_planes = 2,
+         .char_per_block = { 4, 0 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
+         .hsub = 1, .vsub = 1, .has_alpha = true },
+       { .format = DRM_FORMAT_ABGR8888, .depth = 32, .num_planes = 2,
+         .char_per_block = { 4, 0 }, .block_w = { 1, 2 }, .block_h = { 1, 1 },
+         .hsub = 1, .vsub = 1, .has_alpha = true },
+};
+
 struct intel_modifier_desc {
        u64 modifier;
        struct {
                .modifier = I915_FORMAT_MOD_4_TILED_DG2_MC_CCS,
                .display_ver = { 13, 13 },
                .plane_caps = INTEL_PLANE_CAP_TILING_4 | INTEL_PLANE_CAP_CCS_MC,
+       }, {
+               .modifier = I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC,
+               .display_ver = { 13, 13 },
+               .plane_caps = INTEL_PLANE_CAP_TILING_4 | INTEL_PLANE_CAP_CCS_RC_CC,
+
+               .ccs.cc_planes = BIT(1),
+
+               FORMAT_OVERRIDE(gen12_flat_ccs_cc_formats),
        }, {
                .modifier = I915_FORMAT_MOD_4_TILED_DG2_RC_CCS,
                .display_ver = { 13, 13 },
 static bool format_is_yuv_semiplanar(const struct intel_modifier_desc *md,
                                     const struct drm_format_info *info)
 {
-       int yuv_planes;
-
        if (!info->is_yuv)
                return false;
 
-       if (plane_caps_contain_any(md->plane_caps, INTEL_PLANE_CAP_CCS_MASK))
-               yuv_planes = 4;
+       if (hweight8(md->ccs.planar_aux_planes) == 2)
+               return info->num_planes == 4;
        else
-               yuv_planes = 2;
-
-       return info->num_planes == yuv_planes;
+               return info->num_planes == 2;
 }
 
 /**
 
 int skl_main_to_aux_plane(const struct drm_framebuffer *fb, int main_plane)
 {
+       const struct intel_modifier_desc *md = lookup_modifier(fb->modifier);
        struct drm_i915_private *i915 = to_i915(fb->dev);
 
-       if (intel_fb_is_ccs_modifier(fb->modifier))
+       if (md->ccs.packed_aux_planes | md->ccs.planar_aux_planes)
                return main_to_ccs_plane(fb, main_plane);
        else if (DISPLAY_VER(i915) < 11 &&
-                intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier))
+                format_is_yuv_semiplanar(md, fb->format))
                return 1;
        else
                return 0;
                else
                        return 512;
        case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS:
+       case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC:
        case I915_FORMAT_MOD_4_TILED_DG2_MC_CCS:
        case I915_FORMAT_MOD_4_TILED:
                /*
        case I915_FORMAT_MOD_Yf_TILED:
                return 1 * 1024 * 1024;
        case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS:
+       case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC:
        case I915_FORMAT_MOD_4_TILED_DG2_MC_CCS:
                return 16 * 1024;
        default:
 
                return PLANE_CTL_TILED_4 |
                        PLANE_CTL_MEDIA_DECOMPRESSION_ENABLE |
                        PLANE_CTL_CLEAR_COLOR_DISABLE;
+       case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC:
+               return PLANE_CTL_TILED_4 | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
        case I915_FORMAT_MOD_Y_TILED_CCS:
        case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC:
                return PLANE_CTL_TILED_Y | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
                                  upper_32_bits(plane_state->ccval));
        }
 
-       intel_de_write_fw(dev_priv, PLANE_AUX_DIST(pipe, plane_id),
-                         skl_plane_aux_dist(plane_state, color_plane));
+       /* FLAT CCS doesn't need to program AUX_DIST */
+       if (!HAS_FLAT_CCS(dev_priv))
+               intel_de_write_fw(dev_priv, PLANE_AUX_DIST(pipe, plane_id),
+                                 skl_plane_aux_dist(plane_state, color_plane));
 
        if (icl_is_hdr_plane(dev_priv, plane_id))
                intel_de_write_fw(dev_priv, PLANE_CUS_CTL(pipe, plane_id),
 
        /*
         * CCS AUX surface doesn't have its own x/y offsets, we must make sure
-        * they match with the main surface x/y offsets.
+        * they match with the main surface x/y offsets. On DG2
+        * there's no aux plane on fb so skip this checking.
         */
-       if (intel_fb_is_ccs_modifier(fb->modifier)) {
+       if (intel_fb_is_ccs_modifier(fb->modifier) && aux_plane) {
                while (!skl_check_main_ccs_coordinates(plane_state, x, y,
                                                       offset, aux_plane)) {
                        if (offset == 0)
        const struct drm_framebuffer *fb = plane_state->hw.fb;
        unsigned int rotation = plane_state->hw.rotation;
        int uv_plane = 1;
+       int ccs_plane = intel_fb_is_ccs_modifier(fb->modifier) ?
+                       skl_main_to_aux_plane(fb, uv_plane) : 0;
        int max_width = intel_plane_max_width(plane, fb, uv_plane, rotation);
        int max_height = intel_plane_max_height(plane, fb, uv_plane, rotation);
        int x = plane_state->uapi.src.x1 >> 17;
        offset = intel_plane_compute_aligned_offset(&x, &y,
                                                    plane_state, uv_plane);
 
-       if (intel_fb_is_ccs_modifier(fb->modifier)) {
-               int ccs_plane = main_to_ccs_plane(fb, uv_plane);
+       if (ccs_plane) {
                u32 aux_offset = plane_state->view.color_plane[ccs_plane].offset;
                u32 alignment = intel_surf_alignment(fb, uv_plane);
 
                break;
        case PLANE_CTL_TILED_YF: /* aka PLANE_CTL_TILED_4 on XE_LPD+ */
                if (HAS_4TILE(dev_priv)) {
-                       if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE)
+                       u32 rc_mask = PLANE_CTL_RENDER_DECOMPRESSION_ENABLE |
+                                     PLANE_CTL_CLEAR_COLOR_DISABLE;
+
+                       if ((val & rc_mask) == rc_mask)
                                fb->modifier = I915_FORMAT_MOD_4_TILED_DG2_RC_CCS;
                        else if (val & PLANE_CTL_MEDIA_DECOMPRESSION_ENABLE)
                                fb->modifier = I915_FORMAT_MOD_4_TILED_DG2_MC_CCS;
+                       else if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE)
+                               fb->modifier = I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC;
                        else
                                fb->modifier = I915_FORMAT_MOD_4_TILED;
                } else {