mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-19 13:06:06 +07:00
Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel into drm-fixes
From Daniel Vetter - VGA load-detect fix. This bug seems to be as old as the load-detect code (2.6.30), but needs stupid userspace (upowerd trying to detect connectors on dpms-off outputs) to actually kill the machine. And obviously a machine without VGA-hotplug, otherwise we don't do load detect. - 2 interger overflow fixes for unpriviledged ioctls from Xi Wang. - Fix SDVO regression for low-res (pixelclock < 100MHz) digital outputs, introduce in 2.6.36. * 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel: drm/i915: handle input/output sdvo timings separately in mode_set drm/i915: fix integer overflow in i915_gem_do_execbuffer() drm/i915: fix integer overflow in i915_gem_execbuffer2() drm/i915: fixup load-detect on enabled, but not active pipe
This commit is contained in:
commit
792ac99c9a
@ -1133,6 +1133,11 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (args->num_cliprects > UINT_MAX / sizeof(*cliprects)) {
|
||||
DRM_DEBUG("execbuf with %u cliprects\n",
|
||||
args->num_cliprects);
|
||||
return -EINVAL;
|
||||
}
|
||||
cliprects = kmalloc(args->num_cliprects * sizeof(*cliprects),
|
||||
GFP_KERNEL);
|
||||
if (cliprects == NULL) {
|
||||
@ -1404,7 +1409,8 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
|
||||
struct drm_i915_gem_exec_object2 *exec2_list = NULL;
|
||||
int ret;
|
||||
|
||||
if (args->buffer_count < 1) {
|
||||
if (args->buffer_count < 1 ||
|
||||
args->buffer_count > UINT_MAX / sizeof(*exec2_list)) {
|
||||
DRM_DEBUG("execbuf2 with %d buffers\n", args->buffer_count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -430,8 +430,8 @@ intel_crt_detect(struct drm_connector *connector, bool force)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_crt *crt = intel_attached_crt(connector);
|
||||
struct drm_crtc *crtc;
|
||||
enum drm_connector_status status;
|
||||
struct intel_load_detect_pipe tmp;
|
||||
|
||||
if (I915_HAS_HOTPLUG(dev)) {
|
||||
if (intel_crt_detect_hotplug(connector)) {
|
||||
@ -450,23 +450,16 @@ intel_crt_detect(struct drm_connector *connector, bool force)
|
||||
return connector->status;
|
||||
|
||||
/* for pre-945g platforms use load detect */
|
||||
crtc = crt->base.base.crtc;
|
||||
if (crtc && crtc->enabled) {
|
||||
status = intel_crt_load_detect(crt);
|
||||
} else {
|
||||
struct intel_load_detect_pipe tmp;
|
||||
|
||||
if (intel_get_load_detect_pipe(&crt->base, connector, NULL,
|
||||
&tmp)) {
|
||||
if (intel_crt_detect_ddc(connector))
|
||||
status = connector_status_connected;
|
||||
else
|
||||
status = intel_crt_load_detect(crt);
|
||||
intel_release_load_detect_pipe(&crt->base, connector,
|
||||
&tmp);
|
||||
} else
|
||||
status = connector_status_unknown;
|
||||
}
|
||||
if (intel_get_load_detect_pipe(&crt->base, connector, NULL,
|
||||
&tmp)) {
|
||||
if (intel_crt_detect_ddc(connector))
|
||||
status = connector_status_connected;
|
||||
else
|
||||
status = intel_crt_load_detect(crt);
|
||||
intel_release_load_detect_pipe(&crt->base, connector,
|
||||
&tmp);
|
||||
} else
|
||||
status = connector_status_unknown;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -731,6 +731,7 @@ static void intel_sdvo_get_dtd_from_mode(struct intel_sdvo_dtd *dtd,
|
||||
uint16_t width, height;
|
||||
uint16_t h_blank_len, h_sync_len, v_blank_len, v_sync_len;
|
||||
uint16_t h_sync_offset, v_sync_offset;
|
||||
int mode_clock;
|
||||
|
||||
width = mode->crtc_hdisplay;
|
||||
height = mode->crtc_vdisplay;
|
||||
@ -745,7 +746,11 @@ static void intel_sdvo_get_dtd_from_mode(struct intel_sdvo_dtd *dtd,
|
||||
h_sync_offset = mode->crtc_hsync_start - mode->crtc_hblank_start;
|
||||
v_sync_offset = mode->crtc_vsync_start - mode->crtc_vblank_start;
|
||||
|
||||
dtd->part1.clock = mode->clock / 10;
|
||||
mode_clock = mode->clock;
|
||||
mode_clock /= intel_mode_get_pixel_multiplier(mode) ?: 1;
|
||||
mode_clock /= 10;
|
||||
dtd->part1.clock = mode_clock;
|
||||
|
||||
dtd->part1.h_active = width & 0xff;
|
||||
dtd->part1.h_blank = h_blank_len & 0xff;
|
||||
dtd->part1.h_high = (((width >> 8) & 0xf) << 4) |
|
||||
@ -996,7 +1001,7 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
||||
struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder);
|
||||
u32 sdvox;
|
||||
struct intel_sdvo_in_out_map in_out;
|
||||
struct intel_sdvo_dtd input_dtd;
|
||||
struct intel_sdvo_dtd input_dtd, output_dtd;
|
||||
int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode);
|
||||
int rate;
|
||||
|
||||
@ -1021,20 +1026,13 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
||||
intel_sdvo->attached_output))
|
||||
return;
|
||||
|
||||
/* We have tried to get input timing in mode_fixup, and filled into
|
||||
* adjusted_mode.
|
||||
*/
|
||||
if (intel_sdvo->is_tv || intel_sdvo->is_lvds) {
|
||||
input_dtd = intel_sdvo->input_dtd;
|
||||
} else {
|
||||
/* Set the output timing to the screen */
|
||||
if (!intel_sdvo_set_target_output(intel_sdvo,
|
||||
intel_sdvo->attached_output))
|
||||
return;
|
||||
|
||||
intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode);
|
||||
(void) intel_sdvo_set_output_timing(intel_sdvo, &input_dtd);
|
||||
}
|
||||
/* lvds has a special fixed output timing. */
|
||||
if (intel_sdvo->is_lvds)
|
||||
intel_sdvo_get_dtd_from_mode(&output_dtd,
|
||||
intel_sdvo->sdvo_lvds_fixed_mode);
|
||||
else
|
||||
intel_sdvo_get_dtd_from_mode(&output_dtd, mode);
|
||||
(void) intel_sdvo_set_output_timing(intel_sdvo, &output_dtd);
|
||||
|
||||
/* Set the input timing to the screen. Assume always input 0. */
|
||||
if (!intel_sdvo_set_target_input(intel_sdvo))
|
||||
@ -1052,6 +1050,10 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
||||
!intel_sdvo_set_tv_format(intel_sdvo))
|
||||
return;
|
||||
|
||||
/* We have tried to get input timing in mode_fixup, and filled into
|
||||
* adjusted_mode.
|
||||
*/
|
||||
intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode);
|
||||
(void) intel_sdvo_set_input_timing(intel_sdvo, &input_dtd);
|
||||
|
||||
switch (pixel_multiplier) {
|
||||
|
Loading…
Reference in New Issue
Block a user