History

Merge tag 'drm-fixes-for-v4.13-rc5' of git://people.freedesktop.org/~airlied/linux

Pull drm fixes from Dave Airlie: "Nothing too earth shattering here, it just seems like lots of little things all over the place. msm has probably the larger amount of changes, but they all seem fine, otherwise, some rockchip, i915, etnaviv and exynos fixes, along with one nouveau regression fix for some older GPUs" * tag 'drm-fixes-for-v4.13-rc5' of git://people.freedesktop.org/~airlied/linux: (35 commits) drm/nouveau/disp/nv04: avoid creation of output paths drm: make DRM_STM default n drm/exynos: forbid creating framebuffers from too small GEM buffers drm/etnaviv: Fix off-by-one error in reloc checking drm/i915: fix backlight invert for non-zero minimum brightness drm/i915/shrinker: Wrap need_resched() inside preempt-disable drm/i915/perf: fix flex eu registers programming drm/i915: Fix out-of-bounds array access in bdw_load_gamma_lut drm/i915/gvt: Change the max length of mmio_reg_rw from 4 to 8 drm/i915/gvt: Initialize MMIO Block with HW state drm/rockchip: vop: report error when check resource error drm/rockchip: vop: round_up pitches to word align drm/rockchip: vop: fix NV12 video display error drm/rockchip: vop: fix iommu page fault when resume drm/i915/gvt: clean workload queue if error happened drm/i915/gvt: change resetting to resetting_eng drm/msm: gpu: don't abuse dma_alloc for non-DMA allocations drm/msm: gpu: call qcom_mdt interfaces only for ARCH_QCOM drm/msm/adreno: Prevent unclocked access when retrieving timestamps drm/msm: Remove __user from __u64 data types ...

Linus Torvalds committed 9 years ago

Commit b2dbdf22 parents 27df704 46828dc32 files · +247 −214Browse files

Unified · Split

32 files
  1. drivers/dma-buf/sync_file.c +3 −2
  2. drivers/gpu/drm/bridge/tc358767.c +1 −1
  3. drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +2 −2
  4. drivers/gpu/drm/exynos/exynos_drm_fb.c +13 −1
  5. drivers/gpu/drm/i915/gvt/execlist.c +22 −5
  6. drivers/gpu/drm/i915/gvt/firmware.c +10 −1
  7. drivers/gpu/drm/i915/gvt/gvt.h +13 −1
  8. drivers/gpu/drm/i915/gvt/handlers.c +18 −20
  9. drivers/gpu/drm/i915/gvt/scheduler.c +2 −1
  10. drivers/gpu/drm/i915/gvt/vgpu.c +5 −3
  11. drivers/gpu/drm/i915/i915_gem_shrinker.c +8 −3
  12. drivers/gpu/drm/i915/i915_perf.c +2 −2
  13. drivers/gpu/drm/i915/intel_color.c +1 −0
  14. drivers/gpu/drm/i915/intel_panel.c +1 −1
  15. drivers/gpu/drm/msm/Kconfig +1 −1
  16. drivers/gpu/drm/msm/adreno/a5xx_gpu.c +66 −115
  17. drivers/gpu/drm/msm/adreno/a5xx_gpu.h +1 −2
  18. drivers/gpu/drm/msm/adreno/adreno_gpu.c +9 −2
  19. drivers/gpu/drm/msm/dsi/dsi_host.c +7 −7
  20. drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c +10 −2
  21. drivers/gpu/drm/msm/mdp/mdp5/mdp5_encoder.c +1 −1
  22. drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +6 −6
  23. drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c +2 −2
  24. drivers/gpu/drm/msm/msm_gem.c +9 −3
  25. drivers/gpu/drm/msm/msm_gem_submit.c +3 −3
  26. drivers/gpu/drm/msm/msm_gem_vma.c +1 −1
  27. drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c +2 −0
  28. drivers/gpu/drm/rockchip/rockchip_drm_vop.c +20 −21
  29. drivers/gpu/drm/rockchip/rockchip_drm_vop.h +3 −0
  30. drivers/gpu/drm/stm/Kconfig +0 −1
  31. include/linux/sync_file.h +2 −1
  32. include/uapi/drm/msm_drm.h +3 −3
