Skip to content

Commit a1fb548

Browse files
committed
Merge tag 'drm-intel-next-2020-04-30' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
Driver Changes: - Fix GitLab #1698: Performance regression with Linux 5.7-rc1 on Iris Plus 655 and 4K screen (Chris) - Add Wa_14011059788 for Tigerlake (Matt A) - Add per ctx batchbuffer wa for timestamp for Gen12 (Mika) - Use indirect ctx bb to load cmd buffer control value from context image to avoid corruption (Mika) - Enable DP Display Audio WA (Uma, Jani) - Update forcewake firmware ranges for Icelake (Radhakrishna) - Add missing deinitialization cases of load failure for display (Jose) - Implement TC cold sequences for Icelake and Tigerlake (Jose) - Unbreak enable_dpcd_backlight modparam (Lyude) - Move the late flush_submission in retire to the end (Chris) - Demote "Reducing compressed framebufer size" message to info (Peter) - Push MST link retraining to the hotplug work (Ville) - Hold obj->vma.lock over for_each_ggtt_vma() (Chris) - Fix timeout handling during TypeC AUX power well enabling for ICL (Imre) - Fix skl+ non-scaled pfit modes (Ville) - Prefer soft-rc6 over RPS DOWN_TIMEOUT (Chris) - Sanitize GT first before poisoning HWSP (Chris) - Fix up clock RPS frequency readout (Chris) - Avoid reusing the same logical CCID (Chris) - Avoid dereferencing a dead context (Chris) - Always enable busy-stats for execlists (Chris) - Apply the aggressive downclocking to parking (Chris) - Restore aggressive post-boost downclocking (Chris) - Scrub execlists state on resume (Chris) - Add debugfs attributes for LPSP (Ansuman) - Improvements to kernel selftests (Chris, Mika) - Add tiled blits selftest (Zbigniew) - Fix error handling in __live_lrc_indirect_ctx_bb() (Dan) - Add pre/post plane updates for SAGV (Stanislav) - Add ICL PG3 PW ID for EHL (Anshuman) - Fix Sphinx build duplicate label warning (Jani) - Error log non-zero audio power refcount after unbind (Jani) - Remove object_is_locked assertion from unpin_from_display_plane (Chris) - Use single set of AUX powerwell ops for gen11+ (Matt R) - Prefer drm_WARN_ON over WARN_ON (Pankaj) - Poison residual state [HWSP] across resume (Chris, Tvrtko) - Convert request-before-CS assertion to debug (Chris) - Carefully order virtual_submission_tasklet (Chris) - Check carefully for an idle engine in wait-for-idle (Chris) - Only close vma we open (Chris) - Trace RPS events (Chris) - Use the RPM config register to determine clk frequencies (Chris) - Drop rq->ring->vma peeking from error capture (Chris) - Check preempt-timeout target before submit_ports (Chris) - Check HWSP cacheline is valid before acquiring (Chris) - Use proper fault mask in interrupt postinstall too (Matt R) - Keep a no-frills swappable copy of the default context state (Chris) - Add atomic helpers for bandwidth (Stanislav) - Refactor setting dma info to a common helper from device info (Michael) - Refactor DDI transcoder code for clairty (Ville) - Extend PG3 power well ID to ICL (Anshuman) - Refactor PFIT code for readability and future extensibility (Ville) - Clarify code split between intel_ddi.c and intel_dp.c (Ville) - Move out code to return the digital_port of the aux ch (Jose) - Move rps.enabled/active and use of RPS interrupts to flags (Chris) - Remove superfluous inlines and dead code (Jani) - Re-disable -Wframe-address from top-level Makefile (Nick) - Static checker and spelling fixes (Colin, Nathan) - Split long lines (Ville) Signed-off-by: Dave Airlie <[email protected]> From: Joonas Lahtinen <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 3fd911b + 230982d commit a1fb548

File tree

108 files changed

+6193
-1961
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+6193
-1961
lines changed

drivers/char/agp/intel-gtt.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,13 +1407,16 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
14071407

14081408
dev_info(&bridge_pdev->dev, "Intel %s Chipset\n", intel_gtt_chipsets[i].name);
14091409

