Skip to content

Commit 9ec7ccc

Browse files
committed
Merge tag 'drm-fixes-for-v4.16-rc7' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "A bunch of fixes all over the place (core, i915, amdgpu, imx, sun4i, ast, tegra, vmwgfx), nothing too serious or worrying at this stage. - one uapi fix to stop multi-planar images with getfb - Sun4i error path and clock fixes - udl driver mmap offset fix - i915 DP MST and GPU reset fixes - vmwgfx mutex and black screen fixes - imx array underflow fix and vblank fix - amdgpu: display fixes - exynos devicetree fix - ast mode fix" * tag 'drm-fixes-for-v4.16-rc7' of git://people.freedesktop.org/~airlied/linux: (29 commits) drm/ast: Fixed 1280x800 Display Issue drm: udl: Properly check framebuffer mmap offsets drm/i915: Specify which engines to reset following semaphore/event lockups drm/vmwgfx: Fix a destoy-while-held mutex problem. drm/vmwgfx: Fix black screen and device errors when running without fbdev drm: Reject getfb for multi-plane framebuffers drm/amd/display: Add one to EDID's audio channel count when passing to DC drm/amd/display: We shouldn't set format_default on plane as atomic driver drm/amd/display: Fix FMT truncation programming drm/amd/display: Allow truncation to 10 bits drm/sun4i: hdmi: Fix another error handling path in 'sun4i_hdmi_bind()' drm/sun4i: hdmi: Fix an error handling path in 'sun4i_hdmi_bind()' drm/i915/dp: Write to SET_POWER dpcd to enable MST hub. drm/amd/display: fix dereferencing possible ERR_PTR() drm/amd/display: Refine disable VGA drm/tegra: Shutdown on driver unbind drm/tegra: dsi: Don't disable regulator on ->exit() drm/tegra: dc: Detach IOMMU group from domain only once dt-bindings: exynos: Document #sound-dai-cells property of the HDMI node drm/imx: move arming of the vblank event to atomic_flush ...
2 parents e7d7743 + 5a9f698 commit 9ec7ccc

29 files changed

+176
-84
lines changed

Documentation/devicetree/bindings/display/exynos/exynos_hdmi.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Required properties:
1616
- ddc: phandle to the hdmi ddc node
1717
- phy: phandle to the hdmi phy node
1818
- samsung,syscon-phandle: phandle for system controller node for PMU.
19+
- #sound-dai-cells: should be 0.
1920

2021
Required properties for Exynos 4210, 4212, 5420 and 5433:
2122
- clocks: list of clock IDs from SoC clock driver.

drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2063,9 +2063,12 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
20632063

20642064
DRM_INFO("amdgpu: finishing device.\n");
20652065
adev->shutdown = true;
2066-
if (adev->mode_info.mode_config_initialized)
2067-
drm_crtc_force_disable_all(adev->ddev);
2068-
2066+
if (adev->mode_info.mode_config_initialized){
2067+
if (!amdgpu_device_has_dc_support(adev))
2068+
drm_crtc_force_disable_all(adev->ddev);
2069+
else
2070+
drm_atomic_helper_shutdown(adev->ddev);
2071+
}
20692072
amdgpu_ib_pool_fini(adev);
20702073
amdgpu_fence_driver_fini(adev);
20712074
amdgpu_fbdev_fini(adev);

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3134,8 +3134,6 @@ static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,
31343134