drivers/dma-buf/sync_file.c+3−2
@@ -304,7 +304,7 @@ static int sync_file_release(struct inode *inode, struct file *file) · 303 unmodified lines
304304 {
305305 struct sync_file *sync_file = file->private_data;
306306
307− if (test_bit(POLL_ENABLED, &sync_file->fence->flags))
307+ if (test_bit(POLL_ENABLED, &sync_file->flags))
308308 dma_fence_remove_callback(sync_file->fence, &sync_file->cb);
309309 dma_fence_put(sync_file->fence);
310310 kfree(sync_file);
@@ -318,7 +318,8 @@ static unsigned int sync_file_poll(struct file *file, poll_table *wait) · 7 unmodified lines
318318
319319 poll_wait(file, &sync_file->wq, wait);
320320
321− if (!test_and_set_bit(POLL_ENABLED, &sync_file->fence->flags)) {
321+ if (list_empty(&sync_file->cb.node) &&
322+ !test_and_set_bit(POLL_ENABLED, &sync_file->flags)) {
322323 if (dma_fence_add_callback(sync_file->fence, &sync_file->cb,
323324 fence_check_cb_func) < 0)
324325 wake_up_all(&sync_file->wq);
drivers/gpu/drm/bridge/tc358767.c+1−1
@@ -1255,7 +1255,7 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) · 1254 unmodified lines
12551255
12561256 /* port@2 is the output port */
12571257 ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &tc->panel, NULL);
1258− if (ret)
1258+ if (ret && ret != -ENODEV)
12591259 return ret;
12601260
12611261 /* Shut down GPIO is optional */
drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c+2−2
@@ -270,8 +270,8 @@ static int submit_reloc(struct etnaviv_gem_submit *submit, void *stream, · 269 unmodified lines
270270 if (ret)
271271 return ret;
272272
273− if (r->reloc_offset >= bo->obj->base.size - sizeof(*ptr)) {
274− DRM_ERROR("relocation %u outside object", i);
273+ if (r->reloc_offset > bo->obj->base.size - sizeof(*ptr)) {
274+ DRM_ERROR("relocation %u outside object\n", i);
275275 return -EINVAL;
276276 }
277277
drivers/gpu/drm/exynos/exynos_drm_fb.c+13−1
@@ -145,13 +145,19 @@ static struct drm_framebuffer * · 144 unmodified lines
145145 exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
146146 const struct drm_mode_fb_cmd2 *mode_cmd)
147147 {
148+ const struct drm_format_info *info = drm_get_format_info(dev, mode_cmd);
148149 struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER];
149150 struct drm_gem_object *obj;
150151 struct drm_framebuffer *fb;
151152 int i;
152153 int ret;
153154
154− for (i = 0; i < drm_format_num_planes(mode_cmd->pixel_format); i++) {
155+ for (i = 0; i < info->num_planes; i++) {
156+ unsigned int height = (i == 0) ? mode_cmd->height :
157+ DIV_ROUND_UP(mode_cmd->height, info->vsub);
158+ unsigned long size = height * mode_cmd->pitches[i] +
159+ mode_cmd->offsets[i];
160+
155161 obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]);
156162 if (!obj) {
157163 DRM_ERROR("failed to lookup gem object\n");
@@ -160,6 +166,12 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, · 2 unmodified lines
160166 }
161167
162168 exynos_gem[i] = to_exynos_gem(obj);
169+
170+ if (size > exynos_gem[i]->size) {
171+ i++;
172+ ret = -EINVAL;
173+ goto err;
174+ }
163175 }
164176
165177 fb = exynos_drm_framebuffer_init(dev, mode_cmd, exynos_gem, i);
drivers/gpu/drm/i915/gvt/execlist.c+22−5
@@ -46,6 +46,8 @@ · 45 unmodified lines
4646 #define same_context(a, b) (((a)->context_id == (b)->context_id) && \
4747 ((a)->lrca == (b)->lrca))
4848
49+static void clean_workloads(struct intel_vgpu *vgpu, unsigned long engine_mask);
50+
4951 static int context_switch_events[] = {
5052 [RCS] = RCS_AS_CONTEXT_SWITCH,
5153 [BCS] = BCS_AS_CONTEXT_SWITCH,
@@ -499,10 +501,10 @@ static void release_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx) · 447 unmodified lines
499501 static int complete_execlist_workload(struct intel_vgpu_workload *workload)
500502 {
501503 struct intel_vgpu *vgpu = workload->vgpu;
502− struct intel_vgpu_execlist *execlist =
503− &vgpu->execlist[workload->ring_id];
504+ int ring_id = workload->ring_id;
505+ struct intel_vgpu_execlist *execlist = &vgpu->execlist[ring_id];
504506 struct intel_vgpu_workload *next_workload;
505− struct list_head *next = workload_q_head(vgpu, workload->ring_id)->next;
507+ struct list_head *next = workload_q_head(vgpu, ring_id)->next;
506508 bool lite_restore = false;
507509 int ret;
508510
@@ -512,10 +514,25 @@ static int complete_execlist_workload(struct intel_vgpu_workload *workload) · 3 unmodified lines
512514 release_shadow_batch_buffer(workload);
513515 release_shadow_wa_ctx(&workload->wa_ctx);
514516
515− if (workload->status || vgpu->resetting)
517+ if (workload->status || (vgpu->resetting_eng & ENGINE_MASK(ring_id))) {
518+ /* if workload->status is not successful means HW GPU
519+ * has occurred GPU hang or something wrong with i915/GVT,
520+ * and GVT won't inject context switch interrupt to guest.
521+ * So this error is a vGPU hang actually to the guest.
522+ * According to this we should emunlate a vGPU hang. If
523+ * there are pending workloads which are already submitted
524+ * from guest, we should clean them up like HW GPU does.
525+ *
526+ * if it is in middle of engine resetting, the pending
527+ * workloads won't be submitted to HW GPU and will be
528+ * cleaned up during the resetting process later, so doing
529+ * the workload clean up here doesn't have any impact.
530+ **/
531+ clean_workloads(vgpu, ENGINE_MASK(ring_id));
516532 goto out;
533+ }
517534
518− if (!list_empty(workload_q_head(vgpu, workload->ring_id))) {
535+ if (!list_empty(workload_q_head(vgpu, ring_id))) {
519536 struct execlist_ctx_descriptor_format *this_desc, *next_desc;
520537
521538 next_workload = container_of(next,
drivers/gpu/drm/i915/gvt/firmware.c+10−1
@@ -72,11 +72,13 @@ static int expose_firmware_sysfs(struct intel_gvt *gvt) · 71 unmodified lines
7272 struct intel_gvt_device_info *info = &gvt->device_info;
7373 struct pci_dev *pdev = gvt->dev_priv->drm.pdev;
7474 struct intel_gvt_mmio_info *e;
75+ struct gvt_mmio_block *block = gvt->mmio.mmio_block;
76+ int num = gvt->mmio.num_mmio_block;
7577 struct gvt_firmware_header *h;
7678 void *firmware;
7779 void *p;
7880 unsigned long size, crc32_start;
79− int i;
81+ int i, j;
8082 int ret;
8183
8284 size = sizeof(*h) + info->mmio_size + info->cfg_space_size;
@@ -105,6 +107,13 @@ static int expose_firmware_sysfs(struct intel_gvt *gvt) · 22 unmodified lines
105107 hash_for_each(gvt->mmio.mmio_info_table, i, e, node)
106108 *(u32 *)(p + e->offset) = I915_READ_NOTRACE(_MMIO(e->offset));
107109
110+ for (i = 0; i < num; i++, block++) {
111+ for (j = 0; j < block->size; j += 4)
112+ *(u32 *)(p + INTEL_GVT_MMIO_OFFSET(block->offset) + j) =
113+ I915_READ_NOTRACE(_MMIO(INTEL_GVT_MMIO_OFFSET(
114+ block->offset) + j));
115+ }
116+
108117 memcpy(gvt->firmware.mmio, p, info->mmio_size);
109118
110119 crc32_start = offsetof(struct gvt_firmware_header, crc32) + 4;
drivers/gpu/drm/i915/gvt/gvt.h+13−1
@@ -149,7 +149,7 @@ struct intel_vgpu { · 148 unmodified lines
149149 bool active;
150150 bool pv_notified;
151151 bool failsafe;
152− bool resetting;
152+ unsigned int resetting_eng;
153153 void *sched_data;
154154 struct vgpu_sched_ctl sched_ctl;
155155
@@ -195,6 +195,15 @@ struct intel_gvt_fence { · 39 unmodified lines
195195 unsigned long vgpu_allocated_fence_num;
196196 };
197197
198+/* Special MMIO blocks. */
199+struct gvt_mmio_block {
200+ unsigned int device;
201+ i915_reg_t offset;
202+ unsigned int size;
203+ gvt_mmio_func read;
204+ gvt_mmio_func write;
205+};
206+
198207 #define INTEL_GVT_MMIO_HASH_BITS 11
199208
200209 struct intel_gvt_mmio {
@@ -214,6 +223,9 @@ struct intel_gvt_mmio { · 13 unmodified lines
214223 /* This reg could be accessed by unaligned address */
215224 #define F_UNALIGN (1 << 6)
216225
226+ struct gvt_mmio_block *mmio_block;
227+ unsigned int num_mmio_block;
228+
217229 DECLARE_HASHTABLE(mmio_info_table, INTEL_GVT_MMIO_HASH_BITS);
218230 unsigned int num_tracked_mmio;
219231 };
drivers/gpu/drm/i915/gvt/handlers.c+18−20
@@ -2857,31 +2857,15 @@ static int init_skl_mmio_info(struct intel_gvt *gvt) · 2856 unmodified lines
28572857 return 0;
28582858 }
28592859
2860−/* Special MMIO blocks. */
2861−static struct gvt_mmio_block {
2862− unsigned int device;
2863− i915_reg_t offset;
2864− unsigned int size;
2865− gvt_mmio_func read;
2866− gvt_mmio_func write;
2867−} gvt_mmio_blocks[] = {
2868− {D_SKL_PLUS, _MMIO(CSR_MMIO_START_RANGE), 0x3000, NULL, NULL},
2869− {D_ALL, _MMIO(MCHBAR_MIRROR_BASE_SNB), 0x40000, NULL, NULL},
2870− {D_ALL, _MMIO(VGT_PVINFO_PAGE), VGT_PVINFO_SIZE,
2871− pvinfo_mmio_read, pvinfo_mmio_write},
2872− {D_ALL, LGC_PALETTE(PIPE_A, 0), 1024, NULL, NULL},
2873− {D_ALL, LGC_PALETTE(PIPE_B, 0), 1024, NULL, NULL},
2874− {D_ALL, LGC_PALETTE(PIPE_C, 0), 1024, NULL, NULL},
2875−};
2876−
28772860 static struct gvt_mmio_block *find_mmio_block(struct intel_gvt *gvt,
28782861 unsigned int offset)
28792862 {
28802863 unsigned long device = intel_gvt_get_device_type(gvt);
2881− struct gvt_mmio_block *block = gvt_mmio_blocks;
2864+ struct gvt_mmio_block *block = gvt->mmio.mmio_block;
2865+ int num = gvt->mmio.num_mmio_block;
28822866 int i;
28832867
2884− for (i = 0; i < ARRAY_SIZE(gvt_mmio_blocks); i++, block++) {
2868+ for (i = 0; i < num; i++, block++) {
28852869 if (!(device & block->device))
28862870 continue;
28872871 if (offset >= INTEL_GVT_MMIO_OFFSET(block->offset) &&
@@ -2912,6 +2896,17 @@ void intel_gvt_clean_mmio_info(struct intel_gvt *gvt) · 24 unmodified lines
29122896 gvt->mmio.mmio_attribute = NULL;
29132897 }
29142898
2899+/* Special MMIO blocks. */
2900+static struct gvt_mmio_block mmio_blocks[] = {
2901+ {D_SKL_PLUS, _MMIO(CSR_MMIO_START_RANGE), 0x3000, NULL, NULL},
2902+ {D_ALL, _MMIO(MCHBAR_MIRROR_BASE_SNB), 0x40000, NULL, NULL},
2903+ {D_ALL, _MMIO(VGT_PVINFO_PAGE), VGT_PVINFO_SIZE,
2904+ pvinfo_mmio_read, pvinfo_mmio_write},
2905+ {D_ALL, LGC_PALETTE(PIPE_A, 0), 1024, NULL, NULL},
2906+ {D_ALL, LGC_PALETTE(PIPE_B, 0), 1024, NULL, NULL},
2907+ {D_ALL, LGC_PALETTE(PIPE_C, 0), 1024, NULL, NULL},
2908+};
2909+
29152910 /**
29162911 * intel_gvt_setup_mmio_info - setup MMIO information table for GVT device
29172912 * @gvt: GVT device
@@ -2951,6 +2946,9 @@ int intel_gvt_setup_mmio_info(struct intel_gvt *gvt) · 33 unmodified lines
29512946 goto err;
29522947 }
29532948
2949+ gvt->mmio.mmio_block = mmio_blocks;
2950+ gvt->mmio.num_mmio_block = ARRAY_SIZE(mmio_blocks);
2951+
29542952 gvt_dbg_mmio("traced %u virtual mmio registers\n",
29552953 gvt->mmio.num_tracked_mmio);
29562954 return 0;
@@ -3030,7 +3028,7 @@ int intel_vgpu_mmio_reg_rw(struct intel_vgpu *vgpu, unsigned int offset, · 73 unmodified lines
30303028 gvt_mmio_func func;
30313029 int ret;
30323030
3033− if (WARN_ON(bytes > 4))
3031+ if (WARN_ON(bytes > 8))
30343032 return -EINVAL;
30353033
30363034 /*
drivers/gpu/drm/i915/gvt/scheduler.c+2−1
@@ -432,7 +432,8 @@ static void complete_current_workload(struct intel_gvt *gvt, int ring_id) · 431 unmodified lines
432432
433433 i915_gem_request_put(fetch_and_zero(&workload->req));
434434
435− if (!workload->status && !vgpu->resetting) {
435+ if (!workload->status && !(vgpu->resetting_eng &
436+ ENGINE_MASK(ring_id))) {
436437 update_guest_context(workload);
437438
438439 for_each_set_bit(event, workload->pending_events,
drivers/gpu/drm/i915/gvt/vgpu.c+5−3
@@ -480,11 +480,13 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr, · 479 unmodified lines
480480 {
481481 struct intel_gvt *gvt = vgpu->gvt;
482482 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
483+ unsigned int resetting_eng = dmlr ? ALL_ENGINES : engine_mask;
483484
484485 gvt_dbg_core("------------------------------------------\n");
485486 gvt_dbg_core("resseting vgpu%d, dmlr %d, engine_mask %08x\n",
486487 vgpu->id, dmlr, engine_mask);
487− vgpu->resetting = true;
488+
489+ vgpu->resetting_eng = resetting_eng;
488490
489491 intel_vgpu_stop_schedule(vgpu);
490492 /*
@@ -497,7 +499,7 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr, · 6 unmodified lines
497499 mutex_lock(&gvt->lock);
498500 }
499501
500− intel_vgpu_reset_execlist(vgpu, dmlr ? ALL_ENGINES : engine_mask);
502+ intel_vgpu_reset_execlist(vgpu, resetting_eng);
501503
502504 /* full GPU reset or device model level reset */
503505 if (engine_mask == ALL_ENGINES || dmlr) {
@@ -520,7 +522,7 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr, · 16 unmodified lines
520522 }
521523 }
522524
523− vgpu->resetting = false;
525+ vgpu->resetting_eng = 0;
524526 gvt_dbg_core("reset vgpu%d done\n", vgpu->id);
525527 gvt_dbg_core("------------------------------------------\n");
526528 }
drivers/gpu/drm/i915/i915_gem_shrinker.c+8−3
@@ -43,16 +43,21 @@ static bool shrinker_lock(struct drm_i915_private *dev_priv, bool *unlock) · 42 unmodified lines
4343 return true;
4444
4545 case MUTEX_TRYLOCK_FAILED:
46+ *unlock = false;
47+ preempt_disable();
4648 do {
4749 cpu_relax();
4850 if (mutex_trylock(&dev_priv->drm.struct_mutex)) {
49− case MUTEX_TRYLOCK_SUCCESS:
5051 *unlock = true;
51− return true;
52+ break;
5253 }
5354 } while (!need_resched());
55+ preempt_enable();
56+ return *unlock;
5457
55− return false;
58+ case MUTEX_TRYLOCK_SUCCESS:
59+ *unlock = true;
60+ return true;
5661 }
5762
5863 BUG();
drivers/gpu/drm/i915/i915_perf.c+2−2
@@ -1601,11 +1601,11 @@ static int gen8_emit_oa_config(struct drm_i915_gem_request *req) · 1600 unmodified lines
16011601 u32 *cs;
16021602 int i;
16031603
1604− cs = intel_ring_begin(req, n_flex_regs * 2 + 4);
1604+ cs = intel_ring_begin(req, ARRAY_SIZE(flex_mmio) * 2 + 4);
16051605 if (IS_ERR(cs))
16061606 return PTR_ERR(cs);
16071607
1608− *cs++ = MI_LOAD_REGISTER_IMM(n_flex_regs + 1);
1608+ *cs++ = MI_LOAD_REGISTER_IMM(ARRAY_SIZE(flex_mmio) + 1);
16091609
16101610 *cs++ = i915_mmio_reg_offset(GEN8_OACTXCONTROL);
16111611 *cs++ = (dev_priv->perf.oa.period_exponent << GEN8_OA_TIMER_PERIOD_SHIFT) |
drivers/gpu/drm/i915/intel_color.c+1−0
@@ -398,6 +398,7 @@ static void bdw_load_gamma_lut(struct drm_crtc_state *state, u32 offset) · 397 unmodified lines
398398 }
399399
400400 /* Program the max register to clamp values > 1.0. */
401+ i = lut_size - 1;
401402 I915_WRITE(PREC_PAL_GC_MAX(pipe, 0),
402403 drm_color_lut_extract(lut[i].red, 16));
403404 I915_WRITE(PREC_PAL_GC_MAX(pipe, 1),
drivers/gpu/drm/i915/intel_panel.c+1−1
@@ -469,7 +469,7 @@ static u32 intel_panel_compute_brightness(struct intel_connector *connector, · 468 unmodified lines
469469
470470 if (i915.invert_brightness > 0 ||
471471 dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) {
472− return panel->backlight.max - val;
472+ return panel->backlight.max - val + panel->backlight.min;
473473 }
474474
475475 return val;
drivers/gpu/drm/msm/Kconfig+1−1
@@ -5,7 +5,7 @@ config DRM_MSM · 4 unmodified lines
55 depends on ARCH_QCOM || (ARM && COMPILE_TEST)
66 depends on OF && COMMON_CLK
77 depends on MMU
8− select QCOM_MDT_LOADER
8+ select QCOM_MDT_LOADER if ARCH_QCOM
99 select REGULATOR
1010 select DRM_KMS_HELPER
1111 select DRM_PANEL
drivers/gpu/drm/msm/adreno/a5xx_gpu.c+66−115
@@ -15,7 +15,7 @@ · 14 unmodified lines
1515 #include <linux/cpumask.h>
1616 #include <linux/qcom_scm.h>
1717 #include <linux/dma-mapping.h>
18−#include <linux/of_reserved_mem.h>
18+#include <linux/of_address.h>
1919 #include <linux/soc/qcom/mdt_loader.h>
2020 #include "msm_gem.h"
2121 #include "msm_mmu.h"
@@ -26,16 +26,34 @@ static void a5xx_dump(struct msm_gpu *gpu); · 4 unmodified lines
2626
2727 #define GPU_PAS_ID 13
2828
29−#if IS_ENABLED(CONFIG_QCOM_MDT_LOADER)
30−
3129 static int zap_shader_load_mdt(struct device *dev, const char *fwname)
3230 {
3331 const struct firmware *fw;
32+ struct device_node *np;
33+ struct resource r;
3434 phys_addr_t mem_phys;
3535 ssize_t mem_size;
3636 void *mem_region = NULL;
3737 int ret;
3838
39+ if (!IS_ENABLED(CONFIG_ARCH_QCOM))
40+ return -EINVAL;
41+
42+ np = of_get_child_by_name(dev->of_node, "zap-shader");
43+ if (!np)
44+ return -ENODEV;
45+
46+ np = of_parse_phandle(np, "memory-region", 0);
47+ if (!np)
48+ return -EINVAL;
49+
50+ ret = of_address_to_resource(np, 0, &r);
51+ if (ret)
52+ return ret;
53+
54+ mem_phys = r.start;
55+ mem_size = resource_size(&r);
56+
3957 /* Request the MDT file for the firmware */
4058 ret = request_firmware(&fw, fwname, dev);
4159 if (ret) {
@@ -51,7 +69,7 @@ static int zap_shader_load_mdt(struct device *dev, const char *fwname) · 9 unmodified lines
5169 }
5270
5371 /* Allocate memory for the firmware image */
54− mem_region = dmam_alloc_coherent(dev, mem_size, &mem_phys, GFP_KERNEL);
72+ mem_region = memremap(mem_phys, mem_size, MEMREMAP_WC);
5573 if (!mem_region) {
5674 ret = -ENOMEM;
5775 goto out;
@@ -69,16 +87,13 @@ static int zap_shader_load_mdt(struct device *dev, const char *fwname) · 11 unmodified lines
6987 DRM_DEV_ERROR(dev, "Unable to authorize the image\n");
7088
7189 out:
90+ if (mem_region)
91+ memunmap(mem_region);
92+
7293 release_firmware(fw);
7394
7495 return ret;
7596 }
76−#else
77−static int zap_shader_load_mdt(struct device *dev, const char *fwname)
78−{
79− return -ENODEV;
80−}
81−#endif
8297
8398 static void a5xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
8499 struct msm_file_private *ctx)
@@ -117,12 +132,10 @@ static void a5xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit, · 32 unmodified lines
117132 gpu->funcs->flush(gpu);
118133 }
119134
120−struct a5xx_hwcg {
135+static const struct {
121136 u32 offset;
122137 u32 value;
123−};
124−
125−static const struct a5xx_hwcg a530_hwcg[] = {
138+} a5xx_hwcg[] = {
126139 {REG_A5XX_RBBM_CLOCK_CNTL_SP0, 0x02222222},
127140 {REG_A5XX_RBBM_CLOCK_CNTL_SP1, 0x02222222},
128141 {REG_A5XX_RBBM_CLOCK_CNTL_SP2, 0x02222222},
@@ -217,38 +230,16 @@ static const struct a5xx_hwcg a530_hwcg[] = { · 88 unmodified lines
217230 {REG_A5XX_RBBM_CLOCK_DELAY_VFD, 0x00002222}
218231 };
219232
220−static const struct {
221− int (*test)(struct adreno_gpu *gpu);
222− const struct a5xx_hwcg *regs;
223− unsigned int count;
224−} a5xx_hwcg_regs[] = {
225− { adreno_is_a530, a530_hwcg, ARRAY_SIZE(a530_hwcg), },
226−};
227−
228−static void _a5xx_enable_hwcg(struct msm_gpu *gpu,
229− const struct a5xx_hwcg *regs, unsigned int count)
233+void a5xx_set_hwcg(struct msm_gpu *gpu, bool state)
230234 {
231235 unsigned int i;
232236
233− for (i = 0; i < count; i++)
234− gpu_write(gpu, regs[i].offset, regs[i].value);
237+ for (i = 0; i < ARRAY_SIZE(a5xx_hwcg); i++)
238+ gpu_write(gpu, a5xx_hwcg[i].offset,
239+ state ? a5xx_hwcg[i].value : 0);
235240
236− gpu_write(gpu, REG_A5XX_RBBM_CLOCK_CNTL, 0xAAA8AA00);
237− gpu_write(gpu, REG_A5XX_RBBM_ISDB_CNT, 0x182);
238−}
239−
240−static void a5xx_enable_hwcg(struct msm_gpu *gpu)
241−{
242− struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
243− unsigned int i;
244−
245− for (i = 0; i < ARRAY_SIZE(a5xx_hwcg_regs); i++) {
246− if (a5xx_hwcg_regs[i].test(adreno_gpu)) {
247− _a5xx_enable_hwcg(gpu, a5xx_hwcg_regs[i].regs,
248− a5xx_hwcg_regs[i].count);
249− return;
250− }
251− }
241+ gpu_write(gpu, REG_A5XX_RBBM_CLOCK_CNTL, state ? 0xAAA8AA00 : 0);
242+ gpu_write(gpu, REG_A5XX_RBBM_ISDB_CNT, state ? 0x182 : 0x180);
252243 }
253244
254245 static int a5xx_me_init(struct msm_gpu *gpu)
@@ -377,45 +368,6 @@ static int a5xx_zap_shader_resume(struct msm_gpu *gpu) · 122 unmodified lines
377368 return ret;
378369 }
379370
380−/* Set up a child device to "own" the zap shader */
381−static int a5xx_zap_shader_dev_init(struct device *parent, struct device *dev)
382−{
383− struct device_node *node;
384− int ret;
385−
386− if (dev->parent)
387− return 0;
388−
389− /* Find the sub-node for the zap shader */
390− node = of_get_child_by_name(parent->of_node, "zap-shader");
391− if (!node) {
392− DRM_DEV_ERROR(parent, "zap-shader not found in device tree\n");
393− return -ENODEV;
394− }
395−
396− dev->parent = parent;
397− dev->of_node = node;
398− dev_set_name(dev, "adreno_zap_shader");
399−
400− ret = device_register(dev);
401− if (ret) {
402− DRM_DEV_ERROR(parent, "Couldn't register zap shader device\n");
403− goto out;
404− }
405−
406− ret = of_reserved_mem_device_init(dev);
407− if (ret) {
408− DRM_DEV_ERROR(parent, "Unable to set up the reserved memory\n");
409− device_unregister(dev);
410− }
411−
412−out:
413− if (ret)
414− dev->parent = NULL;
415−
416− return ret;
417−}
418−
419371 static int a5xx_zap_shader_init(struct msm_gpu *gpu)
420372 {
421373 static bool loaded;
@@ -444,11 +396,7 @@ static int a5xx_zap_shader_init(struct msm_gpu *gpu) · 22 unmodified lines
444396 return -ENODEV;
445397 }
446398
447− ret = a5xx_zap_shader_dev_init(&pdev->dev, &a5xx_gpu->zap_dev);
448−
449− if (!ret)
450− ret = zap_shader_load_mdt(&a5xx_gpu->zap_dev,
451− adreno_gpu->info->zapfw);
399+ ret = zap_shader_load_mdt(&pdev->dev, adreno_gpu->info->zapfw);
452400
453401 loaded = !ret;
454402
@@ -545,7 +493,7 @@ static int a5xx_hw_init(struct msm_gpu *gpu) · 90 unmodified lines
545493 gpu_write(gpu, REG_A5XX_RBBM_AHB_CNTL1, 0xA6FFFFFF);
546494
547495 /* Enable HWCG */
548− a5xx_enable_hwcg(gpu);
496+ a5xx_set_hwcg(gpu, true);
549497
550498 gpu_write(gpu, REG_A5XX_RBBM_AHB_CNTL2, 0x0000003F);
551499
@@ -691,9 +639,6 @@ static void a5xx_destroy(struct msm_gpu *gpu) · 139 unmodified lines
691639
692640 DBG("%s", gpu->name);
693641
694− if (a5xx_gpu->zap_dev.parent)
695− device_unregister(&a5xx_gpu->zap_dev);
696−
697642 if (a5xx_gpu->pm4_bo) {
698643 if (a5xx_gpu->pm4_iova)
699644 msm_gem_put_iova(a5xx_gpu->pm4_bo, gpu->aspace);
@@ -920,31 +865,30 @@ static const u32 a5xx_registers[] = { · 220 unmodified lines
920865 0x0000, 0x0002, 0x0004, 0x0020, 0x0022, 0x0026, 0x0029, 0x002B,
921866 0x002E, 0x0035, 0x0038, 0x0042, 0x0044, 0x0044, 0x0047, 0x0095,
922867 0x0097, 0x00BB, 0x03A0, 0x0464, 0x0469, 0x046F, 0x04D2, 0x04D3,
923− 0x04E0, 0x0533, 0x0540, 0x0555, 0xF400, 0xF400, 0xF800, 0xF807,
924− 0x0800, 0x081A, 0x081F, 0x0841, 0x0860, 0x0860, 0x0880, 0x08A0,
925− 0x0B00, 0x0B12, 0x0B15, 0x0B28, 0x0B78, 0x0B7F, 0x0BB0, 0x0BBD,
926− 0x0BC0, 0x0BC6, 0x0BD0, 0x0C53, 0x0C60, 0x0C61, 0x0C80, 0x0C82,
927− 0x0C84, 0x0C85, 0x0C90, 0x0C98, 0x0CA0, 0x0CA0, 0x0CB0, 0x0CB2,
928− 0x2180, 0x2185, 0x2580, 0x2585, 0x0CC1, 0x0CC1, 0x0CC4, 0x0CC7,
929− 0x0CCC, 0x0CCC, 0x0CD0, 0x0CD8, 0x0CE0, 0x0CE5, 0x0CE8, 0x0CE8,
930− 0x0CEC, 0x0CF1, 0x0CFB, 0x0D0E, 0x2100, 0x211E, 0x2140, 0x2145,
931− 0x2500, 0x251E, 0x2540, 0x2545, 0x0D10, 0x0D17, 0x0D20, 0x0D23,
932− 0x0D30, 0x0D30, 0x20C0, 0x20C0, 0x24C0, 0x24C0, 0x0E40, 0x0E43,
933− 0x0E4A, 0x0E4A, 0x0E50, 0x0E57, 0x0E60, 0x0E7C, 0x0E80, 0x0E8E,
934− 0x0E90, 0x0E96, 0x0EA0, 0x0EA8, 0x0EB0, 0x0EB2, 0xE140, 0xE147,
935− 0xE150, 0xE187, 0xE1A0, 0xE1A9, 0xE1B0, 0xE1B6, 0xE1C0, 0xE1C7,
936− 0xE1D0, 0xE1D1, 0xE200, 0xE201, 0xE210, 0xE21C, 0xE240, 0xE268,
937− 0xE000, 0xE006, 0xE010, 0xE09A, 0xE0A0, 0xE0A4, 0xE0AA, 0xE0EB,
938− 0xE100, 0xE105, 0xE380, 0xE38F, 0xE3B0, 0xE3B0, 0xE400, 0xE405,
939− 0xE408, 0xE4E9, 0xE4F0, 0xE4F0, 0xE280, 0xE280, 0xE282, 0xE2A3,
940− 0xE2A5, 0xE2C2, 0xE940, 0xE947, 0xE950, 0xE987, 0xE9A0, 0xE9A9,
941− 0xE9B0, 0xE9B6, 0xE9C0, 0xE9C7, 0xE9D0, 0xE9D1, 0xEA00, 0xEA01,
942− 0xEA10, 0xEA1C, 0xEA40, 0xEA68, 0xE800, 0xE806, 0xE810, 0xE89A,
943− 0xE8A0, 0xE8A4, 0xE8AA, 0xE8EB, 0xE900, 0xE905, 0xEB80, 0xEB8F,
944− 0xEBB0, 0xEBB0, 0xEC00, 0xEC05, 0xEC08, 0xECE9, 0xECF0, 0xECF0,
945− 0xEA80, 0xEA80, 0xEA82, 0xEAA3, 0xEAA5, 0xEAC2, 0xA800, 0xA8FF,
946− 0xAC60, 0xAC60, 0xB000, 0xB97F, 0xB9A0, 0xB9BF,
947− ~0
868+ 0x04E0, 0x0533, 0x0540, 0x0555, 0x0800, 0x081A, 0x081F, 0x0841,
869+ 0x0860, 0x0860, 0x0880, 0x08A0, 0x0B00, 0x0B12, 0x0B15, 0x0B28,
870+ 0x0B78, 0x0B7F, 0x0BB0, 0x0BBD, 0x0BC0, 0x0BC6, 0x0BD0, 0x0C53,
871+ 0x0C60, 0x0C61, 0x0C80, 0x0C82, 0x0C84, 0x0C85, 0x0C90, 0x0C98,
872+ 0x0CA0, 0x0CA0, 0x0CB0, 0x0CB2, 0x2180, 0x2185, 0x2580, 0x2585,
873+ 0x0CC1, 0x0CC1, 0x0CC4, 0x0CC7, 0x0CCC, 0x0CCC, 0x0CD0, 0x0CD8,
874+ 0x0CE0, 0x0CE5, 0x0CE8, 0x0CE8, 0x0CEC, 0x0CF1, 0x0CFB, 0x0D0E,
875+ 0x2100, 0x211E, 0x2140, 0x2145, 0x2500, 0x251E, 0x2540, 0x2545,
876+ 0x0D10, 0x0D17, 0x0D20, 0x0D23, 0x0D30, 0x0D30, 0x20C0, 0x20C0,
877+ 0x24C0, 0x24C0, 0x0E40, 0x0E43, 0x0E4A, 0x0E4A, 0x0E50, 0x0E57,
878+ 0x0E60, 0x0E7C, 0x0E80, 0x0E8E, 0x0E90, 0x0E96, 0x0EA0, 0x0EA8,
879+ 0x0EB0, 0x0EB2, 0xE140, 0xE147, 0xE150, 0xE187, 0xE1A0, 0xE1A9,
880+ 0xE1B0, 0xE1B6, 0xE1C0, 0xE1C7, 0xE1D0, 0xE1D1, 0xE200, 0xE201,
881+ 0xE210, 0xE21C, 0xE240, 0xE268, 0xE000, 0xE006, 0xE010, 0xE09A,
882+ 0xE0A0, 0xE0A4, 0xE0AA, 0xE0EB, 0xE100, 0xE105, 0xE380, 0xE38F,
883+ 0xE3B0, 0xE3B0, 0xE400, 0xE405, 0xE408, 0xE4E9, 0xE4F0, 0xE4F0,
884+ 0xE280, 0xE280, 0xE282, 0xE2A3, 0xE2A5, 0xE2C2, 0xE940, 0xE947,
885+ 0xE950, 0xE987, 0xE9A0, 0xE9A9, 0xE9B0, 0xE9B6, 0xE9C0, 0xE9C7,
886+ 0xE9D0, 0xE9D1, 0xEA00, 0xEA01, 0xEA10, 0xEA1C, 0xEA40, 0xEA68,
887+ 0xE800, 0xE806, 0xE810, 0xE89A, 0xE8A0, 0xE8A4, 0xE8AA, 0xE8EB,
888+ 0xE900, 0xE905, 0xEB80, 0xEB8F, 0xEBB0, 0xEBB0, 0xEC00, 0xEC05,
889+ 0xEC08, 0xECE9, 0xECF0, 0xECF0, 0xEA80, 0xEA80, 0xEA82, 0xEAA3,
890+ 0xEAA5, 0xEAC2, 0xA800, 0xA8FF, 0xAC60, 0xAC60, 0xB000, 0xB97F,
891+ 0xB9A0, 0xB9BF, ~0
948892 };
949893
950894 static void a5xx_dump(struct msm_gpu *gpu)
@@ -1020,7 +964,14 @@ static void a5xx_show(struct msm_gpu *gpu, struct seq_file *m) · 69 unmodified lines
1020964 {
1021965 seq_printf(m, "status: %08x\n",
1022966 gpu_read(gpu, REG_A5XX_RBBM_STATUS));
967+
968+ /*
969+ * Temporarily disable hardware clock gating before going into
970+ * adreno_show to avoid issues while reading the registers
971+ */
972+ a5xx_set_hwcg(gpu, false);
1023973 adreno_show(gpu, m);
974+ a5xx_set_hwcg(gpu, true);
1024975 }
1025976 #endif
1026977
drivers/gpu/drm/msm/adreno/a5xx_gpu.h+1−2
@@ -36,8 +36,6 @@ struct a5xx_gpu { · 35 unmodified lines
3636 uint32_t gpmu_dwords;
3737
3838 uint32_t lm_leakage;
39−
40− struct device zap_dev;
4139 };
4240
4341 #define to_a5xx_gpu(x) container_of(x, struct a5xx_gpu, base)
@@ -59,5 +57,6 @@ static inline int spin_usecs(struct msm_gpu *gpu, uint32_t usecs, · 15 unmodified lines
5957 }
6058
6159 bool a5xx_idle(struct msm_gpu *gpu);
60+void a5xx_set_hwcg(struct msm_gpu *gpu, bool state);
6261
6362 #endif /* __A5XX_GPU_H__ */
drivers/gpu/drm/msm/adreno/adreno_gpu.c+9−2
@@ -48,8 +48,15 @@ int adreno_get_param(struct msm_gpu *gpu, uint32_t param, uint64_t *value) · 47 unmodified lines
4848 *value = adreno_gpu->base.fast_rate;
4949 return 0;
5050 case MSM_PARAM_TIMESTAMP:
51− if (adreno_gpu->funcs->get_timestamp)
52− return adreno_gpu->funcs->get_timestamp(gpu, value);
51+ if (adreno_gpu->funcs->get_timestamp) {
52+ int ret;
53+
54+ pm_runtime_get_sync(&gpu->pdev->dev);
55+ ret = adreno_gpu->funcs->get_timestamp(gpu, value);
56+ pm_runtime_put_autosuspend(&gpu->pdev->dev);
57+
58+ return ret;
59+ }
5360 return -EINVAL;
5461 default:
5562 DBG("%s: invalid param: %u", gpu->name, param);
drivers/gpu/drm/msm/dsi/dsi_host.c+7−7
@@ -2137,6 +2137,13 @@ void msm_dsi_host_get_phy_clk_req(struct mipi_dsi_host *host, · 2136 unmodified lines
21372137 struct msm_dsi_phy_clk_request *clk_req)
21382138 {
21392139 struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
2140+ int ret;
2141+
2142+ ret = dsi_calc_clk_rate(msm_host);
2143+ if (ret) {
2144+ pr_err("%s: unable to calc clk rate, %d\n", __func__, ret);
2145+ return;
2146+ }
21402147
21412148 clk_req->bitclk_rate = msm_host->byte_clk_rate * 8;
21422149 clk_req->escclk_rate = msm_host->esc_clk_rate;
@@ -2280,7 +2287,6 @@ int msm_dsi_host_set_display_mode(struct mipi_dsi_host *host, · 137 unmodified lines
22802287 struct drm_display_mode *mode)
22812288 {
22822289 struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
2283− int ret;
22842290
22852291 if (msm_host->mode) {
22862292 drm_mode_destroy(msm_host->dev, msm_host->mode);
@@ -2293,12 +2299,6 @@ int msm_dsi_host_set_display_mode(struct mipi_dsi_host *host, · 6 unmodified lines
22932299 return -ENOMEM;
22942300 }
22952301
2296− ret = dsi_calc_clk_rate(msm_host);
2297− if (ret) {
2298− pr_err("%s: unable to calc clk rate, %d\n", __func__, ret);
2299− return ret;
2300− }
2301−
23022302 return 0;
23032303 }
23042304
drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c+10−2
@@ -221,8 +221,8 @@ static void blend_setup(struct drm_crtc *crtc) · 220 unmodified lines
221221 struct mdp5_ctl *ctl = mdp5_cstate->ctl;
222222 uint32_t blend_op, fg_alpha, bg_alpha, ctl_blend_flags = 0;
223223 unsigned long flags;
224− enum mdp5_pipe stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { SSPP_NONE };
225− enum mdp5_pipe r_stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { SSPP_NONE };
224+ enum mdp5_pipe stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { { SSPP_NONE } };
225+ enum mdp5_pipe r_stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { { SSPP_NONE } };
226226 int i, plane_cnt = 0;
227227 bool bg_alpha_enabled = false;
228228 u32 mixer_op_mode = 0;
@@ -753,6 +753,7 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc, · 524 unmodified lines
753753 if (!handle) {
754754 DBG("Cursor off");
755755 cursor_enable = false;
756+ mdp5_enable(mdp5_kms);
756757 goto set_cursor;
757758 }
758759
@@ -776,6 +777,8 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc, · 17 unmodified lines
776777
777778 get_roi(crtc, &roi_w, &roi_h);
778779
780+ mdp5_enable(mdp5_kms);
781+
779782 mdp5_write(mdp5_kms, REG_MDP5_LM_CURSOR_STRIDE(lm), stride);
780783 mdp5_write(mdp5_kms, REG_MDP5_LM_CURSOR_FORMAT(lm),
781784 MDP5_LM_CURSOR_FORMAT_FORMAT(CURSOR_FMT_ARGB8888));
@@ -804,6 +807,7 @@ set_cursor: · 22 unmodified lines
804807 crtc_flush(crtc, flush_mask);
805808
806809 end:
810+ mdp5_disable(mdp5_kms);
807811 if (old_bo) {
808812 drm_flip_work_queue(&mdp5_crtc->unref_cursor_work, old_bo);
809813 /* enable vblank to complete cursor work: */
@@ -836,6 +840,8 @@ static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) · 26 unmodified lines
836840
837841 get_roi(crtc, &roi_w, &roi_h);
838842
843+ mdp5_enable(mdp5_kms);
844+
839845 spin_lock_irqsave(&mdp5_crtc->cursor.lock, flags);
840846 mdp5_write(mdp5_kms, REG_MDP5_LM_CURSOR_SIZE(lm),
841847 MDP5_LM_CURSOR_SIZE_ROI_H(roi_h) |
@@ -847,6 +853,8 @@ static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) · 5 unmodified lines
847853
848854 crtc_flush(crtc, flush_mask);
849855
856+ mdp5_disable(mdp5_kms);
857+
850858 return 0;
851859 }
852860
drivers/gpu/drm/msm/mdp/mdp5/mdp5_encoder.c+1−1
@@ -299,7 +299,7 @@ static void mdp5_encoder_enable(struct drm_encoder *encoder) · 298 unmodified lines
299299 struct mdp5_interface *intf = mdp5_encoder->intf;
300300
301301 if (intf->mode == MDP5_INTF_DSI_MODE_COMMAND)
302− mdp5_cmd_encoder_disable(encoder);
302+ mdp5_cmd_encoder_enable(encoder);
303303 else
304304 mdp5_vid_encoder_enable(encoder);
305305 }
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c+6−6
@@ -502,7 +502,7 @@ static int get_clk(struct platform_device *pdev, struct clk **clkp, · 501 unmodified lines
502502 const char *name, bool mandatory)
503503 {
504504 struct device *dev = &pdev->dev;
505− struct clk *clk = devm_clk_get(dev, name);
505+ struct clk *clk = msm_clk_get(pdev, name);
506506 if (IS_ERR(clk) && mandatory) {
507507 dev_err(dev, "failed to get %s (%ld)\n", name, PTR_ERR(clk));
508508 return PTR_ERR(clk);
@@ -887,21 +887,21 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev) · 378 unmodified lines
887887 }
888888
889889 /* mandatory clocks: */
890− ret = get_clk(pdev, &mdp5_kms->axi_clk, "bus_clk", true);
890+ ret = get_clk(pdev, &mdp5_kms->axi_clk, "bus", true);
891891 if (ret)
892892 goto fail;
893− ret = get_clk(pdev, &mdp5_kms->ahb_clk, "iface_clk", true);
893+ ret = get_clk(pdev, &mdp5_kms->ahb_clk, "iface", true);
894894 if (ret)
895895 goto fail;
896− ret = get_clk(pdev, &mdp5_kms->core_clk, "core_clk", true);
896+ ret = get_clk(pdev, &mdp5_kms->core_clk, "core", true);
897897 if (ret)
898898 goto fail;
899− ret = get_clk(pdev, &mdp5_kms->vsync_clk, "vsync_clk", true);
899+ ret = get_clk(pdev, &mdp5_kms->vsync_clk, "vsync", true);
900900 if (ret)
901901 goto fail;
902902
903903 /* optional clocks: */
904− get_clk(pdev, &mdp5_kms->lut_clk, "lut_clk", false);
904+ get_clk(pdev, &mdp5_kms->lut_clk, "lut", false);
905905
906906 /* we need to set a default rate before enabling. Set a safe
907907 * rate first, then figure out hw revision, and then set a
drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c+2−2
@@ -890,8 +890,8 @@ static int mdp5_plane_mode_set(struct drm_plane *plane, · 889 unmodified lines
890890 struct mdp5_hw_pipe *right_hwpipe;
891891 const struct mdp_format *format;
892892 uint32_t nplanes, config = 0;
893− struct phase_step step = { 0 };
894− struct pixel_ext pe = { 0 };
893+ struct phase_step step = { { 0 } };
894+ struct pixel_ext pe = { { 0 } };
895895 uint32_t hdecm = 0, vdecm = 0;
896896 uint32_t pix_format;
897897 unsigned int rotation;
drivers/gpu/drm/msm/msm_gem.c+9−3
@@ -383,8 +383,10 @@ int msm_gem_get_iova(struct drm_gem_object *obj, · 382 unmodified lines
383383 struct page **pages;
384384
385385 vma = add_vma(obj, aspace);
386− if (IS_ERR(vma))
387− return PTR_ERR(vma);
386+ if (IS_ERR(vma)) {
387+ ret = PTR_ERR(vma);
388+ goto unlock;
389+ }
388390
389391 pages = get_pages(obj);
390392 if (IS_ERR(pages)) {
@@ -405,7 +407,7 @@ int msm_gem_get_iova(struct drm_gem_object *obj, · 14 unmodified lines
405407
406408 fail:
407409 del_vma(vma);
408−
410+unlock:
409411 mutex_unlock(&msm_obj->lock);
410412 return ret;
411413 }
@@ -928,8 +930,12 @@ static struct drm_gem_object *_msm_gem_new(struct drm_device *dev, · 516 unmodified lines
928930 if (use_vram) {
929931 struct msm_gem_vma *vma;
930932 struct page **pages;
933+ struct msm_gem_object *msm_obj = to_msm_bo(obj);
934+
935+ mutex_lock(&msm_obj->lock);
931936
932937 vma = add_vma(obj, NULL);
938+ mutex_unlock(&msm_obj->lock);
933939 if (IS_ERR(vma)) {
934940 ret = PTR_ERR(vma);
935941 goto fail;
drivers/gpu/drm/msm/msm_gem_submit.c+3−3
@@ -34,8 +34,8 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev, · 33 unmodified lines
3434 struct msm_gpu *gpu, uint32_t nr_bos, uint32_t nr_cmds)
3535 {
3636 struct msm_gem_submit *submit;
37− uint64_t sz = sizeof(*submit) + (nr_bos * sizeof(submit->bos[0])) +
38− (nr_cmds * sizeof(submit->cmd[0]));
37+ uint64_t sz = sizeof(*submit) + ((u64)nr_bos * sizeof(submit->bos[0])) +
38+ ((u64)nr_cmds * sizeof(submit->cmd[0]));
3939
4040 if (sz > SIZE_MAX)
4141 return NULL;
@@ -451,7 +451,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, · 409 unmodified lines
451451 if (ret)
452452 goto out;
453453
454− if (!(args->fence & MSM_SUBMIT_NO_IMPLICIT)) {
454+ if (!(args->flags & MSM_SUBMIT_NO_IMPLICIT)) {
455455 ret = submit_fence_sync(submit);
456456 if (ret)
457457 goto out;
drivers/gpu/drm/msm/msm_gem_vma.c+1−1
@@ -42,7 +42,7 @@ void · 41 unmodified lines
4242 msm_gem_unmap_vma(struct msm_gem_address_space *aspace,
4343 struct msm_gem_vma *vma, struct sg_table *sgt)
4444 {
45− if (!vma->iova)
45+ if (!aspace || !vma->iova)
4646 return;
4747
4848 if (aspace->mmu) {
drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c+2−0
@@ -267,6 +267,8 @@ nvkm_disp_oneinit(struct nvkm_engine *engine) · 266 unmodified lines
267267 /* Create output path objects for each VBIOS display path. */
268268 i = -1;
269269 while ((data = dcb_outp_parse(bios, ++i, &ver, &hdr, &dcbE))) {
270+ if (ver < 0x40) /* No support for chipsets prior to NV50. */
271+ break;
270272 if (dcbE.type == DCB_OUTPUT_UNUSED)
271273 continue;
272274 if (dcbE.type == DCB_OUTPUT_EOL)
drivers/gpu/drm/rockchip/rockchip_drm_vop.c+20−21
@@ -500,7 +500,7 @@ static void vop_line_flag_irq_disable(struct vop *vop) · 499 unmodified lines
500500 static int vop_enable(struct drm_crtc *crtc)
501501 {
502502 struct vop *vop = to_vop(crtc);
503− int ret;
503+ int ret, i;
504504
505505 ret = pm_runtime_get_sync(vop->dev);
506506 if (ret < 0) {
@@ -533,6 +533,20 @@ static int vop_enable(struct drm_crtc *crtc) · 26 unmodified lines
533533 }
534534
535535 memcpy(vop->regs, vop->regsbak, vop->len);
536+ /*
537+ * We need to make sure that all windows are disabled before we
538+ * enable the crtc. Otherwise we might try to scan from a destroyed
539+ * buffer later.
540+ */
541+ for (i = 0; i < vop->data->win_size; i++) {
542+ struct vop_win *vop_win = &vop->win[i];
543+ const struct vop_win_data *win = vop_win->data;
544+
545+ spin_lock(&vop->reg_lock);
546+ VOP_WIN_SET(vop, win, enable, 0);
547+ spin_unlock(&vop->reg_lock);
548+ }
549+
536550 vop_cfg_done(vop);
537551
538552 /*
@@ -566,28 +580,11 @@ err_put_pm_runtime: · 27 unmodified lines
566580 static void vop_crtc_disable(struct drm_crtc *crtc)
567581 {
568582 struct vop *vop = to_vop(crtc);
569− int i;
570583
571584 WARN_ON(vop->event);
572585
573586 rockchip_drm_psr_deactivate(&vop->crtc);
574587
575− /*
576− * We need to make sure that all windows are disabled before we
577− * disable that crtc. Otherwise we might try to scan from a destroyed
578− * buffer later.
579− */
580− for (i = 0; i < vop->data->win_size; i++) {
581− struct vop_win *vop_win = &vop->win[i];
582− const struct vop_win_data *win = vop_win->data;
583−
584− spin_lock(&vop->reg_lock);
585− VOP_WIN_SET(vop, win, enable, 0);
586− spin_unlock(&vop->reg_lock);
587− }
588−
589− vop_cfg_done(vop);
590−
591588 drm_crtc_vblank_off(crtc);
592589
593590 /*
@@ -682,8 +679,10 @@ static int vop_plane_atomic_check(struct drm_plane *plane, · 88 unmodified lines
682679 * Src.x1 can be odd when do clip, but yuv plane start point
683680 * need align with 2 pixel.
684681 */
685− if (is_yuv_support(fb->format->format) && ((state->src.x1 >> 16) % 2))
682+ if (is_yuv_support(fb->format->format) && ((state->src.x1 >> 16) % 2)) {
683+ DRM_ERROR("Invalid Source: Yuv format not support odd xpos\n");
686684 return -EINVAL;
685+ }
687686
688687 return 0;
689688 }
@@ -764,7 +763,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, · 74 unmodified lines
764763 spin_lock(&vop->reg_lock);
765764
766765 VOP_WIN_SET(vop, win, format, format);
767− VOP_WIN_SET(vop, win, yrgb_vir, fb->pitches[0] >> 2);
766+ VOP_WIN_SET(vop, win, yrgb_vir, DIV_ROUND_UP(fb->pitches[0], 4));
768767 VOP_WIN_SET(vop, win, yrgb_mst, dma_addr);
769768 if (is_yuv_support(fb->format->format)) {
770769 int hsub = drm_format_horz_chroma_subsampling(fb->format->format);
@@ -778,7 +777,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, · 7 unmodified lines
778777 offset += (src->y1 >> 16) * fb->pitches[1] / vsub;
779778
780779 dma_addr = rk_uv_obj->dma_addr + offset + fb->offsets[1];
781− VOP_WIN_SET(vop, win, uv_vir, fb->pitches[1] >> 2);
780+ VOP_WIN_SET(vop, win, uv_vir, DIV_ROUND_UP(fb->pitches[1], 4));
782781 VOP_WIN_SET(vop, win, uv_mst, dma_addr);
783782 }
784783
drivers/gpu/drm/rockchip/rockchip_drm_vop.h+3−0
@@ -282,6 +282,9 @@ static inline uint16_t scl_get_bili_dn_vskip(int src_h, int dst_h, · 281 unmodified lines
282282
283283 act_height = (src_h + vskiplines - 1) / vskiplines;
284284
285+ if (act_height == dst_h)
286+ return GET_SCL_FT_BILI_DN(src_h, dst_h) / vskiplines;
287+
285288 return GET_SCL_FT_BILI_DN(act_height, dst_h);
286289 }
287290
drivers/gpu/drm/stm/Kconfig+0−1
@@ -7,7 +7,6 @@ config DRM_STM · 6 unmodified lines
77 select DRM_PANEL
88 select VIDEOMODE_HELPERS
99 select FB_PROVIDE_GET_FB_UNMAPPED_AREA
10− default y
1110
1211 help
1312 Enable support for the on-chip display controller on
include/linux/sync_file.h+2−1
@@ -43,12 +43,13 @@ struct sync_file { · 42 unmodified lines
4343 #endif
4444
4545 wait_queue_head_t wq;
46+ unsigned long flags;
4647
4748 struct dma_fence *fence;
4849 struct dma_fence_cb cb;
4950 };
5051
51−#define POLL_ENABLED DMA_FENCE_FLAG_USER_BITS
52+#define POLL_ENABLED 0
5253
5354 struct sync_file *sync_file_create(struct dma_fence *fence);
5455 struct dma_fence *sync_file_get_fence(int fd);
include/uapi/drm/msm_drm.h+3−3
@@ -171,7 +171,7 @@ struct drm_msm_gem_submit_cmd { · 170 unmodified lines
171171 __u32 size; /* in, cmdstream size */
172172 __u32 pad;
173173 __u32 nr_relocs; /* in, number of submit_reloc's */
174− __u64 __user relocs; /* in, ptr to array of submit_reloc's */
174+ __u64 relocs; /* in, ptr to array of submit_reloc's */
175175 };
176176
177177 /* Each buffer referenced elsewhere in the cmdstream submit (ie. the
@@ -215,8 +215,8 @@ struct drm_msm_gem_submit { · 37 unmodified lines
215215 __u32 fence; /* out */
216216 __u32 nr_bos; /* in, number of submit_bo's */
217217 __u32 nr_cmds; /* in, number of submit_cmd's */
218− __u64 __user bos; /* in, ptr to array of submit_bo's */
219− __u64 __user cmds; /* in, ptr to array of submit_cmd's */
218+ __u64 bos; /* in, ptr to array of submit_bo's */
219+ __u64 cmds; /* in, ptr to array of submit_cmd's */
220220 __s32 fence_fd; /* in/out fence fd (see MSM_SUBMIT_FENCE_FD_IN/OUT) */
221221 };
222222