mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-29 23:24:11 +08:00
i915, nouveau, hdlcd and misc fixes.
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJZH09kAAoJEAx081l5xIa+J/wP/ikgMkHYzBsw22aAa7jlu/iK NaNi7qp4CtN2e5CjNX6GjEtOOEUuDhQ23EsA8qUwctypPQDKXYKW477ZQcEkPI3T Y86OptyVZMdVQQO8BYVTydN5cvfhiTDnYu03AAApHa+1AQ1CPkQ79jbVfL1CR6/0 8B43rgNG2vK/rbB5IPvhWu5bX8sCiHvYummuS9Vi3imdRkik0O7/0mepzu7KF4hs lPmqfid+DhZwXM7sk1hw9hRVjYNxaXZ14VqFZFJbXsO/ayujmG+utLiMFUZP87ij vSEhNhQCOQt/RHSsGATv4DSpxbK3in6ESPsaiPEs1tyyKFsmwo91qmaTAFHtTKjT yUrctlVrLjcNLJtlfRqJGs1zNHthOAll67oGVZNTDWgvHwdhD3VMdJ5qAgJD9biG 8xsWYNxmF2n1qLHynP/jNU2K8NukDjpZSAzpsIPI0N8Qv2nzamfUUhsQzWWk3tW1 GH0EIeK5fCpsTnpb2KVjlbxQR7mAkAkGi6uKOtISOcqGmVdi7i0sssQV5g8nuLO6 GOC2k3jdlhlXjs9HmvKaYQKS24/bdVtXZbOzbdsS75/fJzGQwx8XOM85n2htXm4c woc0l5PChcSmRF/idHuS+iLK/etxZowA6GkD3ed/stqvKILt0CZl1cOnPzKKqOkx LBCzaaS/23HSmY5H5SFG =Eg8t -----END PGP SIGNATURE----- Merge tag 'drm-fixes-for-v4.12-rc2' of git://people.freedesktop.org/~airlied/linux Pull drm fixes from Dave Airlie: "Mostly nouveau and i915, fairly quiet as usual for rc2" * tag 'drm-fixes-for-v4.12-rc2' of git://people.freedesktop.org/~airlied/linux: drm/atmel-hlcdc: Fix output initialization gpu: host1x: select IOMMU_IOVA drm/nouveau/fifo/gk104-: Silence a locking warning drm/nouveau/secboot: plug memory leak in ls_ucode_img_load_gr() error path drm/nouveau: Fix drm poll_helper handling drm/i915: don't do allocate_va_range again on PIN_UPDATE drm/i915: Fix rawclk readout for g4x drm/i915: Fix runtime PM for LPE audio drm/i915/glk: Fix DSI "*ERROR* ULPS is still active" messages drm/i915/gvt: avoid unnecessary vgpu switch drm/i915/gvt: not to restore in-context mmio drm/etnaviv: don't put fence in case of submit failure drm/i915/gvt: fix typo: "supporte" -> "support" drm: hdlcd: Fix the calculation of the scanout start address
This commit is contained in:
commit
cf80a6fbca
@ -10,6 +10,7 @@
|
||||
*/
|
||||
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
@ -226,16 +227,33 @@ static const struct drm_crtc_helper_funcs hdlcd_crtc_helper_funcs = {
|
||||
static int hdlcd_plane_atomic_check(struct drm_plane *plane,
|
||||
struct drm_plane_state *state)
|
||||
{
|
||||
u32 src_w, src_h;
|
||||
struct drm_rect clip = { 0 };
|
||||
struct drm_crtc_state *crtc_state;
|
||||
u32 src_h = state->src_h >> 16;
|
||||
|
||||
src_w = state->src_w >> 16;
|
||||
src_h = state->src_h >> 16;
|
||||
|
||||
/* we can't do any scaling of the plane source */
|
||||
if ((src_w != state->crtc_w) || (src_h != state->crtc_h))
|
||||
/* only the HDLCD_REG_FB_LINE_COUNT register has a limit */
|
||||
if (src_h >= HDLCD_MAX_YRES) {
|
||||
DRM_DEBUG_KMS("Invalid source width: %d\n", src_h);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (!state->fb || !state->crtc)
|
||||
return 0;
|
||||
|
||||
crtc_state = drm_atomic_get_existing_crtc_state(state->state,
|
||||
state->crtc);
|
||||
if (!crtc_state) {
|
||||
DRM_DEBUG_KMS("Invalid crtc state\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
clip.x2 = crtc_state->adjusted_mode.hdisplay;
|
||||
clip.y2 = crtc_state->adjusted_mode.vdisplay;
|
||||
|
||||
return drm_plane_helper_check_state(state, &clip,
|
||||
DRM_PLANE_HELPER_NO_SCALING,
|
||||
DRM_PLANE_HELPER_NO_SCALING,
|
||||
false, true);
|
||||
}
|
||||
|
||||
static void hdlcd_plane_atomic_update(struct drm_plane *plane,
|
||||
@ -244,21 +262,20 @@ static void hdlcd_plane_atomic_update(struct drm_plane *plane,
|
||||
struct drm_framebuffer *fb = plane->state->fb;
|
||||
struct hdlcd_drm_private *hdlcd;
|
||||
struct drm_gem_cma_object *gem;
|
||||
u32 src_w, src_h, dest_w, dest_h;
|
||||
u32 src_x, src_y, dest_h;
|
||||
dma_addr_t scanout_start;
|
||||
|
||||
if (!fb)
|
||||
return;
|
||||
|
||||
src_w = plane->state->src_w >> 16;
|
||||
src_h = plane->state->src_h >> 16;
|
||||
dest_w = plane->state->crtc_w;
|
||||
dest_h = plane->state->crtc_h;
|
||||
src_x = plane->state->src.x1 >> 16;
|
||||
src_y = plane->state->src.y1 >> 16;
|
||||
dest_h = drm_rect_height(&plane->state->dst);
|
||||
gem = drm_fb_cma_get_gem_obj(fb, 0);
|
||||
|
||||
scanout_start = gem->paddr + fb->offsets[0] +
|
||||
plane->state->crtc_y * fb->pitches[0] +
|
||||
plane->state->crtc_x *
|
||||
fb->format->cpp[0];
|
||||
src_y * fb->pitches[0] +
|
||||
src_x * fb->format->cpp[0];
|
||||
|
||||
hdlcd = plane->dev->dev_private;
|
||||
hdlcd_write(hdlcd, HDLCD_REG_FB_LINE_LENGTH, fb->pitches[0]);
|
||||
@ -305,7 +322,6 @@ static struct drm_plane *hdlcd_plane_init(struct drm_device *drm)
|
||||
formats, ARRAY_SIZE(formats),
|
||||
DRM_PLANE_TYPE_PRIMARY, NULL);
|
||||
if (ret) {
|
||||
devm_kfree(drm->dev, plane);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
@ -329,7 +345,6 @@ int hdlcd_setup_crtc(struct drm_device *drm)
|
||||
&hdlcd_crtc_funcs, NULL);
|
||||
if (ret) {
|
||||
hdlcd_plane_destroy(primary);
|
||||
devm_kfree(drm->dev, primary);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -152,8 +152,7 @@ static const struct drm_connector_funcs atmel_hlcdc_panel_connector_funcs = {
|
||||
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
|
||||
};
|
||||
|
||||
static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
|
||||
const struct device_node *np)
|
||||
static int atmel_hlcdc_attach_endpoint(struct drm_device *dev, int endpoint)
|
||||
{
|
||||
struct atmel_hlcdc_dc *dc = dev->dev_private;
|
||||
struct atmel_hlcdc_rgb_output *output;
|
||||
@ -161,6 +160,11 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
|
||||
struct drm_bridge *bridge;
|
||||
int ret;
|
||||
|
||||
ret = drm_of_find_panel_or_bridge(dev->dev->of_node, 0, endpoint,
|
||||
&panel, &bridge);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
output = devm_kzalloc(dev->dev, sizeof(*output), GFP_KERNEL);
|
||||
if (!output)
|
||||
return -EINVAL;
|
||||
@ -177,10 +181,6 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
|
||||
|
||||
output->encoder.possible_crtcs = 0x1;
|
||||
|
||||
ret = drm_of_find_panel_or_bridge(np, 0, 0, &panel, &bridge);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (panel) {
|
||||
output->connector.dpms = DRM_MODE_DPMS_OFF;
|
||||
output->connector.polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||
@ -220,22 +220,14 @@ err_encoder_cleanup:
|
||||
|
||||
int atmel_hlcdc_create_outputs(struct drm_device *dev)
|
||||
{
|
||||
struct device_node *remote;
|
||||
int ret = -ENODEV;
|
||||
int endpoint = 0;
|
||||
int endpoint, ret = 0;
|
||||
|
||||
while (true) {
|
||||
/* Loop thru possible multiple connections to the output */
|
||||
remote = of_graph_get_remote_node(dev->dev->of_node, 0,
|
||||
endpoint++);
|
||||
if (!remote)
|
||||
break;
|
||||
for (endpoint = 0; !ret; endpoint++)
|
||||
ret = atmel_hlcdc_attach_endpoint(dev, endpoint);
|
||||
|
||||
ret = atmel_hlcdc_attach_endpoint(dev, remote);
|
||||
of_node_put(remote);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
/* At least one device was successfully attached.*/
|
||||
if (ret == -ENODEV && endpoint)
|
||||
return 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -44,6 +44,7 @@ static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
|
||||
|
||||
/* initially, until copy_from_user() and bo lookup succeeds: */
|
||||
submit->nr_bos = 0;
|
||||
submit->fence = NULL;
|
||||
|
||||
ww_acquire_init(&submit->ticket, &reservation_ww_class);
|
||||
}
|
||||
@ -294,7 +295,8 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit)
|
||||
}
|
||||
|
||||
ww_acquire_fini(&submit->ticket);
|
||||
dma_fence_put(submit->fence);
|
||||
if (submit->fence)
|
||||
dma_fence_put(submit->fence);
|
||||
kfree(submit);
|
||||
}
|
||||
|
||||
|
@ -1244,7 +1244,7 @@ static int dma_ctrl_write(struct intel_vgpu *vgpu, unsigned int offset,
|
||||
mode = vgpu_vreg(vgpu, offset);
|
||||
|
||||
if (GFX_MODE_BIT_SET_IN_MASK(mode, START_DMA)) {
|
||||
WARN_ONCE(1, "VM(%d): iGVT-g doesn't supporte GuC\n",
|
||||
WARN_ONCE(1, "VM(%d): iGVT-g doesn't support GuC\n",
|
||||
vgpu->id);
|
||||
return 0;
|
||||
}
|
||||
|
@ -340,6 +340,9 @@ void intel_gvt_restore_render_mmio(struct intel_vgpu *vgpu, int ring_id)
|
||||
} else
|
||||
v = mmio->value;
|
||||
|
||||
if (mmio->in_context)
|
||||
continue;
|
||||
|
||||
I915_WRITE(mmio->reg, v);
|
||||
POSTING_READ(mmio->reg);
|
||||
|
||||
|
@ -129,9 +129,13 @@ static void try_to_schedule_next_vgpu(struct intel_gvt *gvt)
|
||||
struct vgpu_sched_data *vgpu_data;
|
||||
ktime_t cur_time;
|
||||
|
||||
/* no target to schedule */
|
||||
if (!scheduler->next_vgpu)
|
||||
/* no need to schedule if next_vgpu is the same with current_vgpu,
|
||||
* let scheduler chose next_vgpu again by setting it to NULL.
|
||||
*/
|
||||
if (scheduler->next_vgpu == scheduler->current_vgpu) {
|
||||
scheduler->next_vgpu = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* after the flag is set, workload dispatch thread will
|
||||
|
@ -195,9 +195,12 @@ static int ppgtt_bind_vma(struct i915_vma *vma,
|
||||
u32 pte_flags;
|
||||
int ret;
|
||||
|
||||
ret = vma->vm->allocate_va_range(vma->vm, vma->node.start, vma->size);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (!(vma->flags & I915_VMA_LOCAL_BIND)) {
|
||||
ret = vma->vm->allocate_va_range(vma->vm, vma->node.start,
|
||||
vma->size);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
vma->pages = vma->obj->mm.pages;
|
||||
|
||||
@ -2306,7 +2309,8 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
|
||||
if (flags & I915_VMA_LOCAL_BIND) {
|
||||
struct i915_hw_ppgtt *appgtt = i915->mm.aliasing_ppgtt;
|
||||
|
||||
if (appgtt->base.allocate_va_range) {
|
||||
if (!(vma->flags & I915_VMA_LOCAL_BIND) &&
|
||||
appgtt->base.allocate_va_range) {
|
||||
ret = appgtt->base.allocate_va_range(&appgtt->base,
|
||||
vma->node.start,
|
||||
vma->node.size);
|
||||
|
@ -3051,10 +3051,14 @@ enum skl_disp_power_wells {
|
||||
#define CLKCFG_FSB_667 (3 << 0) /* hrawclk 166 */
|
||||
#define CLKCFG_FSB_800 (2 << 0) /* hrawclk 200 */
|
||||
#define CLKCFG_FSB_1067 (6 << 0) /* hrawclk 266 */
|
||||
#define CLKCFG_FSB_1067_ALT (0 << 0) /* hrawclk 266 */
|
||||
#define CLKCFG_FSB_1333 (7 << 0) /* hrawclk 333 */
|
||||
/* Note, below two are guess */
|
||||
#define CLKCFG_FSB_1600 (4 << 0) /* hrawclk 400 */
|
||||
#define CLKCFG_FSB_1600_ALT (0 << 0) /* hrawclk 400 */
|
||||
/*
|
||||
* Note that on at least on ELK the below value is reported for both
|
||||
* 333 and 400 MHz BIOS FSB setting, but given that the gmch datasheet
|
||||
* lists only 200/266/333 MHz FSB as supported let's decode it as 333 MHz.
|
||||
*/
|
||||
#define CLKCFG_FSB_1333_ALT (4 << 0) /* hrawclk 333 */
|
||||
#define CLKCFG_FSB_MASK (7 << 0)
|
||||
#define CLKCFG_MEM_533 (1 << 4)
|
||||
#define CLKCFG_MEM_667 (2 << 4)
|
||||
|
@ -1798,13 +1798,11 @@ static int g4x_hrawclk(struct drm_i915_private *dev_priv)
|
||||
case CLKCFG_FSB_800:
|
||||
return 200000;
|
||||
case CLKCFG_FSB_1067:
|
||||
case CLKCFG_FSB_1067_ALT:
|
||||
return 266667;
|
||||
case CLKCFG_FSB_1333:
|
||||
case CLKCFG_FSB_1333_ALT:
|
||||
return 333333;
|
||||
/* these two are just a guess; one of them might be right */
|
||||
case CLKCFG_FSB_1600:
|
||||
case CLKCFG_FSB_1600_ALT:
|
||||
return 400000;
|
||||
default:
|
||||
return 133333;
|
||||
}
|
||||
|
@ -410,11 +410,10 @@ static void glk_dsi_device_ready(struct intel_encoder *encoder)
|
||||
val |= (ULPS_STATE_ENTER | DEVICE_READY);
|
||||
I915_WRITE(MIPI_DEVICE_READY(port), val);
|
||||
|
||||
/* Wait for ULPS Not active */
|
||||
/* Wait for ULPS active */
|
||||
if (intel_wait_for_register(dev_priv,
|
||||
MIPI_CTRL(port), GLK_ULPS_NOT_ACTIVE,
|
||||
GLK_ULPS_NOT_ACTIVE, 20))
|
||||
DRM_ERROR("ULPS is still active\n");
|
||||
MIPI_CTRL(port), GLK_ULPS_NOT_ACTIVE, 0, 20))
|
||||
DRM_ERROR("ULPS not active\n");
|
||||
|
||||
/* Exit ULPS */
|
||||
val = I915_READ(MIPI_DEVICE_READY(port));
|
||||
|
@ -63,6 +63,7 @@
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "i915_drv.h"
|
||||
#include <linux/delay.h>
|
||||
@ -121,6 +122,10 @@ lpe_audio_platdev_create(struct drm_i915_private *dev_priv)
|
||||
|
||||
kfree(rsc);
|
||||
|
||||
pm_runtime_forbid(&platdev->dev);
|
||||
pm_runtime_set_active(&platdev->dev);
|
||||
pm_runtime_enable(&platdev->dev);
|
||||
|
||||
return platdev;
|
||||
|
||||
err:
|
||||
|
@ -360,6 +360,8 @@ nouveau_display_hpd_work(struct work_struct *work)
|
||||
pm_runtime_get_sync(drm->dev->dev);
|
||||
|
||||
drm_helper_hpd_irq_event(drm->dev);
|
||||
/* enable polling for external displays */
|
||||
drm_kms_helper_poll_enable(drm->dev);
|
||||
|
||||
pm_runtime_mark_last_busy(drm->dev->dev);
|
||||
pm_runtime_put_sync(drm->dev->dev);
|
||||
@ -413,10 +415,6 @@ nouveau_display_init(struct drm_device *dev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* enable polling for external displays */
|
||||
if (!dev->mode_config.poll_enabled)
|
||||
drm_kms_helper_poll_enable(dev);
|
||||
|
||||
/* enable hotplug interrupts */
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
struct nouveau_connector *conn = nouveau_connector(connector);
|
||||
|
@ -502,6 +502,9 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
|
||||
pm_runtime_allow(dev->dev);
|
||||
pm_runtime_mark_last_busy(dev->dev);
|
||||
pm_runtime_put(dev->dev);
|
||||
} else {
|
||||
/* enable polling for external displays */
|
||||
drm_kms_helper_poll_enable(dev);
|
||||
}
|
||||
return 0;
|
||||
|
||||
@ -774,9 +777,6 @@ nouveau_pmops_runtime_resume(struct device *dev)
|
||||
|
||||
ret = nouveau_do_resume(drm_dev, true);
|
||||
|
||||
if (!drm_dev->mode_config.poll_enabled)
|
||||
drm_kms_helper_poll_enable(drm_dev);
|
||||
|
||||
/* do magic */
|
||||
nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25));
|
||||
vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON);
|
||||
|
@ -148,7 +148,7 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl)
|
||||
case NVKM_MEM_TARGET_NCOH: target = 3; break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
return;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
nvkm_wr32(device, 0x002270, (nvkm_memory_addr(mem) >> 12) |
|
||||
@ -160,6 +160,7 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl)
|
||||
& 0x00100000),
|
||||
msecs_to_jiffies(2000)) == 0)
|
||||
nvkm_error(subdev, "runlist %d update timeout\n", runl);
|
||||
unlock:
|
||||
mutex_unlock(&subdev->mutex);
|
||||
}
|
||||
|
||||
|
@ -116,6 +116,7 @@ ls_ucode_img_load_gr(const struct nvkm_subdev *subdev, struct ls_ucode_img *img,
|
||||
ret = nvkm_firmware_get(subdev->device, f, &sig);
|
||||
if (ret)
|
||||
goto free_data;
|
||||
|
||||
img->sig = kmemdup(sig->data, sig->size, GFP_KERNEL);
|
||||
if (!img->sig) {
|
||||
ret = -ENOMEM;
|
||||
@ -126,8 +127,9 @@ ls_ucode_img_load_gr(const struct nvkm_subdev *subdev, struct ls_ucode_img *img,
|
||||
img->ucode_data = ls_ucode_img_build(bl, code, data,
|
||||
&img->ucode_desc);
|
||||
if (IS_ERR(img->ucode_data)) {
|
||||
kfree(img->sig);
|
||||
ret = PTR_ERR(img->ucode_data);
|
||||
goto free_data;
|
||||
goto free_sig;
|
||||
}
|
||||
img->ucode_size = img->ucode_desc.image_size;
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
config TEGRA_HOST1X
|
||||
tristate "NVIDIA Tegra host1x driver"
|
||||
depends on ARCH_TEGRA || (ARM && COMPILE_TEST)
|
||||
select IOMMU_IOVA if IOMMU_SUPPORT
|
||||
help
|
||||
Driver for the NVIDIA Tegra host1x hardware.
|
||||
|
||||
|
@ -1809,10 +1809,6 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev)
|
||||
pdata->notify_pending = false;
|
||||
spin_unlock_irq(&pdata->lpe_audio_slock);
|
||||
|
||||
/* runtime PM isn't enabled as default, since it won't save much on
|
||||
* BYT/CHT devices; user who want the runtime PM should adjust the
|
||||
* power/ontrol and power/autosuspend_delay_ms sysfs entries instead
|
||||
*/
|
||||
pm_runtime_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_mark_last_busy(&pdev->dev);
|
||||
pm_runtime_set_active(&pdev->dev);
|
||||
|
Loading…
Reference in New Issue
Block a user