Skip to content

Commit 0594bc7

Browse files
committed
Merge tag 'drm-intel-fixes-2021-02-11' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
drm/i915 fixes for v5.11 final: - Ensure Type-C FIA is powered when initializing - Fix overlay frontbuffer tracking Signed-off-by: Dave Airlie <airlied@redhat.com> From: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/87r1lnc78t.fsf@intel.com
2 parents d92d3d8 + 5feba0e commit 0594bc7

2 files changed

Lines changed: 45 additions & 39 deletions

File tree

drivers/gpu/drm/i915/display/intel_overlay.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ struct intel_overlay {
182182
struct intel_crtc *crtc;
183183
struct i915_vma *vma;
184184
struct i915_vma *old_vma;
185+
struct intel_frontbuffer *frontbuffer;
185186
bool active;
186187
bool pfit_active;
187188
u32 pfit_vscale_ratio; /* shifted-point number, (1<<12) == 1.0 */
@@ -282,21 +283,19 @@ static void intel_overlay_flip_prepare(struct intel_overlay *overlay,
282283
struct i915_vma *vma)
283284
{
284285
enum pipe pipe = overlay->crtc->pipe;
285-
struct intel_frontbuffer *from = NULL, *to = NULL;
286+
struct intel_frontbuffer *frontbuffer = NULL;
286287

287288
drm_WARN_ON(&overlay->i915->drm, overlay->old_vma);
288289

289-
if (overlay->vma)
290-
from = intel_frontbuffer_get(overlay->vma->obj);
291290
if (vma)
292-
to = intel_frontbuffer_get(vma->obj);
291+
frontbuffer = intel_frontbuffer_get(vma->obj);
293292

294-
intel_frontbuffer_track(from, to, INTEL_FRONTBUFFER_OVERLAY(pipe));
293+
intel_frontbuffer_track(overlay->frontbuffer, frontbuffer,
294+
INTEL_FRONTBUFFER_OVERLAY(pipe));
295295

296-
if (to)
297-
intel_frontbuffer_put(to);
298-
if (from)
299-
intel_frontbuffer_put(from);
296+
if (overlay->frontbuffer)
297+
intel_frontbuffer_put(overlay->frontbuffer);
298+
overlay->frontbuffer = frontbuffer;
300299

301300
intel_frontbuffer_flip_prepare(overlay->i915,
302301
INTEL_FRONTBUFFER_OVERLAY(pipe));

drivers/gpu/drm/i915/display/intel_tc.c

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,36 +23,6 @@ static const char *tc_port_mode_name(enum tc_port_mode mode)
2323
return names[mode];
2424
}
2525

26-
static void
27-
tc_port_load_fia_params(struct drm_i915_private *i915,
28-
struct intel_digital_port *dig_port)
29-
{
30-
enum port port = dig_port->base.port;
31-
enum tc_port tc_port = intel_port_to_tc(i915, port);
32-
u32 modular_fia;
33-
34-
if (INTEL_INFO(i915)->display.has_modular_fia) {
35-
modular_fia = intel_uncore_read(&i915->uncore,
36-
PORT_TX_DFLEXDPSP(FIA1));
37-
drm_WARN_ON(&i915->drm, modular_fia == 0xffffffff);
38-
modular_fia &= MODULAR_FIA_MASK;
39-
} else {
40-
modular_fia = 0;
41-
}
42-
43-
/*
44-
* Each Modular FIA instance houses 2 TC ports. In SOC that has more
45-
* than two TC ports, there are multiple instances of Modular FIA.
46-
*/
47-
if (modular_fia) {
48-
dig_port->tc_phy_fia = tc_port / 2;
49-
dig_port->tc_phy_fia_idx = tc_port % 2;
50-
} else {
51-
dig_port->tc_phy_fia = FIA1;
52-
dig_port->tc_phy_fia_idx = tc_port;
53-
}
54-
}
55-
5626
static enum intel_display_power_domain
5727
tc_cold_get_power_domain(struct intel_digital_port *dig_port)
5828
{
@@ -646,6 +616,43 @@ void intel_tc_port_put_link(struct intel_digital_port *dig_port)
646616
mutex_unlock(&dig_port->tc_lock);
647617
}
648618

619+
static bool
620+
tc_has_modular_fia(struct drm_i915_private *i915, struct intel_digital_port *dig_port)
621+
{
622+
intel_wakeref_t wakeref;
623+
u32 val;
624+
625+
if (!INTEL_INFO(i915)->display.has_modular_fia)
626+
return false;
627+
628+
wakeref = tc_cold_block(dig_port);
629+
val = intel_uncore_read(&i915->uncore, PORT_TX_DFLEXDPSP(FIA1));
630+
tc_cold_unblock(dig_port, wakeref);
631+
632+
drm_WARN_ON(&i915->drm, val == 0xffffffff);
633+
634+
return val & MODULAR_FIA_MASK;
635+
}
636+
637+
static void
638+
tc_port_load_fia_params(struct drm_i915_private *i915, struct intel_digital_port *dig_port)
639+
{
640+
enum port port = dig_port->base.port;
641+
enum tc_port tc_port = intel_port_to_tc(i915, port);
642+
643+
/*
644+
* Each Modular FIA instance houses 2 TC ports. In SOC that has more
645+
* than two TC ports, there are multiple instances of Modular FIA.
646+
*/
647+
if (tc_has_modular_fia(i915, dig_port)) {
648+
dig_port->tc_phy_fia = tc_port / 2;
649+
dig_port->tc_phy_fia_idx = tc_port % 2;
650+
} else {
651+
dig_port->tc_phy_fia = FIA1;
652+
dig_port->tc_phy_fia_idx = tc_port;
653+
}
654+
}
655+
649656
void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy)
650657
{
651658
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);

0 commit comments

Comments
 (0)