Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "I've been a bit slow gathering these: - drm/mst: one mutex leak in a fail path - radeon: two oops fixes, one dpm fix - i915: one messy set of fixes, where we revert the original fix, and pull back the proper set of fixes from -next on top. - nouveau: one fix for an illegal buffer placement. Doesn't look too bad, hopefully shouldn't be too much more" * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/nouveau/gem: return only valid domain when there's only one drm: fix mutex leak in drm_dp_get_mst_branch_device drm/amdgpu: add missing dpm check for KV dpm late init drm/amdgpu/dpm: don't add pwm attributes if DPM is disabled drm/radeon/dpm: don't add pwm attributes if DPM is disabled drm/i915: Add primary plane to mask if it's visible drm/i915: Move sprite/cursor plane disable to intel_sanitize_crtc() drm/i915: Assign hwmode after encoder state readout Revert "drm/i915: Add primary plane to mask if it's visible" drm/i915: Deny wrapping an userptr into a framebuffer drm/i915: Enable DPLL VGA mode before P1/P2 divider write drm/i915: Restore lost DPLL register write on gen2-4 drm/i915: Flush pipecontrol post-sync writes drm/i915: Fix kerneldoc for i915_gem_shrink_all
This commit is contained in:
commit
a67b20d24c
10 changed files with 97 additions and 64 deletions
|
@ -294,10 +294,14 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
|
||||||
struct amdgpu_device *adev = dev_get_drvdata(dev);
|
struct amdgpu_device *adev = dev_get_drvdata(dev);
|
||||||
umode_t effective_mode = attr->mode;
|
umode_t effective_mode = attr->mode;
|
||||||
|
|
||||||
/* Skip limit attributes if DPM is not enabled */
|
/* Skip attributes if DPM is not enabled */
|
||||||
if (!adev->pm.dpm_enabled &&
|
if (!adev->pm.dpm_enabled &&
|
||||||
(attr == &sensor_dev_attr_temp1_crit.dev_attr.attr ||
|
(attr == &sensor_dev_attr_temp1_crit.dev_attr.attr ||
|
||||||
attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr))
|
attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr ||
|
||||||
|
attr == &sensor_dev_attr_pwm1.dev_attr.attr ||
|
||||||
|
attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr ||
|
||||||
|
attr == &sensor_dev_attr_pwm1_max.dev_attr.attr ||
|
||||||
|
attr == &sensor_dev_attr_pwm1_min.dev_attr.attr))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Skip fan attributes if fan is not present */
|
/* Skip fan attributes if fan is not present */
|
||||||
|
|
|
@ -2997,6 +2997,9 @@ static int kv_dpm_late_init(void *handle)
|
||||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!amdgpu_dpm)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* init the sysfs and debugfs files late */
|
/* init the sysfs and debugfs files late */
|
||||||
ret = amdgpu_pm_sysfs_init(adev);
|
ret = amdgpu_pm_sysfs_init(adev);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -1194,17 +1194,18 @@ static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_
|
||||||
|
|
||||||
list_for_each_entry(port, &mstb->ports, next) {
|
list_for_each_entry(port, &mstb->ports, next) {
|
||||||
if (port->port_num == port_num) {
|
if (port->port_num == port_num) {
|
||||||
if (!port->mstb) {
|
mstb = port->mstb;
|
||||||
|
if (!mstb) {
|
||||||
DRM_ERROR("failed to lookup MSTB with lct %d, rad %02x\n", lct, rad[0]);
|
DRM_ERROR("failed to lookup MSTB with lct %d, rad %02x\n", lct, rad[0]);
|
||||||
return NULL;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
mstb = port->mstb;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
kref_get(&mstb->kref);
|
kref_get(&mstb->kref);
|
||||||
|
out:
|
||||||
mutex_unlock(&mgr->lock);
|
mutex_unlock(&mgr->lock);
|
||||||
return mstb;
|
return mstb;
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,7 +143,7 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* i915_gem_shrink - Shrink buffer object caches completely
|
* i915_gem_shrink_all - Shrink buffer object caches completely
|
||||||
* @dev_priv: i915 device
|
* @dev_priv: i915 device
|
||||||
*
|
*
|
||||||
* This is a simple wraper around i915_gem_shrink() to aggressively shrink all
|
* This is a simple wraper around i915_gem_shrink() to aggressively shrink all
|
||||||
|
|
|
@ -804,7 +804,10 @@ static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = {
|
||||||
* Also note, that the object created here is not currently a "first class"
|
* Also note, that the object created here is not currently a "first class"
|
||||||
* object, in that several ioctls are banned. These are the CPU access
|
* object, in that several ioctls are banned. These are the CPU access
|
||||||
* ioctls: mmap(), pwrite and pread. In practice, you are expected to use
|
* ioctls: mmap(), pwrite and pread. In practice, you are expected to use
|
||||||
* direct access via your pointer rather than use those ioctls.
|
* direct access via your pointer rather than use those ioctls. Another
|
||||||
|
* restriction is that we do not allow userptr surfaces to be pinned to the
|
||||||
|
* hardware and so we reject any attempt to create a framebuffer out of a
|
||||||
|
* userptr.
|
||||||
*
|
*
|
||||||
* If you think this is a good interface to use to pass GPU memory between
|
* If you think this is a good interface to use to pass GPU memory between
|
||||||
* drivers, please use dma-buf instead. In fact, wherever possible use
|
* drivers, please use dma-buf instead. In fact, wherever possible use
|
||||||
|
|
|
@ -1724,6 +1724,15 @@ static void i9xx_enable_pll(struct intel_crtc *crtc)
|
||||||
I915_READ(DPLL(!crtc->pipe)) | DPLL_DVO_2X_MODE);
|
I915_READ(DPLL(!crtc->pipe)) | DPLL_DVO_2X_MODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Apparently we need to have VGA mode enabled prior to changing
|
||||||
|
* the P1/P2 dividers. Otherwise the DPLL will keep using the old
|
||||||
|
* dividers, even though the register value does change.
|
||||||
|
*/
|
||||||
|
I915_WRITE(reg, 0);
|
||||||
|
|
||||||
|
I915_WRITE(reg, dpll);
|
||||||
|
|
||||||
/* Wait for the clocks to stabilize. */
|
/* Wait for the clocks to stabilize. */
|
||||||
POSTING_READ(reg);
|
POSTING_READ(reg);
|
||||||
udelay(150);
|
udelay(150);
|
||||||
|
@ -14107,6 +14116,11 @@ static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
|
||||||
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
|
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
|
||||||
struct drm_i915_gem_object *obj = intel_fb->obj;
|
struct drm_i915_gem_object *obj = intel_fb->obj;
|
||||||
|
|
||||||
|
if (obj->userptr.mm) {
|
||||||
|
DRM_DEBUG("attempting to use a userptr for a framebuffer, denied\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
return drm_gem_handle_create(file, &obj->base, handle);
|
return drm_gem_handle_create(file, &obj->base, handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14897,9 +14911,19 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
|
||||||
/* restore vblank interrupts to correct state */
|
/* restore vblank interrupts to correct state */
|
||||||
drm_crtc_vblank_reset(&crtc->base);
|
drm_crtc_vblank_reset(&crtc->base);
|
||||||
if (crtc->active) {
|
if (crtc->active) {
|
||||||
|
struct intel_plane *plane;
|
||||||
|
|
||||||
drm_calc_timestamping_constants(&crtc->base, &crtc->base.hwmode);
|
drm_calc_timestamping_constants(&crtc->base, &crtc->base.hwmode);
|
||||||
update_scanline_offset(crtc);
|
update_scanline_offset(crtc);
|
||||||
drm_crtc_vblank_on(&crtc->base);
|
drm_crtc_vblank_on(&crtc->base);
|
||||||
|
|
||||||
|
/* Disable everything but the primary plane */
|
||||||
|
for_each_intel_plane_on_crtc(dev, crtc, plane) {
|
||||||
|
if (plane->base.type == DRM_PLANE_TYPE_PRIMARY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
plane->disable_plane(&plane->base, &crtc->base);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We need to sanitize the plane -> pipe mapping first because this will
|
/* We need to sanitize the plane -> pipe mapping first because this will
|
||||||
|
@ -15067,38 +15091,25 @@ void i915_redisable_vga(struct drm_device *dev)
|
||||||
i915_redisable_vga_power_on(dev);
|
i915_redisable_vga_power_on(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool primary_get_hw_state(struct intel_crtc *crtc)
|
static bool primary_get_hw_state(struct intel_plane *plane)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
|
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
|
||||||
|
|
||||||
return !!(I915_READ(DSPCNTR(crtc->plane)) & DISPLAY_PLANE_ENABLE);
|
return I915_READ(DSPCNTR(plane->plane)) & DISPLAY_PLANE_ENABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void readout_plane_state(struct intel_crtc *crtc,
|
/* FIXME read out full plane state for all planes */
|
||||||
struct intel_crtc_state *crtc_state)
|
static void readout_plane_state(struct intel_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct intel_plane *p;
|
struct drm_plane *primary = crtc->base.primary;
|
||||||
struct intel_plane_state *plane_state;
|
struct intel_plane_state *plane_state =
|
||||||
bool active = crtc_state->base.active;
|
to_intel_plane_state(primary->state);
|
||||||
|
|
||||||
for_each_intel_plane(crtc->base.dev, p) {
|
plane_state->visible =
|
||||||
if (crtc->pipe != p->pipe)
|
primary_get_hw_state(to_intel_plane(primary));
|
||||||
continue;
|
|
||||||
|
|
||||||
plane_state = to_intel_plane_state(p->base.state);
|
|
||||||
|
|
||||||
if (p->base.type == DRM_PLANE_TYPE_PRIMARY) {
|
|
||||||
plane_state->visible = primary_get_hw_state(crtc);
|
|
||||||
if (plane_state->visible)
|
if (plane_state->visible)
|
||||||
crtc->base.state->plane_mask |=
|
crtc->base.state->plane_mask |= 1 << drm_plane_index(primary);
|
||||||
1 << drm_plane_index(&p->base);
|
|
||||||
} else {
|
|
||||||
if (active)
|
|
||||||
p->disable_plane(&p->base, &crtc->base);
|
|
||||||
|
|
||||||
plane_state->visible = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_modeset_readout_hw_state(struct drm_device *dev)
|
static void intel_modeset_readout_hw_state(struct drm_device *dev)
|
||||||
|
@ -15121,34 +15132,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
|
||||||
crtc->base.state->active = crtc->active;
|
crtc->base.state->active = crtc->active;
|
||||||
crtc->base.enabled = crtc->active;
|
crtc->base.enabled = crtc->active;
|
||||||
|
|
||||||
memset(&crtc->base.mode, 0, sizeof(crtc->base.mode));
|
readout_plane_state(crtc);
|
||||||
if (crtc->base.state->active) {
|
|
||||||
intel_mode_from_pipe_config(&crtc->base.mode, crtc->config);
|
|
||||||
intel_mode_from_pipe_config(&crtc->base.state->adjusted_mode, crtc->config);
|
|
||||||
WARN_ON(drm_atomic_set_mode_for_crtc(crtc->base.state, &crtc->base.mode));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The initial mode needs to be set in order to keep
|
|
||||||
* the atomic core happy. It wants a valid mode if the
|
|
||||||
* crtc's enabled, so we do the above call.
|
|
||||||
*
|
|
||||||
* At this point some state updated by the connectors
|
|
||||||
* in their ->detect() callback has not run yet, so
|
|
||||||
* no recalculation can be done yet.
|
|
||||||
*
|
|
||||||
* Even if we could do a recalculation and modeset
|
|
||||||
* right now it would cause a double modeset if
|
|
||||||
* fbdev or userspace chooses a different initial mode.
|
|
||||||
*
|
|
||||||
* If that happens, someone indicated they wanted a
|
|
||||||
* mode change, which means it's safe to do a full
|
|
||||||
* recalculation.
|
|
||||||
*/
|
|
||||||
crtc->base.state->mode.private_flags = I915_MODE_FLAG_INHERITED;
|
|
||||||
}
|
|
||||||
|
|
||||||
crtc->base.hwmode = crtc->config->base.adjusted_mode;
|
|
||||||
readout_plane_state(crtc, to_intel_crtc_state(crtc->base.state));
|
|
||||||
|
|
||||||
DRM_DEBUG_KMS("[CRTC:%d] hw state readout: %s\n",
|
DRM_DEBUG_KMS("[CRTC:%d] hw state readout: %s\n",
|
||||||
crtc->base.base.id,
|
crtc->base.base.id,
|
||||||
|
@ -15207,6 +15191,36 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
|
||||||
connector->base.name,
|
connector->base.name,
|
||||||
connector->base.encoder ? "enabled" : "disabled");
|
connector->base.encoder ? "enabled" : "disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for_each_intel_crtc(dev, crtc) {
|
||||||
|
crtc->base.hwmode = crtc->config->base.adjusted_mode;
|
||||||
|
|
||||||
|
memset(&crtc->base.mode, 0, sizeof(crtc->base.mode));
|
||||||
|
if (crtc->base.state->active) {
|
||||||
|
intel_mode_from_pipe_config(&crtc->base.mode, crtc->config);
|
||||||
|
intel_mode_from_pipe_config(&crtc->base.state->adjusted_mode, crtc->config);
|
||||||
|
WARN_ON(drm_atomic_set_mode_for_crtc(crtc->base.state, &crtc->base.mode));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The initial mode needs to be set in order to keep
|
||||||
|
* the atomic core happy. It wants a valid mode if the
|
||||||
|
* crtc's enabled, so we do the above call.
|
||||||
|
*
|
||||||
|
* At this point some state updated by the connectors
|
||||||
|
* in their ->detect() callback has not run yet, so
|
||||||
|
* no recalculation can be done yet.
|
||||||
|
*
|
||||||
|
* Even if we could do a recalculation and modeset
|
||||||
|
* right now it would cause a double modeset if
|
||||||
|
* fbdev or userspace chooses a different initial mode.
|
||||||
|
*
|
||||||
|
* If that happens, someone indicated they wanted a
|
||||||
|
* mode change, which means it's safe to do a full
|
||||||
|
* recalculation.
|
||||||
|
*/
|
||||||
|
crtc->base.state->mode.private_flags = I915_MODE_FLAG_INHERITED;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scan out the current hw modeset state,
|
/* Scan out the current hw modeset state,
|
||||||
|
|
|
@ -1659,6 +1659,7 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request,
|
||||||
if (flush_domains) {
|
if (flush_domains) {
|
||||||
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
||||||
flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
||||||
|
flags |= PIPE_CONTROL_FLUSH_ENABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (invalidate_domains) {
|
if (invalidate_domains) {
|
||||||
|
|
|
@ -347,6 +347,7 @@ gen7_render_ring_flush(struct drm_i915_gem_request *req,
|
||||||
if (flush_domains) {
|
if (flush_domains) {
|
||||||
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
||||||
flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
||||||
|
flags |= PIPE_CONTROL_FLUSH_ENABLE;
|
||||||
}
|
}
|
||||||
if (invalidate_domains) {
|
if (invalidate_domains) {
|
||||||
flags |= PIPE_CONTROL_TLB_INVALIDATE;
|
flags |= PIPE_CONTROL_TLB_INVALIDATE;
|
||||||
|
@ -418,6 +419,7 @@ gen8_render_ring_flush(struct drm_i915_gem_request *req,
|
||||||
if (flush_domains) {
|
if (flush_domains) {
|
||||||
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
||||||
flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
||||||
|
flags |= PIPE_CONTROL_FLUSH_ENABLE;
|
||||||
}
|
}
|
||||||
if (invalidate_domains) {
|
if (invalidate_domains) {
|
||||||
flags |= PIPE_CONTROL_TLB_INVALIDATE;
|
flags |= PIPE_CONTROL_TLB_INVALIDATE;
|
||||||
|
|
|
@ -227,11 +227,12 @@ nouveau_gem_info(struct drm_file *file_priv, struct drm_gem_object *gem,
|
||||||
struct nouveau_bo *nvbo = nouveau_gem_object(gem);
|
struct nouveau_bo *nvbo = nouveau_gem_object(gem);
|
||||||
struct nvkm_vma *vma;
|
struct nvkm_vma *vma;
|
||||||
|
|
||||||
if (nvbo->bo.mem.mem_type == TTM_PL_TT)
|
if (is_power_of_2(nvbo->valid_domains))
|
||||||
|
rep->domain = nvbo->valid_domains;
|
||||||
|
else if (nvbo->bo.mem.mem_type == TTM_PL_TT)
|
||||||
rep->domain = NOUVEAU_GEM_DOMAIN_GART;
|
rep->domain = NOUVEAU_GEM_DOMAIN_GART;
|
||||||
else
|
else
|
||||||
rep->domain = NOUVEAU_GEM_DOMAIN_VRAM;
|
rep->domain = NOUVEAU_GEM_DOMAIN_VRAM;
|
||||||
|
|
||||||
rep->offset = nvbo->bo.offset;
|
rep->offset = nvbo->bo.offset;
|
||||||
if (cli->vm) {
|
if (cli->vm) {
|
||||||
vma = nouveau_bo_vma_find(nvbo, cli->vm);
|
vma = nouveau_bo_vma_find(nvbo, cli->vm);
|
||||||
|
|
|
@ -717,10 +717,14 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
|
||||||
struct radeon_device *rdev = dev_get_drvdata(dev);
|
struct radeon_device *rdev = dev_get_drvdata(dev);
|
||||||
umode_t effective_mode = attr->mode;
|
umode_t effective_mode = attr->mode;
|
||||||
|
|
||||||
/* Skip limit attributes if DPM is not enabled */
|
/* Skip attributes if DPM is not enabled */
|
||||||
if (rdev->pm.pm_method != PM_METHOD_DPM &&
|
if (rdev->pm.pm_method != PM_METHOD_DPM &&
|
||||||
(attr == &sensor_dev_attr_temp1_crit.dev_attr.attr ||
|
(attr == &sensor_dev_attr_temp1_crit.dev_attr.attr ||
|
||||||
attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr))
|
attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr ||
|
||||||
|
attr == &sensor_dev_attr_pwm1.dev_attr.attr ||
|
||||||
|
attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr ||
|
||||||
|
attr == &sensor_dev_attr_pwm1_max.dev_attr.attr ||
|
||||||
|
attr == &sensor_dev_attr_pwm1_min.dev_attr.attr))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Skip fan attributes if fan is not present */
|
/* Skip fan attributes if fan is not present */
|
||||||
|
|
Loading…
Add table
Reference in a new issue