31353135
switch (aplane->base.type) {
31363136
case DRM_PLANE_TYPE_PRIMARY:
3137-
aplane->base.format_default = true;
3138-
31393137
res = drm_universal_plane_init(
31403138
dm->adev->ddev,
31413139
&aplane->base,
@@ -4794,6 +4792,9 @@ static int dm_atomic_check_plane_state_fb(struct drm_atomic_state *state,
47944792
return -EDEADLK;
47954793

47964794
crtc_state = drm_atomic_get_crtc_state(plane_state->state, crtc);
4795+
if (IS_ERR(crtc_state))
4796+
return PTR_ERR(crtc_state);
4797+
47974798
if (crtc->primary == plane && crtc_state->active) {
47984799
if (!plane_state->fb)
47994800
return -EINVAL;

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
109109
struct cea_sad *sad = &sads[i];
110110

111111
edid_caps->audio_modes[i].format_code = sad->format;
112-
edid_caps->audio_modes[i].channel_count = sad->channels;
112+
edid_caps->audio_modes[i].channel_count = sad->channels + 1;
113113
edid_caps->audio_modes[i].sample_rate = sad->freq;
114114
edid_caps->audio_modes[i].sample_size = sad->byte2;
115115
}

drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,9 @@ struct dce_hwseq_registers {
496496
HWS_SF(, DOMAIN7_PG_STATUS, DOMAIN7_PGFSM_PWR_STATUS, mask_sh), \
497497
HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
498498
HWS_SF(, D1VGA_CONTROL, D1VGA_MODE_ENABLE, mask_sh),\
499+
HWS_SF(, D2VGA_CONTROL, D2VGA_MODE_ENABLE, mask_sh),\
500+
HWS_SF(, D3VGA_CONTROL, D3VGA_MODE_ENABLE, mask_sh),\
501+
HWS_SF(, D4VGA_CONTROL, D4VGA_MODE_ENABLE, mask_sh),\
499502
HWS_SF(, VGA_TEST_CONTROL, VGA_TEST_ENABLE, mask_sh),\
500503
HWS_SF(, VGA_TEST_CONTROL, VGA_TEST_RENDER_START, mask_sh),\
501504
HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh), \
@@ -591,7 +594,10 @@ struct dce_hwseq_registers {
591594
type DENTIST_DISPCLK_WDIVIDER; \
592595
type VGA_TEST_ENABLE; \
593596
type VGA_TEST_RENDER_START; \
594-
type D1VGA_MODE_ENABLE;
597+
type D1VGA_MODE_ENABLE; \
598+
type D2VGA_MODE_ENABLE; \
599+
type D3VGA_MODE_ENABLE; \
600+
type D4VGA_MODE_ENABLE;
595601

596602
struct dce_hwseq_shift {
597603
HWSEQ_REG_FIELD_LIST(uint8_t)

drivers/gpu/drm/amd/display/dc/dce/dce_opp.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,23 +128,22 @@ static void set_truncation(
128128
return;
129129
}
130130
/* on other format-to do */
131-
if (params->flags.TRUNCATE_ENABLED == 0 ||
132-
params->flags.TRUNCATE_DEPTH == 2)
131+
if (params->flags.TRUNCATE_ENABLED == 0)
133132
return;
134133
/*Set truncation depth and Enable truncation*/
135134
REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
136135
FMT_TRUNCATE_EN, 1,
137136
FMT_TRUNCATE_DEPTH,
138-
params->flags.TRUNCATE_MODE,
137+
params->flags.TRUNCATE_DEPTH,
139138
FMT_TRUNCATE_MODE,
140-
params->flags.TRUNCATE_DEPTH);
139+
params->flags.TRUNCATE_MODE);
141140
}
142141

143142

144143
/**
145144
* set_spatial_dither
146145
* 1) set spatial dithering mode: pattern of seed
147-
* 2) set spatical dithering depth: 0 for 18bpp or 1 for 24bpp
146+
* 2) set spatial dithering depth: 0 for 18bpp or 1 for 24bpp
148147
* 3) set random seed
149148
* 4) set random mode
150149
* lfsr is reset every frame or not reset

drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,14 +238,24 @@ static void enable_power_gating_plane(
238238
static void disable_vga(
239239
struct dce_hwseq *hws)
240240
{
241-
unsigned int in_vga_mode = 0;
242-
243-
REG_GET(D1VGA_CONTROL, D1VGA_MODE_ENABLE, &in_vga_mode);
244-
245-
if (in_vga_mode == 0)
241+
unsigned int in_vga1_mode = 0;
242+
unsigned int in_vga2_mode = 0;
243+
unsigned int in_vga3_mode = 0;
244+
unsigned int in_vga4_mode = 0;
245+
246+
REG_GET(D1VGA_CONTROL, D1VGA_MODE_ENABLE, &in_vga1_mode);
247+
REG_GET(D2VGA_CONTROL, D2VGA_MODE_ENABLE, &in_vga2_mode);
248+
REG_GET(D3VGA_CONTROL, D3VGA_MODE_ENABLE, &in_vga3_mode);
249+
REG_GET(D4VGA_CONTROL, D4VGA_MODE_ENABLE, &in_vga4_mode);
250+
251+
if (in_vga1_mode == 0 && in_vga2_mode == 0 &&
252+
in_vga3_mode == 0 && in_vga4_mode == 0)
246253
return;
247254

248255
REG_WRITE(D1VGA_CONTROL, 0);
256+
REG_WRITE(D2VGA_CONTROL, 0);
257+
REG_WRITE(D3VGA_CONTROL, 0);
258+
REG_WRITE(D4VGA_CONTROL, 0);
249259

250260
/* HW Engineer's Notes:
251261
* During switch from vga->extended, if we set the VGA_TEST_ENABLE and

drivers/gpu/drm/ast/ast_tables.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ static const struct ast_vbios_dclk_info dclk_table[] = {
9797
{0x67, 0x22, 0x00}, /* 0E: VCLK157_5 */
9898
{0x6A, 0x22, 0x00}, /* 0F: VCLK162 */
9999
{0x4d, 0x4c, 0x80}, /* 10: VCLK154 */
100-
{0xa7, 0x78, 0x80}, /* 11: VCLK83.5 */
100+
{0x68, 0x6f, 0x80}, /* 11: VCLK83.5 */
101101
{0x28, 0x49, 0x80}, /* 12: VCLK106.5 */
102102
{0x37, 0x49, 0x80}, /* 13: VCLK146.25 */
103103
{0x1f, 0x45, 0x80}, /* 14: VCLK148.5 */
@@ -127,7 +127,7 @@ static const struct ast_vbios_dclk_info dclk_table_ast2500[] = {
127127
{0x67, 0x22, 0x00}, /* 0E: VCLK157_5 */
128128
{0x6A, 0x22, 0x00}, /* 0F: VCLK162 */
129129
{0x4d, 0x4c, 0x80}, /* 10: VCLK154 */
130-
{0xa7, 0x78, 0x80}, /* 11: VCLK83.5 */
130+
{0x68, 0x6f, 0x80}, /* 11: VCLK83.5 */
131131
{0x28, 0x49, 0x80}, /* 12: VCLK106.5 */
132132
{0x37, 0x49, 0x80}, /* 13: VCLK146.25 */
133133
{0x1f, 0x45, 0x80}, /* 14: VCLK148.5 */

drivers/gpu/drm/drm_framebuffer.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,12 @@ int drm_mode_getfb(struct drm_device *dev,
461461
if (!fb)
462462
return -ENOENT;
463463

464+
/* Multi-planar framebuffers need getfb2. */
465+
if (fb->format->num_planes > 1) {
466+
ret = -EINVAL;
467+
goto out;
468+
}
469+
464470
r->height = fb->height;
465471
r->width = fb->width;
466472
r->depth = fb->format->depth;
@@ -484,6 +490,7 @@ int drm_mode_getfb(struct drm_device *dev,
484490
ret = -ENODEV;
485491
}
486492

493+
out:
487494
drm_framebuffer_put(fb);
488495

489496
return ret;

drivers/gpu/drm/i915/intel_ddi.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2175,8 +2175,7 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
21752175
intel_prepare_dp_ddi_buffers(encoder, crtc_state);
21762176

21772177
intel_ddi_init_dp_buf_reg(encoder);
2178-
if (!is_mst)
2179-
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
2178+
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
21802179
intel_dp_start_link_train(intel_dp);
21812180
if (port != PORT_A || INTEL_GEN(dev_priv) >= 9)
21822181
intel_dp_stop_link_train(intel_dp);
@@ -2274,14 +2273,12 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder,
22742273
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
22752274
struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
22762275
struct intel_dp *intel_dp = &dig_port->dp;
2277-
bool is_mst = intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST);
22782276

22792277
/*
22802278
* Power down sink before disabling the port, otherwise we end
22812279
* up getting interrupts from the sink on detecting link loss.
22822280
*/
2283-
if (!is_mst)
2284-
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
2281+
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
22852282

22862283
intel_disable_ddi_buf(encoder);
22872284

drivers/gpu/drm/i915/intel_hangcheck.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ engine_stuck(struct intel_engine_cs *engine, u64 acthd)
246246
*/
247247
tmp = I915_READ_CTL(engine);
248248
if (tmp & RING_WAIT) {
249-
i915_handle_error(dev_priv, 0,
249+
i915_handle_error(dev_priv, BIT(engine->id),
250250
"Kicking stuck wait on %s",
251251
engine->name);
252252
I915_WRITE_CTL(engine, tmp);
@@ -258,7 +258,7 @@ engine_stuck(struct intel_engine_cs *engine, u64 acthd)
258258
default:
259259
return ENGINE_DEAD;
260260
case 1:
261-
i915_handle_error(dev_priv, 0,
261+
i915_handle_error(dev_priv, ALL_ENGINES,
262262
"Kicking stuck semaphore on %s",
263263
engine->name);
264264
I915_WRITE_CTL(engine, tmp);

drivers/gpu/drm/imx/ipuv3-crtc.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,11 @@ static void ipu_crtc_atomic_begin(struct drm_crtc *crtc,
225225
struct drm_crtc_state *old_crtc_state)
226226
{
227227
drm_crtc_vblank_on(crtc);
228+
}
228229

230+
static void ipu_crtc_atomic_flush(struct drm_crtc *crtc,
231+
struct drm_crtc_state *old_crtc_state)
232+
{
229233
spin_lock_irq(&crtc->dev->event_lock);
230234
if (crtc->state->event) {
231235
WARN_ON(drm_crtc_vblank_get(crtc));
@@ -293,6 +297,7 @@ static const struct drm_crtc_helper_funcs ipu_helper_funcs = {
293297
.mode_set_nofb = ipu_crtc_mode_set_nofb,
294298
.atomic_check = ipu_crtc_atomic_check,
295299
.atomic_begin = ipu_crtc_atomic_begin,
300+
.atomic_flush = ipu_crtc_atomic_flush,
296301
.atomic_disable = ipu_crtc_atomic_disable,
297302
.atomic_enable = ipu_crtc_atomic_enable,
298303
};

drivers/gpu/drm/imx/ipuv3-plane.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <drm/drm_plane_helper.h>
2323

2424
#include "video/imx-ipu-v3.h"
25+
#include "imx-drm.h"
2526
#include "ipuv3-plane.h"
2627

2728
struct ipu_plane_state {
@@ -272,7 +273,7 @@ static void ipu_plane_destroy(struct drm_plane *plane)
272273
kfree(ipu_plane);
273274
}
274275

275-
void ipu_plane_state_reset(struct drm_plane *plane)
276+
static void ipu_plane_state_reset(struct drm_plane *plane)
276277
{
277278
struct ipu_plane_state *ipu_state;
278279

@@ -292,7 +293,8 @@ void ipu_plane_state_reset(struct drm_plane *plane)
292293
plane->state = &ipu_state->base;
293294
}
294295

295-
struct drm_plane_state *ipu_plane_duplicate_state(struct drm_plane *plane)
296+
static struct drm_plane_state *
297+
ipu_plane_duplicate_state(struct drm_plane *plane)
296298
{
297299
struct ipu_plane_state *state;
298300

@@ -306,8 +308,8 @@ struct drm_plane_state *ipu_plane_duplicate_state(struct drm_plane *plane)
306308
return &state->base;
307309
}
308310

309-
void ipu_plane_destroy_state(struct drm_plane *plane,
310-
struct drm_plane_state *state)
311+
static void ipu_plane_destroy_state(struct drm_plane *plane,
312+
struct drm_plane_state *state)
311313
{
312314
struct ipu_plane_state *ipu_state = to_ipu_plane_state(state);
313315

drivers/gpu/drm/radeon/radeon_connectors.c

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -90,25 +90,18 @@ void radeon_connector_hotplug(struct drm_connector *connector)
9090
/* don't do anything if sink is not display port, i.e.,
9191
* passive dp->(dvi|hdmi) adaptor
9292
*/
93-
if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
94-
int saved_dpms = connector->dpms;
95-
/* Only turn off the display if it's physically disconnected */
96-
if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
97-
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
98-
} else if (radeon_dp_needs_link_train(radeon_connector)) {
99-
/* Don't try to start link training before we
100-
* have the dpcd */
101-
if (!radeon_dp_getdpcd(radeon_connector))
102-
return;
103-
104-
/* set it to OFF so that drm_helper_connector_dpms()
105-
* won't return immediately since the current state
106-
* is ON at this point.
107-
*/
108-
connector->dpms = DRM_MODE_DPMS_OFF;
109-
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
110-
}
111-
connector->dpms = saved_dpms;
93+
if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT &&
94+
radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) &&
95+
radeon_dp_needs_link_train(radeon_connector)) {
96+
/* Don't start link training before we have the DPCD */
97+
if (!radeon_dp_getdpcd(radeon_connector))
98+
return;
99+
100+
/* Turn the connector off and back on immediately, which
101+
* will trigger link training
102+
*/
103+
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
104+
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
112105
}
113106
}
114107
}

drivers/gpu/drm/sun4i/sun4i_drv.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ static int sun4i_drv_bind(struct device *dev)
111111
/* drm_vblank_init calls kcalloc, which can fail */
112112
ret = drm_vblank_init(drm, drm->mode_config.num_crtc);
113113
if (ret)
114-
goto free_mem_region;
114+
goto cleanup_mode_config;
115115

116116
drm->irq_enabled = true;
117117

@@ -139,7 +139,6 @@ static int sun4i_drv_bind(struct device *dev)
139139
sun4i_framebuffer_free(drm);
140140
cleanup_mode_config:
141141
drm_mode_config_cleanup(drm);
142-
free_mem_region:
143142
of_reserved_mem_device_release(dev);
144143
free_drm:
145144
drm_dev_unref(drm);

drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,8 @@ static int sun4i_hdmi_bind(struct device *dev, struct device *master,
538538
&sun4i_hdmi_regmap_config);
539539
if (IS_ERR(hdmi->regmap)) {
540540
dev_err(dev, "Couldn't create HDMI encoder regmap\n");
541-
return PTR_ERR(hdmi->regmap);
541+
ret = PTR_ERR(hdmi->regmap);
542+
goto err_disable_mod_clk;
542543
}
543544

544545
ret = sun4i_tmds_create(hdmi);
@@ -551,7 +552,8 @@ static int sun4i_hdmi_bind(struct device *dev, struct device *master,
551552
hdmi->ddc_parent_clk = devm_clk_get(dev, "ddc");
552553
if (IS_ERR(hdmi->ddc_parent_clk)) {
553554
dev_err(dev, "Couldn't get the HDMI DDC clock\n");
554-
return PTR_ERR(hdmi->ddc_parent_clk);
555+
ret = PTR_ERR(hdmi->ddc_parent_clk);
556+
goto err_disable_mod_clk;
555557
}
556558
} else {
557559
hdmi->ddc_parent_clk = hdmi->tmds_clk;

drivers/gpu/drm/sun4i/sun4i_tcon.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ static void sun4i_tcon_channel_set_status(struct sun4i_tcon *tcon, int channel,
103103

104104
if (enabled) {
105105
clk_prepare_enable(clk);
106+
clk_rate_exclusive_get(clk);
106107
} else {
107108
clk_rate_exclusive_put(clk);
108109
clk_disable_unprepare(clk);
@@ -262,7 +263,7 @@ static void sun4i_tcon0_mode_set_common(struct sun4i_tcon *tcon,
262263
const struct drm_display_mode *mode)
263264
{
264265
/* Configure the dot clock */
265-
clk_set_rate_exclusive(tcon->dclk, mode->crtc_clock * 1000);
266+
clk_set_rate(tcon->dclk, mode->crtc_clock * 1000);
266267

267268
/* Set the resolution */
268269
regmap_write(tcon->regs, SUN4I_TCON0_BASIC0_REG,
@@ -423,7 +424,7 @@ static void sun4i_tcon1_mode_set(struct sun4i_tcon *tcon,
423424
WARN_ON(!tcon->quirks->has_channel_1);
424425

425426
/* Configure the dot clock */
426-
clk_set_rate_exclusive(tcon->sclk1, mode->crtc_clock * 1000);
427+
clk_set_rate(tcon->sclk1, mode->crtc_clock * 1000);
427428

428429
/* Adjust clock delay */
429430
clk_delay = sun4i_tcon_get_clk_delay(mode, 1);

0 commit comments

Comments
 (0)