1410-
mask = intel_private.driver->dma_mask_size;
1411-
if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(mask)))
1412-
dev_err(&intel_private.pcidev->dev,
1413-
"set gfx device dma mask %d-bit failed!\n", mask);
1414-
else
1415-
pci_set_consistent_dma_mask(intel_private.pcidev,
1416-
DMA_BIT_MASK(mask));
1410+
if (bridge) {
1411+
mask = intel_private.driver->dma_mask_size;
1412+
if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(mask)))
1413+
dev_err(&intel_private.pcidev->dev,
1414+
"set gfx device dma mask %d-bit failed!\n",
1415+
mask);
1416+
else
1417+
pci_set_consistent_dma_mask(intel_private.pcidev,
1418+
DMA_BIT_MASK(mask));
1419+
}
14171420

14181421
if (intel_gtt_init() != 0) {
14191422
intel_gmch_remove();

drivers/gpu/drm/i915/Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ subdir-ccflags-y += $(call cc-disable-warning, sign-compare)
2222
subdir-ccflags-y += $(call cc-disable-warning, sometimes-uninitialized)
2323
subdir-ccflags-y += $(call cc-disable-warning, initializer-overrides)
2424
subdir-ccflags-y += $(call cc-disable-warning, uninitialized)
25+
subdir-ccflags-y += $(call cc-disable-warning, frame-address)
2526
subdir-ccflags-$(CONFIG_DRM_I915_WERROR) += -Werror
2627

2728
# Fine grained warnings disable
@@ -91,6 +92,7 @@ gt-y += \
9192
gt/intel_ggtt.o \
9293
gt/intel_ggtt_fencing.o \
9394
gt/intel_gt.o \
95+
gt/intel_gt_clock_utils.o \
9496
gt/intel_gt_irq.o \
9597
gt/intel_gt_pm.o \
9698
gt/intel_gt_pm_irq.o \
@@ -109,6 +111,7 @@ gt-y += \
109111
gt/intel_sseu.o \
110112
gt/intel_timeline.o \
111113
gt/intel_workarounds.o \
114+
gt/shmem_utils.o \
112115
gt/sysfs_engines.o
113116
# autogenerated null render state
114117
gt-y += \
@@ -257,7 +260,8 @@ i915-$(CONFIG_DRM_I915_SELFTEST) += \
257260
selftests/igt_live_test.o \
258261
selftests/igt_mmap.o \
259262
selftests/igt_reset.o \
260-
selftests/igt_spinner.o
263+
selftests/igt_spinner.o \
264+
selftests/librapl.o
261265

262266
# virtual gpu code
263267
i915-y += i915_vgpu.o

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@
3636
#include "intel_panel.h"
3737
#include "intel_vdsc.h"
3838

39-
static inline int header_credits_available(struct drm_i915_private *dev_priv,
40-
enum transcoder dsi_trans)
39+
static int header_credits_available(struct drm_i915_private *dev_priv,
40+
enum transcoder dsi_trans)
4141
{
4242
return (intel_de_read(dev_priv, DSI_CMD_TXCTL(dsi_trans)) & FREE_HEADER_CREDIT_MASK)
4343
>> FREE_HEADER_CREDIT_SHIFT;
4444
}
4545

46-
static inline int payload_credits_available(struct drm_i915_private *dev_priv,
47-
enum transcoder dsi_trans)
46+
static int payload_credits_available(struct drm_i915_private *dev_priv,
47+
enum transcoder dsi_trans)
4848
{
4949
return (intel_de_read(dev_priv, DSI_CMD_TXCTL(dsi_trans)) & FREE_PLOAD_CREDIT_MASK)
5050
>> FREE_PLOAD_CREDIT_SHIFT;
@@ -1195,7 +1195,7 @@ static void gen11_dsi_enable(struct intel_atomic_state *state,
11951195
{
11961196
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
11971197

1198-
WARN_ON(crtc_state->has_pch_encoder);
1198+
drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder);
11991199

12001200
/* step6d: enable dsi transcoder */
12011201
gen11_dsi_enable_transcoder(encoder);
@@ -1525,15 +1525,18 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder,
15251525
struct intel_dsi *intel_dsi = container_of(encoder, struct intel_dsi,
15261526
base);
15271527
struct intel_connector *intel_connector = intel_dsi->attached_connector;
1528-
struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
15291528
const struct drm_display_mode *fixed_mode =
1530-
intel_connector->panel.fixed_mode;
1529+
intel_connector->panel.fixed_mode;
15311530
struct drm_display_mode *adjusted_mode =
1532-
&pipe_config->hw.adjusted_mode;
1531+
&pipe_config->hw.adjusted_mode;
1532+
int ret;
15331533

15341534
pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
15351535
intel_fixed_panel_mode(fixed_mode, adjusted_mode);
1536-
intel_pch_panel_fitting(crtc, pipe_config, conn_state->scaling_mode);
1536+
1537+
ret = intel_pch_panel_fitting(pipe_config, conn_state);
1538+
if (ret)
1539+
return ret;
15371540

15381541
adjusted_mode->flags = 0;
15391542

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ intel_plane_destroy_state(struct drm_plane *plane,
125125
struct drm_plane_state *state)
126126
{
127127
struct intel_plane_state *plane_state = to_intel_plane_state(state);
128-
WARN_ON(plane_state->vma);
128+
drm_WARN_ON(plane->dev, plane_state->vma);
129129

130130
__drm_atomic_helper_plane_destroy_state(&plane_state->uapi);
131131
if (plane_state->hw.fb)
@@ -396,7 +396,7 @@ skl_next_plane_to_commit(struct intel_atomic_state *state,
396396
}
397397

398398
/* should never happen */
399-
WARN_ON(1);
399+
drm_WARN_ON(state->base.dev, 1);
400400

401401
return NULL;
402402
}

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

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,143 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder,
514514
mutex_unlock(&dev_priv->av_mutex);
515515
}
516516

517+
/* Add a factor to take care of rounding and truncations */
518+
#define ROUNDING_FACTOR 10000
519+
520+
static unsigned int get_hblank_early_enable_config(struct intel_encoder *encoder,
521+
const struct intel_crtc_state *crtc_state)
522+
{
523+
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
524+
unsigned int link_clks_available, link_clks_required;
525+
unsigned int tu_data, tu_line, link_clks_active;
526+
unsigned int hblank_rise, hblank_early_prog;
527+
unsigned int h_active, h_total, hblank_delta, pixel_clk, v_total;
528+
unsigned int fec_coeff, refresh_rate, cdclk, vdsc_bpp;
529+
530+
h_active = crtc_state->hw.adjusted_mode.crtc_hdisplay;
531+
h_total = crtc_state->hw.adjusted_mode.crtc_htotal;
532+
v_total = crtc_state->hw.adjusted_mode.crtc_vtotal;
533+
pixel_clk = crtc_state->hw.adjusted_mode.crtc_clock;
534+
refresh_rate = crtc_state->hw.adjusted_mode.vrefresh;
535+
vdsc_bpp = crtc_state->dsc.compressed_bpp;
536+
cdclk = i915->cdclk.hw.cdclk;
537+
/* fec= 0.972261, using rounding multiplier of 1000000 */
538+
fec_coeff = 972261;
539+
540+
drm_dbg_kms(&i915->drm, "h_active = %u link_clk = %u :"
541+
"lanes = %u vdsc_bpp = %u cdclk = %u\n",
542+
h_active, crtc_state->port_clock, crtc_state->lane_count,
543+
vdsc_bpp, cdclk);
544+
545+
if (WARN_ON(!crtc_state->port_clock || !crtc_state->lane_count ||
546+
!crtc_state->dsc.compressed_bpp || !i915->cdclk.hw.cdclk))
547+
return 0;
548+
549+
link_clks_available = ((((h_total - h_active) *
550+
((crtc_state->port_clock * ROUNDING_FACTOR) /
551+
pixel_clk)) / ROUNDING_FACTOR) - 28);
552+
553+
link_clks_required = DIV_ROUND_UP(192000, (refresh_rate *
554+
v_total)) * ((48 /
555+
crtc_state->lane_count) + 2);
556+
557+
if (link_clks_available > link_clks_required)
558+
hblank_delta = 32;
559+
else
560+
hblank_delta = DIV_ROUND_UP(((((5 * ROUNDING_FACTOR) /
561+
crtc_state->port_clock) + ((5 *
562+
ROUNDING_FACTOR) /
563+
cdclk)) * pixel_clk),
564+
ROUNDING_FACTOR);
565+
566+
tu_data = (pixel_clk * vdsc_bpp * 8) / ((crtc_state->port_clock *
567+
crtc_state->lane_count * fec_coeff) / 1000000);
568+
tu_line = (((h_active * crtc_state->port_clock * fec_coeff) /
569+
1000000) / (64 * pixel_clk));
570+
link_clks_active = (tu_line - 1) * 64 + tu_data;
571+
572+
hblank_rise = ((link_clks_active + 6 * DIV_ROUND_UP(link_clks_active,
573+
250) + 4) * ((pixel_clk * ROUNDING_FACTOR) /
574+
crtc_state->port_clock)) / ROUNDING_FACTOR;
575+
576+
hblank_early_prog = h_active - hblank_rise + hblank_delta;
577+
578+
return hblank_early_prog;
579+
}
580+
581+
static unsigned int get_sample_room_req_config(const struct intel_crtc_state *crtc_state)
582+
{
583+
unsigned int h_active, h_total, pixel_clk;
584+
unsigned int samples_room;
585+
586+
h_active = crtc_state->hw.adjusted_mode.hdisplay;
587+
h_total = crtc_state->hw.adjusted_mode.htotal;
588+
pixel_clk = crtc_state->hw.adjusted_mode.clock;
589+
590+
samples_room = ((((h_total - h_active) * ((crtc_state->port_clock *
591+
ROUNDING_FACTOR) / pixel_clk)) /
592+
ROUNDING_FACTOR) - 12) / ((48 /
593+
crtc_state->lane_count) + 2);
594+
595+
return samples_room;
596+
}
597+
598+
static void enable_audio_dsc_wa(struct intel_encoder *encoder,
599+
const struct intel_crtc_state *crtc_state)
600+
{
601+
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
602+
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
603+
enum pipe pipe = crtc->pipe;
604+
unsigned int hblank_early_prog, samples_room;
605+
unsigned int val;
606+
607+
if (INTEL_GEN(i915) < 11)
608+
return;
609+
610+
val = intel_de_read(i915, AUD_CONFIG_BE);
611+
612+
if (INTEL_GEN(i915) == 11)
613+
val |= HBLANK_EARLY_ENABLE_ICL(pipe);
614+
else if (INTEL_GEN(i915) >= 12)
615+
val |= HBLANK_EARLY_ENABLE_TGL(pipe);
616+
617+
if (crtc_state->dsc.compression_enable &&
618+
(crtc_state->hw.adjusted_mode.hdisplay >= 3840 &&
619+
crtc_state->hw.adjusted_mode.vdisplay >= 2160)) {
620+
/* Get hblank early enable value required */
621+
hblank_early_prog = get_hblank_early_enable_config(encoder,
622+
crtc_state);
623+
if (hblank_early_prog < 32) {
624+
val &= ~HBLANK_START_COUNT_MASK(pipe);
625+
val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_32);
626+
} else if (hblank_early_prog < 64) {
627+
val &= ~HBLANK_START_COUNT_MASK(pipe);
628+
val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_64);
629+
} else if (hblank_early_prog < 96) {
630+
val &= ~HBLANK_START_COUNT_MASK(pipe);
631+
val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_96);
632+
} else {
633+
val &= ~HBLANK_START_COUNT_MASK(pipe);
634+
val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_128);
635+
}
636+
637+
/* Get samples room value required */
638+
samples_room = get_sample_room_req_config(crtc_state);
639+
if (samples_room < 3) {
640+
val &= ~NUMBER_SAMPLES_PER_LINE_MASK(pipe);
641+
val |= NUMBER_SAMPLES_PER_LINE(pipe, samples_room);
642+
} else {
643+
/* Program 0 i.e "All Samples available in buffer" */
644+
val &= ~NUMBER_SAMPLES_PER_LINE_MASK(pipe);
645+
val |= NUMBER_SAMPLES_PER_LINE(pipe, 0x0);
646+
}
647+
}
648+
649+
intel_de_write(i915, AUD_CONFIG_BE, val);
650+
}
651+
652+
#undef ROUNDING_FACTOR
653+
517654
static void hsw_audio_codec_enable(struct intel_encoder *encoder,
518655
const struct intel_crtc_state *crtc_state,
519656
const struct drm_connector_state *conn_state)
@@ -531,6 +668,10 @@ static void hsw_audio_codec_enable(struct intel_encoder *encoder,
531668

532669
mutex_lock(&dev_priv->av_mutex);
533670

671+
/* Enable Audio WA for 4k DSC usecases */
672+
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP))
673+
enable_audio_dsc_wa(encoder, crtc_state);
674+
534675
/* Enable audio presence detect, invalidate ELD */
535676
tmp = intel_de_read(dev_priv, HSW_AUD_PIN_ELD_CP_VLD);
536677
tmp |= AUDIO_OUTPUT_ENABLE(cpu_transcoder);
@@ -1138,6 +1279,10 @@ static void i915_audio_component_unbind(struct device *i915_kdev,
11381279
drm_modeset_unlock_all(&dev_priv->drm);
11391280

11401281
device_link_remove(hda_kdev, i915_kdev);
1282+
1283+
if (dev_priv->audio_power_refcount)
1284+
drm_err(&dev_priv->drm, "audio power refcount %d after unbind\n",
1285+
dev_priv->audio_power_refcount);
11411286
}
11421287

