Commit d4e181f2 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'drm-next-2020-06-11-1' of git://anongit.freedesktop.org/drm/drm

Pull drm fixes from Dave Airlie:
 "One sun4i fix and a connector hotplug race The ast fix is for a
  regression in 5.6, and one of the i915 ones fixes an oops reported by
  dhowells.

  core:
   - fix race in connectors sending hotplug

  i915:
   - Avoid use after free in cmdparser
   - Avoid NULL dereference when probing all display encoders
   - Fixup to module parameter type

  sun4i:
   - clock divider fix

  ast:
   - 24/32 bpp mode setting fix"

* tag 'drm-next-2020-06-11-1' of git://anongit.freedesktop.org/drm/drm:
  drm/ast: fix missing break in switch statement for format->cpp[0] case 4
  drm/sun4i: hdmi ddc clk: Fix size of m divider
  drm/i915/display: Only query DP state of a DDI encoder
  drm/i915/params: fix i915.reset module param type
  drm/i915/gem: Mark the buffer pool as active for the cmdparser
  drm/connector: notify userspace on hotplug after register complete
parents a5395682 66057dd1
...@@ -226,6 +226,7 @@ static void ast_set_vbios_color_reg(struct ast_private *ast, ...@@ -226,6 +226,7 @@ static void ast_set_vbios_color_reg(struct ast_private *ast,
case 3: case 3:
case 4: case 4:
color_index = TrueCModeIndex; color_index = TrueCModeIndex;
break;
default: default:
return; return;
} }
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <drm/drm_print.h> #include <drm/drm_print.h>
#include <drm/drm_drv.h> #include <drm/drm_drv.h>
#include <drm/drm_file.h> #include <drm/drm_file.h>
#include <drm/drm_sysfs.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
...@@ -523,6 +524,10 @@ int drm_connector_register(struct drm_connector *connector) ...@@ -523,6 +524,10 @@ int drm_connector_register(struct drm_connector *connector)
drm_mode_object_register(connector->dev, &connector->base); drm_mode_object_register(connector->dev, &connector->base);
connector->registration_state = DRM_CONNECTOR_REGISTERED; connector->registration_state = DRM_CONNECTOR_REGISTERED;
/* Let userspace know we have a new connector */
drm_sysfs_hotplug_event(connector->dev);
goto unlock; goto unlock;
err_debugfs: err_debugfs:
......
...@@ -291,9 +291,6 @@ int drm_sysfs_connector_add(struct drm_connector *connector) ...@@ -291,9 +291,6 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
return PTR_ERR(connector->kdev); return PTR_ERR(connector->kdev);
} }
/* Let userspace know we have a new connector */
drm_sysfs_hotplug_event(dev);
if (connector->ddc) if (connector->ddc)
return sysfs_create_link(&connector->kdev->kobj, return sysfs_create_link(&connector->kdev->kobj,
&connector->ddc->dev.kobj, "ddc"); &connector->ddc->dev.kobj, "ddc");
......
...@@ -5206,6 +5206,9 @@ void intel_read_dp_sdp(struct intel_encoder *encoder, ...@@ -5206,6 +5206,9 @@ void intel_read_dp_sdp(struct intel_encoder *encoder,
struct intel_crtc_state *crtc_state, struct intel_crtc_state *crtc_state,
unsigned int type) unsigned int type)
{ {
if (encoder->type != INTEL_OUTPUT_DDI)
return;
switch (type) { switch (type) {
case DP_SDP_VSC: case DP_SDP_VSC:
intel_read_dp_vsc_sdp(encoder, crtc_state, intel_read_dp_vsc_sdp(encoder, crtc_state,
......
...@@ -1988,6 +1988,38 @@ static const struct dma_fence_work_ops eb_parse_ops = { ...@@ -1988,6 +1988,38 @@ static const struct dma_fence_work_ops eb_parse_ops = {
.release = __eb_parse_release, .release = __eb_parse_release,
}; };
static inline int
__parser_mark_active(struct i915_vma *vma,
struct intel_timeline *tl,
struct dma_fence *fence)
{
struct intel_gt_buffer_pool_node *node = vma->private;
return i915_active_ref(&node->active, tl, fence);
}
static int
parser_mark_active(struct eb_parse_work *pw, struct intel_timeline *tl)
{
int err;
mutex_lock(&tl->mutex);
err = __parser_mark_active(pw->shadow, tl, &pw->base.dma);
if (err)
goto unlock;
if (pw->trampoline) {
err = __parser_mark_active(pw->trampoline, tl, &pw->base.dma);
if (err)
goto unlock;
}
unlock:
mutex_unlock(&tl->mutex);
return err;
}
static int eb_parse_pipeline(struct i915_execbuffer *eb, static int eb_parse_pipeline(struct i915_execbuffer *eb,
struct i915_vma *shadow, struct i915_vma *shadow,
struct i915_vma *trampoline) struct i915_vma *trampoline)
...@@ -2022,20 +2054,25 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb, ...@@ -2022,20 +2054,25 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
pw->shadow = shadow; pw->shadow = shadow;
pw->trampoline = trampoline; pw->trampoline = trampoline;
/* Mark active refs early for this worker, in case we get interrupted */
err = parser_mark_active(pw, eb->context->timeline);
if (err)
goto err_commit;
err = dma_resv_lock_interruptible(pw->batch->resv, NULL); err = dma_resv_lock_interruptible(pw->batch->resv, NULL);
if (err) if (err)
goto err_trampoline; goto err_commit;
err = dma_resv_reserve_shared(pw->batch->resv, 1); err = dma_resv_reserve_shared(pw->batch->resv, 1);
if (err) if (err)
goto err_batch_unlock; goto err_commit_unlock;
/* Wait for all writes (and relocs) into the batch to complete */ /* Wait for all writes (and relocs) into the batch to complete */
err = i915_sw_fence_await_reservation(&pw->base.chain, err = i915_sw_fence_await_reservation(&pw->base.chain,
pw->batch->resv, NULL, false, pw->batch->resv, NULL, false,
0, I915_FENCE_GFP); 0, I915_FENCE_GFP);
if (err < 0) if (err < 0)
goto err_batch_unlock; goto err_commit_unlock;
/* Keep the batch alive and unwritten as we parse */ /* Keep the batch alive and unwritten as we parse */
dma_resv_add_shared_fence(pw->batch->resv, &pw->base.dma); dma_resv_add_shared_fence(pw->batch->resv, &pw->base.dma);
...@@ -2050,11 +2087,13 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb, ...@@ -2050,11 +2087,13 @@ static int eb_parse_pipeline(struct i915_execbuffer *eb,
dma_fence_work_commit_imm(&pw->base); dma_fence_work_commit_imm(&pw->base);
return 0; return 0;
err_batch_unlock: err_commit_unlock:
dma_resv_unlock(pw->batch->resv); dma_resv_unlock(pw->batch->resv);
err_trampoline: err_commit:
if (trampoline) i915_sw_fence_set_error_once(&pw->base.chain, err);
i915_active_release(&trampoline->active); dma_fence_work_commit_imm(&pw->base);
return err;
err_shadow: err_shadow:
i915_active_release(&shadow->active); i915_active_release(&shadow->active);
err_batch: err_batch:
...@@ -2100,6 +2139,7 @@ static int eb_parse(struct i915_execbuffer *eb) ...@@ -2100,6 +2139,7 @@ static int eb_parse(struct i915_execbuffer *eb)
goto err; goto err;
} }
i915_gem_object_set_readonly(shadow->obj); i915_gem_object_set_readonly(shadow->obj);
shadow->private = pool;
trampoline = NULL; trampoline = NULL;
if (CMDPARSER_USES_GGTT(eb->i915)) { if (CMDPARSER_USES_GGTT(eb->i915)) {
...@@ -2113,6 +2153,7 @@ static int eb_parse(struct i915_execbuffer *eb) ...@@ -2113,6 +2153,7 @@ static int eb_parse(struct i915_execbuffer *eb)
shadow = trampoline; shadow = trampoline;
goto err_shadow; goto err_shadow;
} }
shadow->private = pool;
eb->batch_flags |= I915_DISPATCH_SECURE; eb->batch_flags |= I915_DISPATCH_SECURE;
} }
...@@ -2129,7 +2170,6 @@ static int eb_parse(struct i915_execbuffer *eb) ...@@ -2129,7 +2170,6 @@ static int eb_parse(struct i915_execbuffer *eb)
eb->trampoline = trampoline; eb->trampoline = trampoline;
eb->batch_start_offset = 0; eb->batch_start_offset = 0;
shadow->private = pool;
return 0; return 0;
err_trampoline: err_trampoline:
......
...@@ -65,7 +65,7 @@ i915_param_named_unsafe(vbt_sdvo_panel_type, int, 0400, ...@@ -65,7 +65,7 @@ i915_param_named_unsafe(vbt_sdvo_panel_type, int, 0400,
"Override/Ignore selection of SDVO panel mode in the VBT " "Override/Ignore selection of SDVO panel mode in the VBT "
"(-2=ignore, -1=auto [default], index in VBT BIOS table)"); "(-2=ignore, -1=auto [default], index in VBT BIOS table)");
i915_param_named_unsafe(reset, int, 0600, i915_param_named_unsafe(reset, uint, 0600,
"Attempt GPU resets (0=disabled, 1=full gpu reset, 2=engine reset [default])"); "Attempt GPU resets (0=disabled, 1=full gpu reset, 2=engine reset [default])");
i915_param_named_unsafe(vbt_firmware, charp, 0400, i915_param_named_unsafe(vbt_firmware, charp, 0400,
......
...@@ -148,7 +148,7 @@ ...@@ -148,7 +148,7 @@
#define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3 #define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3
#define SUN4I_HDMI_DDC_CLK_REG 0x528 #define SUN4I_HDMI_DDC_CLK_REG 0x528
#define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0x7) << 3) #define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0xf) << 3)
#define SUN4I_HDMI_DDC_CLK_N(n) ((n) & 0x7) #define SUN4I_HDMI_DDC_CLK_N(n) ((n) & 0x7)
#define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540 #define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540
......
...@@ -33,7 +33,7 @@ static unsigned long sun4i_ddc_calc_divider(unsigned long rate, ...@@ -33,7 +33,7 @@ static unsigned long sun4i_ddc_calc_divider(unsigned long rate,
unsigned long best_rate = 0; unsigned long best_rate = 0;
u8 best_m = 0, best_n = 0, _m, _n; u8 best_m = 0, best_n = 0, _m, _n;
for (_m = 0; _m < 8; _m++) { for (_m = 0; _m < 16; _m++) {
for (_n = 0; _n < 8; _n++) { for (_n = 0; _n < 8; _n++) {
unsigned long tmp_rate; unsigned long tmp_rate;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment