Message ID | 20240705145254.3355-3-ville.syrjala@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/{i915, xe}: FBC cleanups + tweak fbdev stolen usage | expand |
On Fri, Jul 05, 2024 at 05:52:36PM +0300, Ville Syrjala wrote: > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Switch the FBC code over to intel_display from i915, as > much as possible. This is the future direction so that > the display code can be shared between i915 and xe more > cleanly. > > Some of the platform checks and the stolen mem facing stiff > still need i915 around though. > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > .../drm/i915/display/intel_display_debugfs.c | 4 +- > .../drm/i915/display/intel_display_driver.c | 4 +- > drivers/gpu/drm/i915/display/intel_fbc.c | 422 ++++++++++-------- > drivers/gpu/drm/i915/display/intel_fbc.h | 13 +- > .../drm/i915/display/intel_fifo_underrun.c | 2 +- > .../drm/i915/display/intel_modeset_setup.c | 2 +- > 6 files changed, 239 insertions(+), 208 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c > index 91757fed9c6d..5cf9b4af9adf 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c > +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c > @@ -1008,7 +1008,7 @@ i915_fifo_underrun_reset_write(struct file *filp, > return ret; > } > > - intel_fbc_reset_underrun(dev_priv); > + intel_fbc_reset_underrun(&dev_priv->display); > > return cnt; > } > @@ -1063,7 +1063,7 @@ void intel_display_debugfs_register(struct drm_i915_private *i915) > intel_bios_debugfs_register(i915); > intel_cdclk_debugfs_register(i915); > intel_dmc_debugfs_register(i915); > - intel_fbc_debugfs_register(i915); > + intel_fbc_debugfs_register(&i915->display); > intel_hpd_debugfs_register(i915); > intel_opregion_debugfs_register(i915); > intel_psr_debugfs_register(i915); > diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c > index 794b4af38055..13e206ec450f 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_driver.c > +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c > @@ -265,7 +265,7 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915) > > intel_init_quirks(display); > > - intel_fbc_init(i915); > + intel_fbc_init(display); > > return 0; > > @@ -607,7 +607,7 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915) > destroy_workqueue(i915->display.wq.flip); > destroy_workqueue(i915->display.wq.modeset); > > - intel_fbc_cleanup(i915); > + intel_fbc_cleanup(&i915->display); > } > > /* part #3: call after gem init */ > diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c > index ba9820d4b78f..de8caa69a0dd 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbc.c > +++ b/drivers/gpu/drm/i915/display/intel_fbc.c > @@ -61,13 +61,13 @@ > #include "intel_fbc_regs.h" > #include "intel_frontbuffer.h" > > -#define for_each_fbc_id(__dev_priv, __fbc_id) \ > +#define for_each_fbc_id(__display, __fbc_id) \ > for ((__fbc_id) = INTEL_FBC_A; (__fbc_id) < I915_MAX_FBCS; (__fbc_id)++) \ > - for_each_if(DISPLAY_RUNTIME_INFO(__dev_priv)->fbc_mask & BIT(__fbc_id)) > + for_each_if(DISPLAY_RUNTIME_INFO(__display)->fbc_mask & BIT(__fbc_id)) > > -#define for_each_intel_fbc(__dev_priv, __fbc, __fbc_id) \ > - for_each_fbc_id((__dev_priv), (__fbc_id)) \ > - for_each_if((__fbc) = (__dev_priv)->display.fbc[(__fbc_id)]) > +#define for_each_intel_fbc(__display, __fbc, __fbc_id) \ > + for_each_fbc_id((__display), (__fbc_id)) \ > + for_each_if((__fbc) = (__display)->fbc[(__fbc_id)]) > > struct intel_fbc_funcs { > void (*activate)(struct intel_fbc *fbc); > @@ -90,7 +90,7 @@ struct intel_fbc_state { > }; > > struct intel_fbc { > - struct drm_i915_private *i915; > + struct intel_display *display; > const struct intel_fbc_funcs *funcs; > > /* > @@ -151,7 +151,7 @@ static unsigned int _intel_fbc_cfb_stride(const struct intel_plane_state *plane_ > /* minimum acceptable cfb stride in bytes, assuming 1:1 compression limit */ > static unsigned int skl_fbc_min_cfb_stride(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > unsigned int limit = 4; /* 1:4 compression limit is the worst case */ > unsigned int cpp = 4; /* FBC always 4 bytes per pixel */ > unsigned int width = drm_rect_width(&plane_state->uapi.src) >> 16; > @@ -165,7 +165,7 @@ static unsigned int skl_fbc_min_cfb_stride(const struct intel_plane_state *plane > * Wa_16011863758: icl+ > * Avoid some hardware segment address miscalculation. > */ > - if (DISPLAY_VER(i915) >= 11) > + if (DISPLAY_VER(display) >= 11) > stride += 64; > > /* > @@ -181,7 +181,7 @@ static unsigned int skl_fbc_min_cfb_stride(const struct intel_plane_state *plane > /* properly aligned cfb stride in bytes, assuming 1:1 compression limit */ > static unsigned int intel_fbc_cfb_stride(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > unsigned int stride = _intel_fbc_cfb_stride(plane_state); > > /* > @@ -189,7 +189,7 @@ static unsigned int intel_fbc_cfb_stride(const struct intel_plane_state *plane_s > * be 512 byte aligned. Aligning each line to 512 bytes guarantees > * that regardless of the compression limit we choose later. > */ > - if (DISPLAY_VER(i915) >= 9) > + if (DISPLAY_VER(display) >= 9) > return max(ALIGN(stride, 512), skl_fbc_min_cfb_stride(plane_state)); > else > return stride; > @@ -197,12 +197,12 @@ static unsigned int intel_fbc_cfb_stride(const struct intel_plane_state *plane_s > > static unsigned int intel_fbc_cfb_size(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > int lines = drm_rect_height(&plane_state->uapi.src) >> 16; > > - if (DISPLAY_VER(i915) == 7) > + if (DISPLAY_VER(display) == 7) > lines = min(lines, 2048); > - else if (DISPLAY_VER(i915) >= 8) > + else if (DISPLAY_VER(display) >= 8) > lines = min(lines, 2560); > > return lines * intel_fbc_cfb_stride(plane_state); > @@ -210,7 +210,7 @@ static unsigned int intel_fbc_cfb_size(const struct intel_plane_state *plane_sta > > static u16 intel_fbc_override_cfb_stride(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > unsigned int stride_aligned = intel_fbc_cfb_stride(plane_state); > unsigned int stride = _intel_fbc_cfb_stride(plane_state); > const struct drm_framebuffer *fb = plane_state->hw.fb; > @@ -223,28 +223,31 @@ static u16 intel_fbc_override_cfb_stride(const struct intel_plane_state *plane_s > * we always need to use the override there. > */ > if (stride != stride_aligned || > - (DISPLAY_VER(i915) == 9 && fb->modifier == DRM_FORMAT_MOD_LINEAR)) > + (DISPLAY_VER(display) == 9 && fb->modifier == DRM_FORMAT_MOD_LINEAR)) > return stride_aligned * 4 / 64; > > return 0; > } > > -static bool intel_fbc_has_fences(struct drm_i915_private *i915) > +static bool intel_fbc_has_fences(struct intel_display *display) > { > + struct drm_i915_private __maybe_unused *i915 = to_i915(display->drm); I was going to ask why __maybe_unused, but then I remember about the xe compat-headers where below function is defined to 0... Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> > + > return intel_gt_support_legacy_fencing(to_gt(i915)); > } > > static u32 i8xx_fbc_ctl(struct intel_fbc *fbc) > { > const struct intel_fbc_state *fbc_state = &fbc->state; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > unsigned int cfb_stride; > u32 fbc_ctl; > > cfb_stride = fbc_state->cfb_stride / fbc->limit; > > /* FBC_CTL wants 32B or 64B units */ > - if (DISPLAY_VER(i915) == 2) > + if (DISPLAY_VER(display) == 2) > cfb_stride = (cfb_stride / 32) - 1; > else > cfb_stride = (cfb_stride / 64) - 1; > @@ -278,21 +281,21 @@ static u32 i965_fbc_ctl2(struct intel_fbc *fbc) > > static void i8xx_fbc_deactivate(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > u32 fbc_ctl; > > /* Disable compression */ > - fbc_ctl = intel_de_read(i915, FBC_CONTROL); > + fbc_ctl = intel_de_read(display, FBC_CONTROL); > if ((fbc_ctl & FBC_CTL_EN) == 0) > return; > > fbc_ctl &= ~FBC_CTL_EN; > - intel_de_write(i915, FBC_CONTROL, fbc_ctl); > + intel_de_write(display, FBC_CONTROL, fbc_ctl); > > /* Wait for compressing bit to clear */ > - if (intel_de_wait_for_clear(i915, FBC_STATUS, > + if (intel_de_wait_for_clear(display, FBC_STATUS, > FBC_STAT_COMPRESSING, 10)) { > - drm_dbg_kms(&i915->drm, "FBC idle timed out\n"); > + drm_dbg_kms(display->drm, "FBC idle timed out\n"); > return; > } > } > @@ -300,32 +303,32 @@ static void i8xx_fbc_deactivate(struct intel_fbc *fbc) > static void i8xx_fbc_activate(struct intel_fbc *fbc) > { > const struct intel_fbc_state *fbc_state = &fbc->state; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > int i; > > /* Clear old tags */ > for (i = 0; i < (FBC_LL_SIZE / 32) + 1; i++) > - intel_de_write(i915, FBC_TAG(i), 0); > + intel_de_write(display, FBC_TAG(i), 0); > > - if (DISPLAY_VER(i915) == 4) { > - intel_de_write(i915, FBC_CONTROL2, > + if (DISPLAY_VER(display) == 4) { > + intel_de_write(display, FBC_CONTROL2, > i965_fbc_ctl2(fbc)); > - intel_de_write(i915, FBC_FENCE_OFF, > + intel_de_write(display, FBC_FENCE_OFF, > fbc_state->fence_y_offset); > } > > - intel_de_write(i915, FBC_CONTROL, > + intel_de_write(display, FBC_CONTROL, > FBC_CTL_EN | i8xx_fbc_ctl(fbc)); > } > > static bool i8xx_fbc_is_active(struct intel_fbc *fbc) > { > - return intel_de_read(fbc->i915, FBC_CONTROL) & FBC_CTL_EN; > + return intel_de_read(fbc->display, FBC_CONTROL) & FBC_CTL_EN; > } > > static bool i8xx_fbc_is_compressing(struct intel_fbc *fbc) > { > - return intel_de_read(fbc->i915, FBC_STATUS) & > + return intel_de_read(fbc->display, FBC_STATUS) & > (FBC_STAT_COMPRESSING | FBC_STAT_COMPRESSED); > } > > @@ -333,7 +336,7 @@ static void i8xx_fbc_nuke(struct intel_fbc *fbc) > { > struct intel_fbc_state *fbc_state = &fbc->state; > enum i9xx_plane_id i9xx_plane = fbc_state->plane->i9xx_plane; > - struct drm_i915_private *dev_priv = fbc->i915; > + struct drm_i915_private *dev_priv = to_i915(fbc->display->drm); > > intel_de_write_fw(dev_priv, DSPADDR(dev_priv, i9xx_plane), > intel_de_read_fw(dev_priv, DSPADDR(dev_priv, i9xx_plane))); > @@ -341,13 +344,14 @@ static void i8xx_fbc_nuke(struct intel_fbc *fbc) > > static void i8xx_fbc_program_cfb(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > > - drm_WARN_ON(&i915->drm, > + drm_WARN_ON(display->drm, > range_overflows_end_t(u64, i915_gem_stolen_area_address(i915), > i915_gem_stolen_node_offset(&fbc->compressed_fb), > U32_MAX)); > - drm_WARN_ON(&i915->drm, > + drm_WARN_ON(display->drm, > range_overflows_end_t(u64, i915_gem_stolen_area_address(i915), > i915_gem_stolen_node_offset(&fbc->compressed_llb), > U32_MAX)); > @@ -370,7 +374,7 @@ static void i965_fbc_nuke(struct intel_fbc *fbc) > { > struct intel_fbc_state *fbc_state = &fbc->state; > enum i9xx_plane_id i9xx_plane = fbc_state->plane->i9xx_plane; > - struct drm_i915_private *dev_priv = fbc->i915; > + struct drm_i915_private *dev_priv = to_i915(fbc->display->drm); > > intel_de_write_fw(dev_priv, DSPSURF(dev_priv, i9xx_plane), > intel_de_read_fw(dev_priv, DSPSURF(dev_priv, i9xx_plane))); > @@ -403,7 +407,8 @@ static u32 g4x_dpfc_ctl_limit(struct intel_fbc *fbc) > static u32 g4x_dpfc_ctl(struct intel_fbc *fbc) > { > const struct intel_fbc_state *fbc_state = &fbc->state; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > u32 dpfc_ctl; > > dpfc_ctl = g4x_dpfc_ctl_limit(fbc) | > @@ -415,7 +420,7 @@ static u32 g4x_dpfc_ctl(struct intel_fbc *fbc) > if (fbc_state->fence_id >= 0) { > dpfc_ctl |= DPFC_CTL_FENCE_EN_G4X; > > - if (DISPLAY_VER(i915) < 6) > + if (DISPLAY_VER(display) < 6) > dpfc_ctl |= DPFC_CTL_FENCENO(fbc_state->fence_id); > } > > @@ -425,43 +430,43 @@ static u32 g4x_dpfc_ctl(struct intel_fbc *fbc) > static void g4x_fbc_activate(struct intel_fbc *fbc) > { > const struct intel_fbc_state *fbc_state = &fbc->state; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > > - intel_de_write(i915, DPFC_FENCE_YOFF, > + intel_de_write(display, DPFC_FENCE_YOFF, > fbc_state->fence_y_offset); > > - intel_de_write(i915, DPFC_CONTROL, > + intel_de_write(display, DPFC_CONTROL, > DPFC_CTL_EN | g4x_dpfc_ctl(fbc)); > } > > static void g4x_fbc_deactivate(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > u32 dpfc_ctl; > > /* Disable compression */ > - dpfc_ctl = intel_de_read(i915, DPFC_CONTROL); > + dpfc_ctl = intel_de_read(display, DPFC_CONTROL); > if (dpfc_ctl & DPFC_CTL_EN) { > dpfc_ctl &= ~DPFC_CTL_EN; > - intel_de_write(i915, DPFC_CONTROL, dpfc_ctl); > + intel_de_write(display, DPFC_CONTROL, dpfc_ctl); > } > } > > static bool g4x_fbc_is_active(struct intel_fbc *fbc) > { > - return intel_de_read(fbc->i915, DPFC_CONTROL) & DPFC_CTL_EN; > + return intel_de_read(fbc->display, DPFC_CONTROL) & DPFC_CTL_EN; > } > > static bool g4x_fbc_is_compressing(struct intel_fbc *fbc) > { > - return intel_de_read(fbc->i915, DPFC_STATUS) & DPFC_COMP_SEG_MASK; > + return intel_de_read(fbc->display, DPFC_STATUS) & DPFC_COMP_SEG_MASK; > } > > static void g4x_fbc_program_cfb(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > > - intel_de_write(i915, DPFC_CB_BASE, > + intel_de_write(display, DPFC_CB_BASE, > i915_gem_stolen_node_offset(&fbc->compressed_fb)); > } > > @@ -477,43 +482,43 @@ static const struct intel_fbc_funcs g4x_fbc_funcs = { > static void ilk_fbc_activate(struct intel_fbc *fbc) > { > struct intel_fbc_state *fbc_state = &fbc->state; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > > - intel_de_write(i915, ILK_DPFC_FENCE_YOFF(fbc->id), > + intel_de_write(display, ILK_DPFC_FENCE_YOFF(fbc->id), > fbc_state->fence_y_offset); > > - intel_de_write(i915, ILK_DPFC_CONTROL(fbc->id), > + intel_de_write(display, ILK_DPFC_CONTROL(fbc->id), > DPFC_CTL_EN | g4x_dpfc_ctl(fbc)); > } > > static void ilk_fbc_deactivate(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > u32 dpfc_ctl; > > /* Disable compression */ > - dpfc_ctl = intel_de_read(i915, ILK_DPFC_CONTROL(fbc->id)); > + dpfc_ctl = intel_de_read(display, ILK_DPFC_CONTROL(fbc->id)); > if (dpfc_ctl & DPFC_CTL_EN) { > dpfc_ctl &= ~DPFC_CTL_EN; > - intel_de_write(i915, ILK_DPFC_CONTROL(fbc->id), dpfc_ctl); > + intel_de_write(display, ILK_DPFC_CONTROL(fbc->id), dpfc_ctl); > } > } > > static bool ilk_fbc_is_active(struct intel_fbc *fbc) > { > - return intel_de_read(fbc->i915, ILK_DPFC_CONTROL(fbc->id)) & DPFC_CTL_EN; > + return intel_de_read(fbc->display, ILK_DPFC_CONTROL(fbc->id)) & DPFC_CTL_EN; > } > > static bool ilk_fbc_is_compressing(struct intel_fbc *fbc) > { > - return intel_de_read(fbc->i915, ILK_DPFC_STATUS(fbc->id)) & DPFC_COMP_SEG_MASK; > + return intel_de_read(fbc->display, ILK_DPFC_STATUS(fbc->id)) & DPFC_COMP_SEG_MASK; > } > > static void ilk_fbc_program_cfb(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > > - intel_de_write(i915, ILK_DPFC_CB_BASE(fbc->id), > + intel_de_write(display, ILK_DPFC_CB_BASE(fbc->id), > i915_gem_stolen_node_offset(&fbc->compressed_fb)); > } > > @@ -529,14 +534,14 @@ static const struct intel_fbc_funcs ilk_fbc_funcs = { > static void snb_fbc_program_fence(struct intel_fbc *fbc) > { > const struct intel_fbc_state *fbc_state = &fbc->state; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > u32 ctl = 0; > > if (fbc_state->fence_id >= 0) > ctl = SNB_DPFC_FENCE_EN | SNB_DPFC_FENCENO(fbc_state->fence_id); > > - intel_de_write(i915, SNB_DPFC_CTL_SA, ctl); > - intel_de_write(i915, SNB_DPFC_CPU_FENCE_OFFSET, fbc_state->fence_y_offset); > + intel_de_write(display, SNB_DPFC_CTL_SA, ctl); > + intel_de_write(display, SNB_DPFC_CPU_FENCE_OFFSET, fbc_state->fence_y_offset); > } > > static void snb_fbc_activate(struct intel_fbc *fbc) > @@ -548,10 +553,10 @@ static void snb_fbc_activate(struct intel_fbc *fbc) > > static void snb_fbc_nuke(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > > - intel_de_write(i915, MSG_FBC_REND_STATE(fbc->id), FBC_REND_NUKE); > - intel_de_posting_read(i915, MSG_FBC_REND_STATE(fbc->id)); > + intel_de_write(display, MSG_FBC_REND_STATE(fbc->id), FBC_REND_NUKE); > + intel_de_posting_read(display, MSG_FBC_REND_STATE(fbc->id)); > } > > static const struct intel_fbc_funcs snb_fbc_funcs = { > @@ -566,20 +571,20 @@ static const struct intel_fbc_funcs snb_fbc_funcs = { > static void glk_fbc_program_cfb_stride(struct intel_fbc *fbc) > { > const struct intel_fbc_state *fbc_state = &fbc->state; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > u32 val = 0; > > if (fbc_state->override_cfb_stride) > val |= FBC_STRIDE_OVERRIDE | > FBC_STRIDE(fbc_state->override_cfb_stride / fbc->limit); > > - intel_de_write(i915, GLK_FBC_STRIDE(fbc->id), val); > + intel_de_write(display, GLK_FBC_STRIDE(fbc->id), val); > } > > static void skl_fbc_program_cfb_stride(struct intel_fbc *fbc) > { > const struct intel_fbc_state *fbc_state = &fbc->state; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > u32 val = 0; > > /* Display WA #0529: skl, kbl, bxt. */ > @@ -587,7 +592,7 @@ static void skl_fbc_program_cfb_stride(struct intel_fbc *fbc) > val |= CHICKEN_FBC_STRIDE_OVERRIDE | > CHICKEN_FBC_STRIDE(fbc_state->override_cfb_stride / fbc->limit); > > - intel_de_rmw(i915, CHICKEN_MISC_4, > + intel_de_rmw(display, CHICKEN_MISC_4, > CHICKEN_FBC_STRIDE_OVERRIDE | > CHICKEN_FBC_STRIDE_MASK, val); > } > @@ -595,7 +600,8 @@ static void skl_fbc_program_cfb_stride(struct intel_fbc *fbc) > static u32 ivb_dpfc_ctl(struct intel_fbc *fbc) > { > const struct intel_fbc_state *fbc_state = &fbc->state; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > u32 dpfc_ctl; > > dpfc_ctl = g4x_dpfc_ctl_limit(fbc); > @@ -603,7 +609,7 @@ static u32 ivb_dpfc_ctl(struct intel_fbc *fbc) > if (IS_IVYBRIDGE(i915)) > dpfc_ctl |= DPFC_CTL_PLANE_IVB(fbc_state->plane->i9xx_plane); > > - if (DISPLAY_VER(i915) >= 20) > + if (DISPLAY_VER(display) >= 20) > dpfc_ctl |= DPFC_CTL_PLANE_BINDING(fbc_state->plane->id); > > if (fbc_state->fence_id >= 0) > @@ -617,35 +623,35 @@ static u32 ivb_dpfc_ctl(struct intel_fbc *fbc) > > static void ivb_fbc_activate(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > u32 dpfc_ctl; > > - if (DISPLAY_VER(i915) >= 10) > + if (DISPLAY_VER(display) >= 10) > glk_fbc_program_cfb_stride(fbc); > - else if (DISPLAY_VER(i915) == 9) > + else if (DISPLAY_VER(display) == 9) > skl_fbc_program_cfb_stride(fbc); > > - if (intel_fbc_has_fences(i915)) > + if (intel_fbc_has_fences(display)) > snb_fbc_program_fence(fbc); > > /* wa_14019417088 Alternative WA*/ > dpfc_ctl = ivb_dpfc_ctl(fbc); > - if (DISPLAY_VER(i915) >= 20) > - intel_de_write(i915, ILK_DPFC_CONTROL(fbc->id), dpfc_ctl); > + if (DISPLAY_VER(display) >= 20) > + intel_de_write(display, ILK_DPFC_CONTROL(fbc->id), dpfc_ctl); > > - intel_de_write(i915, ILK_DPFC_CONTROL(fbc->id), > + intel_de_write(display, ILK_DPFC_CONTROL(fbc->id), > DPFC_CTL_EN | dpfc_ctl); > } > > static bool ivb_fbc_is_compressing(struct intel_fbc *fbc) > { > - return intel_de_read(fbc->i915, ILK_DPFC_STATUS2(fbc->id)) & DPFC_COMP_SEG_MASK_IVB; > + return intel_de_read(fbc->display, ILK_DPFC_STATUS2(fbc->id)) & DPFC_COMP_SEG_MASK_IVB; > } > > static void ivb_fbc_set_false_color(struct intel_fbc *fbc, > bool enable) > { > - intel_de_rmw(fbc->i915, ILK_DPFC_CONTROL(fbc->id), > + intel_de_rmw(fbc->display, ILK_DPFC_CONTROL(fbc->id), > DPFC_CTL_FALSE_COLOR, enable ? DPFC_CTL_FALSE_COLOR : 0); > } > > @@ -690,10 +696,10 @@ static bool intel_fbc_is_compressing(struct intel_fbc *fbc) > > static void intel_fbc_nuke(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > > lockdep_assert_held(&fbc->lock); > - drm_WARN_ON(&i915->drm, fbc->flip_pending); > + drm_WARN_ON(display->drm, fbc->flip_pending); > > trace_intel_fbc_nuke(fbc->state.plane); > > @@ -720,29 +726,32 @@ static void intel_fbc_deactivate(struct intel_fbc *fbc, const char *reason) > fbc->no_fbc_reason = reason; > } > > -static u64 intel_fbc_cfb_base_max(struct drm_i915_private *i915) > +static u64 intel_fbc_cfb_base_max(struct intel_display *display) > { > - if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) > + struct drm_i915_private *i915 = to_i915(display->drm); > + > + if (DISPLAY_VER(display) >= 5 || IS_G4X(i915)) > return BIT_ULL(28); > else > return BIT_ULL(32); > } > > -static u64 intel_fbc_stolen_end(struct drm_i915_private *i915) > +static u64 intel_fbc_stolen_end(struct intel_display *display) > { > + struct drm_i915_private __maybe_unused *i915 = to_i915(display->drm); > u64 end; > > /* The FBC hardware for BDW/SKL doesn't have access to the stolen > * reserved range size, so it always assumes the maximum (8mb) is used. > * If we enable FBC using a CFB on that memory range we'll get FIFO > * underruns, even if that range is not reserved by the BIOS. */ > - if (IS_BROADWELL(i915) || > - (DISPLAY_VER(i915) == 9 && !IS_BROXTON(i915))) > + if (IS_BROADWELL(to_i915(display->drm)) || > + (DISPLAY_VER(display) == 9 && !IS_BROXTON(to_i915(display->drm)))) > end = i915_gem_stolen_area_size(i915) - 8 * 1024 * 1024; > else > end = U64_MAX; > > - return min(end, intel_fbc_cfb_base_max(i915)); > + return min(end, intel_fbc_cfb_base_max(display)); > } > > static int intel_fbc_min_limit(const struct intel_plane_state *plane_state) > @@ -750,8 +759,10 @@ static int intel_fbc_min_limit(const struct intel_plane_state *plane_state) > return plane_state->hw.fb->format->cpp[0] == 2 ? 2 : 1; > } > > -static int intel_fbc_max_limit(struct drm_i915_private *i915) > +static int intel_fbc_max_limit(struct intel_display *display) > { > + struct drm_i915_private *i915 = to_i915(display->drm); > + > /* WaFbcOnly1to1Ratio:ctg */ > if (IS_G4X(i915)) > return 1; > @@ -766,8 +777,9 @@ static int intel_fbc_max_limit(struct drm_i915_private *i915) > static int find_compression_limit(struct intel_fbc *fbc, > unsigned int size, int min_limit) > { > - struct drm_i915_private *i915 = fbc->i915; > - u64 end = intel_fbc_stolen_end(i915); > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > + u64 end = intel_fbc_stolen_end(display); > int ret, limit = min_limit; > > size /= limit; > @@ -778,7 +790,7 @@ static int find_compression_limit(struct intel_fbc *fbc, > if (ret == 0) > return limit; > > - for (; limit <= intel_fbc_max_limit(i915); limit <<= 1) { > + for (; limit <= intel_fbc_max_limit(display); limit <<= 1) { > ret = i915_gem_stolen_insert_node_in_range(i915, &fbc->compressed_fb, > size >>= 1, 4096, 0, end); > if (ret == 0) > @@ -791,15 +803,16 @@ static int find_compression_limit(struct intel_fbc *fbc, > static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, > unsigned int size, int min_limit) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > int ret; > > - drm_WARN_ON(&i915->drm, > + drm_WARN_ON(display->drm, > i915_gem_stolen_node_allocated(&fbc->compressed_fb)); > - drm_WARN_ON(&i915->drm, > + drm_WARN_ON(display->drm, > i915_gem_stolen_node_allocated(&fbc->compressed_llb)); > > - if (DISPLAY_VER(i915) < 5 && !IS_G4X(i915)) { > + if (DISPLAY_VER(display) < 5 && !IS_G4X(to_i915(display->drm))) { > ret = i915_gem_stolen_insert_node(i915, &fbc->compressed_llb, > 4096, 4096); > if (ret) > @@ -810,12 +823,12 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, > if (!ret) > goto err_llb; > else if (ret > min_limit) > - drm_info_once(&i915->drm, > + drm_info_once(display->drm, > "Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS.\n"); > > fbc->limit = ret; > > - drm_dbg_kms(&i915->drm, > + drm_dbg_kms(display->drm, > "reserved %llu bytes of contiguous stolen space for FBC, limit: %d\n", > i915_gem_stolen_node_size(&fbc->compressed_fb), fbc->limit); > return 0; > @@ -825,7 +838,8 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, > i915_gem_stolen_remove_node(i915, &fbc->compressed_llb); > err: > if (i915_gem_stolen_initialized(i915)) > - drm_info_once(&i915->drm, "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); > + drm_info_once(display->drm, > + "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); > return -ENOSPC; > } > > @@ -836,14 +850,15 @@ static void intel_fbc_program_cfb(struct intel_fbc *fbc) > > static void intel_fbc_program_workarounds(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > > if (IS_SKYLAKE(i915) || IS_BROXTON(i915)) { > /* > * WaFbcHighMemBwCorruptionAvoidance:skl,bxt > * Display WA #0883: skl,bxt > */ > - intel_de_rmw(i915, ILK_DPFC_CHICKEN(fbc->id), > + intel_de_rmw(display, ILK_DPFC_CHICKEN(fbc->id), > 0, DPFC_DISABLE_DUMMY0); > } > > @@ -853,24 +868,25 @@ static void intel_fbc_program_workarounds(struct intel_fbc *fbc) > * WaFbcNukeOnHostModify:skl,kbl,cfl > * Display WA #0873: skl,kbl,cfl > */ > - intel_de_rmw(i915, ILK_DPFC_CHICKEN(fbc->id), > + intel_de_rmw(display, ILK_DPFC_CHICKEN(fbc->id), > 0, DPFC_NUKE_ON_ANY_MODIFICATION); > } > > /* Wa_1409120013:icl,jsl,tgl,dg1 */ > - if (IS_DISPLAY_VER(i915, 11, 12)) > - intel_de_rmw(i915, ILK_DPFC_CHICKEN(fbc->id), > + if (IS_DISPLAY_VER(display, 11, 12)) > + intel_de_rmw(display, ILK_DPFC_CHICKEN(fbc->id), > 0, DPFC_CHICKEN_COMP_DUMMY_PIXEL); > > /* Wa_22014263786:icl,jsl,tgl,dg1,rkl,adls,adlp,mtl */ > - if (DISPLAY_VER(i915) >= 11 && !IS_DG2(i915)) > - intel_de_rmw(i915, ILK_DPFC_CHICKEN(fbc->id), > + if (DISPLAY_VER(display) >= 11 && !IS_DG2(i915)) > + intel_de_rmw(display, ILK_DPFC_CHICKEN(fbc->id), > 0, DPFC_CHICKEN_FORCE_SLB_INVALIDATION); > } > > static void __intel_fbc_cleanup_cfb(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > > if (WARN_ON(intel_fbc_hw_is_active(fbc))) > return; > @@ -881,12 +897,12 @@ static void __intel_fbc_cleanup_cfb(struct intel_fbc *fbc) > i915_gem_stolen_remove_node(i915, &fbc->compressed_fb); > } > > -void intel_fbc_cleanup(struct drm_i915_private *i915) > +void intel_fbc_cleanup(struct intel_display *display) > { > struct intel_fbc *fbc; > enum intel_fbc_id fbc_id; > > - for_each_intel_fbc(i915, fbc, fbc_id) { > + for_each_intel_fbc(display, fbc, fbc_id) { > mutex_lock(&fbc->lock); > __intel_fbc_cleanup_cfb(fbc); > mutex_unlock(&fbc->lock); > @@ -938,15 +954,16 @@ static bool icl_fbc_stride_is_valid(const struct intel_plane_state *plane_state) > > static bool stride_is_valid(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > + struct drm_i915_private *i915 = to_i915(display->drm); > > - if (DISPLAY_VER(i915) >= 11) > + if (DISPLAY_VER(display) >= 11) > return icl_fbc_stride_is_valid(plane_state); > - else if (DISPLAY_VER(i915) >= 9) > + else if (DISPLAY_VER(display) >= 9) > return skl_fbc_stride_is_valid(plane_state); > - else if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) > + else if (DISPLAY_VER(display) >= 5 || IS_G4X(i915)) > return g4x_fbc_stride_is_valid(plane_state); > - else if (DISPLAY_VER(i915) == 4) > + else if (DISPLAY_VER(display) == 4) > return i965_fbc_stride_is_valid(plane_state); > else > return i8xx_fbc_stride_is_valid(plane_state); > @@ -954,7 +971,7 @@ static bool stride_is_valid(const struct intel_plane_state *plane_state) > > static bool i8xx_fbc_pixel_format_is_valid(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > const struct drm_framebuffer *fb = plane_state->hw.fb; > > switch (fb->format->format) { > @@ -964,7 +981,7 @@ static bool i8xx_fbc_pixel_format_is_valid(const struct intel_plane_state *plane > case DRM_FORMAT_XRGB1555: > case DRM_FORMAT_RGB565: > /* 16bpp not supported on gen2 */ > - if (DISPLAY_VER(i915) == 2) > + if (DISPLAY_VER(display) == 2) > return false; > return true; > default: > @@ -974,7 +991,8 @@ static bool i8xx_fbc_pixel_format_is_valid(const struct intel_plane_state *plane > > static bool g4x_fbc_pixel_format_is_valid(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > + struct drm_i915_private *i915 = to_i915(display->drm); > const struct drm_framebuffer *fb = plane_state->hw.fb; > > switch (fb->format->format) { > @@ -1009,11 +1027,12 @@ static bool lnl_fbc_pixel_format_is_valid(const struct intel_plane_state *plane_ > > static bool pixel_format_is_valid(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > + struct drm_i915_private *i915 = to_i915(display->drm); > > - if (DISPLAY_VER(i915) >= 20) > + if (DISPLAY_VER(display) >= 20) > return lnl_fbc_pixel_format_is_valid(plane_state); > - else if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) > + else if (DISPLAY_VER(display) >= 5 || IS_G4X(i915)) > return g4x_fbc_pixel_format_is_valid(plane_state); > else > return i8xx_fbc_pixel_format_is_valid(plane_state); > @@ -1043,11 +1062,12 @@ static bool skl_fbc_rotation_is_valid(const struct intel_plane_state *plane_stat > > static bool rotation_is_valid(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > + struct drm_i915_private *i915 = to_i915(display->drm); > > - if (DISPLAY_VER(i915) >= 9) > + if (DISPLAY_VER(display) >= 9) > return skl_fbc_rotation_is_valid(plane_state); > - else if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) > + else if (DISPLAY_VER(display) >= 5 || IS_G4X(i915)) > return g4x_fbc_rotation_is_valid(plane_state); > else > return i8xx_fbc_rotation_is_valid(plane_state); > @@ -1061,19 +1081,20 @@ static bool rotation_is_valid(const struct intel_plane_state *plane_state) > */ > static bool intel_fbc_hw_tracking_covers_screen(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > + struct drm_i915_private *i915 = to_i915(display->drm); > unsigned int effective_w, effective_h, max_w, max_h; > > - if (DISPLAY_VER(i915) >= 11) { > + if (DISPLAY_VER(display) >= 11) { > max_w = 8192; > max_h = 4096; > - } else if (DISPLAY_VER(i915) >= 10) { > + } else if (DISPLAY_VER(display) >= 10) { > max_w = 5120; > max_h = 4096; > - } else if (DISPLAY_VER(i915) >= 7) { > + } else if (DISPLAY_VER(display) >= 7) { > max_w = 4096; > max_h = 4096; > - } else if (IS_G4X(i915) || DISPLAY_VER(i915) >= 5) { > + } else if (IS_G4X(i915) || DISPLAY_VER(display) >= 5) { > max_w = 4096; > max_h = 2048; > } else { > @@ -1091,16 +1112,17 @@ static bool intel_fbc_hw_tracking_covers_screen(const struct intel_plane_state * > > static bool intel_fbc_plane_size_valid(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > + struct drm_i915_private *i915 = to_i915(display->drm); > unsigned int w, h, max_w, max_h; > > - if (DISPLAY_VER(i915) >= 10) { > + if (DISPLAY_VER(display) >= 10) { > max_w = 5120; > max_h = 4096; > - } else if (DISPLAY_VER(i915) >= 8 || IS_HASWELL(i915)) { > + } else if (DISPLAY_VER(display) >= 8 || IS_HASWELL(i915)) { > max_w = 4096; > max_h = 4096; > - } else if (IS_G4X(i915) || DISPLAY_VER(i915) >= 5) { > + } else if (IS_G4X(i915) || DISPLAY_VER(display) >= 5) { > max_w = 4096; > max_h = 2048; > } else { > @@ -1128,9 +1150,9 @@ static bool skl_fbc_tiling_valid(const struct intel_plane_state *plane_state) > > static bool tiling_is_valid(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > > - if (DISPLAY_VER(i915) >= 9) > + if (DISPLAY_VER(display) >= 9) > return skl_fbc_tiling_valid(plane_state); > else > return i8xx_fbc_tiling_valid(plane_state); > @@ -1140,7 +1162,7 @@ static void intel_fbc_update_state(struct intel_atomic_state *state, > struct intel_crtc *crtc, > struct intel_plane *plane) > { > - struct drm_i915_private *i915 = to_i915(state->base.dev); > + struct intel_display *display = to_intel_display(state->base.dev); > const struct intel_crtc_state *crtc_state = > intel_atomic_get_new_crtc_state(state, crtc); > const struct intel_plane_state *plane_state = > @@ -1158,8 +1180,8 @@ static void intel_fbc_update_state(struct intel_atomic_state *state, > > fbc_state->fence_y_offset = intel_plane_fence_y_offset(plane_state); > > - drm_WARN_ON(&i915->drm, plane_state->flags & PLANE_HAS_FENCE && > - !intel_fbc_has_fences(i915)); > + drm_WARN_ON(display->drm, plane_state->flags & PLANE_HAS_FENCE && > + !intel_fbc_has_fences(display)); > > if (plane_state->flags & PLANE_HAS_FENCE) > fbc_state->fence_id = i915_vma_fence_id(plane_state->ggtt_vma); > @@ -1173,7 +1195,7 @@ static void intel_fbc_update_state(struct intel_atomic_state *state, > > static bool intel_fbc_is_fence_ok(const struct intel_plane_state *plane_state) > { > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > > /* > * The use of a CPU fence is one of two ways to detect writes by the > @@ -1187,7 +1209,7 @@ static bool intel_fbc_is_fence_ok(const struct intel_plane_state *plane_state) > * so have no fence associated with it) due to aperture constraints > * at the time of pinning. > */ > - return DISPLAY_VER(i915) >= 9 || > + return DISPLAY_VER(display) >= 9 || > (plane_state->flags & PLANE_HAS_FENCE && > i915_vma_fence_id(plane_state->ggtt_vma) != -1); > } > @@ -1212,7 +1234,8 @@ static bool intel_fbc_is_ok(const struct intel_plane_state *plane_state) > static int intel_fbc_check_plane(struct intel_atomic_state *state, > struct intel_plane *plane) > { > - struct drm_i915_private *i915 = to_i915(state->base.dev); > + struct intel_display *display = to_intel_display(state->base.dev); > + struct drm_i915_private *i915 = to_i915(display->drm); > struct intel_plane_state *plane_state = > intel_atomic_get_new_plane_state(state, plane); > const struct drm_framebuffer *fb = plane_state->hw.fb; > @@ -1233,7 +1256,7 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, > return 0; > } > > - if (!i915->display.params.enable_fbc) { > + if (!display->params.enable_fbc) { > plane_state->no_fbc_reason = "disabled per module param or by default"; > return 0; > } > @@ -1271,14 +1294,14 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, > * Recommendation is to keep this combination disabled > * Bspec: 50422 HSD: 14010260002 > */ > - if (IS_DISPLAY_VER(i915, 12, 14) && crtc_state->has_sel_update && > + if (IS_DISPLAY_VER(display, 12, 14) && crtc_state->has_sel_update && > !crtc_state->has_panel_replay) { > plane_state->no_fbc_reason = "PSR2 enabled"; > return 0; > } > > /* Wa_14016291713 */ > - if ((IS_DISPLAY_VER(i915, 12, 13) || > + if ((IS_DISPLAY_VER(display, 12, 13) || > IS_DISPLAY_IP_STEP(i915, IP_VER(14, 0), STEP_A0, STEP_C0)) && > crtc_state->has_psr && !crtc_state->has_panel_replay) { > plane_state->no_fbc_reason = "PSR1 enabled (Wa_14016291713)"; > @@ -1305,7 +1328,7 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, > return 0; > } > > - if (DISPLAY_VER(i915) < 20 && > + if (DISPLAY_VER(display) < 20 && > plane_state->hw.pixel_blend_mode != DRM_MODE_BLEND_PIXEL_NONE && > fb->format->has_alpha) { > plane_state->no_fbc_reason = "per-pixel alpha not supported"; > @@ -1327,14 +1350,14 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, > * having a Y offset that isn't divisible by 4 causes FIFO underrun > * and screen flicker. > */ > - if (DISPLAY_VER(i915) >= 9 && > + if (DISPLAY_VER(display) >= 9 && > plane_state->view.color_plane[0].y & 3) { > plane_state->no_fbc_reason = "plane start Y offset misaligned"; > return 0; > } > > /* Wa_22010751166: icl, ehl, tgl, dg1, rkl */ > - if (DISPLAY_VER(i915) >= 11 && > + if (DISPLAY_VER(display) >= 11 && > (plane_state->view.color_plane[0].y + > (drm_rect_height(&plane_state->uapi.src) >> 16)) & 3) { > plane_state->no_fbc_reason = "plane end Y offset misaligned"; > @@ -1410,7 +1433,7 @@ static bool __intel_fbc_pre_update(struct intel_atomic_state *state, > struct intel_crtc *crtc, > struct intel_plane *plane) > { > - struct drm_i915_private *i915 = to_i915(state->base.dev); > + struct intel_display *display = to_intel_display(state->base.dev); > struct intel_fbc *fbc = plane->fbc; > bool need_vblank_wait = false; > > @@ -1436,7 +1459,7 @@ static bool __intel_fbc_pre_update(struct intel_atomic_state *state, > * and skipping the extra vblank wait before the plane update > * if at least one frame has already passed. > */ > - if (fbc->activated && DISPLAY_VER(i915) >= 10) > + if (fbc->activated && DISPLAY_VER(display) >= 10) > need_vblank_wait = true; > fbc->activated = false; > > @@ -1470,13 +1493,13 @@ bool intel_fbc_pre_update(struct intel_atomic_state *state, > > static void __intel_fbc_disable(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > struct intel_plane *plane = fbc->state.plane; > > lockdep_assert_held(&fbc->lock); > - drm_WARN_ON(&i915->drm, fbc->active); > + drm_WARN_ON(display->drm, fbc->active); > > - drm_dbg_kms(&i915->drm, "Disabling FBC on [PLANE:%d:%s]\n", > + drm_dbg_kms(display->drm, "Disabling FBC on [PLANE:%d:%s]\n", > plane->base.base.id, plane->base.name); > > __intel_fbc_cleanup_cfb(fbc); > @@ -1553,7 +1576,7 @@ void intel_fbc_invalidate(struct drm_i915_private *i915, > struct intel_fbc *fbc; > enum intel_fbc_id fbc_id; > > - for_each_intel_fbc(i915, fbc, fbc_id) > + for_each_intel_fbc(&i915->display, fbc, fbc_id) > __intel_fbc_invalidate(fbc, frontbuffer_bits, origin); > > } > @@ -1592,7 +1615,7 @@ void intel_fbc_flush(struct drm_i915_private *i915, > struct intel_fbc *fbc; > enum intel_fbc_id fbc_id; > > - for_each_intel_fbc(i915, fbc, fbc_id) > + for_each_intel_fbc(&i915->display, fbc, fbc_id) > __intel_fbc_flush(fbc, frontbuffer_bits, origin); > } > > @@ -1617,7 +1640,7 @@ static void __intel_fbc_enable(struct intel_atomic_state *state, > struct intel_crtc *crtc, > struct intel_plane *plane) > { > - struct drm_i915_private *i915 = to_i915(state->base.dev); > + struct intel_display *display = to_intel_display(state->base.dev); > const struct intel_plane_state *plane_state = > intel_atomic_get_new_plane_state(state, plane); > struct intel_fbc *fbc = plane->fbc; > @@ -1636,7 +1659,7 @@ static void __intel_fbc_enable(struct intel_atomic_state *state, > __intel_fbc_disable(fbc); > } > > - drm_WARN_ON(&i915->drm, fbc->active); > + drm_WARN_ON(display->drm, fbc->active); > > fbc->no_fbc_reason = plane_state->no_fbc_reason; > if (fbc->no_fbc_reason) > @@ -1658,7 +1681,7 @@ static void __intel_fbc_enable(struct intel_atomic_state *state, > return; > } > > - drm_dbg_kms(&i915->drm, "Enabling FBC on [PLANE:%d:%s]\n", > + drm_dbg_kms(display->drm, "Enabling FBC on [PLANE:%d:%s]\n", > plane->base.base.id, plane->base.name); > fbc->no_fbc_reason = "FBC enabled but not active yet\n"; > > @@ -1676,10 +1699,10 @@ static void __intel_fbc_enable(struct intel_atomic_state *state, > */ > void intel_fbc_disable(struct intel_crtc *crtc) > { > - struct drm_i915_private *i915 = to_i915(crtc->base.dev); > + struct intel_display *display = to_intel_display(crtc->base.dev); > struct intel_plane *plane; > > - for_each_intel_plane(&i915->drm, plane) { > + for_each_intel_plane(display->drm, plane) { > struct intel_fbc *fbc = plane->fbc; > > if (!fbc || plane->pipe != crtc->pipe) > @@ -1724,7 +1747,8 @@ void intel_fbc_update(struct intel_atomic_state *state, > static void intel_fbc_underrun_work_fn(struct work_struct *work) > { > struct intel_fbc *fbc = container_of(work, typeof(*fbc), underrun_work); > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > > mutex_lock(&fbc->lock); > > @@ -1732,7 +1756,7 @@ static void intel_fbc_underrun_work_fn(struct work_struct *work) > if (fbc->underrun_detected || !fbc->state.plane) > goto out; > > - drm_dbg_kms(&i915->drm, "Disabling FBC due to FIFO underrun.\n"); > + drm_dbg_kms(display->drm, "Disabling FBC due to FIFO underrun.\n"); > fbc->underrun_detected = true; > > intel_fbc_deactivate(fbc, "FIFO underrun"); > @@ -1745,14 +1769,14 @@ static void intel_fbc_underrun_work_fn(struct work_struct *work) > > static void __intel_fbc_reset_underrun(struct intel_fbc *fbc) > { > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > > cancel_work_sync(&fbc->underrun_work); > > mutex_lock(&fbc->lock); > > if (fbc->underrun_detected) { > - drm_dbg_kms(&i915->drm, > + drm_dbg_kms(display->drm, > "Re-allowing FBC after fifo underrun\n"); > fbc->no_fbc_reason = "FIFO underrun cleared"; > } > @@ -1763,22 +1787,24 @@ static void __intel_fbc_reset_underrun(struct intel_fbc *fbc) > > /* > * intel_fbc_reset_underrun - reset FBC fifo underrun status. > - * @i915: the i915 device > + * @display: display > * > * See intel_fbc_handle_fifo_underrun_irq(). For automated testing we > * want to re-enable FBC after an underrun to increase test coverage. > */ > -void intel_fbc_reset_underrun(struct drm_i915_private *i915) > +void intel_fbc_reset_underrun(struct intel_display *display) > { > struct intel_fbc *fbc; > enum intel_fbc_id fbc_id; > > - for_each_intel_fbc(i915, fbc, fbc_id) > + for_each_intel_fbc(display, fbc, fbc_id) > __intel_fbc_reset_underrun(fbc); > } > > static void __intel_fbc_handle_fifo_underrun_irq(struct intel_fbc *fbc) > { > + struct drm_i915_private *i915 = to_i915(fbc->display->drm); > + > /* > * There's no guarantee that underrun_detected won't be set to true > * right after this check and before the work is scheduled, but that's > @@ -1790,12 +1816,12 @@ static void __intel_fbc_handle_fifo_underrun_irq(struct intel_fbc *fbc) > if (READ_ONCE(fbc->underrun_detected)) > return; > > - queue_work(fbc->i915->unordered_wq, &fbc->underrun_work); > + queue_work(i915->unordered_wq, &fbc->underrun_work); > } > > /** > * intel_fbc_handle_fifo_underrun_irq - disable FBC when we get a FIFO underrun > - * @i915: i915 device > + * @display: display > * > * Without FBC, most underruns are harmless and don't really cause too many > * problems, except for an annoying message on dmesg. With FBC, underruns can > @@ -1807,12 +1833,12 @@ static void __intel_fbc_handle_fifo_underrun_irq(struct intel_fbc *fbc) > * > * This function is called from the IRQ handler. > */ > -void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *i915) > +void intel_fbc_handle_fifo_underrun_irq(struct intel_display *display) > { > struct intel_fbc *fbc; > enum intel_fbc_id fbc_id; > > - for_each_intel_fbc(i915, fbc, fbc_id) > + for_each_intel_fbc(display, fbc, fbc_id) > __intel_fbc_handle_fifo_underrun_irq(fbc); > } > > @@ -1825,15 +1851,17 @@ void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *i915) > * space to change the value during runtime without sanitizing it again. IGT > * relies on being able to change i915.enable_fbc at runtime. > */ > -static int intel_sanitize_fbc_option(struct drm_i915_private *i915) > +static int intel_sanitize_fbc_option(struct intel_display *display) > { > - if (i915->display.params.enable_fbc >= 0) > - return !!i915->display.params.enable_fbc; > + struct drm_i915_private *i915 = to_i915(display->drm); > > - if (!HAS_FBC(i915)) > + if (display->params.enable_fbc >= 0) > + return !!display->params.enable_fbc; > + > + if (!HAS_FBC(display)) > return 0; > > - if (IS_BROADWELL(i915) || DISPLAY_VER(i915) >= 9) > + if (IS_BROADWELL(i915) || DISPLAY_VER(display) >= 9) > return 1; > > return 0; > @@ -1844,9 +1872,10 @@ void intel_fbc_add_plane(struct intel_fbc *fbc, struct intel_plane *plane) > plane->fbc = fbc; > } > > -static struct intel_fbc *intel_fbc_create(struct drm_i915_private *i915, > +static struct intel_fbc *intel_fbc_create(struct intel_display *display, > enum intel_fbc_id fbc_id) > { > + struct drm_i915_private *i915 = to_i915(display->drm); > struct intel_fbc *fbc; > > fbc = kzalloc(sizeof(*fbc), GFP_KERNEL); > @@ -1854,19 +1883,19 @@ static struct intel_fbc *intel_fbc_create(struct drm_i915_private *i915, > return NULL; > > fbc->id = fbc_id; > - fbc->i915 = i915; > + fbc->display = display; > INIT_WORK(&fbc->underrun_work, intel_fbc_underrun_work_fn); > mutex_init(&fbc->lock); > > - if (DISPLAY_VER(i915) >= 7) > + if (DISPLAY_VER(display) >= 7) > fbc->funcs = &ivb_fbc_funcs; > - else if (DISPLAY_VER(i915) == 6) > + else if (DISPLAY_VER(display) == 6) > fbc->funcs = &snb_fbc_funcs; > - else if (DISPLAY_VER(i915) == 5) > + else if (DISPLAY_VER(display) == 5) > fbc->funcs = &ilk_fbc_funcs; > else if (IS_G4X(i915)) > fbc->funcs = &g4x_fbc_funcs; > - else if (DISPLAY_VER(i915) == 4) > + else if (DISPLAY_VER(display) == 4) > fbc->funcs = &i965_fbc_funcs; > else > fbc->funcs = &i8xx_fbc_funcs; > @@ -1876,36 +1905,36 @@ static struct intel_fbc *intel_fbc_create(struct drm_i915_private *i915, > > /** > * intel_fbc_init - Initialize FBC > - * @i915: the i915 device > + * @display: display > * > * This function might be called during PM init process. > */ > -void intel_fbc_init(struct drm_i915_private *i915) > +void intel_fbc_init(struct intel_display *display) > { > enum intel_fbc_id fbc_id; > > - i915->display.params.enable_fbc = intel_sanitize_fbc_option(i915); > - drm_dbg_kms(&i915->drm, "Sanitized enable_fbc value: %d\n", > - i915->display.params.enable_fbc); > + display->params.enable_fbc = intel_sanitize_fbc_option(display); > + drm_dbg_kms(display->drm, "Sanitized enable_fbc value: %d\n", > + display->params.enable_fbc); > > - for_each_fbc_id(i915, fbc_id) > - i915->display.fbc[fbc_id] = intel_fbc_create(i915, fbc_id); > + for_each_fbc_id(display, fbc_id) > + display->fbc[fbc_id] = intel_fbc_create(display, fbc_id); > } > > /** > * intel_fbc_sanitize - Sanitize FBC > - * @i915: the i915 device > + * @display: display > * > * Make sure FBC is initially disabled since we have no > * idea eg. into which parts of stolen it might be scribbling > * into. > */ > -void intel_fbc_sanitize(struct drm_i915_private *i915) > +void intel_fbc_sanitize(struct intel_display *display) > { > struct intel_fbc *fbc; > enum intel_fbc_id fbc_id; > > - for_each_intel_fbc(i915, fbc, fbc_id) { > + for_each_intel_fbc(display, fbc, fbc_id) { > if (intel_fbc_hw_is_active(fbc)) > intel_fbc_hw_deactivate(fbc); > } > @@ -1914,11 +1943,12 @@ void intel_fbc_sanitize(struct drm_i915_private *i915) > static int intel_fbc_debugfs_status_show(struct seq_file *m, void *unused) > { > struct intel_fbc *fbc = m->private; > - struct drm_i915_private *i915 = fbc->i915; > + struct intel_display *display = fbc->display; > + struct drm_i915_private *i915 = to_i915(display->drm); > struct intel_plane *plane; > intel_wakeref_t wakeref; > > - drm_modeset_lock_all(&i915->drm); > + drm_modeset_lock_all(display->drm); > > wakeref = intel_runtime_pm_get(&i915->runtime_pm); > mutex_lock(&fbc->lock); > @@ -1931,7 +1961,7 @@ static int intel_fbc_debugfs_status_show(struct seq_file *m, void *unused) > seq_printf(m, "FBC disabled: %s\n", fbc->no_fbc_reason); > } > > - for_each_intel_plane(&i915->drm, plane) { > + for_each_intel_plane(display->drm, plane) { > const struct intel_plane_state *plane_state = > to_intel_plane_state(plane->base.state); > > @@ -1947,7 +1977,7 @@ static int intel_fbc_debugfs_status_show(struct seq_file *m, void *unused) > mutex_unlock(&fbc->lock); > intel_runtime_pm_put(&i915->runtime_pm, wakeref); > > - drm_modeset_unlock_all(&i915->drm); > + drm_modeset_unlock_all(display->drm); > > return 0; > } > @@ -2004,12 +2034,12 @@ void intel_fbc_crtc_debugfs_add(struct intel_crtc *crtc) > } > > /* FIXME: remove this once igt is on board with per-crtc stuff */ > -void intel_fbc_debugfs_register(struct drm_i915_private *i915) > +void intel_fbc_debugfs_register(struct intel_display *display) > { > - struct drm_minor *minor = i915->drm.primary; > + struct drm_minor *minor = display->drm->primary; > struct intel_fbc *fbc; > > - fbc = i915->display.fbc[INTEL_FBC_A]; > + fbc = display->fbc[INTEL_FBC_A]; > if (fbc) > intel_fbc_debugfs_add(fbc, minor->debugfs_root); > } > diff --git a/drivers/gpu/drm/i915/display/intel_fbc.h b/drivers/gpu/drm/i915/display/intel_fbc.h > index 6720ec8ee8a2..834b271505b1 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbc.h > +++ b/drivers/gpu/drm/i915/display/intel_fbc.h > @@ -13,6 +13,7 @@ struct drm_i915_private; > struct intel_atomic_state; > struct intel_crtc; > struct intel_crtc_state; > +struct intel_display; > struct intel_fbc; > struct intel_plane; > struct intel_plane_state; > @@ -31,9 +32,9 @@ bool intel_fbc_pre_update(struct intel_atomic_state *state, > struct intel_crtc *crtc); > void intel_fbc_post_update(struct intel_atomic_state *state, > struct intel_crtc *crtc); > -void intel_fbc_init(struct drm_i915_private *dev_priv); > -void intel_fbc_cleanup(struct drm_i915_private *dev_priv); > -void intel_fbc_sanitize(struct drm_i915_private *dev_priv); > +void intel_fbc_init(struct intel_display *dev_priv); > +void intel_fbc_cleanup(struct intel_display *dev_priv); > +void intel_fbc_sanitize(struct intel_display *dev_priv); > void intel_fbc_update(struct intel_atomic_state *state, > struct intel_crtc *crtc); > void intel_fbc_disable(struct intel_crtc *crtc); > @@ -43,9 +44,9 @@ void intel_fbc_invalidate(struct drm_i915_private *dev_priv, > void intel_fbc_flush(struct drm_i915_private *dev_priv, > unsigned int frontbuffer_bits, enum fb_op_origin origin); > void intel_fbc_add_plane(struct intel_fbc *fbc, struct intel_plane *plane); > -void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *i915); > -void intel_fbc_reset_underrun(struct drm_i915_private *i915); > +void intel_fbc_handle_fifo_underrun_irq(struct intel_display *display); > +void intel_fbc_reset_underrun(struct intel_display *display); > void intel_fbc_crtc_debugfs_add(struct intel_crtc *crtc); > -void intel_fbc_debugfs_register(struct drm_i915_private *i915); > +void intel_fbc_debugfs_register(struct intel_display *display); > > #endif /* __INTEL_FBC_H__ */ > diff --git a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c > index e5e4ca7cc499..8949fbb1cc60 100644 > --- a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c > +++ b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c > @@ -440,7 +440,7 @@ void intel_cpu_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv, > drm_err(&dev_priv->drm, "CPU pipe %c FIFO underrun\n", pipe_name(pipe)); > } > > - intel_fbc_handle_fifo_underrun_irq(dev_priv); > + intel_fbc_handle_fifo_underrun_irq(&dev_priv->display); > } > > /** > diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c > index 7602cb30ebf1..6f85f5352455 100644 > --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c > +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c > @@ -966,7 +966,7 @@ void intel_modeset_setup_hw_state(struct drm_i915_private *i915, > } > } > > - intel_fbc_sanitize(i915); > + intel_fbc_sanitize(&i915->display); > > intel_sanitize_plane_mapping(i915); > > -- > 2.44.2 >
On Tue, Jul 09, 2024 at 03:49:29PM -0400, Rodrigo Vivi wrote: > On Fri, Jul 05, 2024 at 05:52:36PM +0300, Ville Syrjala wrote: > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > > > Switch the FBC code over to intel_display from i915, as > > much as possible. This is the future direction so that > > the display code can be shared between i915 and xe more > > cleanly. > > > > Some of the platform checks and the stolen mem facing stiff > > still need i915 around though. > > > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > > --- > > .../drm/i915/display/intel_display_debugfs.c | 4 +- > > .../drm/i915/display/intel_display_driver.c | 4 +- > > drivers/gpu/drm/i915/display/intel_fbc.c | 422 ++++++++++-------- > > drivers/gpu/drm/i915/display/intel_fbc.h | 13 +- > > .../drm/i915/display/intel_fifo_underrun.c | 2 +- > > .../drm/i915/display/intel_modeset_setup.c | 2 +- > > 6 files changed, 239 insertions(+), 208 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c > > index 91757fed9c6d..5cf9b4af9adf 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c > > +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c > > @@ -1008,7 +1008,7 @@ i915_fifo_underrun_reset_write(struct file *filp, > > return ret; > > } > > > > - intel_fbc_reset_underrun(dev_priv); > > + intel_fbc_reset_underrun(&dev_priv->display); > > > > return cnt; > > } > > @@ -1063,7 +1063,7 @@ void intel_display_debugfs_register(struct drm_i915_private *i915) > > intel_bios_debugfs_register(i915); > > intel_cdclk_debugfs_register(i915); > > intel_dmc_debugfs_register(i915); > > - intel_fbc_debugfs_register(i915); > > + intel_fbc_debugfs_register(&i915->display); > > intel_hpd_debugfs_register(i915); > > intel_opregion_debugfs_register(i915); > > intel_psr_debugfs_register(i915); > > diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c > > index 794b4af38055..13e206ec450f 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_driver.c > > +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c > > @@ -265,7 +265,7 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915) > > > > intel_init_quirks(display); > > > > - intel_fbc_init(i915); > > + intel_fbc_init(display); > > > > return 0; > > > > @@ -607,7 +607,7 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915) > > destroy_workqueue(i915->display.wq.flip); > > destroy_workqueue(i915->display.wq.modeset); > > > > - intel_fbc_cleanup(i915); > > + intel_fbc_cleanup(&i915->display); > > } > > > > /* part #3: call after gem init */ > > diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c > > index ba9820d4b78f..de8caa69a0dd 100644 > > --- a/drivers/gpu/drm/i915/display/intel_fbc.c > > +++ b/drivers/gpu/drm/i915/display/intel_fbc.c > > @@ -61,13 +61,13 @@ > > #include "intel_fbc_regs.h" > > #include "intel_frontbuffer.h" > > > > -#define for_each_fbc_id(__dev_priv, __fbc_id) \ > > +#define for_each_fbc_id(__display, __fbc_id) \ > > for ((__fbc_id) = INTEL_FBC_A; (__fbc_id) < I915_MAX_FBCS; (__fbc_id)++) \ > > - for_each_if(DISPLAY_RUNTIME_INFO(__dev_priv)->fbc_mask & BIT(__fbc_id)) > > + for_each_if(DISPLAY_RUNTIME_INFO(__display)->fbc_mask & BIT(__fbc_id)) > > > > -#define for_each_intel_fbc(__dev_priv, __fbc, __fbc_id) \ > > - for_each_fbc_id((__dev_priv), (__fbc_id)) \ > > - for_each_if((__fbc) = (__dev_priv)->display.fbc[(__fbc_id)]) > > +#define for_each_intel_fbc(__display, __fbc, __fbc_id) \ > > + for_each_fbc_id((__display), (__fbc_id)) \ > > + for_each_if((__fbc) = (__display)->fbc[(__fbc_id)]) > > > > struct intel_fbc_funcs { > > void (*activate)(struct intel_fbc *fbc); > > @@ -90,7 +90,7 @@ struct intel_fbc_state { > > }; > > > > struct intel_fbc { > > - struct drm_i915_private *i915; > > + struct intel_display *display; > > const struct intel_fbc_funcs *funcs; > > > > /* > > @@ -151,7 +151,7 @@ static unsigned int _intel_fbc_cfb_stride(const struct intel_plane_state *plane_ > > /* minimum acceptable cfb stride in bytes, assuming 1:1 compression limit */ > > static unsigned int skl_fbc_min_cfb_stride(const struct intel_plane_state *plane_state) > > { > > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > > unsigned int limit = 4; /* 1:4 compression limit is the worst case */ > > unsigned int cpp = 4; /* FBC always 4 bytes per pixel */ > > unsigned int width = drm_rect_width(&plane_state->uapi.src) >> 16; > > @@ -165,7 +165,7 @@ static unsigned int skl_fbc_min_cfb_stride(const struct intel_plane_state *plane > > * Wa_16011863758: icl+ > > * Avoid some hardware segment address miscalculation. > > */ > > - if (DISPLAY_VER(i915) >= 11) > > + if (DISPLAY_VER(display) >= 11) > > stride += 64; > > > > /* > > @@ -181,7 +181,7 @@ static unsigned int skl_fbc_min_cfb_stride(const struct intel_plane_state *plane > > /* properly aligned cfb stride in bytes, assuming 1:1 compression limit */ > > static unsigned int intel_fbc_cfb_stride(const struct intel_plane_state *plane_state) > > { > > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > > unsigned int stride = _intel_fbc_cfb_stride(plane_state); > > > > /* > > @@ -189,7 +189,7 @@ static unsigned int intel_fbc_cfb_stride(const struct intel_plane_state *plane_s > > * be 512 byte aligned. Aligning each line to 512 bytes guarantees > > * that regardless of the compression limit we choose later. > > */ > > - if (DISPLAY_VER(i915) >= 9) > > + if (DISPLAY_VER(display) >= 9) > > return max(ALIGN(stride, 512), skl_fbc_min_cfb_stride(plane_state)); > > else > > return stride; > > @@ -197,12 +197,12 @@ static unsigned int intel_fbc_cfb_stride(const struct intel_plane_state *plane_s > > > > static unsigned int intel_fbc_cfb_size(const struct intel_plane_state *plane_state) > > { > > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > > int lines = drm_rect_height(&plane_state->uapi.src) >> 16; > > > > - if (DISPLAY_VER(i915) == 7) > > + if (DISPLAY_VER(display) == 7) > > lines = min(lines, 2048); > > - else if (DISPLAY_VER(i915) >= 8) > > + else if (DISPLAY_VER(display) >= 8) > > lines = min(lines, 2560); > > > > return lines * intel_fbc_cfb_stride(plane_state); > > @@ -210,7 +210,7 @@ static unsigned int intel_fbc_cfb_size(const struct intel_plane_state *plane_sta > > > > static u16 intel_fbc_override_cfb_stride(const struct intel_plane_state *plane_state) > > { > > - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); > > + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); > > unsigned int stride_aligned = intel_fbc_cfb_stride(plane_state); > > unsigned int stride = _intel_fbc_cfb_stride(plane_state); > > const struct drm_framebuffer *fb = plane_state->hw.fb; > > @@ -223,28 +223,31 @@ static u16 intel_fbc_override_cfb_stride(const struct intel_plane_state *plane_s > > * we always need to use the override there. > > */ > > if (stride != stride_aligned || > > - (DISPLAY_VER(i915) == 9 && fb->modifier == DRM_FORMAT_MOD_LINEAR)) > > + (DISPLAY_VER(display) == 9 && fb->modifier == DRM_FORMAT_MOD_LINEAR)) > > return stride_aligned * 4 / 64; > > > > return 0; > > } > > > > -static bool intel_fbc_has_fences(struct drm_i915_private *i915) > > +static bool intel_fbc_has_fences(struct intel_display *display) > > { > > + struct drm_i915_private __maybe_unused *i915 = to_i915(display->drm); > > I was going to ask why __maybe_unused, > but then I remember about the xe compat-headers where below function is > defined to 0... Yaeh this one is needed. > > > -static u64 intel_fbc_stolen_end(struct drm_i915_private *i915) > > +static u64 intel_fbc_stolen_end(struct intel_display *display) > > { > > + struct drm_i915_private __maybe_unused *i915 = to_i915(display->drm); This one was only needed because I accidentally used to_i915() below instead of using the local i915 variable. I adjusted this while pushing.
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c index 91757fed9c6d..5cf9b4af9adf 100644 --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c @@ -1008,7 +1008,7 @@ i915_fifo_underrun_reset_write(struct file *filp, return ret; } - intel_fbc_reset_underrun(dev_priv); + intel_fbc_reset_underrun(&dev_priv->display); return cnt; } @@ -1063,7 +1063,7 @@ void intel_display_debugfs_register(struct drm_i915_private *i915) intel_bios_debugfs_register(i915); intel_cdclk_debugfs_register(i915); intel_dmc_debugfs_register(i915); - intel_fbc_debugfs_register(i915); + intel_fbc_debugfs_register(&i915->display); intel_hpd_debugfs_register(i915); intel_opregion_debugfs_register(i915); intel_psr_debugfs_register(i915); diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c index 794b4af38055..13e206ec450f 100644 --- a/drivers/gpu/drm/i915/display/intel_display_driver.c +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c @@ -265,7 +265,7 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915) intel_init_quirks(display); - intel_fbc_init(i915); + intel_fbc_init(display); return 0; @@ -607,7 +607,7 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915) destroy_workqueue(i915->display.wq.flip); destroy_workqueue(i915->display.wq.modeset); - intel_fbc_cleanup(i915); + intel_fbc_cleanup(&i915->display); } /* part #3: call after gem init */ diff --git a/drivers/gpu/drm/i915/display/intel_fbc.c b/drivers/gpu/drm/i915/display/intel_fbc.c index ba9820d4b78f..de8caa69a0dd 100644 --- a/drivers/gpu/drm/i915/display/intel_fbc.c +++ b/drivers/gpu/drm/i915/display/intel_fbc.c @@ -61,13 +61,13 @@ #include "intel_fbc_regs.h" #include "intel_frontbuffer.h" -#define for_each_fbc_id(__dev_priv, __fbc_id) \ +#define for_each_fbc_id(__display, __fbc_id) \ for ((__fbc_id) = INTEL_FBC_A; (__fbc_id) < I915_MAX_FBCS; (__fbc_id)++) \ - for_each_if(DISPLAY_RUNTIME_INFO(__dev_priv)->fbc_mask & BIT(__fbc_id)) + for_each_if(DISPLAY_RUNTIME_INFO(__display)->fbc_mask & BIT(__fbc_id)) -#define for_each_intel_fbc(__dev_priv, __fbc, __fbc_id) \ - for_each_fbc_id((__dev_priv), (__fbc_id)) \ - for_each_if((__fbc) = (__dev_priv)->display.fbc[(__fbc_id)]) +#define for_each_intel_fbc(__display, __fbc, __fbc_id) \ + for_each_fbc_id((__display), (__fbc_id)) \ + for_each_if((__fbc) = (__display)->fbc[(__fbc_id)]) struct intel_fbc_funcs { void (*activate)(struct intel_fbc *fbc); @@ -90,7 +90,7 @@ struct intel_fbc_state { }; struct intel_fbc { - struct drm_i915_private *i915; + struct intel_display *display; const struct intel_fbc_funcs *funcs; /* @@ -151,7 +151,7 @@ static unsigned int _intel_fbc_cfb_stride(const struct intel_plane_state *plane_ /* minimum acceptable cfb stride in bytes, assuming 1:1 compression limit */ static unsigned int skl_fbc_min_cfb_stride(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); unsigned int limit = 4; /* 1:4 compression limit is the worst case */ unsigned int cpp = 4; /* FBC always 4 bytes per pixel */ unsigned int width = drm_rect_width(&plane_state->uapi.src) >> 16; @@ -165,7 +165,7 @@ static unsigned int skl_fbc_min_cfb_stride(const struct intel_plane_state *plane * Wa_16011863758: icl+ * Avoid some hardware segment address miscalculation. */ - if (DISPLAY_VER(i915) >= 11) + if (DISPLAY_VER(display) >= 11) stride += 64; /* @@ -181,7 +181,7 @@ static unsigned int skl_fbc_min_cfb_stride(const struct intel_plane_state *plane /* properly aligned cfb stride in bytes, assuming 1:1 compression limit */ static unsigned int intel_fbc_cfb_stride(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); unsigned int stride = _intel_fbc_cfb_stride(plane_state); /* @@ -189,7 +189,7 @@ static unsigned int intel_fbc_cfb_stride(const struct intel_plane_state *plane_s * be 512 byte aligned. Aligning each line to 512 bytes guarantees * that regardless of the compression limit we choose later. */ - if (DISPLAY_VER(i915) >= 9) + if (DISPLAY_VER(display) >= 9) return max(ALIGN(stride, 512), skl_fbc_min_cfb_stride(plane_state)); else return stride; @@ -197,12 +197,12 @@ static unsigned int intel_fbc_cfb_stride(const struct intel_plane_state *plane_s static unsigned int intel_fbc_cfb_size(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); int lines = drm_rect_height(&plane_state->uapi.src) >> 16; - if (DISPLAY_VER(i915) == 7) + if (DISPLAY_VER(display) == 7) lines = min(lines, 2048); - else if (DISPLAY_VER(i915) >= 8) + else if (DISPLAY_VER(display) >= 8) lines = min(lines, 2560); return lines * intel_fbc_cfb_stride(plane_state); @@ -210,7 +210,7 @@ static unsigned int intel_fbc_cfb_size(const struct intel_plane_state *plane_sta static u16 intel_fbc_override_cfb_stride(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); unsigned int stride_aligned = intel_fbc_cfb_stride(plane_state); unsigned int stride = _intel_fbc_cfb_stride(plane_state); const struct drm_framebuffer *fb = plane_state->hw.fb; @@ -223,28 +223,31 @@ static u16 intel_fbc_override_cfb_stride(const struct intel_plane_state *plane_s * we always need to use the override there. */ if (stride != stride_aligned || - (DISPLAY_VER(i915) == 9 && fb->modifier == DRM_FORMAT_MOD_LINEAR)) + (DISPLAY_VER(display) == 9 && fb->modifier == DRM_FORMAT_MOD_LINEAR)) return stride_aligned * 4 / 64; return 0; } -static bool intel_fbc_has_fences(struct drm_i915_private *i915) +static bool intel_fbc_has_fences(struct intel_display *display) { + struct drm_i915_private __maybe_unused *i915 = to_i915(display->drm); + return intel_gt_support_legacy_fencing(to_gt(i915)); } static u32 i8xx_fbc_ctl(struct intel_fbc *fbc) { const struct intel_fbc_state *fbc_state = &fbc->state; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); unsigned int cfb_stride; u32 fbc_ctl; cfb_stride = fbc_state->cfb_stride / fbc->limit; /* FBC_CTL wants 32B or 64B units */ - if (DISPLAY_VER(i915) == 2) + if (DISPLAY_VER(display) == 2) cfb_stride = (cfb_stride / 32) - 1; else cfb_stride = (cfb_stride / 64) - 1; @@ -278,21 +281,21 @@ static u32 i965_fbc_ctl2(struct intel_fbc *fbc) static void i8xx_fbc_deactivate(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; u32 fbc_ctl; /* Disable compression */ - fbc_ctl = intel_de_read(i915, FBC_CONTROL); + fbc_ctl = intel_de_read(display, FBC_CONTROL); if ((fbc_ctl & FBC_CTL_EN) == 0) return; fbc_ctl &= ~FBC_CTL_EN; - intel_de_write(i915, FBC_CONTROL, fbc_ctl); + intel_de_write(display, FBC_CONTROL, fbc_ctl); /* Wait for compressing bit to clear */ - if (intel_de_wait_for_clear(i915, FBC_STATUS, + if (intel_de_wait_for_clear(display, FBC_STATUS, FBC_STAT_COMPRESSING, 10)) { - drm_dbg_kms(&i915->drm, "FBC idle timed out\n"); + drm_dbg_kms(display->drm, "FBC idle timed out\n"); return; } } @@ -300,32 +303,32 @@ static void i8xx_fbc_deactivate(struct intel_fbc *fbc) static void i8xx_fbc_activate(struct intel_fbc *fbc) { const struct intel_fbc_state *fbc_state = &fbc->state; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; int i; /* Clear old tags */ for (i = 0; i < (FBC_LL_SIZE / 32) + 1; i++) - intel_de_write(i915, FBC_TAG(i), 0); + intel_de_write(display, FBC_TAG(i), 0); - if (DISPLAY_VER(i915) == 4) { - intel_de_write(i915, FBC_CONTROL2, + if (DISPLAY_VER(display) == 4) { + intel_de_write(display, FBC_CONTROL2, i965_fbc_ctl2(fbc)); - intel_de_write(i915, FBC_FENCE_OFF, + intel_de_write(display, FBC_FENCE_OFF, fbc_state->fence_y_offset); } - intel_de_write(i915, FBC_CONTROL, + intel_de_write(display, FBC_CONTROL, FBC_CTL_EN | i8xx_fbc_ctl(fbc)); } static bool i8xx_fbc_is_active(struct intel_fbc *fbc) { - return intel_de_read(fbc->i915, FBC_CONTROL) & FBC_CTL_EN; + return intel_de_read(fbc->display, FBC_CONTROL) & FBC_CTL_EN; } static bool i8xx_fbc_is_compressing(struct intel_fbc *fbc) { - return intel_de_read(fbc->i915, FBC_STATUS) & + return intel_de_read(fbc->display, FBC_STATUS) & (FBC_STAT_COMPRESSING | FBC_STAT_COMPRESSED); } @@ -333,7 +336,7 @@ static void i8xx_fbc_nuke(struct intel_fbc *fbc) { struct intel_fbc_state *fbc_state = &fbc->state; enum i9xx_plane_id i9xx_plane = fbc_state->plane->i9xx_plane; - struct drm_i915_private *dev_priv = fbc->i915; + struct drm_i915_private *dev_priv = to_i915(fbc->display->drm); intel_de_write_fw(dev_priv, DSPADDR(dev_priv, i9xx_plane), intel_de_read_fw(dev_priv, DSPADDR(dev_priv, i9xx_plane))); @@ -341,13 +344,14 @@ static void i8xx_fbc_nuke(struct intel_fbc *fbc) static void i8xx_fbc_program_cfb(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); - drm_WARN_ON(&i915->drm, + drm_WARN_ON(display->drm, range_overflows_end_t(u64, i915_gem_stolen_area_address(i915), i915_gem_stolen_node_offset(&fbc->compressed_fb), U32_MAX)); - drm_WARN_ON(&i915->drm, + drm_WARN_ON(display->drm, range_overflows_end_t(u64, i915_gem_stolen_area_address(i915), i915_gem_stolen_node_offset(&fbc->compressed_llb), U32_MAX)); @@ -370,7 +374,7 @@ static void i965_fbc_nuke(struct intel_fbc *fbc) { struct intel_fbc_state *fbc_state = &fbc->state; enum i9xx_plane_id i9xx_plane = fbc_state->plane->i9xx_plane; - struct drm_i915_private *dev_priv = fbc->i915; + struct drm_i915_private *dev_priv = to_i915(fbc->display->drm); intel_de_write_fw(dev_priv, DSPSURF(dev_priv, i9xx_plane), intel_de_read_fw(dev_priv, DSPSURF(dev_priv, i9xx_plane))); @@ -403,7 +407,8 @@ static u32 g4x_dpfc_ctl_limit(struct intel_fbc *fbc) static u32 g4x_dpfc_ctl(struct intel_fbc *fbc) { const struct intel_fbc_state *fbc_state = &fbc->state; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); u32 dpfc_ctl; dpfc_ctl = g4x_dpfc_ctl_limit(fbc) | @@ -415,7 +420,7 @@ static u32 g4x_dpfc_ctl(struct intel_fbc *fbc) if (fbc_state->fence_id >= 0) { dpfc_ctl |= DPFC_CTL_FENCE_EN_G4X; - if (DISPLAY_VER(i915) < 6) + if (DISPLAY_VER(display) < 6) dpfc_ctl |= DPFC_CTL_FENCENO(fbc_state->fence_id); } @@ -425,43 +430,43 @@ static u32 g4x_dpfc_ctl(struct intel_fbc *fbc) static void g4x_fbc_activate(struct intel_fbc *fbc) { const struct intel_fbc_state *fbc_state = &fbc->state; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; - intel_de_write(i915, DPFC_FENCE_YOFF, + intel_de_write(display, DPFC_FENCE_YOFF, fbc_state->fence_y_offset); - intel_de_write(i915, DPFC_CONTROL, + intel_de_write(display, DPFC_CONTROL, DPFC_CTL_EN | g4x_dpfc_ctl(fbc)); } static void g4x_fbc_deactivate(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; u32 dpfc_ctl; /* Disable compression */ - dpfc_ctl = intel_de_read(i915, DPFC_CONTROL); + dpfc_ctl = intel_de_read(display, DPFC_CONTROL); if (dpfc_ctl & DPFC_CTL_EN) { dpfc_ctl &= ~DPFC_CTL_EN; - intel_de_write(i915, DPFC_CONTROL, dpfc_ctl); + intel_de_write(display, DPFC_CONTROL, dpfc_ctl); } } static bool g4x_fbc_is_active(struct intel_fbc *fbc) { - return intel_de_read(fbc->i915, DPFC_CONTROL) & DPFC_CTL_EN; + return intel_de_read(fbc->display, DPFC_CONTROL) & DPFC_CTL_EN; } static bool g4x_fbc_is_compressing(struct intel_fbc *fbc) { - return intel_de_read(fbc->i915, DPFC_STATUS) & DPFC_COMP_SEG_MASK; + return intel_de_read(fbc->display, DPFC_STATUS) & DPFC_COMP_SEG_MASK; } static void g4x_fbc_program_cfb(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; - intel_de_write(i915, DPFC_CB_BASE, + intel_de_write(display, DPFC_CB_BASE, i915_gem_stolen_node_offset(&fbc->compressed_fb)); } @@ -477,43 +482,43 @@ static const struct intel_fbc_funcs g4x_fbc_funcs = { static void ilk_fbc_activate(struct intel_fbc *fbc) { struct intel_fbc_state *fbc_state = &fbc->state; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; - intel_de_write(i915, ILK_DPFC_FENCE_YOFF(fbc->id), + intel_de_write(display, ILK_DPFC_FENCE_YOFF(fbc->id), fbc_state->fence_y_offset); - intel_de_write(i915, ILK_DPFC_CONTROL(fbc->id), + intel_de_write(display, ILK_DPFC_CONTROL(fbc->id), DPFC_CTL_EN | g4x_dpfc_ctl(fbc)); } static void ilk_fbc_deactivate(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; u32 dpfc_ctl; /* Disable compression */ - dpfc_ctl = intel_de_read(i915, ILK_DPFC_CONTROL(fbc->id)); + dpfc_ctl = intel_de_read(display, ILK_DPFC_CONTROL(fbc->id)); if (dpfc_ctl & DPFC_CTL_EN) { dpfc_ctl &= ~DPFC_CTL_EN; - intel_de_write(i915, ILK_DPFC_CONTROL(fbc->id), dpfc_ctl); + intel_de_write(display, ILK_DPFC_CONTROL(fbc->id), dpfc_ctl); } } static bool ilk_fbc_is_active(struct intel_fbc *fbc) { - return intel_de_read(fbc->i915, ILK_DPFC_CONTROL(fbc->id)) & DPFC_CTL_EN; + return intel_de_read(fbc->display, ILK_DPFC_CONTROL(fbc->id)) & DPFC_CTL_EN; } static bool ilk_fbc_is_compressing(struct intel_fbc *fbc) { - return intel_de_read(fbc->i915, ILK_DPFC_STATUS(fbc->id)) & DPFC_COMP_SEG_MASK; + return intel_de_read(fbc->display, ILK_DPFC_STATUS(fbc->id)) & DPFC_COMP_SEG_MASK; } static void ilk_fbc_program_cfb(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; - intel_de_write(i915, ILK_DPFC_CB_BASE(fbc->id), + intel_de_write(display, ILK_DPFC_CB_BASE(fbc->id), i915_gem_stolen_node_offset(&fbc->compressed_fb)); } @@ -529,14 +534,14 @@ static const struct intel_fbc_funcs ilk_fbc_funcs = { static void snb_fbc_program_fence(struct intel_fbc *fbc) { const struct intel_fbc_state *fbc_state = &fbc->state; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; u32 ctl = 0; if (fbc_state->fence_id >= 0) ctl = SNB_DPFC_FENCE_EN | SNB_DPFC_FENCENO(fbc_state->fence_id); - intel_de_write(i915, SNB_DPFC_CTL_SA, ctl); - intel_de_write(i915, SNB_DPFC_CPU_FENCE_OFFSET, fbc_state->fence_y_offset); + intel_de_write(display, SNB_DPFC_CTL_SA, ctl); + intel_de_write(display, SNB_DPFC_CPU_FENCE_OFFSET, fbc_state->fence_y_offset); } static void snb_fbc_activate(struct intel_fbc *fbc) @@ -548,10 +553,10 @@ static void snb_fbc_activate(struct intel_fbc *fbc) static void snb_fbc_nuke(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; - intel_de_write(i915, MSG_FBC_REND_STATE(fbc->id), FBC_REND_NUKE); - intel_de_posting_read(i915, MSG_FBC_REND_STATE(fbc->id)); + intel_de_write(display, MSG_FBC_REND_STATE(fbc->id), FBC_REND_NUKE); + intel_de_posting_read(display, MSG_FBC_REND_STATE(fbc->id)); } static const struct intel_fbc_funcs snb_fbc_funcs = { @@ -566,20 +571,20 @@ static const struct intel_fbc_funcs snb_fbc_funcs = { static void glk_fbc_program_cfb_stride(struct intel_fbc *fbc) { const struct intel_fbc_state *fbc_state = &fbc->state; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; u32 val = 0; if (fbc_state->override_cfb_stride) val |= FBC_STRIDE_OVERRIDE | FBC_STRIDE(fbc_state->override_cfb_stride / fbc->limit); - intel_de_write(i915, GLK_FBC_STRIDE(fbc->id), val); + intel_de_write(display, GLK_FBC_STRIDE(fbc->id), val); } static void skl_fbc_program_cfb_stride(struct intel_fbc *fbc) { const struct intel_fbc_state *fbc_state = &fbc->state; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; u32 val = 0; /* Display WA #0529: skl, kbl, bxt. */ @@ -587,7 +592,7 @@ static void skl_fbc_program_cfb_stride(struct intel_fbc *fbc) val |= CHICKEN_FBC_STRIDE_OVERRIDE | CHICKEN_FBC_STRIDE(fbc_state->override_cfb_stride / fbc->limit); - intel_de_rmw(i915, CHICKEN_MISC_4, + intel_de_rmw(display, CHICKEN_MISC_4, CHICKEN_FBC_STRIDE_OVERRIDE | CHICKEN_FBC_STRIDE_MASK, val); } @@ -595,7 +600,8 @@ static void skl_fbc_program_cfb_stride(struct intel_fbc *fbc) static u32 ivb_dpfc_ctl(struct intel_fbc *fbc) { const struct intel_fbc_state *fbc_state = &fbc->state; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); u32 dpfc_ctl; dpfc_ctl = g4x_dpfc_ctl_limit(fbc); @@ -603,7 +609,7 @@ static u32 ivb_dpfc_ctl(struct intel_fbc *fbc) if (IS_IVYBRIDGE(i915)) dpfc_ctl |= DPFC_CTL_PLANE_IVB(fbc_state->plane->i9xx_plane); - if (DISPLAY_VER(i915) >= 20) + if (DISPLAY_VER(display) >= 20) dpfc_ctl |= DPFC_CTL_PLANE_BINDING(fbc_state->plane->id); if (fbc_state->fence_id >= 0) @@ -617,35 +623,35 @@ static u32 ivb_dpfc_ctl(struct intel_fbc *fbc) static void ivb_fbc_activate(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; u32 dpfc_ctl; - if (DISPLAY_VER(i915) >= 10) + if (DISPLAY_VER(display) >= 10) glk_fbc_program_cfb_stride(fbc); - else if (DISPLAY_VER(i915) == 9) + else if (DISPLAY_VER(display) == 9) skl_fbc_program_cfb_stride(fbc); - if (intel_fbc_has_fences(i915)) + if (intel_fbc_has_fences(display)) snb_fbc_program_fence(fbc); /* wa_14019417088 Alternative WA*/ dpfc_ctl = ivb_dpfc_ctl(fbc); - if (DISPLAY_VER(i915) >= 20) - intel_de_write(i915, ILK_DPFC_CONTROL(fbc->id), dpfc_ctl); + if (DISPLAY_VER(display) >= 20) + intel_de_write(display, ILK_DPFC_CONTROL(fbc->id), dpfc_ctl); - intel_de_write(i915, ILK_DPFC_CONTROL(fbc->id), + intel_de_write(display, ILK_DPFC_CONTROL(fbc->id), DPFC_CTL_EN | dpfc_ctl); } static bool ivb_fbc_is_compressing(struct intel_fbc *fbc) { - return intel_de_read(fbc->i915, ILK_DPFC_STATUS2(fbc->id)) & DPFC_COMP_SEG_MASK_IVB; + return intel_de_read(fbc->display, ILK_DPFC_STATUS2(fbc->id)) & DPFC_COMP_SEG_MASK_IVB; } static void ivb_fbc_set_false_color(struct intel_fbc *fbc, bool enable) { - intel_de_rmw(fbc->i915, ILK_DPFC_CONTROL(fbc->id), + intel_de_rmw(fbc->display, ILK_DPFC_CONTROL(fbc->id), DPFC_CTL_FALSE_COLOR, enable ? DPFC_CTL_FALSE_COLOR : 0); } @@ -690,10 +696,10 @@ static bool intel_fbc_is_compressing(struct intel_fbc *fbc) static void intel_fbc_nuke(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; lockdep_assert_held(&fbc->lock); - drm_WARN_ON(&i915->drm, fbc->flip_pending); + drm_WARN_ON(display->drm, fbc->flip_pending); trace_intel_fbc_nuke(fbc->state.plane); @@ -720,29 +726,32 @@ static void intel_fbc_deactivate(struct intel_fbc *fbc, const char *reason) fbc->no_fbc_reason = reason; } -static u64 intel_fbc_cfb_base_max(struct drm_i915_private *i915) +static u64 intel_fbc_cfb_base_max(struct intel_display *display) { - if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) + struct drm_i915_private *i915 = to_i915(display->drm); + + if (DISPLAY_VER(display) >= 5 || IS_G4X(i915)) return BIT_ULL(28); else return BIT_ULL(32); } -static u64 intel_fbc_stolen_end(struct drm_i915_private *i915) +static u64 intel_fbc_stolen_end(struct intel_display *display) { + struct drm_i915_private __maybe_unused *i915 = to_i915(display->drm); u64 end; /* The FBC hardware for BDW/SKL doesn't have access to the stolen * reserved range size, so it always assumes the maximum (8mb) is used. * If we enable FBC using a CFB on that memory range we'll get FIFO * underruns, even if that range is not reserved by the BIOS. */ - if (IS_BROADWELL(i915) || - (DISPLAY_VER(i915) == 9 && !IS_BROXTON(i915))) + if (IS_BROADWELL(to_i915(display->drm)) || + (DISPLAY_VER(display) == 9 && !IS_BROXTON(to_i915(display->drm)))) end = i915_gem_stolen_area_size(i915) - 8 * 1024 * 1024; else end = U64_MAX; - return min(end, intel_fbc_cfb_base_max(i915)); + return min(end, intel_fbc_cfb_base_max(display)); } static int intel_fbc_min_limit(const struct intel_plane_state *plane_state) @@ -750,8 +759,10 @@ static int intel_fbc_min_limit(const struct intel_plane_state *plane_state) return plane_state->hw.fb->format->cpp[0] == 2 ? 2 : 1; } -static int intel_fbc_max_limit(struct drm_i915_private *i915) +static int intel_fbc_max_limit(struct intel_display *display) { + struct drm_i915_private *i915 = to_i915(display->drm); + /* WaFbcOnly1to1Ratio:ctg */ if (IS_G4X(i915)) return 1; @@ -766,8 +777,9 @@ static int intel_fbc_max_limit(struct drm_i915_private *i915) static int find_compression_limit(struct intel_fbc *fbc, unsigned int size, int min_limit) { - struct drm_i915_private *i915 = fbc->i915; - u64 end = intel_fbc_stolen_end(i915); + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); + u64 end = intel_fbc_stolen_end(display); int ret, limit = min_limit; size /= limit; @@ -778,7 +790,7 @@ static int find_compression_limit(struct intel_fbc *fbc, if (ret == 0) return limit; - for (; limit <= intel_fbc_max_limit(i915); limit <<= 1) { + for (; limit <= intel_fbc_max_limit(display); limit <<= 1) { ret = i915_gem_stolen_insert_node_in_range(i915, &fbc->compressed_fb, size >>= 1, 4096, 0, end); if (ret == 0) @@ -791,15 +803,16 @@ static int find_compression_limit(struct intel_fbc *fbc, static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, unsigned int size, int min_limit) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); int ret; - drm_WARN_ON(&i915->drm, + drm_WARN_ON(display->drm, i915_gem_stolen_node_allocated(&fbc->compressed_fb)); - drm_WARN_ON(&i915->drm, + drm_WARN_ON(display->drm, i915_gem_stolen_node_allocated(&fbc->compressed_llb)); - if (DISPLAY_VER(i915) < 5 && !IS_G4X(i915)) { + if (DISPLAY_VER(display) < 5 && !IS_G4X(to_i915(display->drm))) { ret = i915_gem_stolen_insert_node(i915, &fbc->compressed_llb, 4096, 4096); if (ret) @@ -810,12 +823,12 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, if (!ret) goto err_llb; else if (ret > min_limit) - drm_info_once(&i915->drm, + drm_info_once(display->drm, "Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS.\n"); fbc->limit = ret; - drm_dbg_kms(&i915->drm, + drm_dbg_kms(display->drm, "reserved %llu bytes of contiguous stolen space for FBC, limit: %d\n", i915_gem_stolen_node_size(&fbc->compressed_fb), fbc->limit); return 0; @@ -825,7 +838,8 @@ static int intel_fbc_alloc_cfb(struct intel_fbc *fbc, i915_gem_stolen_remove_node(i915, &fbc->compressed_llb); err: if (i915_gem_stolen_initialized(i915)) - drm_info_once(&i915->drm, "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); + drm_info_once(display->drm, + "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); return -ENOSPC; } @@ -836,14 +850,15 @@ static void intel_fbc_program_cfb(struct intel_fbc *fbc) static void intel_fbc_program_workarounds(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); if (IS_SKYLAKE(i915) || IS_BROXTON(i915)) { /* * WaFbcHighMemBwCorruptionAvoidance:skl,bxt * Display WA #0883: skl,bxt */ - intel_de_rmw(i915, ILK_DPFC_CHICKEN(fbc->id), + intel_de_rmw(display, ILK_DPFC_CHICKEN(fbc->id), 0, DPFC_DISABLE_DUMMY0); } @@ -853,24 +868,25 @@ static void intel_fbc_program_workarounds(struct intel_fbc *fbc) * WaFbcNukeOnHostModify:skl,kbl,cfl * Display WA #0873: skl,kbl,cfl */ - intel_de_rmw(i915, ILK_DPFC_CHICKEN(fbc->id), + intel_de_rmw(display, ILK_DPFC_CHICKEN(fbc->id), 0, DPFC_NUKE_ON_ANY_MODIFICATION); } /* Wa_1409120013:icl,jsl,tgl,dg1 */ - if (IS_DISPLAY_VER(i915, 11, 12)) - intel_de_rmw(i915, ILK_DPFC_CHICKEN(fbc->id), + if (IS_DISPLAY_VER(display, 11, 12)) + intel_de_rmw(display, ILK_DPFC_CHICKEN(fbc->id), 0, DPFC_CHICKEN_COMP_DUMMY_PIXEL); /* Wa_22014263786:icl,jsl,tgl,dg1,rkl,adls,adlp,mtl */ - if (DISPLAY_VER(i915) >= 11 && !IS_DG2(i915)) - intel_de_rmw(i915, ILK_DPFC_CHICKEN(fbc->id), + if (DISPLAY_VER(display) >= 11 && !IS_DG2(i915)) + intel_de_rmw(display, ILK_DPFC_CHICKEN(fbc->id), 0, DPFC_CHICKEN_FORCE_SLB_INVALIDATION); } static void __intel_fbc_cleanup_cfb(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); if (WARN_ON(intel_fbc_hw_is_active(fbc))) return; @@ -881,12 +897,12 @@ static void __intel_fbc_cleanup_cfb(struct intel_fbc *fbc) i915_gem_stolen_remove_node(i915, &fbc->compressed_fb); } -void intel_fbc_cleanup(struct drm_i915_private *i915) +void intel_fbc_cleanup(struct intel_display *display) { struct intel_fbc *fbc; enum intel_fbc_id fbc_id; - for_each_intel_fbc(i915, fbc, fbc_id) { + for_each_intel_fbc(display, fbc, fbc_id) { mutex_lock(&fbc->lock); __intel_fbc_cleanup_cfb(fbc); mutex_unlock(&fbc->lock); @@ -938,15 +954,16 @@ static bool icl_fbc_stride_is_valid(const struct intel_plane_state *plane_state) static bool stride_is_valid(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); + struct drm_i915_private *i915 = to_i915(display->drm); - if (DISPLAY_VER(i915) >= 11) + if (DISPLAY_VER(display) >= 11) return icl_fbc_stride_is_valid(plane_state); - else if (DISPLAY_VER(i915) >= 9) + else if (DISPLAY_VER(display) >= 9) return skl_fbc_stride_is_valid(plane_state); - else if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) + else if (DISPLAY_VER(display) >= 5 || IS_G4X(i915)) return g4x_fbc_stride_is_valid(plane_state); - else if (DISPLAY_VER(i915) == 4) + else if (DISPLAY_VER(display) == 4) return i965_fbc_stride_is_valid(plane_state); else return i8xx_fbc_stride_is_valid(plane_state); @@ -954,7 +971,7 @@ static bool stride_is_valid(const struct intel_plane_state *plane_state) static bool i8xx_fbc_pixel_format_is_valid(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); const struct drm_framebuffer *fb = plane_state->hw.fb; switch (fb->format->format) { @@ -964,7 +981,7 @@ static bool i8xx_fbc_pixel_format_is_valid(const struct intel_plane_state *plane case DRM_FORMAT_XRGB1555: case DRM_FORMAT_RGB565: /* 16bpp not supported on gen2 */ - if (DISPLAY_VER(i915) == 2) + if (DISPLAY_VER(display) == 2) return false; return true; default: @@ -974,7 +991,8 @@ static bool i8xx_fbc_pixel_format_is_valid(const struct intel_plane_state *plane static bool g4x_fbc_pixel_format_is_valid(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); + struct drm_i915_private *i915 = to_i915(display->drm); const struct drm_framebuffer *fb = plane_state->hw.fb; switch (fb->format->format) { @@ -1009,11 +1027,12 @@ static bool lnl_fbc_pixel_format_is_valid(const struct intel_plane_state *plane_ static bool pixel_format_is_valid(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); + struct drm_i915_private *i915 = to_i915(display->drm); - if (DISPLAY_VER(i915) >= 20) + if (DISPLAY_VER(display) >= 20) return lnl_fbc_pixel_format_is_valid(plane_state); - else if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) + else if (DISPLAY_VER(display) >= 5 || IS_G4X(i915)) return g4x_fbc_pixel_format_is_valid(plane_state); else return i8xx_fbc_pixel_format_is_valid(plane_state); @@ -1043,11 +1062,12 @@ static bool skl_fbc_rotation_is_valid(const struct intel_plane_state *plane_stat static bool rotation_is_valid(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); + struct drm_i915_private *i915 = to_i915(display->drm); - if (DISPLAY_VER(i915) >= 9) + if (DISPLAY_VER(display) >= 9) return skl_fbc_rotation_is_valid(plane_state); - else if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) + else if (DISPLAY_VER(display) >= 5 || IS_G4X(i915)) return g4x_fbc_rotation_is_valid(plane_state); else return i8xx_fbc_rotation_is_valid(plane_state); @@ -1061,19 +1081,20 @@ static bool rotation_is_valid(const struct intel_plane_state *plane_state) */ static bool intel_fbc_hw_tracking_covers_screen(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); + struct drm_i915_private *i915 = to_i915(display->drm); unsigned int effective_w, effective_h, max_w, max_h; - if (DISPLAY_VER(i915) >= 11) { + if (DISPLAY_VER(display) >= 11) { max_w = 8192; max_h = 4096; - } else if (DISPLAY_VER(i915) >= 10) { + } else if (DISPLAY_VER(display) >= 10) { max_w = 5120; max_h = 4096; - } else if (DISPLAY_VER(i915) >= 7) { + } else if (DISPLAY_VER(display) >= 7) { max_w = 4096; max_h = 4096; - } else if (IS_G4X(i915) || DISPLAY_VER(i915) >= 5) { + } else if (IS_G4X(i915) || DISPLAY_VER(display) >= 5) { max_w = 4096; max_h = 2048; } else { @@ -1091,16 +1112,17 @@ static bool intel_fbc_hw_tracking_covers_screen(const struct intel_plane_state * static bool intel_fbc_plane_size_valid(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); + struct drm_i915_private *i915 = to_i915(display->drm); unsigned int w, h, max_w, max_h; - if (DISPLAY_VER(i915) >= 10) { + if (DISPLAY_VER(display) >= 10) { max_w = 5120; max_h = 4096; - } else if (DISPLAY_VER(i915) >= 8 || IS_HASWELL(i915)) { + } else if (DISPLAY_VER(display) >= 8 || IS_HASWELL(i915)) { max_w = 4096; max_h = 4096; - } else if (IS_G4X(i915) || DISPLAY_VER(i915) >= 5) { + } else if (IS_G4X(i915) || DISPLAY_VER(display) >= 5) { max_w = 4096; max_h = 2048; } else { @@ -1128,9 +1150,9 @@ static bool skl_fbc_tiling_valid(const struct intel_plane_state *plane_state) static bool tiling_is_valid(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); - if (DISPLAY_VER(i915) >= 9) + if (DISPLAY_VER(display) >= 9) return skl_fbc_tiling_valid(plane_state); else return i8xx_fbc_tiling_valid(plane_state); @@ -1140,7 +1162,7 @@ static void intel_fbc_update_state(struct intel_atomic_state *state, struct intel_crtc *crtc, struct intel_plane *plane) { - struct drm_i915_private *i915 = to_i915(state->base.dev); + struct intel_display *display = to_intel_display(state->base.dev); const struct intel_crtc_state *crtc_state = intel_atomic_get_new_crtc_state(state, crtc); const struct intel_plane_state *plane_state = @@ -1158,8 +1180,8 @@ static void intel_fbc_update_state(struct intel_atomic_state *state, fbc_state->fence_y_offset = intel_plane_fence_y_offset(plane_state); - drm_WARN_ON(&i915->drm, plane_state->flags & PLANE_HAS_FENCE && - !intel_fbc_has_fences(i915)); + drm_WARN_ON(display->drm, plane_state->flags & PLANE_HAS_FENCE && + !intel_fbc_has_fences(display)); if (plane_state->flags & PLANE_HAS_FENCE) fbc_state->fence_id = i915_vma_fence_id(plane_state->ggtt_vma); @@ -1173,7 +1195,7 @@ static void intel_fbc_update_state(struct intel_atomic_state *state, static bool intel_fbc_is_fence_ok(const struct intel_plane_state *plane_state) { - struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev); + struct intel_display *display = to_intel_display(plane_state->uapi.plane->dev); /* * The use of a CPU fence is one of two ways to detect writes by the @@ -1187,7 +1209,7 @@ static bool intel_fbc_is_fence_ok(const struct intel_plane_state *plane_state) * so have no fence associated with it) due to aperture constraints * at the time of pinning. */ - return DISPLAY_VER(i915) >= 9 || + return DISPLAY_VER(display) >= 9 || (plane_state->flags & PLANE_HAS_FENCE && i915_vma_fence_id(plane_state->ggtt_vma) != -1); } @@ -1212,7 +1234,8 @@ static bool intel_fbc_is_ok(const struct intel_plane_state *plane_state) static int intel_fbc_check_plane(struct intel_atomic_state *state, struct intel_plane *plane) { - struct drm_i915_private *i915 = to_i915(state->base.dev); + struct intel_display *display = to_intel_display(state->base.dev); + struct drm_i915_private *i915 = to_i915(display->drm); struct intel_plane_state *plane_state = intel_atomic_get_new_plane_state(state, plane); const struct drm_framebuffer *fb = plane_state->hw.fb; @@ -1233,7 +1256,7 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, return 0; } - if (!i915->display.params.enable_fbc) { + if (!display->params.enable_fbc) { plane_state->no_fbc_reason = "disabled per module param or by default"; return 0; } @@ -1271,14 +1294,14 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, * Recommendation is to keep this combination disabled * Bspec: 50422 HSD: 14010260002 */ - if (IS_DISPLAY_VER(i915, 12, 14) && crtc_state->has_sel_update && + if (IS_DISPLAY_VER(display, 12, 14) && crtc_state->has_sel_update && !crtc_state->has_panel_replay) { plane_state->no_fbc_reason = "PSR2 enabled"; return 0; } /* Wa_14016291713 */ - if ((IS_DISPLAY_VER(i915, 12, 13) || + if ((IS_DISPLAY_VER(display, 12, 13) || IS_DISPLAY_IP_STEP(i915, IP_VER(14, 0), STEP_A0, STEP_C0)) && crtc_state->has_psr && !crtc_state->has_panel_replay) { plane_state->no_fbc_reason = "PSR1 enabled (Wa_14016291713)"; @@ -1305,7 +1328,7 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, return 0; } - if (DISPLAY_VER(i915) < 20 && + if (DISPLAY_VER(display) < 20 && plane_state->hw.pixel_blend_mode != DRM_MODE_BLEND_PIXEL_NONE && fb->format->has_alpha) { plane_state->no_fbc_reason = "per-pixel alpha not supported"; @@ -1327,14 +1350,14 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state, * having a Y offset that isn't divisible by 4 causes FIFO underrun * and screen flicker. */ - if (DISPLAY_VER(i915) >= 9 && + if (DISPLAY_VER(display) >= 9 && plane_state->view.color_plane[0].y & 3) { plane_state->no_fbc_reason = "plane start Y offset misaligned"; return 0; } /* Wa_22010751166: icl, ehl, tgl, dg1, rkl */ - if (DISPLAY_VER(i915) >= 11 && + if (DISPLAY_VER(display) >= 11 && (plane_state->view.color_plane[0].y + (drm_rect_height(&plane_state->uapi.src) >> 16)) & 3) { plane_state->no_fbc_reason = "plane end Y offset misaligned"; @@ -1410,7 +1433,7 @@ static bool __intel_fbc_pre_update(struct intel_atomic_state *state, struct intel_crtc *crtc, struct intel_plane *plane) { - struct drm_i915_private *i915 = to_i915(state->base.dev); + struct intel_display *display = to_intel_display(state->base.dev); struct intel_fbc *fbc = plane->fbc; bool need_vblank_wait = false; @@ -1436,7 +1459,7 @@ static bool __intel_fbc_pre_update(struct intel_atomic_state *state, * and skipping the extra vblank wait before the plane update * if at least one frame has already passed. */ - if (fbc->activated && DISPLAY_VER(i915) >= 10) + if (fbc->activated && DISPLAY_VER(display) >= 10) need_vblank_wait = true; fbc->activated = false; @@ -1470,13 +1493,13 @@ bool intel_fbc_pre_update(struct intel_atomic_state *state, static void __intel_fbc_disable(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; struct intel_plane *plane = fbc->state.plane; lockdep_assert_held(&fbc->lock); - drm_WARN_ON(&i915->drm, fbc->active); + drm_WARN_ON(display->drm, fbc->active); - drm_dbg_kms(&i915->drm, "Disabling FBC on [PLANE:%d:%s]\n", + drm_dbg_kms(display->drm, "Disabling FBC on [PLANE:%d:%s]\n", plane->base.base.id, plane->base.name); __intel_fbc_cleanup_cfb(fbc); @@ -1553,7 +1576,7 @@ void intel_fbc_invalidate(struct drm_i915_private *i915, struct intel_fbc *fbc; enum intel_fbc_id fbc_id; - for_each_intel_fbc(i915, fbc, fbc_id) + for_each_intel_fbc(&i915->display, fbc, fbc_id) __intel_fbc_invalidate(fbc, frontbuffer_bits, origin); } @@ -1592,7 +1615,7 @@ void intel_fbc_flush(struct drm_i915_private *i915, struct intel_fbc *fbc; enum intel_fbc_id fbc_id; - for_each_intel_fbc(i915, fbc, fbc_id) + for_each_intel_fbc(&i915->display, fbc, fbc_id) __intel_fbc_flush(fbc, frontbuffer_bits, origin); } @@ -1617,7 +1640,7 @@ static void __intel_fbc_enable(struct intel_atomic_state *state, struct intel_crtc *crtc, struct intel_plane *plane) { - struct drm_i915_private *i915 = to_i915(state->base.dev); + struct intel_display *display = to_intel_display(state->base.dev); const struct intel_plane_state *plane_state = intel_atomic_get_new_plane_state(state, plane); struct intel_fbc *fbc = plane->fbc; @@ -1636,7 +1659,7 @@ static void __intel_fbc_enable(struct intel_atomic_state *state, __intel_fbc_disable(fbc); } - drm_WARN_ON(&i915->drm, fbc->active); + drm_WARN_ON(display->drm, fbc->active); fbc->no_fbc_reason = plane_state->no_fbc_reason; if (fbc->no_fbc_reason) @@ -1658,7 +1681,7 @@ static void __intel_fbc_enable(struct intel_atomic_state *state, return; } - drm_dbg_kms(&i915->drm, "Enabling FBC on [PLANE:%d:%s]\n", + drm_dbg_kms(display->drm, "Enabling FBC on [PLANE:%d:%s]\n", plane->base.base.id, plane->base.name); fbc->no_fbc_reason = "FBC enabled but not active yet\n"; @@ -1676,10 +1699,10 @@ static void __intel_fbc_enable(struct intel_atomic_state *state, */ void intel_fbc_disable(struct intel_crtc *crtc) { - struct drm_i915_private *i915 = to_i915(crtc->base.dev); + struct intel_display *display = to_intel_display(crtc->base.dev); struct intel_plane *plane; - for_each_intel_plane(&i915->drm, plane) { + for_each_intel_plane(display->drm, plane) { struct intel_fbc *fbc = plane->fbc; if (!fbc || plane->pipe != crtc->pipe) @@ -1724,7 +1747,8 @@ void intel_fbc_update(struct intel_atomic_state *state, static void intel_fbc_underrun_work_fn(struct work_struct *work) { struct intel_fbc *fbc = container_of(work, typeof(*fbc), underrun_work); - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); mutex_lock(&fbc->lock); @@ -1732,7 +1756,7 @@ static void intel_fbc_underrun_work_fn(struct work_struct *work) if (fbc->underrun_detected || !fbc->state.plane) goto out; - drm_dbg_kms(&i915->drm, "Disabling FBC due to FIFO underrun.\n"); + drm_dbg_kms(display->drm, "Disabling FBC due to FIFO underrun.\n"); fbc->underrun_detected = true; intel_fbc_deactivate(fbc, "FIFO underrun"); @@ -1745,14 +1769,14 @@ static void intel_fbc_underrun_work_fn(struct work_struct *work) static void __intel_fbc_reset_underrun(struct intel_fbc *fbc) { - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; cancel_work_sync(&fbc->underrun_work); mutex_lock(&fbc->lock); if (fbc->underrun_detected) { - drm_dbg_kms(&i915->drm, + drm_dbg_kms(display->drm, "Re-allowing FBC after fifo underrun\n"); fbc->no_fbc_reason = "FIFO underrun cleared"; } @@ -1763,22 +1787,24 @@ static void __intel_fbc_reset_underrun(struct intel_fbc *fbc) /* * intel_fbc_reset_underrun - reset FBC fifo underrun status. - * @i915: the i915 device + * @display: display * * See intel_fbc_handle_fifo_underrun_irq(). For automated testing we * want to re-enable FBC after an underrun to increase test coverage. */ -void intel_fbc_reset_underrun(struct drm_i915_private *i915) +void intel_fbc_reset_underrun(struct intel_display *display) { struct intel_fbc *fbc; enum intel_fbc_id fbc_id; - for_each_intel_fbc(i915, fbc, fbc_id) + for_each_intel_fbc(display, fbc, fbc_id) __intel_fbc_reset_underrun(fbc); } static void __intel_fbc_handle_fifo_underrun_irq(struct intel_fbc *fbc) { + struct drm_i915_private *i915 = to_i915(fbc->display->drm); + /* * There's no guarantee that underrun_detected won't be set to true * right after this check and before the work is scheduled, but that's @@ -1790,12 +1816,12 @@ static void __intel_fbc_handle_fifo_underrun_irq(struct intel_fbc *fbc) if (READ_ONCE(fbc->underrun_detected)) return; - queue_work(fbc->i915->unordered_wq, &fbc->underrun_work); + queue_work(i915->unordered_wq, &fbc->underrun_work); } /** * intel_fbc_handle_fifo_underrun_irq - disable FBC when we get a FIFO underrun - * @i915: i915 device + * @display: display * * Without FBC, most underruns are harmless and don't really cause too many * problems, except for an annoying message on dmesg. With FBC, underruns can @@ -1807,12 +1833,12 @@ static void __intel_fbc_handle_fifo_underrun_irq(struct intel_fbc *fbc) * * This function is called from the IRQ handler. */ -void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *i915) +void intel_fbc_handle_fifo_underrun_irq(struct intel_display *display) { struct intel_fbc *fbc; enum intel_fbc_id fbc_id; - for_each_intel_fbc(i915, fbc, fbc_id) + for_each_intel_fbc(display, fbc, fbc_id) __intel_fbc_handle_fifo_underrun_irq(fbc); } @@ -1825,15 +1851,17 @@ void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *i915) * space to change the value during runtime without sanitizing it again. IGT * relies on being able to change i915.enable_fbc at runtime. */ -static int intel_sanitize_fbc_option(struct drm_i915_private *i915) +static int intel_sanitize_fbc_option(struct intel_display *display) { - if (i915->display.params.enable_fbc >= 0) - return !!i915->display.params.enable_fbc; + struct drm_i915_private *i915 = to_i915(display->drm); - if (!HAS_FBC(i915)) + if (display->params.enable_fbc >= 0) + return !!display->params.enable_fbc; + + if (!HAS_FBC(display)) return 0; - if (IS_BROADWELL(i915) || DISPLAY_VER(i915) >= 9) + if (IS_BROADWELL(i915) || DISPLAY_VER(display) >= 9) return 1; return 0; @@ -1844,9 +1872,10 @@ void intel_fbc_add_plane(struct intel_fbc *fbc, struct intel_plane *plane) plane->fbc = fbc; } -static struct intel_fbc *intel_fbc_create(struct drm_i915_private *i915, +static struct intel_fbc *intel_fbc_create(struct intel_display *display, enum intel_fbc_id fbc_id) { + struct drm_i915_private *i915 = to_i915(display->drm); struct intel_fbc *fbc; fbc = kzalloc(sizeof(*fbc), GFP_KERNEL); @@ -1854,19 +1883,19 @@ static struct intel_fbc *intel_fbc_create(struct drm_i915_private *i915, return NULL; fbc->id = fbc_id; - fbc->i915 = i915; + fbc->display = display; INIT_WORK(&fbc->underrun_work, intel_fbc_underrun_work_fn); mutex_init(&fbc->lock); - if (DISPLAY_VER(i915) >= 7) + if (DISPLAY_VER(display) >= 7) fbc->funcs = &ivb_fbc_funcs; - else if (DISPLAY_VER(i915) == 6) + else if (DISPLAY_VER(display) == 6) fbc->funcs = &snb_fbc_funcs; - else if (DISPLAY_VER(i915) == 5) + else if (DISPLAY_VER(display) == 5) fbc->funcs = &ilk_fbc_funcs; else if (IS_G4X(i915)) fbc->funcs = &g4x_fbc_funcs; - else if (DISPLAY_VER(i915) == 4) + else if (DISPLAY_VER(display) == 4) fbc->funcs = &i965_fbc_funcs; else fbc->funcs = &i8xx_fbc_funcs; @@ -1876,36 +1905,36 @@ static struct intel_fbc *intel_fbc_create(struct drm_i915_private *i915, /** * intel_fbc_init - Initialize FBC - * @i915: the i915 device + * @display: display * * This function might be called during PM init process. */ -void intel_fbc_init(struct drm_i915_private *i915) +void intel_fbc_init(struct intel_display *display) { enum intel_fbc_id fbc_id; - i915->display.params.enable_fbc = intel_sanitize_fbc_option(i915); - drm_dbg_kms(&i915->drm, "Sanitized enable_fbc value: %d\n", - i915->display.params.enable_fbc); + display->params.enable_fbc = intel_sanitize_fbc_option(display); + drm_dbg_kms(display->drm, "Sanitized enable_fbc value: %d\n", + display->params.enable_fbc); - for_each_fbc_id(i915, fbc_id) - i915->display.fbc[fbc_id] = intel_fbc_create(i915, fbc_id); + for_each_fbc_id(display, fbc_id) + display->fbc[fbc_id] = intel_fbc_create(display, fbc_id); } /** * intel_fbc_sanitize - Sanitize FBC - * @i915: the i915 device + * @display: display * * Make sure FBC is initially disabled since we have no * idea eg. into which parts of stolen it might be scribbling * into. */ -void intel_fbc_sanitize(struct drm_i915_private *i915) +void intel_fbc_sanitize(struct intel_display *display) { struct intel_fbc *fbc; enum intel_fbc_id fbc_id; - for_each_intel_fbc(i915, fbc, fbc_id) { + for_each_intel_fbc(display, fbc, fbc_id) { if (intel_fbc_hw_is_active(fbc)) intel_fbc_hw_deactivate(fbc); } @@ -1914,11 +1943,12 @@ void intel_fbc_sanitize(struct drm_i915_private *i915) static int intel_fbc_debugfs_status_show(struct seq_file *m, void *unused) { struct intel_fbc *fbc = m->private; - struct drm_i915_private *i915 = fbc->i915; + struct intel_display *display = fbc->display; + struct drm_i915_private *i915 = to_i915(display->drm); struct intel_plane *plane; intel_wakeref_t wakeref; - drm_modeset_lock_all(&i915->drm); + drm_modeset_lock_all(display->drm); wakeref = intel_runtime_pm_get(&i915->runtime_pm); mutex_lock(&fbc->lock); @@ -1931,7 +1961,7 @@ static int intel_fbc_debugfs_status_show(struct seq_file *m, void *unused) seq_printf(m, "FBC disabled: %s\n", fbc->no_fbc_reason); } - for_each_intel_plane(&i915->drm, plane) { + for_each_intel_plane(display->drm, plane) { const struct intel_plane_state *plane_state = to_intel_plane_state(plane->base.state); @@ -1947,7 +1977,7 @@ static int intel_fbc_debugfs_status_show(struct seq_file *m, void *unused) mutex_unlock(&fbc->lock); intel_runtime_pm_put(&i915->runtime_pm, wakeref); - drm_modeset_unlock_all(&i915->drm); + drm_modeset_unlock_all(display->drm); return 0; } @@ -2004,12 +2034,12 @@ void intel_fbc_crtc_debugfs_add(struct intel_crtc *crtc) } /* FIXME: remove this once igt is on board with per-crtc stuff */ -void intel_fbc_debugfs_register(struct drm_i915_private *i915) +void intel_fbc_debugfs_register(struct intel_display *display) { - struct drm_minor *minor = i915->drm.primary; + struct drm_minor *minor = display->drm->primary; struct intel_fbc *fbc; - fbc = i915->display.fbc[INTEL_FBC_A]; + fbc = display->fbc[INTEL_FBC_A]; if (fbc) intel_fbc_debugfs_add(fbc, minor->debugfs_root); } diff --git a/drivers/gpu/drm/i915/display/intel_fbc.h b/drivers/gpu/drm/i915/display/intel_fbc.h index 6720ec8ee8a2..834b271505b1 100644 --- a/drivers/gpu/drm/i915/display/intel_fbc.h +++ b/drivers/gpu/drm/i915/display/intel_fbc.h @@ -13,6 +13,7 @@ struct drm_i915_private; struct intel_atomic_state; struct intel_crtc; struct intel_crtc_state; +struct intel_display; struct intel_fbc; struct intel_plane; struct intel_plane_state; @@ -31,9 +32,9 @@ bool intel_fbc_pre_update(struct intel_atomic_state *state, struct intel_crtc *crtc); void intel_fbc_post_update(struct intel_atomic_state *state, struct intel_crtc *crtc); -void intel_fbc_init(struct drm_i915_private *dev_priv); -void intel_fbc_cleanup(struct drm_i915_private *dev_priv); -void intel_fbc_sanitize(struct drm_i915_private *dev_priv); +void intel_fbc_init(struct intel_display *dev_priv); +void intel_fbc_cleanup(struct intel_display *dev_priv); +void intel_fbc_sanitize(struct intel_display *dev_priv); void intel_fbc_update(struct intel_atomic_state *state, struct intel_crtc *crtc); void intel_fbc_disable(struct intel_crtc *crtc); @@ -43,9 +44,9 @@ void intel_fbc_invalidate(struct drm_i915_private *dev_priv, void intel_fbc_flush(struct drm_i915_private *dev_priv, unsigned int frontbuffer_bits, enum fb_op_origin origin); void intel_fbc_add_plane(struct intel_fbc *fbc, struct intel_plane *plane); -void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *i915); -void intel_fbc_reset_underrun(struct drm_i915_private *i915); +void intel_fbc_handle_fifo_underrun_irq(struct intel_display *display); +void intel_fbc_reset_underrun(struct intel_display *display); void intel_fbc_crtc_debugfs_add(struct intel_crtc *crtc); -void intel_fbc_debugfs_register(struct drm_i915_private *i915); +void intel_fbc_debugfs_register(struct intel_display *display); #endif /* __INTEL_FBC_H__ */ diff --git a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c index e5e4ca7cc499..8949fbb1cc60 100644 --- a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c +++ b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c @@ -440,7 +440,7 @@ void intel_cpu_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv, drm_err(&dev_priv->drm, "CPU pipe %c FIFO underrun\n", pipe_name(pipe)); } - intel_fbc_handle_fifo_underrun_irq(dev_priv); + intel_fbc_handle_fifo_underrun_irq(&dev_priv->display); } /** diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c index 7602cb30ebf1..6f85f5352455 100644 --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c @@ -966,7 +966,7 @@ void intel_modeset_setup_hw_state(struct drm_i915_private *i915, } } - intel_fbc_sanitize(i915); + intel_fbc_sanitize(&i915->display); intel_sanitize_plane_mapping(i915);