11431288
static const struct component_ops i915_audio_component_bind_ops = {

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,29 @@ static unsigned int intel_bw_data_rate(struct drm_i915_private *dev_priv,
375375
return data_rate;
376376
}
377377

378-
static struct intel_bw_state *
378+
struct intel_bw_state *
379+
intel_atomic_get_old_bw_state(struct intel_atomic_state *state)
380+
{
381+
struct drm_i915_private *dev_priv = to_i915(state->base.dev);
382+
struct intel_global_state *bw_state;
383+
384+
bw_state = intel_atomic_get_old_global_obj_state(state, &dev_priv->bw_obj);
385+
386+
return to_intel_bw_state(bw_state);
387+
}
388+
389+
struct intel_bw_state *
390+
intel_atomic_get_new_bw_state(struct intel_atomic_state *state)
391+
{
392+
struct drm_i915_private *dev_priv = to_i915(state->base.dev);
393+
struct intel_global_state *bw_state;
394+
395+
bw_state = intel_atomic_get_new_global_obj_state(state, &dev_priv->bw_obj);
396+
397+
return to_intel_bw_state(bw_state);
398+
}
399+
400+
struct intel_bw_state *
379401
intel_atomic_get_bw_state(struct intel_atomic_state *state)
380402
{
381403
struct drm_i915_private *dev_priv = to_i915(state->base.dev);

drivers/gpu/drm/i915/display/intel_bw.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ struct intel_bw_state {
2424

2525
#define to_intel_bw_state(x) container_of((x), struct intel_bw_state, base)
2626

27+
struct intel_bw_state *
28+
intel_atomic_get_old_bw_state(struct intel_atomic_state *state);
29+
30+
struct intel_bw_state *
31+
intel_atomic_get_new_bw_state(struct intel_atomic_state *state);
32+
33+
struct intel_bw_state *
34+
intel_atomic_get_bw_state(struct intel_atomic_state *state);
35+
2736
void intel_bw_init_hw(struct drm_i915_private *dev_priv);
2837
int intel_bw_init(struct drm_i915_private *dev_priv);
2938
int intel_bw_atomic_check(struct intel_atomic_state *state);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
#include "i915_drv.h"
3535
#include "intel_connector.h"
36+
#include "intel_display_debugfs.h"
3637
#include "intel_display_types.h"
3738
#include "intel_hdcp.h"
3839

@@ -123,6 +124,8 @@ int intel_connector_register(struct drm_connector *connector)
123124
goto err_backlight;
124125
}
125126

127+
intel_connector_debugfs_add(connector);
128+
126129
return 0;
127130

128131
err_backlight:

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ static void hsw_pre_enable_crt(struct intel_atomic_state *state,
294294

295295
hsw_fdi_link_train(encoder, crtc_state);
296296

297-
intel_ddi_enable_pipe_clock(crtc_state);
297+
intel_ddi_enable_pipe_clock(encoder, crtc_state);
298298
}
299299

300300
static void hsw_enable_crt(struct intel_atomic_state *state,
@@ -308,6 +308,8 @@ static void hsw_enable_crt(struct intel_atomic_state *state,
308308

309309
drm_WARN_ON(&dev_priv->drm, !crtc_state->has_pch_encoder);
310310

311+
intel_ddi_enable_transcoder_func(encoder, crtc_state);
312+
311313
intel_enable_pipe(crtc_state);
312314

313315
lpt_pch_enable(crtc_state);

0 commit comments

Comments
 (0)