staticint skl_plane_max_width(conststruct drm_framebuffer *fb, int color_plane, unsignedint rotation)
{ int cpp = fb->format->cpp[color_plane];
switch (fb->modifier) { case DRM_FORMAT_MOD_LINEAR: case I915_FORMAT_MOD_X_TILED: /* *Validatedlimitis4k,buthas5kshould *workapartfromthefollowingfeatures: *-Ytile(alreadylimitedto4k) *-FP16(alreadylimitedto4k) *-rendercompression(alreadylimitedto4k) *-KVMRspriteandcursor(don'tcare) *-horizontalpanning(TODOverifythis) *-pipeandplanescaling(TODOverifythis)
*/ if (cpp == 8) return4096; else return5120; case I915_FORMAT_MOD_Y_TILED_CCS: case I915_FORMAT_MOD_Yf_TILED_CCS: /* FIXME AUX plane? */ case I915_FORMAT_MOD_Y_TILED: case I915_FORMAT_MOD_Yf_TILED: if (cpp == 8) return2048; else return4096; default:
MISSING_CASE(fb->modifier); return2048;
}
}
staticint glk_plane_max_width(conststruct drm_framebuffer *fb, int color_plane, unsignedint rotation)
{ int cpp = fb->format->cpp[color_plane];
switch (fb->modifier) { case DRM_FORMAT_MOD_LINEAR: case I915_FORMAT_MOD_X_TILED: if (cpp == 8) return4096; else return5120; case I915_FORMAT_MOD_Y_TILED_CCS: case I915_FORMAT_MOD_Yf_TILED_CCS: /* FIXME AUX plane? */ case I915_FORMAT_MOD_Y_TILED: case I915_FORMAT_MOD_Yf_TILED: if (cpp == 8) return2048; else return5120; default:
MISSING_CASE(fb->modifier); return2048;
}
}
staticint icl_plane_min_width(conststruct drm_framebuffer *fb, int color_plane, unsignedint rotation)
{ /* Wa_14011264657, Wa_14011050563: gen11+ */ switch (fb->format->format) { case DRM_FORMAT_C8: return18; case DRM_FORMAT_RGB565: return10; case DRM_FORMAT_XRGB8888: case DRM_FORMAT_XBGR8888: case DRM_FORMAT_ARGB8888: case DRM_FORMAT_ABGR8888: case DRM_FORMAT_XRGB2101010: case DRM_FORMAT_XBGR2101010: case DRM_FORMAT_ARGB2101010: case DRM_FORMAT_ABGR2101010: case DRM_FORMAT_XVYU2101010: case DRM_FORMAT_Y212: case DRM_FORMAT_Y216: return6; case DRM_FORMAT_NV12: return20; case DRM_FORMAT_P010: case DRM_FORMAT_P012: case DRM_FORMAT_P016: return12; case DRM_FORMAT_XRGB16161616F: case DRM_FORMAT_XBGR16161616F: case DRM_FORMAT_ARGB16161616F: case DRM_FORMAT_ABGR16161616F: case DRM_FORMAT_XVYU12_16161616: case DRM_FORMAT_XVYU16161616: return4; default: return1;
}
}
staticint xe3_plane_max_width(conststruct drm_framebuffer *fb, int color_plane, unsignedint rotation)
{ if (intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier)) return4096; else return6144;
}
staticint icl_hdr_plane_max_width(conststruct drm_framebuffer *fb, int color_plane, unsignedint rotation)
{ if (intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier)) return4096; else return5120;
}
staticbool tgl_plane_can_async_flip(u64 modifier)
{ switch (modifier) { case DRM_FORMAT_MOD_LINEAR: case I915_FORMAT_MOD_X_TILED: case I915_FORMAT_MOD_Y_TILED: case I915_FORMAT_MOD_4_TILED: case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS: case I915_FORMAT_MOD_4_TILED_MTL_RC_CCS: case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS: case I915_FORMAT_MOD_4_TILED_BMG_CCS: case I915_FORMAT_MOD_4_TILED_LNL_CCS: returntrue; case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS: case I915_FORMAT_MOD_4_TILED_MTL_MC_CCS: case I915_FORMAT_MOD_4_TILED_DG2_MC_CCS: case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC: case I915_FORMAT_MOD_4_TILED_MTL_RC_CCS_CC: case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC: returnfalse; default: returnfalse;
}
}
staticbool icl_plane_can_async_flip(u64 modifier)
{ switch (modifier) { case DRM_FORMAT_MOD_LINEAR: /* *FIXME:AsynconLinearbufferissupportedonICL *butwithadditionalalignmentandfbcrestrictions *needtobetakencareof.
*/ returnfalse; case I915_FORMAT_MOD_X_TILED: case I915_FORMAT_MOD_Y_TILED: case I915_FORMAT_MOD_Yf_TILED: case I915_FORMAT_MOD_Y_TILED_CCS: case I915_FORMAT_MOD_Yf_TILED_CCS: returntrue; default: returnfalse;
}
}
staticbool skl_plane_can_async_flip(u64 modifier)
{ switch (modifier) { case DRM_FORMAT_MOD_LINEAR: returnfalse; case I915_FORMAT_MOD_X_TILED: case I915_FORMAT_MOD_Y_TILED: case I915_FORMAT_MOD_Yf_TILED: returntrue; case I915_FORMAT_MOD_Y_TILED_CCS: case I915_FORMAT_MOD_Yf_TILED_CCS: /* *DisplayWA#0731:skl *WaDisableRCWithAsyncFlip:skl *"Whenrenderdecompressionisenabled,hardware *internallyconvertstheAsyncflipstoSyncflips." * *DisplayWA#1159:glk *"Asyncflipwithrendercompressionmayresultin *intermittentunderruncorruption."
*/ returnfalse; default: returnfalse;
}
}
/* AUX_DIST needs only 4K alignment */ if (intel_fb_is_ccs_aux_plane(fb, color_plane)) return mult * 4 * 1024;
/* *FIXMEADLseesGGTT/DMARfaultswithasync *flipsunlesswealignto16katleast. *Figureoutwhat'sgoingonhere...
*/ if (display->platform.alderlake_p &&
intel_plane_can_async_flip(plane, fb->format->format, fb->modifier)) return mult * 16 * 1024;
switch (fb->modifier) { case DRM_FORMAT_MOD_LINEAR: case I915_FORMAT_MOD_X_TILED: case I915_FORMAT_MOD_Y_TILED: case I915_FORMAT_MOD_4_TILED: return mult * 4 * 1024; case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS: case I915_FORMAT_MOD_4_TILED_MTL_RC_CCS: case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS: case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS: case I915_FORMAT_MOD_4_TILED_MTL_MC_CCS: case I915_FORMAT_MOD_4_TILED_DG2_MC_CCS: case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC: case I915_FORMAT_MOD_4_TILED_MTL_RC_CCS_CC: case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC: case I915_FORMAT_MOD_4_TILED_BMG_CCS: case I915_FORMAT_MOD_4_TILED_LNL_CCS: /* *Aligntoatleast4x1mainsurface *tiles(16K)tomatch64BofAUX.
*/ return max(mult * 4 * 1024, 16 * 1024); default:
MISSING_CASE(fb->modifier); return0;
}
}
if (*min_ddb)
val |= PLANE_MIN_DBUF_BLOCKS(*min_ddb);
if (*interim_ddb)
val |= PLANE_INTERIM_DBUF_BLOCKS(*interim_ddb);
val |= val ? PLANE_AUTO_MIN_DBUF_EN : 0;
return val;
}
static u32 skl_plane_wm_reg_val(conststruct skl_wm_level *level)
{
u32 val = 0;
if (level->enable)
val |= PLANE_WM_EN; if (level->ignore_lines)
val |= PLANE_WM_IGNORE_LINES; if (level->auto_min_alloc_wm_enable)
val |= PLANE_WM_AUTO_MIN_ALLOC_EN;
val |= REG_FIELD_PREP(PLANE_WM_BLOCKS_MASK, level->blocks);
val |= REG_FIELD_PREP(PLANE_WM_LINES_MASK, level->lines);
static u32 skl_plane_ctl_format(u32 pixel_format)
{ switch (pixel_format) { case DRM_FORMAT_C8: return PLANE_CTL_FORMAT_INDEXED; case DRM_FORMAT_RGB565: return PLANE_CTL_FORMAT_RGB_565; case DRM_FORMAT_XBGR8888: case DRM_FORMAT_ABGR8888: return PLANE_CTL_FORMAT_XRGB_8888 | PLANE_CTL_ORDER_RGBX; case DRM_FORMAT_XRGB8888: case DRM_FORMAT_ARGB8888: return PLANE_CTL_FORMAT_XRGB_8888; case DRM_FORMAT_XBGR2101010: case DRM_FORMAT_ABGR2101010: return PLANE_CTL_FORMAT_XRGB_2101010 | PLANE_CTL_ORDER_RGBX; case DRM_FORMAT_XRGB2101010: case DRM_FORMAT_ARGB2101010: return PLANE_CTL_FORMAT_XRGB_2101010; case DRM_FORMAT_XBGR16161616F: case DRM_FORMAT_ABGR16161616F: return PLANE_CTL_FORMAT_XRGB_16161616F | PLANE_CTL_ORDER_RGBX; case DRM_FORMAT_XRGB16161616F: case DRM_FORMAT_ARGB16161616F: return PLANE_CTL_FORMAT_XRGB_16161616F; case DRM_FORMAT_XYUV8888: return PLANE_CTL_FORMAT_XYUV; case DRM_FORMAT_YUYV: return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_ORDER_YUYV; case DRM_FORMAT_YVYU: return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_ORDER_YVYU; case DRM_FORMAT_UYVY: return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_ORDER_UYVY; case DRM_FORMAT_VYUY: return PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_ORDER_VYUY; case DRM_FORMAT_NV12: return PLANE_CTL_FORMAT_NV12; case DRM_FORMAT_P010: return PLANE_CTL_FORMAT_P010; case DRM_FORMAT_P012: return PLANE_CTL_FORMAT_P012; case DRM_FORMAT_P016: return PLANE_CTL_FORMAT_P016; case DRM_FORMAT_Y210: return PLANE_CTL_FORMAT_Y210; case DRM_FORMAT_Y212: return PLANE_CTL_FORMAT_Y212; case DRM_FORMAT_Y216: return PLANE_CTL_FORMAT_Y216; case DRM_FORMAT_XVYU2101010: return PLANE_CTL_FORMAT_Y410; case DRM_FORMAT_XVYU12_16161616: return PLANE_CTL_FORMAT_Y412; case DRM_FORMAT_XVYU16161616: return PLANE_CTL_FORMAT_Y416; default:
MISSING_CASE(pixel_format);
}
return0;
}
static u32 skl_plane_ctl_alpha(conststruct intel_plane_state *plane_state)
{ if (!plane_state->hw.fb->format->has_alpha) return PLANE_CTL_ALPHA_DISABLE;
switch (plane_state->hw.pixel_blend_mode) { case DRM_MODE_BLEND_PIXEL_NONE: return PLANE_CTL_ALPHA_DISABLE; case DRM_MODE_BLEND_PREMULTI: return PLANE_CTL_ALPHA_SW_PREMULTIPLY; case DRM_MODE_BLEND_COVERAGE: return PLANE_CTL_ALPHA_HW_PREMULTIPLY; default:
MISSING_CASE(plane_state->hw.pixel_blend_mode); return PLANE_CTL_ALPHA_DISABLE;
}
}
static u32 glk_plane_color_ctl_alpha(conststruct intel_plane_state *plane_state)
{ if (!plane_state->hw.fb->format->has_alpha) return PLANE_COLOR_ALPHA_DISABLE;
switch (plane_state->hw.pixel_blend_mode) { case DRM_MODE_BLEND_PIXEL_NONE: return PLANE_COLOR_ALPHA_DISABLE; case DRM_MODE_BLEND_PREMULTI: return PLANE_COLOR_ALPHA_SW_PREMULTIPLY; case DRM_MODE_BLEND_COVERAGE: return PLANE_COLOR_ALPHA_HW_PREMULTIPLY; default:
MISSING_CASE(plane_state->hw.pixel_blend_mode); return PLANE_COLOR_ALPHA_DISABLE;
}
}
static u32 skl_plane_ctl_tiling(u64 fb_modifier)
{ switch (fb_modifier) { case DRM_FORMAT_MOD_LINEAR: break; case I915_FORMAT_MOD_X_TILED: return PLANE_CTL_TILED_X; case I915_FORMAT_MOD_Y_TILED: return PLANE_CTL_TILED_Y; case I915_FORMAT_MOD_4_TILED: return PLANE_CTL_TILED_4; case I915_FORMAT_MOD_4_TILED_DG2_RC_CCS: return PLANE_CTL_TILED_4 |
PLANE_CTL_RENDER_DECOMPRESSION_ENABLE |
PLANE_CTL_CLEAR_COLOR_DISABLE; case I915_FORMAT_MOD_4_TILED_DG2_MC_CCS: 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_4_TILED_MTL_RC_CCS: return PLANE_CTL_TILED_4 |
PLANE_CTL_RENDER_DECOMPRESSION_ENABLE |
PLANE_CTL_CLEAR_COLOR_DISABLE; case I915_FORMAT_MOD_4_TILED_MTL_RC_CCS_CC: return PLANE_CTL_TILED_4 | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE; case I915_FORMAT_MOD_4_TILED_MTL_MC_CCS: return PLANE_CTL_TILED_4 | PLANE_CTL_MEDIA_DECOMPRESSION_ENABLE; case I915_FORMAT_MOD_4_TILED_BMG_CCS: case I915_FORMAT_MOD_4_TILED_LNL_CCS: 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; case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS: return PLANE_CTL_TILED_Y |
PLANE_CTL_RENDER_DECOMPRESSION_ENABLE |
PLANE_CTL_CLEAR_COLOR_DISABLE; case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS: return PLANE_CTL_TILED_Y | PLANE_CTL_MEDIA_DECOMPRESSION_ENABLE; case I915_FORMAT_MOD_Yf_TILED: return PLANE_CTL_TILED_YF; case I915_FORMAT_MOD_Yf_TILED_CCS: return PLANE_CTL_TILED_YF | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE; default:
MISSING_CASE(fb_modifier);
}
return0;
}
static u32 skl_plane_ctl_rotate(unsignedint rotate)
{ switch (rotate) { case DRM_MODE_ROTATE_0: break; /* *DRM_MODE_ROTATE_iscounterclockwisetostaycompatiblewithXrandr *whilei915HWrotationisclockwise,that'swhythisswapping.
*/ case DRM_MODE_ROTATE_90: return PLANE_CTL_ROTATE_270; case DRM_MODE_ROTATE_180: return PLANE_CTL_ROTATE_180; case DRM_MODE_ROTATE_270: return PLANE_CTL_ROTATE_90; default:
MISSING_CASE(rotate);
}
return0;
}
static u32 icl_plane_ctl_flip(unsignedint reflect)
{ switch (reflect) { case0: break; case DRM_MODE_REFLECT_X: return PLANE_CTL_FLIP_HORIZONTAL; case DRM_MODE_REFLECT_Y: default:
MISSING_CASE(reflect);
}
if (crtc_state->enable_psr2_su_region_et)
y = max(0, plane_state->uapi.dst.y1 - crtc_state->psr2_su_area.y1); else
y = (clip->y1 + plane_state->uapi.dst.y1);
val = y << 16;
val |= plane_state->uapi.dst.x1;
intel_de_write_dsb(display, dsb, SEL_FETCH_PLANE_POS(pipe, plane->id), val);
x = plane_state->view.color_plane[color_plane].x;
/* *FromBspec:UVsurfaceStartYPosition=halfofYplaneY *startposition.
*/ if (!color_plane)
y = plane_state->view.color_plane[color_plane].y + clip->y1; else
y = plane_state->view.color_plane[color_plane].y + clip->y1 / 2;
if (rotation & ~(DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180) &&
intel_fb_is_ccs_modifier(fb->modifier)) {
drm_dbg_kms(display->drm, "[PLANE:%d:%s] RC support only with 0/180 degree rotation (%x)\n",
plane->base.base.id, plane->base.name, rotation); return -EINVAL;
}
if (rotation & DRM_MODE_REFLECT_X &&
fb->modifier == DRM_FORMAT_MOD_LINEAR) {
drm_dbg_kms(display->drm, "[PLANE:%d:%s] horizontal flip is not supported with linear surface formats\n",
plane->base.base.id, plane->base.name); return -EINVAL;
}
/* *Display20onwardtile4hflipisnotsupported
*/ if (rotation & DRM_MODE_REFLECT_X &&
intel_fb_is_tile4_modifier(fb->modifier) &&
DISPLAY_VER(display) >= 20) {
drm_dbg_kms(display->drm, "[PLANE:%d:%s] horizontal flip is not supported with tile4 surface formats\n",
plane->base.base.id, plane->base.name); return -EINVAL;
}
if (drm_rotation_90_or_270(rotation)) { if (!intel_fb_supports_90_270_rotation(to_intel_framebuffer(fb))) {
drm_dbg_kms(display->drm, "[PLANE:%d:%s] Y/Yf tiling required for 90/270!\n",
plane->base.base.id, plane->base.name); return -EINVAL;
}
/* *90/270isnotallowedwithRGB6416:16:16:16and *Indexed8-bit.RGB16-bit5:6:5isallowedgen11onwards.
*/ switch (fb->format->format) { case DRM_FORMAT_RGB565: if (DISPLAY_VER(display) >= 11) break;
fallthrough; case DRM_FORMAT_C8: case DRM_FORMAT_XRGB16161616F: case DRM_FORMAT_XBGR16161616F: case DRM_FORMAT_ARGB16161616F: case DRM_FORMAT_ABGR16161616F: case DRM_FORMAT_Y210: case DRM_FORMAT_Y212: case DRM_FORMAT_Y216: case DRM_FORMAT_XVYU12_16161616: case DRM_FORMAT_XVYU16161616:
drm_dbg_kms(display->drm, "[PLANE:%d:%s] unsupported pixel format %p4cc for 90/270!\n",
plane->base.base.id, plane->base.name, &fb->format->format); return -EINVAL; default: break;
}
}
/* Y-tiling is not supported in IF-ID Interlace mode */ if (crtc_state->hw.enable &&
crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE &&
fb->modifier != DRM_FORMAT_MOD_LINEAR &&
fb->modifier != I915_FORMAT_MOD_X_TILED) {
drm_dbg_kms(display->drm, "[PLANE:%d:%s] Y/Yf tiling not supported in IF-ID mode\n",
plane->base.base.id, plane->base.name); return -EINVAL;
}
/* Wa_1606054188:tgl,adl-s */ if ((display->platform.alderlake_s || display->platform.tigerlake) &&
plane_state->ckey.flags & I915_SET_COLORKEY_SOURCE &&
intel_format_is_p01x(fb->format->format)) {
drm_dbg_kms(display->drm, "[PLANE:%d:%s] source color keying not supported with P01x formats\n",
plane->base.base.id, plane->base.name); return -EINVAL;
}
return0;
}
staticint skl_plane_check_dst_coordinates(conststruct intel_crtc_state *crtc_state, conststruct intel_plane_state *plane_state)
{ struct intel_display *display = to_intel_display(plane_state); struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); int crtc_x = plane_state->uapi.dst.x1; int crtc_w = drm_rect_width(&plane_state->uapi.dst); int pipe_src_w = drm_rect_width(&crtc_state->pipe_src);
/* *Putthefinalcoordinatesbacksothatthesrc *coordinatecheckswillseetherightvalues.
*/
drm_rect_translate_to(&plane_state->uapi.src,
x << 16, y << 16);
return0;
}
staticint skl_check_nv12_aux_surface(struct intel_plane_state *plane_state)
{ struct intel_display *display = to_intel_display(plane_state); struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); conststruct drm_framebuffer *fb = plane_state->hw.fb; unsignedint 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; int y = plane_state->uapi.src.y1 >> 17; int w = drm_rect_width(&plane_state->uapi.src) >> 17; int h = drm_rect_height(&plane_state->uapi.src) >> 17;
u32 offset;
/* FIXME not quite sure how/if these apply to the chroma plane */ if (w > max_width || h > max_height) {
drm_dbg_kms(display->drm, "[PLANE:%d:%s] CbCr source size %dx%d too big (limit %dx%d)\n",
plane->base.base.id, plane->base.name,
w, h, max_width, max_height); return -EINVAL;
}
ret = intel_plane_compute_gtt(plane_state); if (ret) return ret;
if (!plane_state->uapi.visible) return0;
/* *HandletheAUXsurfacefirstsincethemainsurfacesetupdependson *it.
*/ if (intel_fb_is_ccs_modifier(fb->modifier)) {
ret = skl_check_ccs_aux_surface(plane_state); if (ret) return ret;
}
if (intel_format_info_is_yuv_semiplanar(fb->format,
fb->modifier)) {
ret = skl_check_nv12_aux_surface(plane_state); if (ret) return ret;
}
ret = skl_check_main_surface(plane_state); if (ret) return ret;
switch (fb->format->format) { case DRM_FORMAT_C8: returnfalse; case DRM_FORMAT_XRGB16161616F: case DRM_FORMAT_ARGB16161616F: case DRM_FORMAT_XBGR16161616F: case DRM_FORMAT_ABGR16161616F: return DISPLAY_VER(display) >= 11; default: returntrue;
}
}
ret = skl_plane_check_fb(crtc_state, plane_state); if (ret) return ret;
/* use scaler when colorkey is not required */ if (!plane_state->ckey.flags && skl_fb_scalable(fb)) {
min_scale = 1;
max_scale = skl_plane_max_scale(display, fb);
}
ret = intel_plane_check_clipping(plane_state, crtc_state,
min_scale, max_scale, true); if (ret) return ret;
make_damage_viewport_relative(plane_state);
ret = skl_check_plane_surface(plane_state); if (ret) return ret;
if (!plane_state->uapi.visible) return0;
ret = skl_plane_check_dst_coordinates(crtc_state, plane_state); if (ret) return ret;
ret = intel_plane_check_src_coordinates(plane_state); if (ret) return ret;
clip_damage(plane_state);
ret = skl_plane_check_nv12_rotation(plane_state); if (ret) return ret;
check_protection(plane_state);
/* HW only has 8 bits pixel precision, disable plane if invisible */ if (!(plane_state->hw.alpha >> 8)) {
plane_state->uapi.visible = false;
plane_state->damage = DRM_RECT_INIT(0, 0, 0, 0);
}
if (!intel_fb_plane_supports_modifier(plane, modifier)) returnfalse;
switch (format) { case DRM_FORMAT_XRGB8888: case DRM_FORMAT_XBGR8888: case DRM_FORMAT_ARGB8888: case DRM_FORMAT_ABGR8888: if (intel_fb_is_ccs_modifier(modifier)) returntrue;
fallthrough; case DRM_FORMAT_RGB565: case DRM_FORMAT_XRGB2101010: case DRM_FORMAT_XBGR2101010: case DRM_FORMAT_ARGB2101010: case DRM_FORMAT_ABGR2101010: case DRM_FORMAT_YUYV: case DRM_FORMAT_YVYU: case DRM_FORMAT_UYVY: case DRM_FORMAT_VYUY: case DRM_FORMAT_NV12: case DRM_FORMAT_XYUV8888: case DRM_FORMAT_P010: case DRM_FORMAT_P012: case DRM_FORMAT_P016: case DRM_FORMAT_XVYU2101010: if (modifier == I915_FORMAT_MOD_Yf_TILED) returntrue;
fallthrough; case DRM_FORMAT_C8: case DRM_FORMAT_XBGR16161616F: case DRM_FORMAT_ABGR16161616F: case DRM_FORMAT_XRGB16161616F: case DRM_FORMAT_ARGB16161616F: case DRM_FORMAT_Y210: case DRM_FORMAT_Y212: case DRM_FORMAT_Y216: case DRM_FORMAT_XVYU12_16161616: case DRM_FORMAT_XVYU16161616: if (modifier == DRM_FORMAT_MOD_LINEAR ||
modifier == I915_FORMAT_MOD_X_TILED ||
modifier == I915_FORMAT_MOD_Y_TILED) returntrue;
fallthrough; default: returnfalse;
}
}
if (!intel_fb_plane_supports_modifier(plane, modifier)) returnfalse;
switch (format) { case DRM_FORMAT_XRGB8888: case DRM_FORMAT_XBGR8888: case DRM_FORMAT_ARGB8888: case DRM_FORMAT_ABGR8888: case DRM_FORMAT_XRGB2101010: case DRM_FORMAT_XBGR2101010: case DRM_FORMAT_ARGB2101010: case DRM_FORMAT_ABGR2101010: if (intel_fb_is_ccs_modifier(modifier)) returntrue;
fallthrough; case DRM_FORMAT_RGB565: case DRM_FORMAT_YUYV: case DRM_FORMAT_YVYU: case DRM_FORMAT_UYVY: case DRM_FORMAT_VYUY: case DRM_FORMAT_NV12: case DRM_FORMAT_XYUV8888: case DRM_FORMAT_P010: case DRM_FORMAT_P012: case DRM_FORMAT_P016: case DRM_FORMAT_XVYU2101010: if (modifier == I915_FORMAT_MOD_Yf_TILED) returntrue;
fallthrough; case DRM_FORMAT_C8: case DRM_FORMAT_XBGR16161616F: case DRM_FORMAT_ABGR16161616F: case DRM_FORMAT_XRGB16161616F: case DRM_FORMAT_ARGB16161616F: case DRM_FORMAT_Y210: case DRM_FORMAT_Y212: case DRM_FORMAT_Y216: case DRM_FORMAT_XVYU12_16161616: case DRM_FORMAT_XVYU16161616: if (modifier == DRM_FORMAT_MOD_LINEAR ||
modifier == I915_FORMAT_MOD_X_TILED ||
modifier == I915_FORMAT_MOD_Y_TILED) returntrue;
fallthrough; default: returnfalse;
}
}
if (!intel_fb_plane_supports_modifier(plane, modifier)) returnfalse;
switch (format) { case DRM_FORMAT_XRGB8888: case DRM_FORMAT_XBGR8888: case DRM_FORMAT_ARGB8888: case DRM_FORMAT_ABGR8888: case DRM_FORMAT_XRGB2101010: case DRM_FORMAT_XBGR2101010: case DRM_FORMAT_ARGB2101010: case DRM_FORMAT_ABGR2101010: case DRM_FORMAT_XBGR16161616F: case DRM_FORMAT_ABGR16161616F: case DRM_FORMAT_XRGB16161616F: case DRM_FORMAT_ARGB16161616F: if (intel_fb_is_ccs_modifier(modifier)) returntrue;
fallthrough; case DRM_FORMAT_YUYV: case DRM_FORMAT_YVYU: case DRM_FORMAT_UYVY: case DRM_FORMAT_VYUY: case DRM_FORMAT_NV12: case DRM_FORMAT_XYUV8888: case DRM_FORMAT_P010: case DRM_FORMAT_P012: case DRM_FORMAT_P016: if (intel_fb_is_mc_ccs_modifier(modifier)) returntrue;
fallthrough; case DRM_FORMAT_RGB565: case DRM_FORMAT_XVYU2101010: case DRM_FORMAT_C8: case DRM_FORMAT_Y210: case DRM_FORMAT_Y212: case DRM_FORMAT_Y216: case DRM_FORMAT_XVYU12_16161616: case DRM_FORMAT_XVYU16161616: if (!intel_fb_is_ccs_modifier(modifier)) returntrue;
fallthrough; default: returnfalse;
}
}
if (intel_fb_uses_dpt(fb)) { /* if DPT is enabled, keep tiling, but disable compression */
plane_ctl &= ~PLANE_CTL_RENDER_DECOMPRESSION_ENABLE;
} else { /* if DPT is not supported, disable tiling, and update stride */
u32 stride = state->view.color_plane[0].scanout_stride / 64;
/* FIXME: xe has problems with AUX */ if (!IS_ENABLED(I915) && !HAS_FLAT_CCS(to_i915(display->drm)))
caps &= ~(INTEL_PLANE_CAP_CCS_RC |
INTEL_PLANE_CAP_CCS_RC_CC |
INTEL_PLANE_CAP_CCS_MC);
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.46Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-03)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.