Lines Matching refs:fb

532  * @fb: Framebuffer
536 * Returns %true if @fb's color plane at index @color_plane is a CCS AUX plane.
538 bool intel_fb_is_ccs_aux_plane(const struct drm_framebuffer *fb, int color_plane)
540 const struct intel_modifier_desc *md = lookup_modifier(fb->modifier);
542 return ccs_aux_plane_mask(md, fb->format) & BIT(color_plane);
547 * @fb: Framebuffer
551 * Returns %true if @fb's color plane at index @color_plane is a GEN12 CCS AUX plane.
553 static bool intel_fb_is_gen12_ccs_aux_plane(const struct drm_framebuffer *fb, int color_plane)
555 const struct intel_modifier_desc *md = lookup_modifier(fb->modifier);
558 ccs_aux_plane_mask(md, fb->format) & BIT(color_plane);
563 * @fb: Framebuffer
566 * Returns the index of the color clear plane for @fb, or -1 if @fb is not a
569 int intel_fb_rc_ccs_cc_plane(const struct drm_framebuffer *fb)
571 const struct intel_modifier_desc *md = lookup_modifier(fb->modifier);
576 drm_WARN_ON_ONCE(fb->dev, hweight8(md->ccs.cc_planes) > 1);
581 static bool is_gen12_ccs_cc_plane(const struct drm_framebuffer *fb, int color_plane)
583 return intel_fb_rc_ccs_cc_plane(fb) == color_plane;
586 static bool is_semiplanar_uv_plane(const struct drm_framebuffer *fb, int color_plane)
588 return intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier) &&
592 bool is_surface_linear(const struct drm_framebuffer *fb, int color_plane)
594 return fb->modifier == DRM_FORMAT_MOD_LINEAR ||
595 intel_fb_is_gen12_ccs_aux_plane(fb, color_plane) ||
596 is_gen12_ccs_cc_plane(fb, color_plane);
599 int main_to_ccs_plane(const struct drm_framebuffer *fb, int main_plane)
601 drm_WARN_ON(fb->dev, !intel_fb_is_ccs_modifier(fb->modifier) ||
602 (main_plane && main_plane >= fb->format->num_planes / 2));
604 return fb->format->num_planes / 2 + main_plane;
607 int skl_ccs_to_main_plane(const struct drm_framebuffer *fb, int ccs_plane)
609 drm_WARN_ON(fb->dev, !intel_fb_is_ccs_modifier(fb->modifier) ||
610 ccs_plane < fb->format->num_planes / 2);
612 if (is_gen12_ccs_cc_plane(fb, ccs_plane))
615 return ccs_plane - fb->format->num_planes / 2;
618 static unsigned int gen12_ccs_aux_stride(struct intel_framebuffer *fb, int ccs_plane)
620 int main_plane = skl_ccs_to_main_plane(&fb->base, ccs_plane);
621 unsigned int main_stride = fb->base.pitches[main_plane];
622 unsigned int main_tile_width = intel_tile_width_bytes(&fb->base, main_plane);
627 int skl_main_to_aux_plane(const struct drm_framebuffer *fb, int main_plane)
629 const struct intel_modifier_desc *md = lookup_modifier(fb->modifier);
630 struct drm_i915_private *i915 = to_i915(fb->dev);
633 return main_to_ccs_plane(fb, main_plane);
635 format_is_yuv_semiplanar(md, fb->format))
647 intel_tile_width_bytes(const struct drm_framebuffer *fb, int color_plane)
649 struct drm_i915_private *dev_priv = to_i915(fb->dev);
650 unsigned int cpp = fb->format->cpp[color_plane];
652 switch (fb->modifier) {
670 if (intel_fb_is_ccs_aux_plane(fb, color_plane))
679 if (intel_fb_is_ccs_aux_plane(fb, color_plane) ||
680 is_gen12_ccs_cc_plane(fb, color_plane))
689 if (intel_fb_is_ccs_aux_plane(fb, color_plane))
708 MISSING_CASE(fb->modifier);
713 unsigned int intel_tile_height(const struct drm_framebuffer *fb, int color_plane)
715 return intel_tile_size(to_i915(fb->dev)) /
716 intel_tile_width_bytes(fb, color_plane);
723 static void intel_tile_dims(const struct drm_framebuffer *fb, int color_plane,
727 unsigned int tile_width_bytes = intel_tile_width_bytes(fb, color_plane);
728 unsigned int cpp = fb->format->cpp[color_plane];
731 *tile_height = intel_tile_height(fb, color_plane);
739 static void intel_tile_block_dims(const struct drm_framebuffer *fb, int color_plane,
743 intel_tile_dims(fb, color_plane, tile_width, tile_height);
745 if (intel_fb_is_gen12_ccs_aux_plane(fb, color_plane))
749 unsigned int intel_tile_row_size(const struct drm_framebuffer *fb, int color_plane)
753 intel_tile_dims(fb, color_plane, &tile_width, &tile_height);
755 return fb->pitches[color_plane] * tile_height;
759 intel_fb_align_height(const struct drm_framebuffer *fb,
762 unsigned int tile_height = intel_tile_height(fb, color_plane);
772 bool intel_fb_uses_dpt(const struct drm_framebuffer *fb)
774 return to_i915(fb->dev)->display.params.enable_dpt &&
775 intel_fb_modifier_uses_dpt(to_i915(fb->dev), fb->modifier);
803 unsigned int intel_surf_alignment(const struct drm_framebuffer *fb,
806 struct drm_i915_private *dev_priv = to_i915(fb->dev);
808 if (intel_fb_uses_dpt(fb))
812 if (intel_fb_is_ccs_aux_plane(fb, color_plane))
815 if (is_semiplanar_uv_plane(fb, color_plane)) {
821 if (fb->modifier == DRM_FORMAT_MOD_LINEAR)
824 return intel_tile_row_size(fb, color_plane);
832 switch (fb->modifier) {
857 MISSING_CASE(fb->modifier);
863 const struct drm_framebuffer *fb,
879 if (!intel_fb_is_gen12_ccs_aux_plane(fb, color_plane)) {
880 *hsub = fb->format->hsub;
881 *vsub = fb->format->vsub;
886 main_plane = skl_ccs_to_main_plane(fb, color_plane);
887 *hsub = drm_format_info_block_width(fb->format, color_plane) /
888 drm_format_info_block_width(fb->format, main_plane);
899 *hsub *= fb->format->hsub;
904 static void intel_fb_plane_dims(const struct intel_framebuffer *fb, int color_plane, int *w, int *h)
906 int main_plane = intel_fb_is_ccs_aux_plane(&fb->base, color_plane) ?
907 skl_ccs_to_main_plane(&fb->base, color_plane) : 0;
908 unsigned int main_width = fb->base.width;
909 unsigned int main_height = fb->base.height;
913 intel_fb_plane_get_subsampling(&main_hsub, &main_vsub, &fb->base, main_plane);
914 intel_fb_plane_get_subsampling(&hsub, &vsub, &fb->base, color_plane);
962 const struct drm_framebuffer *fb,
968 struct drm_i915_private *i915 = to_i915(fb->dev);
969 unsigned int cpp = fb->format->cpp[color_plane];
973 if (!is_surface_linear(fb, color_plane)) {
978 intel_tile_dims(fb, color_plane, &tile_width, &tile_height);
1007 return intel_adjust_aligned_offset(x, y, state->hw.fb, color_plane,
1029 const struct drm_framebuffer *fb,
1035 unsigned int cpp = fb->format->cpp[color_plane];
1038 if (!is_surface_linear(fb, color_plane)) {
1043 intel_tile_dims(fb, color_plane, &tile_width, &tile_height);
1088 const struct drm_framebuffer *fb = state->hw.fb;
1096 alignment = intel_surf_alignment(fb, color_plane);
1098 return intel_compute_aligned_offset(i915, x, y, fb, color_plane,
1102 /* Convert the fb->offset[] into x/y offsets */
1104 const struct drm_framebuffer *fb,
1107 struct drm_i915_private *i915 = to_i915(fb->dev);
1112 !intel_fb_needs_pot_stride_remap(to_intel_framebuffer(fb)) &&
1113 is_semiplanar_uv_plane(fb, color_plane))
1114 alignment = intel_tile_row_size(fb, color_plane);
1115 else if (fb->modifier != DRM_FORMAT_MOD_LINEAR)
1120 if (alignment != 0 && fb->offsets[color_plane] % alignment) {
1123 fb->offsets[color_plane], color_plane);
1127 height = drm_format_info_plane_height(fb->format, fb->height, color_plane);
1128 height = ALIGN(height, intel_tile_height(fb, color_plane));
1131 if (add_overflows_t(u32, mul_u32_u32(height, fb->pitches[color_plane]),
1132 fb->offsets[color_plane])) {
1135 fb->offsets[color_plane], fb->pitches[color_plane],
1144 fb, color_plane, DRM_MODE_ROTATE_0,
1145 fb->pitches[color_plane],
1146 fb->offsets[color_plane], 0);
1151 static int intel_fb_check_ccs_xy(const struct drm_framebuffer *fb, int ccs_plane, int x, int y)
1153 struct drm_i915_private *i915 = to_i915(fb->dev);
1154 const struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1161 if (!intel_fb_is_ccs_aux_plane(fb, ccs_plane))
1169 intel_tile_block_dims(fb, ccs_plane, &tile_width, &tile_height);
1170 intel_fb_plane_get_subsampling(&hsub, &vsub, fb, ccs_plane);
1178 main_plane = skl_ccs_to_main_plane(fb, ccs_plane);
1204 const struct drm_framebuffer *fb = plane_state->hw.fb;
1224 if (intel_fb_is_ccs_modifier(fb->modifier))
1228 if (fb->modifier == DRM_FORMAT_MOD_LINEAR) {
1231 for (i = 0; i < fb->format->num_planes; i++) {
1232 if (fb->pitches[i] & alignment)
1240 bool intel_fb_needs_pot_stride_remap(const struct intel_framebuffer *fb)
1242 struct drm_i915_private *i915 = to_i915(fb->base.dev);
1245 intel_fb_uses_dpt(&fb->base);
1248 static int intel_fb_pitch(const struct intel_framebuffer *fb, int color_plane, unsigned int rotation)
1251 return fb->rotated_view.color_plane[color_plane].mapping_stride;
1252 else if (intel_fb_needs_pot_stride_remap(fb))
1253 return fb->remapped_view.color_plane[color_plane].mapping_stride;
1255 return fb->normal_view.color_plane[color_plane].mapping_stride;
1261 const struct intel_framebuffer *fb = to_intel_framebuffer(plane_state->hw.fb);
1279 stride = intel_fb_pitch(fb, 0, rotation);
1280 max_stride = plane->max_stride(plane, fb->base.format->format,
1281 fb->base.modifier, rotation);
1286 static int convert_plane_offset_to_xy(const struct intel_framebuffer *fb, int color_plane,
1289 struct drm_i915_gem_object *obj = intel_fb_obj(&fb->base);
1292 ret = intel_fb_offset_to_xy(x, y, &fb->base, color_plane);
1294 drm_dbg_kms(fb->base.dev,
1295 "bad fb plane %d offset: 0x%x\n",
1296 color_plane, fb->base.offsets[color_plane]);
1300 ret = intel_fb_check_ccs_xy(&fb->base, color_plane, *x, *y);
1310 * fb layout agrees with the fence layout. We already check that the
1311 * fb stride matches the fence stride elsewhere.
1314 (*x + plane_width) * fb->base.format->cpp[color_plane] > fb->base.pitches[color_plane]) {
1315 drm_dbg_kms(fb->base.dev,
1316 "bad fb plane %d offset: 0x%x\n",
1317 color_plane, fb->base.offsets[color_plane]);
1324 static u32 calc_plane_aligned_offset(const struct intel_framebuffer *fb, int color_plane, int *x, int *y)
1326 struct drm_i915_private *i915 = to_i915(fb->base.dev);
1330 offset = intel_compute_aligned_offset(i915, x, y, &fb->base, color_plane,
1331 fb->base.pitches[color_plane],
1343 static void init_plane_view_dims(const struct intel_framebuffer *fb, int color_plane,
1350 intel_tile_dims(&fb->base, color_plane, &dims->tile_width, &dims->tile_height);
1354 plane_view_src_stride_tiles(const struct intel_framebuffer *fb, int color_plane,
1357 return DIV_ROUND_UP(fb->base.pitches[color_plane],
1358 dims->tile_width * fb->base.format->cpp[color_plane]);
1362 plane_view_dst_stride_tiles(const struct intel_framebuffer *fb, int color_plane,
1365 if (intel_fb_needs_pot_stride_remap(fb)) {
1377 plane_view_scanout_stride(const struct intel_framebuffer *fb, int color_plane,
1381 struct drm_i915_private *i915 = to_i915(fb->base.dev);
1390 return stride_tiles * tile_width * fb->base.format->cpp[color_plane];
1394 plane_view_width_tiles(const struct intel_framebuffer *fb, int color_plane,
1402 plane_view_height_tiles(const struct intel_framebuffer *fb, int color_plane,
1410 plane_view_linear_tiles(const struct intel_framebuffer *fb, int color_plane,
1414 struct drm_i915_private *i915 = to_i915(fb->base.dev);
1417 size = (y + dims->height) * fb->base.pitches[color_plane] +
1418 x * fb->base.format->cpp[color_plane];
1434 static u32 calc_plane_remap_info(const struct intel_framebuffer *fb, int color_plane,
1439 struct drm_i915_private *i915 = to_i915(fb->base.dev);
1450 if (intel_fb_is_gen12_ccs_aux_plane(&fb->base, color_plane)) {
1454 plane_view_linear_tiles(fb, color_plane, dims, x, y));
1459 plane_view_src_stride_tiles(fb, color_plane, dims));
1461 plane_view_width_tiles(fb, color_plane, dims, x));
1463 plane_view_height_tiles(fb, color_plane, dims, y));
1471 plane_view_dst_stride_tiles(fb, color_plane, remap_info->height));
1507 color_plane_info->mapping_stride = fb->base.pitches[color_plane];
1519 if (intel_fb_needs_pot_stride_remap(fb) &&
1520 intel_fb_is_ccs_modifier(fb->base.modifier))
1525 dst_stride = plane_view_dst_stride_tiles(fb, color_plane, dst_stride);
1530 fb->base.format->cpp[color_plane];
1532 plane_view_scanout_stride(fb, color_plane, tile_width,
1547 fb->base.format->cpp[color_plane],
1563 calc_plane_normal_size(const struct intel_framebuffer *fb, int color_plane,
1569 if (is_surface_linear(&fb->base, color_plane)) {
1570 tiles = plane_view_linear_tiles(fb, color_plane, dims, x, y);
1572 tiles = plane_view_src_stride_tiles(fb, color_plane, dims) *
1573 plane_view_height_tiles(fb, color_plane, dims, y);
1596 bool intel_fb_supports_90_270_rotation(const struct intel_framebuffer *fb)
1598 if (DISPLAY_VER(to_i915(fb->base.dev)) >= 13)
1601 return fb->base.modifier == I915_FORMAT_MOD_Y_TILED ||
1602 fb->base.modifier == I915_FORMAT_MOD_Yf_TILED;
1605 int intel_fill_fb_info(struct drm_i915_private *i915, struct intel_framebuffer *fb)
1607 struct drm_i915_gem_object *obj = intel_fb_obj(&fb->base);
1611 int i, num_planes = fb->base.format->num_planes;
1614 intel_fb_view_init(i915, &fb->normal_view, I915_GTT_VIEW_NORMAL);
1617 intel_fb_supports_90_270_rotation(fb) &&
1618 intel_fb_needs_pot_stride_remap(fb));
1620 if (intel_fb_supports_90_270_rotation(fb))
1621 intel_fb_view_init(i915, &fb->rotated_view, I915_GTT_VIEW_ROTATED);
1622 if (intel_fb_needs_pot_stride_remap(fb))
1623 intel_fb_view_init(i915, &fb->remapped_view, I915_GTT_VIEW_REMAPPED);
1634 * Plane 2 of Render Compression with Clear Color fb modifier
1638 if (is_gen12_ccs_cc_plane(&fb->base, i)) {
1639 if (IS_ALIGNED(fb->base.offsets[i], PAGE_SIZE))
1645 intel_fb_plane_dims(fb, i, &width, &height);
1647 ret = convert_plane_offset_to_xy(fb, i, width, &x, &y);
1651 init_plane_view_dims(fb, i, width, height, &view_dims);
1657 fb->normal_view.color_plane[i].x = x;
1658 fb->normal_view.color_plane[i].y = y;
1659 fb->normal_view.color_plane[i].mapping_stride = fb->base.pitches[i];
1660 fb->normal_view.color_plane[i].scanout_stride =
1661 fb->normal_view.color_plane[i].mapping_stride;
1663 offset = calc_plane_aligned_offset(fb, i, &x, &y);
1665 if (intel_fb_supports_90_270_rotation(fb))
1666 gtt_offset_rotated += calc_plane_remap_info(fb, i, &view_dims,
1668 &fb->rotated_view);
1670 if (intel_fb_needs_pot_stride_remap(fb))
1671 gtt_offset_remapped += calc_plane_remap_info(fb, i, &view_dims,
1673 &fb->remapped_view);
1675 size = calc_plane_normal_size(fb, i, &view_dims, x, y);
1682 "fb too big for bo (need %llu bytes, have %zu bytes)\n",
1694 struct drm_framebuffer *fb = plane_state->hw.fb;
1695 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1697 int i, num_planes = fb->format->num_planes;
1711 drm_WARN_ON(&i915->drm, intel_fb_is_ccs_modifier(fb->modifier));
1724 unsigned int hsub = i ? fb->format->hsub : 1;
1725 unsigned int vsub = i ? fb->format->vsub : 1;
1753 void intel_fb_fill_view(const struct intel_framebuffer *fb, unsigned int rotation,
1757 *view = fb->rotated_view;
1758 else if (intel_fb_needs_pot_stride_remap(fb))
1759 *view = fb->remapped_view;
1761 *view = fb->normal_view;
1784 intel_fb_stride_alignment(const struct drm_framebuffer *fb, int color_plane)
1786 struct drm_i915_private *dev_priv = to_i915(fb->dev);
1789 if (is_surface_linear(fb, color_plane)) {
1791 fb->format->format,
1792 fb->modifier);
1798 if (fb->pitches[color_plane] > max_stride &&
1799 !intel_fb_is_ccs_modifier(fb->modifier))
1805 tile_width = intel_tile_width_bytes(fb, color_plane);
1806 if (intel_fb_is_ccs_modifier(fb->modifier)) {
1819 * require the entire fb to accommodate that to avoid
1823 color_plane == 0 && fb->width > 3840)
1832 const struct drm_framebuffer *fb = plane_state->hw.fb;
1848 max_stride = plane->max_stride(plane, fb->format->format,
1849 fb->modifier, rotation);
1854 fb->base.id, stride,
1864 const struct intel_framebuffer *fb =
1865 to_intel_framebuffer(plane_state->hw.fb);
1868 if (!fb)
1883 intel_fb_fill_view(fb, rotation, &plane_state->view);
1888 fb->base.width << 16, fb->base.height << 16,
1894 static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
1896 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1898 drm_framebuffer_cleanup(fb);
1900 if (intel_fb_uses_dpt(fb))
1905 intel_fb_bo_framebuffer_fini(intel_fb_obj(fb));
1910 static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
1914 struct drm_i915_gem_object *obj = intel_fb_obj(fb);
1941 static int intel_user_framebuffer_dirty(struct drm_framebuffer *fb,
1947 struct drm_i915_gem_object *obj = intel_fb_obj(fb);
1948 struct intel_frontbuffer *front = to_intel_frontbuffer(fb);
2002 struct drm_framebuffer *fb = &intel_fb->base;
2046 drm_helper_mode_fill_fb_struct(&dev_priv->drm, fb, mode_cmd);
2048 for (i = 0; i < fb->format->num_planes; i++) {
2057 stride_alignment = intel_fb_stride_alignment(fb, i);
2058 if (fb->pitches[i] & (stride_alignment - 1)) {
2061 i, fb->pitches[i], stride_alignment);
2065 if (intel_fb_is_gen12_ccs_aux_plane(fb, i)) {
2068 if (fb->pitches[i] != ccs_aux_stride) {
2072 fb->pitches[i], ccs_aux_stride);
2077 fb->obj[i] = intel_bo_to_drm_bo(obj);
2084 if (intel_fb_uses_dpt(fb)) {
2097 ret = drm_framebuffer_init(&dev_priv->drm, fb, &intel_fb_funcs);
2106 if (intel_fb_uses_dpt(fb))
2120 struct drm_framebuffer *fb;
2129 fb = intel_framebuffer_create(obj, &mode_cmd);
2132 return fb;