Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "All pretty normal: one TTM oops fix, one radeon, a few intel and a vmwgfx fix." * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/ttm: remove unneeded preempt_disable/enable ttm: Clear the ttm page allocated from high memory zone correctly vmwgfx: return an -EFAULT if copy_to_user() fails drm/radeon: fix logic error in atombios_encoders.c drm/i915: do not ignore eDP bpc settings from vbt drm/i915/sdvo: clean up connectors on intel_sdvo_init() failures drm/i915/crt: fix DPMS standby and suspend mode handling
This commit is contained in:
commit
7279d7cb52
|
@ -143,7 +143,7 @@ static void intel_crt_dpms(struct drm_connector *connector, int mode)
|
||||||
int old_dpms;
|
int old_dpms;
|
||||||
|
|
||||||
/* PCH platforms and VLV only support on/off. */
|
/* PCH platforms and VLV only support on/off. */
|
||||||
if (INTEL_INFO(dev)->gen < 5 && mode != DRM_MODE_DPMS_ON)
|
if (INTEL_INFO(dev)->gen >= 5 && mode != DRM_MODE_DPMS_ON)
|
||||||
mode = DRM_MODE_DPMS_OFF;
|
mode = DRM_MODE_DPMS_OFF;
|
||||||
|
|
||||||
if (mode == connector->dpms)
|
if (mode == connector->dpms)
|
||||||
|
|
|
@ -3841,6 +3841,17 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (intel_encoder->type == INTEL_OUTPUT_EDP) {
|
||||||
|
/* Use VBT settings if we have an eDP panel */
|
||||||
|
unsigned int edp_bpc = dev_priv->edp.bpp / 3;
|
||||||
|
|
||||||
|
if (edp_bpc < display_bpc) {
|
||||||
|
DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc);
|
||||||
|
display_bpc = edp_bpc;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* HDMI is either 12 or 8, so if the display lets 10bpc sneak
|
* HDMI is either 12 or 8, so if the display lets 10bpc sneak
|
||||||
* through, clamp it down. (Note: >12bpc will be caught below.)
|
* through, clamp it down. (Note: >12bpc will be caught below.)
|
||||||
|
|
|
@ -2382,6 +2382,18 @@ intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, uint16_t flags)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = intel_sdvo->base.base.dev;
|
||||||
|
struct drm_connector *connector, *tmp;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(connector, tmp,
|
||||||
|
&dev->mode_config.connector_list, head) {
|
||||||
|
if (intel_attached_encoder(connector) == &intel_sdvo->base)
|
||||||
|
intel_sdvo_destroy(connector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo,
|
static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo,
|
||||||
struct intel_sdvo_connector *intel_sdvo_connector,
|
struct intel_sdvo_connector *intel_sdvo_connector,
|
||||||
int type)
|
int type)
|
||||||
|
@ -2705,7 +2717,8 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
|
||||||
intel_sdvo->caps.output_flags) != true) {
|
intel_sdvo->caps.output_flags) != true) {
|
||||||
DRM_DEBUG_KMS("SDVO output failed to setup on %s\n",
|
DRM_DEBUG_KMS("SDVO output failed to setup on %s\n",
|
||||||
SDVO_NAME(intel_sdvo));
|
SDVO_NAME(intel_sdvo));
|
||||||
goto err;
|
/* Output_setup can leave behind connectors! */
|
||||||
|
goto err_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Only enable the hotplug irq if we need it, to work around noisy
|
/* Only enable the hotplug irq if we need it, to work around noisy
|
||||||
|
@ -2718,12 +2731,12 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
|
||||||
|
|
||||||
/* Set the input timing to the screen. Assume always input 0. */
|
/* Set the input timing to the screen. Assume always input 0. */
|
||||||
if (!intel_sdvo_set_target_input(intel_sdvo))
|
if (!intel_sdvo_set_target_input(intel_sdvo))
|
||||||
goto err;
|
goto err_output;
|
||||||
|
|
||||||
if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo,
|
if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo,
|
||||||
&intel_sdvo->pixel_clock_min,
|
&intel_sdvo->pixel_clock_min,
|
||||||
&intel_sdvo->pixel_clock_max))
|
&intel_sdvo->pixel_clock_max))
|
||||||
goto err;
|
goto err_output;
|
||||||
|
|
||||||
DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, "
|
DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, "
|
||||||
"clock range %dMHz - %dMHz, "
|
"clock range %dMHz - %dMHz, "
|
||||||
|
@ -2743,6 +2756,9 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
|
||||||
(SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N');
|
(SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N');
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
err_output:
|
||||||
|
intel_sdvo_output_cleanup(intel_sdvo);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
drm_encoder_cleanup(&intel_encoder->base);
|
drm_encoder_cleanup(&intel_encoder->base);
|
||||||
i2c_del_adapter(&intel_sdvo->ddc);
|
i2c_del_adapter(&intel_sdvo->ddc);
|
||||||
|
|
|
@ -1625,7 +1625,7 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
|
||||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0);
|
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0);
|
||||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
|
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
|
||||||
/* some early dce3.2 boards have a bug in their transmitter control table */
|
/* some early dce3.2 boards have a bug in their transmitter control table */
|
||||||
if ((rdev->family != CHIP_RV710) || (rdev->family != CHIP_RV730))
|
if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730))
|
||||||
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0);
|
atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0);
|
||||||
}
|
}
|
||||||
if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) {
|
if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) {
|
||||||
|
|
|
@ -749,7 +749,10 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
|
||||||
/* clear the pages coming from the pool if requested */
|
/* clear the pages coming from the pool if requested */
|
||||||
if (flags & TTM_PAGE_FLAG_ZERO_ALLOC) {
|
if (flags & TTM_PAGE_FLAG_ZERO_ALLOC) {
|
||||||
list_for_each_entry(p, &plist, lru) {
|
list_for_each_entry(p, &plist, lru) {
|
||||||
clear_page(page_address(p));
|
if (PageHighMem(p))
|
||||||
|
clear_highpage(p);
|
||||||
|
else
|
||||||
|
clear_page(page_address(p));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -308,9 +308,7 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
|
||||||
if (unlikely(to_page == NULL))
|
if (unlikely(to_page == NULL))
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
preempt_disable();
|
|
||||||
copy_highpage(to_page, from_page);
|
copy_highpage(to_page, from_page);
|
||||||
preempt_enable();
|
|
||||||
page_cache_release(from_page);
|
page_cache_release(from_page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,9 +356,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
|
||||||
ret = PTR_ERR(to_page);
|
ret = PTR_ERR(to_page);
|
||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
preempt_disable();
|
|
||||||
copy_highpage(to_page, from_page);
|
copy_highpage(to_page, from_page);
|
||||||
preempt_enable();
|
|
||||||
set_page_dirty(to_page);
|
set_page_dirty(to_page);
|
||||||
mark_page_accessed(to_page);
|
mark_page_accessed(to_page);
|
||||||
page_cache_release(to_page);
|
page_cache_release(to_page);
|
||||||
|
|
|
@ -110,6 +110,8 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data,
|
||||||
memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size);
|
memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size);
|
||||||
|
|
||||||
ret = copy_to_user(buffer, bounce, size);
|
ret = copy_to_user(buffer, bounce, size);
|
||||||
|
if (ret)
|
||||||
|
ret = -EFAULT;
|
||||||
vfree(bounce);
|
vfree(bounce);
|
||||||
|
|
||||||
if (unlikely(ret != 0))
|
if (unlikely(ret != 0))
|
||||||
|
|
Loading…
Reference in New Issue