diff options
author | Dave Airlie <airlied@redhat.com> | 2017-11-01 22:40:41 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-11-01 22:40:41 -0400 |
commit | 7a88cbd8d65d622c00bd76ba4ae1d893b292c91c (patch) | |
tree | 826df7ac42ca13c33828d0142046186b91df686b /drivers/gpu | |
parent | 0a4334c9e5405f836c46375c6e279cfdda7da6b5 (diff) | |
parent | 0b07194bb55ed836c2cc7c22e866b87a14681984 (diff) |
Backmerge tag 'v4.14-rc7' into drm-next
Linux 4.14-rc7
Requested by Ben Skeggs for nouveau to avoid major conflicts,
and things were getting a bit conflicty already, esp around amdgpu
reverts.
Diffstat (limited to 'drivers/gpu')
30 files changed, 179 insertions, 140 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c index 71299c67c517..2581543b35a7 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | |||
@@ -565,11 +565,7 @@ static int uvd_v6_0_suspend(void *handle) | |||
565 | if (r) | 565 | if (r) |
566 | return r; | 566 | return r; |
567 | 567 | ||
568 | /* Skip this for APU for now */ | 568 | return amdgpu_uvd_suspend(adev); |
569 | if (!(adev->flags & AMD_IS_APU)) | ||
570 | r = amdgpu_uvd_suspend(adev); | ||
571 | |||
572 | return r; | ||
573 | } | 569 | } |
574 | 570 | ||
575 | static int uvd_v6_0_resume(void *handle) | 571 | static int uvd_v6_0_resume(void *handle) |
@@ -577,12 +573,10 @@ static int uvd_v6_0_resume(void *handle) | |||
577 | int r; | 573 | int r; |
578 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 574 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
579 | 575 | ||
580 | /* Skip this for APU for now */ | 576 | r = amdgpu_uvd_resume(adev); |
581 | if (!(adev->flags & AMD_IS_APU)) { | 577 | if (r) |
582 | r = amdgpu_uvd_resume(adev); | 578 | return r; |
583 | if (r) | 579 | |
584 | return r; | ||
585 | } | ||
586 | return uvd_v6_0_hw_init(adev); | 580 | return uvd_v6_0_hw_init(adev); |
587 | } | 581 | } |
588 | 582 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index e32f18a99074..4466469cf8ab 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | |||
@@ -815,7 +815,7 @@ uint32_t smu7_get_xclk(struct pp_hwmgr *hwmgr) | |||
815 | { | 815 | { |
816 | uint32_t reference_clock, tmp; | 816 | uint32_t reference_clock, tmp; |
817 | struct cgs_display_info info = {0}; | 817 | struct cgs_display_info info = {0}; |
818 | struct cgs_mode_info mode_info; | 818 | struct cgs_mode_info mode_info = {0}; |
819 | 819 | ||
820 | info.mode_info = &mode_info; | 820 | info.mode_info = &mode_info; |
821 | 821 | ||
@@ -3948,10 +3948,9 @@ static int smu7_program_display_gap(struct pp_hwmgr *hwmgr) | |||
3948 | uint32_t ref_clock; | 3948 | uint32_t ref_clock; |
3949 | uint32_t refresh_rate = 0; | 3949 | uint32_t refresh_rate = 0; |
3950 | struct cgs_display_info info = {0}; | 3950 | struct cgs_display_info info = {0}; |
3951 | struct cgs_mode_info mode_info; | 3951 | struct cgs_mode_info mode_info = {0}; |
3952 | 3952 | ||
3953 | info.mode_info = &mode_info; | 3953 | info.mode_info = &mode_info; |
3954 | |||
3955 | cgs_get_active_displays_info(hwmgr->device, &info); | 3954 | cgs_get_active_displays_info(hwmgr->device, &info); |
3956 | num_active_displays = info.display_count; | 3955 | num_active_displays = info.display_count; |
3957 | 3956 | ||
@@ -3967,6 +3966,7 @@ static int smu7_program_display_gap(struct pp_hwmgr *hwmgr) | |||
3967 | frame_time_in_us = 1000000 / refresh_rate; | 3966 | frame_time_in_us = 1000000 / refresh_rate; |
3968 | 3967 | ||
3969 | pre_vbi_time_in_us = frame_time_in_us - 200 - mode_info.vblank_time_us; | 3968 | pre_vbi_time_in_us = frame_time_in_us - 200 - mode_info.vblank_time_us; |
3969 | |||
3970 | data->frame_time_x2 = frame_time_in_us * 2 / 100; | 3970 | data->frame_time_x2 = frame_time_in_us * 2 / 100; |
3971 | 3971 | ||
3972 | display_gap2 = pre_vbi_time_in_us * (ref_clock / 100); | 3972 | display_gap2 = pre_vbi_time_in_us * (ref_clock / 100); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index e651a58c18cf..82b72425a42f 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
@@ -168,11 +168,13 @@ static struct drm_driver exynos_drm_driver = { | |||
168 | static int exynos_drm_suspend(struct device *dev) | 168 | static int exynos_drm_suspend(struct device *dev) |
169 | { | 169 | { |
170 | struct drm_device *drm_dev = dev_get_drvdata(dev); | 170 | struct drm_device *drm_dev = dev_get_drvdata(dev); |
171 | struct exynos_drm_private *private = drm_dev->dev_private; | 171 | struct exynos_drm_private *private; |
172 | 172 | ||
173 | if (pm_runtime_suspended(dev) || !drm_dev) | 173 | if (pm_runtime_suspended(dev) || !drm_dev) |
174 | return 0; | 174 | return 0; |
175 | 175 | ||
176 | private = drm_dev->dev_private; | ||
177 | |||
176 | drm_kms_helper_poll_disable(drm_dev); | 178 | drm_kms_helper_poll_disable(drm_dev); |
177 | exynos_drm_fbdev_suspend(drm_dev); | 179 | exynos_drm_fbdev_suspend(drm_dev); |
178 | private->suspend_state = drm_atomic_helper_suspend(drm_dev); | 180 | private->suspend_state = drm_atomic_helper_suspend(drm_dev); |
@@ -188,11 +190,12 @@ static int exynos_drm_suspend(struct device *dev) | |||
188 | static int exynos_drm_resume(struct device *dev) | 190 | static int exynos_drm_resume(struct device *dev) |
189 | { | 191 | { |
190 | struct drm_device *drm_dev = dev_get_drvdata(dev); | 192 | struct drm_device *drm_dev = dev_get_drvdata(dev); |
191 | struct exynos_drm_private *private = drm_dev->dev_private; | 193 | struct exynos_drm_private *private; |
192 | 194 | ||
193 | if (pm_runtime_suspended(dev) || !drm_dev) | 195 | if (pm_runtime_suspended(dev) || !drm_dev) |
194 | return 0; | 196 | return 0; |
195 | 197 | ||
198 | private = drm_dev->dev_private; | ||
196 | drm_atomic_helper_resume(drm_dev, private->suspend_state); | 199 | drm_atomic_helper_resume(drm_dev, private->suspend_state); |
197 | exynos_drm_fbdev_resume(drm_dev); | 200 | exynos_drm_fbdev_resume(drm_dev); |
198 | drm_kms_helper_poll_enable(drm_dev); | 201 | drm_kms_helper_poll_enable(drm_dev); |
@@ -427,6 +430,7 @@ static void exynos_drm_unbind(struct device *dev) | |||
427 | 430 | ||
428 | kfree(drm->dev_private); | 431 | kfree(drm->dev_private); |
429 | drm->dev_private = NULL; | 432 | drm->dev_private = NULL; |
433 | dev_set_drvdata(dev, NULL); | ||
430 | 434 | ||
431 | drm_dev_unref(drm); | 435 | drm_dev_unref(drm); |
432 | } | 436 | } |
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c index 2c0ccbb817dc..701a3c6f1669 100644 --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c | |||
@@ -2734,6 +2734,9 @@ static int combine_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx) | |||
2734 | uint32_t per_ctx_start[CACHELINE_DWORDS] = {0}; | 2734 | uint32_t per_ctx_start[CACHELINE_DWORDS] = {0}; |
2735 | unsigned char *bb_start_sva; | 2735 | unsigned char *bb_start_sva; |
2736 | 2736 | ||
2737 | if (!wa_ctx->per_ctx.valid) | ||
2738 | return 0; | ||
2739 | |||
2737 | per_ctx_start[0] = 0x18800001; | 2740 | per_ctx_start[0] = 0x18800001; |
2738 | per_ctx_start[1] = wa_ctx->per_ctx.guest_gma; | 2741 | per_ctx_start[1] = wa_ctx->per_ctx.guest_gma; |
2739 | 2742 | ||
diff --git a/drivers/gpu/drm/i915/gvt/execlist.c b/drivers/gpu/drm/i915/gvt/execlist.c index 5ec07ecf33ad..4427be18e4a9 100644 --- a/drivers/gpu/drm/i915/gvt/execlist.c +++ b/drivers/gpu/drm/i915/gvt/execlist.c | |||
@@ -734,8 +734,7 @@ static int submit_context(struct intel_vgpu *vgpu, int ring_id, | |||
734 | CACHELINE_BYTES; | 734 | CACHELINE_BYTES; |
735 | workload->wa_ctx.per_ctx.guest_gma = | 735 | workload->wa_ctx.per_ctx.guest_gma = |
736 | per_ctx & PER_CTX_ADDR_MASK; | 736 | per_ctx & PER_CTX_ADDR_MASK; |
737 | 737 | workload->wa_ctx.per_ctx.valid = per_ctx & 1; | |
738 | WARN_ON(workload->wa_ctx.indirect_ctx.size && !(per_ctx & 0x1)); | ||
739 | } | 738 | } |
740 | 739 | ||
741 | if (emulate_schedule_in) | 740 | if (emulate_schedule_in) |
diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c index 2294466dd415..a5bed2e71b92 100644 --- a/drivers/gpu/drm/i915/gvt/handlers.c +++ b/drivers/gpu/drm/i915/gvt/handlers.c | |||
@@ -1429,18 +1429,7 @@ static int skl_lcpll_write(struct intel_vgpu *vgpu, unsigned int offset, | |||
1429 | return 0; | 1429 | return 0; |
1430 | } | 1430 | } |
1431 | 1431 | ||
1432 | static int ring_timestamp_mmio_read(struct intel_vgpu *vgpu, | 1432 | static int mmio_read_from_hw(struct intel_vgpu *vgpu, |
1433 | unsigned int offset, void *p_data, unsigned int bytes) | ||
1434 | { | ||
1435 | struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; | ||
1436 | |||
1437 | mmio_hw_access_pre(dev_priv); | ||
1438 | vgpu_vreg(vgpu, offset) = I915_READ(_MMIO(offset)); | ||
1439 | mmio_hw_access_post(dev_priv); | ||
1440 | return intel_vgpu_default_mmio_read(vgpu, offset, p_data, bytes); | ||
1441 | } | ||
1442 | |||
1443 | static int instdone_mmio_read(struct intel_vgpu *vgpu, | ||
1444 | unsigned int offset, void *p_data, unsigned int bytes) | 1433 | unsigned int offset, void *p_data, unsigned int bytes) |
1445 | { | 1434 | { |
1446 | struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; | 1435 | struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; |
@@ -1589,6 +1578,8 @@ static int ring_reset_ctl_write(struct intel_vgpu *vgpu, | |||
1589 | MMIO_F(prefix(BLT_RING_BASE), s, f, am, rm, d, r, w); \ | 1578 | MMIO_F(prefix(BLT_RING_BASE), s, f, am, rm, d, r, w); \ |
1590 | MMIO_F(prefix(GEN6_BSD_RING_BASE), s, f, am, rm, d, r, w); \ | 1579 | MMIO_F(prefix(GEN6_BSD_RING_BASE), s, f, am, rm, d, r, w); \ |
1591 | MMIO_F(prefix(VEBOX_RING_BASE), s, f, am, rm, d, r, w); \ | 1580 | MMIO_F(prefix(VEBOX_RING_BASE), s, f, am, rm, d, r, w); \ |
1581 | if (HAS_BSD2(dev_priv)) \ | ||
1582 | MMIO_F(prefix(GEN8_BSD2_RING_BASE), s, f, am, rm, d, r, w); \ | ||
1592 | } while (0) | 1583 | } while (0) |
1593 | 1584 | ||
1594 | #define MMIO_RING_D(prefix, d) \ | 1585 | #define MMIO_RING_D(prefix, d) \ |
@@ -1635,10 +1626,9 @@ static int init_generic_mmio_info(struct intel_gvt *gvt) | |||
1635 | #undef RING_REG | 1626 | #undef RING_REG |
1636 | 1627 | ||
1637 | #define RING_REG(base) (base + 0x6c) | 1628 | #define RING_REG(base) (base + 0x6c) |
1638 | MMIO_RING_DFH(RING_REG, D_ALL, 0, instdone_mmio_read, NULL); | 1629 | MMIO_RING_DFH(RING_REG, D_ALL, 0, mmio_read_from_hw, NULL); |
1639 | MMIO_DH(RING_REG(GEN8_BSD2_RING_BASE), D_ALL, instdone_mmio_read, NULL); | ||
1640 | #undef RING_REG | 1630 | #undef RING_REG |
1641 | MMIO_DH(GEN7_SC_INSTDONE, D_BDW_PLUS, instdone_mmio_read, NULL); | 1631 | MMIO_DH(GEN7_SC_INSTDONE, D_BDW_PLUS, mmio_read_from_hw, NULL); |
1642 | 1632 | ||
1643 | MMIO_GM_RDR(0x2148, D_ALL, NULL, NULL); | 1633 | MMIO_GM_RDR(0x2148, D_ALL, NULL, NULL); |
1644 | MMIO_GM_RDR(CCID, D_ALL, NULL, NULL); | 1634 | MMIO_GM_RDR(CCID, D_ALL, NULL, NULL); |
@@ -1648,7 +1638,7 @@ static int init_generic_mmio_info(struct intel_gvt *gvt) | |||
1648 | MMIO_RING_DFH(RING_TAIL, D_ALL, F_CMD_ACCESS, NULL, NULL); | 1638 | MMIO_RING_DFH(RING_TAIL, D_ALL, F_CMD_ACCESS, NULL, NULL); |
1649 | MMIO_RING_DFH(RING_HEAD, D_ALL, F_CMD_ACCESS, NULL, NULL); | 1639 | MMIO_RING_DFH(RING_HEAD, D_ALL, F_CMD_ACCESS, NULL, NULL); |
1650 | MMIO_RING_DFH(RING_CTL, D_ALL, F_CMD_ACCESS, NULL, NULL); | 1640 | MMIO_RING_DFH(RING_CTL, D_ALL, F_CMD_ACCESS, NULL, NULL); |
1651 | MMIO_RING_DFH(RING_ACTHD, D_ALL, F_CMD_ACCESS, NULL, NULL); | 1641 | MMIO_RING_DFH(RING_ACTHD, D_ALL, F_CMD_ACCESS, mmio_read_from_hw, NULL); |
1652 | MMIO_RING_GM_RDR(RING_START, D_ALL, NULL, NULL); | 1642 | MMIO_RING_GM_RDR(RING_START, D_ALL, NULL, NULL); |
1653 | 1643 | ||
1654 | /* RING MODE */ | 1644 | /* RING MODE */ |
@@ -1662,9 +1652,9 @@ static int init_generic_mmio_info(struct intel_gvt *gvt) | |||
1662 | MMIO_RING_DFH(RING_INSTPM, D_ALL, F_MODE_MASK | F_CMD_ACCESS, | 1652 | MMIO_RING_DFH(RING_INSTPM, D_ALL, F_MODE_MASK | F_CMD_ACCESS, |
1663 | NULL, NULL); | 1653 | NULL, NULL); |
1664 | MMIO_RING_DFH(RING_TIMESTAMP, D_ALL, F_CMD_ACCESS, | 1654 | MMIO_RING_DFH(RING_TIMESTAMP, D_ALL, F_CMD_ACCESS, |
1665 | ring_timestamp_mmio_read, NULL); | 1655 | mmio_read_from_hw, NULL); |
1666 | MMIO_RING_DFH(RING_TIMESTAMP_UDW, D_ALL, F_CMD_ACCESS, | 1656 | MMIO_RING_DFH(RING_TIMESTAMP_UDW, D_ALL, F_CMD_ACCESS, |
1667 | ring_timestamp_mmio_read, NULL); | 1657 | mmio_read_from_hw, NULL); |
1668 | 1658 | ||
1669 | MMIO_DFH(GEN7_GT_MODE, D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); | 1659 | MMIO_DFH(GEN7_GT_MODE, D_ALL, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); |
1670 | MMIO_DFH(CACHE_MODE_0_GEN7, D_ALL, F_MODE_MASK | F_CMD_ACCESS, | 1660 | MMIO_DFH(CACHE_MODE_0_GEN7, D_ALL, F_MODE_MASK | F_CMD_ACCESS, |
@@ -2411,9 +2401,6 @@ static int init_broadwell_mmio_info(struct intel_gvt *gvt) | |||
2411 | struct drm_i915_private *dev_priv = gvt->dev_priv; | 2401 | struct drm_i915_private *dev_priv = gvt->dev_priv; |
2412 | int ret; | 2402 | int ret; |
2413 | 2403 | ||
2414 | MMIO_DFH(RING_IMR(GEN8_BSD2_RING_BASE), D_BDW_PLUS, F_CMD_ACCESS, NULL, | ||
2415 | intel_vgpu_reg_imr_handler); | ||
2416 | |||
2417 | MMIO_DH(GEN8_GT_IMR(0), D_BDW_PLUS, NULL, intel_vgpu_reg_imr_handler); | 2404 | MMIO_DH(GEN8_GT_IMR(0), D_BDW_PLUS, NULL, intel_vgpu_reg_imr_handler); |
2418 | MMIO_DH(GEN8_GT_IER(0), D_BDW_PLUS, NULL, intel_vgpu_reg_ier_handler); | 2405 | MMIO_DH(GEN8_GT_IER(0), D_BDW_PLUS, NULL, intel_vgpu_reg_ier_handler); |
2419 | MMIO_DH(GEN8_GT_IIR(0), D_BDW_PLUS, NULL, intel_vgpu_reg_iir_handler); | 2406 | MMIO_DH(GEN8_GT_IIR(0), D_BDW_PLUS, NULL, intel_vgpu_reg_iir_handler); |
@@ -2476,68 +2463,34 @@ static int init_broadwell_mmio_info(struct intel_gvt *gvt) | |||
2476 | MMIO_DH(GEN8_MASTER_IRQ, D_BDW_PLUS, NULL, | 2463 | MMIO_DH(GEN8_MASTER_IRQ, D_BDW_PLUS, NULL, |
2477 | intel_vgpu_reg_master_irq_handler); | 2464 | intel_vgpu_reg_master_irq_handler); |
2478 | 2465 | ||
2479 | MMIO_DFH(RING_HWSTAM(GEN8_BSD2_RING_BASE), D_BDW_PLUS, | 2466 | MMIO_RING_DFH(RING_ACTHD_UDW, D_BDW_PLUS, F_CMD_ACCESS, |
2480 | F_CMD_ACCESS, NULL, NULL); | 2467 | mmio_read_from_hw, NULL); |
2481 | MMIO_DFH(0x1c134, D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); | ||
2482 | |||
2483 | MMIO_DFH(RING_TAIL(GEN8_BSD2_RING_BASE), D_BDW_PLUS, F_CMD_ACCESS, | ||
2484 | NULL, NULL); | ||
2485 | MMIO_DFH(RING_HEAD(GEN8_BSD2_RING_BASE), D_BDW_PLUS, | ||
2486 | F_CMD_ACCESS, NULL, NULL); | ||
2487 | MMIO_GM_RDR(RING_START(GEN8_BSD2_RING_BASE), D_BDW_PLUS, NULL, NULL); | ||
2488 | MMIO_DFH(RING_CTL(GEN8_BSD2_RING_BASE), D_BDW_PLUS, F_CMD_ACCESS, | ||
2489 | NULL, NULL); | ||
2490 | MMIO_DFH(RING_ACTHD(GEN8_BSD2_RING_BASE), D_BDW_PLUS, | ||
2491 | F_CMD_ACCESS, NULL, NULL); | ||
2492 | MMIO_DFH(RING_ACTHD_UDW(GEN8_BSD2_RING_BASE), D_BDW_PLUS, | ||
2493 | F_CMD_ACCESS, NULL, NULL); | ||
2494 | MMIO_DFH(0x1c29c, D_BDW_PLUS, F_MODE_MASK | F_CMD_ACCESS, NULL, | ||
2495 | ring_mode_mmio_write); | ||
2496 | MMIO_DFH(RING_MI_MODE(GEN8_BSD2_RING_BASE), D_BDW_PLUS, | ||
2497 | F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); | ||
2498 | MMIO_DFH(RING_INSTPM(GEN8_BSD2_RING_BASE), D_BDW_PLUS, | ||
2499 | F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); | ||
2500 | MMIO_DFH(RING_TIMESTAMP(GEN8_BSD2_RING_BASE), D_BDW_PLUS, F_CMD_ACCESS, | ||
2501 | ring_timestamp_mmio_read, NULL); | ||
2502 | |||
2503 | MMIO_RING_DFH(RING_ACTHD_UDW, D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); | ||
2504 | 2468 | ||
2505 | #define RING_REG(base) (base + 0xd0) | 2469 | #define RING_REG(base) (base + 0xd0) |
2506 | MMIO_RING_F(RING_REG, 4, F_RO, 0, | 2470 | MMIO_RING_F(RING_REG, 4, F_RO, 0, |
2507 | ~_MASKED_BIT_ENABLE(RESET_CTL_REQUEST_RESET), D_BDW_PLUS, NULL, | 2471 | ~_MASKED_BIT_ENABLE(RESET_CTL_REQUEST_RESET), D_BDW_PLUS, NULL, |
2508 | ring_reset_ctl_write); | 2472 | ring_reset_ctl_write); |
2509 | MMIO_F(RING_REG(GEN8_BSD2_RING_BASE), 4, F_RO, 0, | ||
2510 | ~_MASKED_BIT_ENABLE(RESET_CTL_REQUEST_RESET), D_BDW_PLUS, NULL, | ||
2511 | ring_reset_ctl_write); | ||
2512 | #undef RING_REG | 2473 | #undef RING_REG |
2513 | 2474 | ||
2514 | #define RING_REG(base) (base + 0x230) | 2475 | #define RING_REG(base) (base + 0x230) |
2515 | MMIO_RING_DFH(RING_REG, D_BDW_PLUS, 0, NULL, elsp_mmio_write); | 2476 | MMIO_RING_DFH(RING_REG, D_BDW_PLUS, 0, NULL, elsp_mmio_write); |
2516 | MMIO_DH(RING_REG(GEN8_BSD2_RING_BASE), D_BDW_PLUS, NULL, elsp_mmio_write); | ||
2517 | #undef RING_REG | 2477 | #undef RING_REG |
2518 | 2478 | ||
2519 | #define RING_REG(base) (base + 0x234) | 2479 | #define RING_REG(base) (base + 0x234) |
2520 | MMIO_RING_F(RING_REG, 8, F_RO | F_CMD_ACCESS, 0, ~0, D_BDW_PLUS, | 2480 | MMIO_RING_F(RING_REG, 8, F_RO | F_CMD_ACCESS, 0, ~0, D_BDW_PLUS, |
2521 | NULL, NULL); | 2481 | NULL, NULL); |
2522 | MMIO_F(RING_REG(GEN8_BSD2_RING_BASE), 4, F_RO | F_CMD_ACCESS, 0, | ||
2523 | ~0LL, D_BDW_PLUS, NULL, NULL); | ||
2524 | #undef RING_REG | 2482 | #undef RING_REG |
2525 | 2483 | ||
2526 | #define RING_REG(base) (base + 0x244) | 2484 | #define RING_REG(base) (base + 0x244) |
2527 | MMIO_RING_DFH(RING_REG, D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); | 2485 | MMIO_RING_DFH(RING_REG, D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); |
2528 | MMIO_DFH(RING_REG(GEN8_BSD2_RING_BASE), D_BDW_PLUS, F_CMD_ACCESS, | ||
2529 | NULL, NULL); | ||
2530 | #undef RING_REG | 2486 | #undef RING_REG |
2531 | 2487 | ||
2532 | #define RING_REG(base) (base + 0x370) | 2488 | #define RING_REG(base) (base + 0x370) |
2533 | MMIO_RING_F(RING_REG, 48, F_RO, 0, ~0, D_BDW_PLUS, NULL, NULL); | 2489 | MMIO_RING_F(RING_REG, 48, F_RO, 0, ~0, D_BDW_PLUS, NULL, NULL); |
2534 | MMIO_F(RING_REG(GEN8_BSD2_RING_BASE), 48, F_RO, 0, ~0, D_BDW_PLUS, | ||
2535 | NULL, NULL); | ||
2536 | #undef RING_REG | 2490 | #undef RING_REG |
2537 | 2491 | ||
2538 | #define RING_REG(base) (base + 0x3a0) | 2492 | #define RING_REG(base) (base + 0x3a0) |
2539 | MMIO_RING_DFH(RING_REG, D_BDW_PLUS, F_MODE_MASK, NULL, NULL); | 2493 | MMIO_RING_DFH(RING_REG, D_BDW_PLUS, F_MODE_MASK, NULL, NULL); |
2540 | MMIO_DFH(RING_REG(GEN8_BSD2_RING_BASE), D_BDW_PLUS, F_MODE_MASK, NULL, NULL); | ||
2541 | #undef RING_REG | 2494 | #undef RING_REG |
2542 | 2495 | ||
2543 | MMIO_D(PIPEMISC(PIPE_A), D_BDW_PLUS); | 2496 | MMIO_D(PIPEMISC(PIPE_A), D_BDW_PLUS); |
@@ -2557,11 +2510,9 @@ static int init_broadwell_mmio_info(struct intel_gvt *gvt) | |||
2557 | 2510 | ||
2558 | #define RING_REG(base) (base + 0x270) | 2511 | #define RING_REG(base) (base + 0x270) |
2559 | MMIO_RING_F(RING_REG, 32, 0, 0, 0, D_BDW_PLUS, NULL, NULL); | 2512 | MMIO_RING_F(RING_REG, 32, 0, 0, 0, D_BDW_PLUS, NULL, NULL); |
2560 | MMIO_F(RING_REG(GEN8_BSD2_RING_BASE), 32, 0, 0, 0, D_BDW_PLUS, NULL, NULL); | ||
2561 | #undef RING_REG | 2513 | #undef RING_REG |
2562 | 2514 | ||
2563 | MMIO_RING_GM_RDR(RING_HWS_PGA, D_BDW_PLUS, NULL, NULL); | 2515 | MMIO_RING_GM_RDR(RING_HWS_PGA, D_BDW_PLUS, NULL, NULL); |
2564 | MMIO_GM_RDR(RING_HWS_PGA(GEN8_BSD2_RING_BASE), D_BDW_PLUS, NULL, NULL); | ||
2565 | 2516 | ||
2566 | MMIO_DFH(HDC_CHICKEN0, D_BDW_PLUS, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); | 2517 | MMIO_DFH(HDC_CHICKEN0, D_BDW_PLUS, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL); |
2567 | 2518 | ||
@@ -2849,7 +2800,6 @@ static int init_skl_mmio_info(struct intel_gvt *gvt) | |||
2849 | MMIO_D(0x65f08, D_SKL | D_KBL); | 2800 | MMIO_D(0x65f08, D_SKL | D_KBL); |
2850 | MMIO_D(0x320f0, D_SKL | D_KBL); | 2801 | MMIO_D(0x320f0, D_SKL | D_KBL); |
2851 | 2802 | ||
2852 | MMIO_DFH(_REG_VCS2_EXCC, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL); | ||
2853 | MMIO_D(0x70034, D_SKL_PLUS); | 2803 | MMIO_D(0x70034, D_SKL_PLUS); |
2854 | MMIO_D(0x71034, D_SKL_PLUS); | 2804 | MMIO_D(0x71034, D_SKL_PLUS); |
2855 | MMIO_D(0x72034, D_SKL_PLUS); | 2805 | MMIO_D(0x72034, D_SKL_PLUS); |
diff --git a/drivers/gpu/drm/i915/gvt/reg.h b/drivers/gpu/drm/i915/gvt/reg.h index fbd023a16f18..7d01c77a0f7a 100644 --- a/drivers/gpu/drm/i915/gvt/reg.h +++ b/drivers/gpu/drm/i915/gvt/reg.h | |||
@@ -54,9 +54,6 @@ | |||
54 | 54 | ||
55 | #define VGT_SPRSTRIDE(pipe) _PIPE(pipe, _SPRA_STRIDE, _PLANE_STRIDE_2_B) | 55 | #define VGT_SPRSTRIDE(pipe) _PIPE(pipe, _SPRA_STRIDE, _PLANE_STRIDE_2_B) |
56 | 56 | ||
57 | #define _REG_VECS_EXCC 0x1A028 | ||
58 | #define _REG_VCS2_EXCC 0x1c028 | ||
59 | |||
60 | #define _REG_701C0(pipe, plane) (0x701c0 + pipe * 0x1000 + (plane - 1) * 0x100) | 57 | #define _REG_701C0(pipe, plane) (0x701c0 + pipe * 0x1000 + (plane - 1) * 0x100) |
61 | #define _REG_701C4(pipe, plane) (0x701c4 + pipe * 0x1000 + (plane - 1) * 0x100) | 58 | #define _REG_701C4(pipe, plane) (0x701c4 + pipe * 0x1000 + (plane - 1) * 0x100) |
62 | 59 | ||
diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c index 436377da41ba..03532dfc0cd5 100644 --- a/drivers/gpu/drm/i915/gvt/sched_policy.c +++ b/drivers/gpu/drm/i915/gvt/sched_policy.c | |||
@@ -308,20 +308,8 @@ static int tbs_sched_init_vgpu(struct intel_vgpu *vgpu) | |||
308 | 308 | ||
309 | static void tbs_sched_clean_vgpu(struct intel_vgpu *vgpu) | 309 | static void tbs_sched_clean_vgpu(struct intel_vgpu *vgpu) |
310 | { | 310 | { |
311 | struct intel_gvt_workload_scheduler *scheduler = &vgpu->gvt->scheduler; | ||
312 | int ring_id; | ||
313 | |||
314 | kfree(vgpu->sched_data); | 311 | kfree(vgpu->sched_data); |
315 | vgpu->sched_data = NULL; | 312 | vgpu->sched_data = NULL; |
316 | |||
317 | spin_lock_bh(&scheduler->mmio_context_lock); | ||
318 | for (ring_id = 0; ring_id < I915_NUM_ENGINES; ring_id++) { | ||
319 | if (scheduler->engine_owner[ring_id] == vgpu) { | ||
320 | intel_gvt_switch_mmio(vgpu, NULL, ring_id); | ||
321 | scheduler->engine_owner[ring_id] = NULL; | ||
322 | } | ||
323 | } | ||
324 | spin_unlock_bh(&scheduler->mmio_context_lock); | ||
325 | } | 313 | } |
326 | 314 | ||
327 | static void tbs_sched_start_schedule(struct intel_vgpu *vgpu) | 315 | static void tbs_sched_start_schedule(struct intel_vgpu *vgpu) |
@@ -388,6 +376,7 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu) | |||
388 | { | 376 | { |
389 | struct intel_gvt_workload_scheduler *scheduler = | 377 | struct intel_gvt_workload_scheduler *scheduler = |
390 | &vgpu->gvt->scheduler; | 378 | &vgpu->gvt->scheduler; |
379 | int ring_id; | ||
391 | 380 | ||
392 | gvt_dbg_core("vgpu%d: stop schedule\n", vgpu->id); | 381 | gvt_dbg_core("vgpu%d: stop schedule\n", vgpu->id); |
393 | 382 | ||
@@ -401,4 +390,13 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu) | |||
401 | scheduler->need_reschedule = true; | 390 | scheduler->need_reschedule = true; |
402 | scheduler->current_vgpu = NULL; | 391 | scheduler->current_vgpu = NULL; |
403 | } | 392 | } |
393 | |||
394 | spin_lock_bh(&scheduler->mmio_context_lock); | ||
395 | for (ring_id = 0; ring_id < I915_NUM_ENGINES; ring_id++) { | ||
396 | if (scheduler->engine_owner[ring_id] == vgpu) { | ||
397 | intel_gvt_switch_mmio(vgpu, NULL, ring_id); | ||
398 | scheduler->engine_owner[ring_id] = NULL; | ||
399 | } | ||
400 | } | ||
401 | spin_unlock_bh(&scheduler->mmio_context_lock); | ||
404 | } | 402 | } |
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.h b/drivers/gpu/drm/i915/gvt/scheduler.h index f36b85fd6d01..2d694f6c0907 100644 --- a/drivers/gpu/drm/i915/gvt/scheduler.h +++ b/drivers/gpu/drm/i915/gvt/scheduler.h | |||
@@ -68,6 +68,7 @@ struct shadow_indirect_ctx { | |||
68 | struct shadow_per_ctx { | 68 | struct shadow_per_ctx { |
69 | unsigned long guest_gma; | 69 | unsigned long guest_gma; |
70 | unsigned long shadow_gma; | 70 | unsigned long shadow_gma; |
71 | unsigned valid; | ||
71 | }; | 72 | }; |
72 | 73 | ||
73 | struct intel_shadow_wa_ctx { | 74 | struct intel_shadow_wa_ctx { |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 20fcac37c85a..49762bc21ed6 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -2718,6 +2718,9 @@ i915_gem_object_pwrite_gtt(struct drm_i915_gem_object *obj, | |||
2718 | if (READ_ONCE(obj->mm.pages)) | 2718 | if (READ_ONCE(obj->mm.pages)) |
2719 | return -ENODEV; | 2719 | return -ENODEV; |
2720 | 2720 | ||
2721 | if (obj->mm.madv != I915_MADV_WILLNEED) | ||
2722 | return -EFAULT; | ||
2723 | |||
2721 | /* Before the pages are instantiated the object is treated as being | 2724 | /* Before the pages are instantiated the object is treated as being |
2722 | * in the CPU domain. The pages will be clflushed as required before | 2725 | * in the CPU domain. The pages will be clflushed as required before |
2723 | * use, and we can freely write into the pages directly. If userspace | 2726 | * use, and we can freely write into the pages directly. If userspace |
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c index a5a5b7e6daae..ee4811ffb7aa 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c | |||
@@ -33,21 +33,20 @@ | |||
33 | #include "intel_drv.h" | 33 | #include "intel_drv.h" |
34 | #include "i915_trace.h" | 34 | #include "i915_trace.h" |
35 | 35 | ||
36 | static bool ggtt_is_idle(struct drm_i915_private *dev_priv) | 36 | static bool ggtt_is_idle(struct drm_i915_private *i915) |
37 | { | 37 | { |
38 | struct i915_ggtt *ggtt = &dev_priv->ggtt; | 38 | struct intel_engine_cs *engine; |
39 | struct intel_engine_cs *engine; | 39 | enum intel_engine_id id; |
40 | enum intel_engine_id id; | ||
41 | 40 | ||
42 | for_each_engine(engine, dev_priv, id) { | 41 | if (i915->gt.active_requests) |
43 | struct intel_timeline *tl; | 42 | return false; |
44 | 43 | ||
45 | tl = &ggtt->base.timeline.engine[engine->id]; | 44 | for_each_engine(engine, i915, id) { |
46 | if (i915_gem_active_isset(&tl->last_request)) | 45 | if (engine->last_retired_context != i915->kernel_context) |
47 | return false; | 46 | return false; |
48 | } | 47 | } |
49 | 48 | ||
50 | return true; | 49 | return true; |
51 | } | 50 | } |
52 | 51 | ||
53 | static int ggtt_flush(struct drm_i915_private *i915) | 52 | static int ggtt_flush(struct drm_i915_private *i915) |
@@ -157,7 +156,8 @@ i915_gem_evict_something(struct i915_address_space *vm, | |||
157 | min_size, alignment, cache_level, | 156 | min_size, alignment, cache_level, |
158 | start, end, mode); | 157 | start, end, mode); |
159 | 158 | ||
160 | /* Retire before we search the active list. Although we have | 159 | /* |
160 | * Retire before we search the active list. Although we have | ||
161 | * reasonable accuracy in our retirement lists, we may have | 161 | * reasonable accuracy in our retirement lists, we may have |
162 | * a stray pin (preventing eviction) that can only be resolved by | 162 | * a stray pin (preventing eviction) that can only be resolved by |
163 | * retiring. | 163 | * retiring. |
@@ -182,7 +182,8 @@ search_again: | |||
182 | BUG_ON(ret); | 182 | BUG_ON(ret); |
183 | } | 183 | } |
184 | 184 | ||
185 | /* Can we unpin some objects such as idle hw contents, | 185 | /* |
186 | * Can we unpin some objects such as idle hw contents, | ||
186 | * or pending flips? But since only the GGTT has global entries | 187 | * or pending flips? But since only the GGTT has global entries |
187 | * such as scanouts, rinbuffers and contexts, we can skip the | 188 | * such as scanouts, rinbuffers and contexts, we can skip the |
188 | * purge when inspecting per-process local address spaces. | 189 | * purge when inspecting per-process local address spaces. |
@@ -190,19 +191,33 @@ search_again: | |||
190 | if (!i915_is_ggtt(vm) || flags & PIN_NONBLOCK) | 191 | if (!i915_is_ggtt(vm) || flags & PIN_NONBLOCK) |
191 | return -ENOSPC; | 192 | return -ENOSPC; |
192 | 193 | ||
193 | if (ggtt_is_idle(dev_priv)) { | 194 | /* |
194 | /* If we still have pending pageflip completions, drop | 195 | * Not everything in the GGTT is tracked via VMA using |
195 | * back to userspace to give our workqueues time to | 196 | * i915_vma_move_to_active(), otherwise we could evict as required |
196 | * acquire our locks and unpin the old scanouts. | 197 | * with minimal stalling. Instead we are forced to idle the GPU and |
197 | */ | 198 | * explicitly retire outstanding requests which will then remove |
198 | return intel_has_pending_fb_unpin(dev_priv) ? -EAGAIN : -ENOSPC; | 199 | * the pinning for active objects such as contexts and ring, |
199 | } | 200 | * enabling us to evict them on the next iteration. |
201 | * | ||
202 | * To ensure that all user contexts are evictable, we perform | ||
203 | * a switch to the perma-pinned kernel context. This all also gives | ||
204 | * us a termination condition, when the last retired context is | ||
205 | * the kernel's there is no more we can evict. | ||
206 | */ | ||
207 | if (!ggtt_is_idle(dev_priv)) { | ||
208 | ret = ggtt_flush(dev_priv); | ||
209 | if (ret) | ||
210 | return ret; | ||
200 | 211 | ||
201 | ret = ggtt_flush(dev_priv); | 212 | goto search_again; |
202 | if (ret) | 213 | } |
203 | return ret; | ||
204 | 214 | ||
205 | goto search_again; | 215 | /* |
216 | * If we still have pending pageflip completions, drop | ||
217 | * back to userspace to give our workqueues time to | ||
218 | * acquire our locks and unpin the old scanouts. | ||
219 | */ | ||
220 | return intel_has_pending_fb_unpin(dev_priv) ? -EAGAIN : -ENOSPC; | ||
206 | 221 | ||
207 | found: | 222 | found: |
208 | /* drm_mm doesn't allow any other other operations while | 223 | /* drm_mm doesn't allow any other other operations while |
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c index 1383a2995a69..59ee808f8fd9 100644 --- a/drivers/gpu/drm/i915/i915_perf.c +++ b/drivers/gpu/drm/i915/i915_perf.c | |||
@@ -2537,6 +2537,10 @@ static const struct file_operations fops = { | |||
2537 | .poll = i915_perf_poll, | 2537 | .poll = i915_perf_poll, |
2538 | .read = i915_perf_read, | 2538 | .read = i915_perf_read, |
2539 | .unlocked_ioctl = i915_perf_ioctl, | 2539 | .unlocked_ioctl = i915_perf_ioctl, |
2540 | /* Our ioctl have no arguments, so it's safe to use the same function | ||
2541 | * to handle 32bits compatibility. | ||
2542 | */ | ||
2543 | .compat_ioctl = i915_perf_ioctl, | ||
2540 | }; | 2544 | }; |
2541 | 2545 | ||
2542 | 2546 | ||
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index d2d0a83c09b6..628ccd9181bb 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -7041,6 +7041,7 @@ enum { | |||
7041 | */ | 7041 | */ |
7042 | #define L3_GENERAL_PRIO_CREDITS(x) (((x) >> 1) << 19) | 7042 | #define L3_GENERAL_PRIO_CREDITS(x) (((x) >> 1) << 19) |
7043 | #define L3_HIGH_PRIO_CREDITS(x) (((x) >> 1) << 14) | 7043 | #define L3_HIGH_PRIO_CREDITS(x) (((x) >> 1) << 14) |
7044 | #define L3_PRIO_CREDITS_MASK ((0x1f << 19) | (0x1f << 14)) | ||
7044 | 7045 | ||
7045 | #define GEN7_L3CNTLREG1 _MMIO(0xB01C) | 7046 | #define GEN7_L3CNTLREG1 _MMIO(0xB01C) |
7046 | #define GEN7_WA_FOR_GEN7_L3_CONTROL 0x3C47FF8C | 7047 | #define GEN7_WA_FOR_GEN7_L3_CONTROL 0x3C47FF8C |
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 9d5b42953436..e809a9c347d3 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
@@ -1131,6 +1131,13 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, | |||
1131 | is_hdmi = false; | 1131 | is_hdmi = false; |
1132 | } | 1132 | } |
1133 | 1133 | ||
1134 | if (port == PORT_A && is_dvi) { | ||
1135 | DRM_DEBUG_KMS("VBT claims port A supports DVI%s, ignoring\n", | ||
1136 | is_hdmi ? "/HDMI" : ""); | ||
1137 | is_dvi = false; | ||
1138 | is_hdmi = false; | ||
1139 | } | ||
1140 | |||
1134 | info->supports_dvi = is_dvi; | 1141 | info->supports_dvi = is_dvi; |
1135 | info->supports_hdmi = is_hdmi; | 1142 | info->supports_hdmi = is_hdmi; |
1136 | info->supports_dp = is_dp; | 1143 | info->supports_dp = is_dp; |
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index b307b6fe1ce3..4da7f5c745b6 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
@@ -734,8 +734,8 @@ intel_ddi_get_buf_trans_fdi(struct drm_i915_private *dev_priv, | |||
734 | int *n_entries) | 734 | int *n_entries) |
735 | { | 735 | { |
736 | if (IS_BROADWELL(dev_priv)) { | 736 | if (IS_BROADWELL(dev_priv)) { |
737 | *n_entries = ARRAY_SIZE(hsw_ddi_translations_fdi); | 737 | *n_entries = ARRAY_SIZE(bdw_ddi_translations_fdi); |
738 | return hsw_ddi_translations_fdi; | 738 | return bdw_ddi_translations_fdi; |
739 | } else if (IS_HASWELL(dev_priv)) { | 739 | } else if (IS_HASWELL(dev_priv)) { |
740 | *n_entries = ARRAY_SIZE(hsw_ddi_translations_fdi); | 740 | *n_entries = ARRAY_SIZE(hsw_ddi_translations_fdi); |
741 | return hsw_ddi_translations_fdi; | 741 | return hsw_ddi_translations_fdi; |
@@ -2122,8 +2122,7 @@ static void intel_ddi_clk_select(struct intel_encoder *encoder, | |||
2122 | * register writes. | 2122 | * register writes. |
2123 | */ | 2123 | */ |
2124 | val = I915_READ(DPCLKA_CFGCR0); | 2124 | val = I915_READ(DPCLKA_CFGCR0); |
2125 | val &= ~(DPCLKA_CFGCR0_DDI_CLK_OFF(port) | | 2125 | val &= ~DPCLKA_CFGCR0_DDI_CLK_OFF(port); |
2126 | DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port)); | ||
2127 | I915_WRITE(DPCLKA_CFGCR0, val); | 2126 | I915_WRITE(DPCLKA_CFGCR0, val); |
2128 | } else if (IS_GEN9_BC(dev_priv)) { | 2127 | } else if (IS_GEN9_BC(dev_priv)) { |
2129 | /* DDI -> PLL mapping */ | 2128 | /* DDI -> PLL mapping */ |
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c index a2a3d93d67bd..df808a94c511 100644 --- a/drivers/gpu/drm/i915/intel_dpll_mgr.c +++ b/drivers/gpu/drm/i915/intel_dpll_mgr.c | |||
@@ -1996,7 +1996,7 @@ static void cnl_ddi_pll_enable(struct drm_i915_private *dev_priv, | |||
1996 | 1996 | ||
1997 | /* 3. Configure DPLL_CFGCR0 */ | 1997 | /* 3. Configure DPLL_CFGCR0 */ |
1998 | /* Avoid touch CFGCR1 if HDMI mode is not enabled */ | 1998 | /* Avoid touch CFGCR1 if HDMI mode is not enabled */ |
1999 | if (pll->state.hw_state.cfgcr0 & DPLL_CTRL1_HDMI_MODE(pll->id)) { | 1999 | if (pll->state.hw_state.cfgcr0 & DPLL_CFGCR0_HDMI_MODE) { |
2000 | val = pll->state.hw_state.cfgcr1; | 2000 | val = pll->state.hw_state.cfgcr1; |
2001 | I915_WRITE(CNL_DPLL_CFGCR1(pll->id), val); | 2001 | I915_WRITE(CNL_DPLL_CFGCR1(pll->id), val); |
2002 | /* 4. Reab back to ensure writes completed */ | 2002 | /* 4. Reab back to ensure writes completed */ |
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c index a59b2a30ff5a..40e439ca3eb3 100644 --- a/drivers/gpu/drm/i915/intel_engine_cs.c +++ b/drivers/gpu/drm/i915/intel_engine_cs.c | |||
@@ -1252,9 +1252,12 @@ static int bxt_init_workarounds(struct intel_engine_cs *engine) | |||
1252 | } | 1252 | } |
1253 | 1253 | ||
1254 | /* WaProgramL3SqcReg1DefaultForPerf:bxt */ | 1254 | /* WaProgramL3SqcReg1DefaultForPerf:bxt */ |
1255 | if (IS_BXT_REVID(dev_priv, BXT_REVID_B0, REVID_FOREVER)) | 1255 | if (IS_BXT_REVID(dev_priv, BXT_REVID_B0, REVID_FOREVER)) { |
1256 | I915_WRITE(GEN8_L3SQCREG1, L3_GENERAL_PRIO_CREDITS(62) | | 1256 | u32 val = I915_READ(GEN8_L3SQCREG1); |
1257 | L3_HIGH_PRIO_CREDITS(2)); | 1257 | val &= ~L3_PRIO_CREDITS_MASK; |
1258 | val |= L3_GENERAL_PRIO_CREDITS(62) | L3_HIGH_PRIO_CREDITS(2); | ||
1259 | I915_WRITE(GEN8_L3SQCREG1, val); | ||
1260 | } | ||
1258 | 1261 | ||
1259 | /* WaToEnableHwFixForPushConstHWBug:bxt */ | 1262 | /* WaToEnableHwFixForPushConstHWBug:bxt */ |
1260 | if (IS_BXT_REVID(dev_priv, BXT_REVID_C0, REVID_FOREVER)) | 1263 | if (IS_BXT_REVID(dev_priv, BXT_REVID_C0, REVID_FOREVER)) |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 2fcff9788b6f..985b59770eec 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -8477,14 +8477,17 @@ static void gen8_set_l3sqc_credits(struct drm_i915_private *dev_priv, | |||
8477 | int high_prio_credits) | 8477 | int high_prio_credits) |
8478 | { | 8478 | { |
8479 | u32 misccpctl; | 8479 | u32 misccpctl; |
8480 | u32 val; | ||
8480 | 8481 | ||
8481 | /* WaTempDisableDOPClkGating:bdw */ | 8482 | /* WaTempDisableDOPClkGating:bdw */ |
8482 | misccpctl = I915_READ(GEN7_MISCCPCTL); | 8483 | misccpctl = I915_READ(GEN7_MISCCPCTL); |
8483 | I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE); | 8484 | I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE); |
8484 | 8485 | ||
8485 | I915_WRITE(GEN8_L3SQCREG1, | 8486 | val = I915_READ(GEN8_L3SQCREG1); |
8486 | L3_GENERAL_PRIO_CREDITS(general_prio_credits) | | 8487 | val &= ~L3_PRIO_CREDITS_MASK; |
8487 | L3_HIGH_PRIO_CREDITS(high_prio_credits)); | 8488 | val |= L3_GENERAL_PRIO_CREDITS(general_prio_credits); |
8489 | val |= L3_HIGH_PRIO_CREDITS(high_prio_credits); | ||
8490 | I915_WRITE(GEN8_L3SQCREG1, val); | ||
8488 | 8491 | ||
8489 | /* | 8492 | /* |
8490 | * Wait at least 100 clocks before re-enabling clock gating. | 8493 | * Wait at least 100 clocks before re-enabling clock gating. |
diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c index 50d437568d43..0f7324a686ca 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_host.c +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c | |||
@@ -248,7 +248,7 @@ disable_clks: | |||
248 | clk_disable_unprepare(ahb_clk); | 248 | clk_disable_unprepare(ahb_clk); |
249 | disable_gdsc: | 249 | disable_gdsc: |
250 | regulator_disable(gdsc_reg); | 250 | regulator_disable(gdsc_reg); |
251 | pm_runtime_put_autosuspend(dev); | 251 | pm_runtime_put_sync(dev); |
252 | put_clk: | 252 | put_clk: |
253 | clk_put(ahb_clk); | 253 | clk_put(ahb_clk); |
254 | put_gdsc: | 254 | put_gdsc: |
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c index c2bdad88447e..824067d2d427 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c | |||
@@ -83,6 +83,8 @@ const struct mdp5_cfg_hw msm8x74v1_config = { | |||
83 | .caps = MDP_LM_CAP_WB }, | 83 | .caps = MDP_LM_CAP_WB }, |
84 | }, | 84 | }, |
85 | .nb_stages = 5, | 85 | .nb_stages = 5, |
86 | .max_width = 2048, | ||
87 | .max_height = 0xFFFF, | ||
86 | }, | 88 | }, |
87 | .dspp = { | 89 | .dspp = { |
88 | .count = 3, | 90 | .count = 3, |
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c index 6f84796c5abc..e414850dbbda 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | |||
@@ -873,8 +873,6 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc, | |||
873 | 873 | ||
874 | spin_unlock_irqrestore(&mdp5_crtc->cursor.lock, flags); | 874 | spin_unlock_irqrestore(&mdp5_crtc->cursor.lock, flags); |
875 | 875 | ||
876 | pm_runtime_put_autosuspend(&pdev->dev); | ||
877 | |||
878 | set_cursor: | 876 | set_cursor: |
879 | ret = mdp5_ctl_set_cursor(ctl, pipeline, 0, cursor_enable); | 877 | ret = mdp5_ctl_set_cursor(ctl, pipeline, 0, cursor_enable); |
880 | if (ret) { | 878 | if (ret) { |
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 0776160a6924..81fe6d6740ce 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c | |||
@@ -1052,10 +1052,10 @@ static void *_msm_gem_kernel_new(struct drm_device *dev, uint32_t size, | |||
1052 | } | 1052 | } |
1053 | 1053 | ||
1054 | vaddr = msm_gem_get_vaddr(obj); | 1054 | vaddr = msm_gem_get_vaddr(obj); |
1055 | if (!vaddr) { | 1055 | if (IS_ERR(vaddr)) { |
1056 | msm_gem_put_iova(obj, aspace); | 1056 | msm_gem_put_iova(obj, aspace); |
1057 | drm_gem_object_unreference(obj); | 1057 | drm_gem_object_unreference(obj); |
1058 | return ERR_PTR(-ENOMEM); | 1058 | return ERR_CAST(vaddr); |
1059 | } | 1059 | } |
1060 | 1060 | ||
1061 | if (bo) | 1061 | if (bo) |
diff --git a/drivers/gpu/drm/msm/msm_rd.c b/drivers/gpu/drm/msm/msm_rd.c index 96d678b582d9..3aa8a8576abe 100644 --- a/drivers/gpu/drm/msm/msm_rd.c +++ b/drivers/gpu/drm/msm/msm_rd.c | |||
@@ -117,10 +117,14 @@ static void rd_write(struct msm_rd_state *rd, const void *buf, int sz) | |||
117 | 117 | ||
118 | wait_event(rd->fifo_event, circ_space(&rd->fifo) > 0); | 118 | wait_event(rd->fifo_event, circ_space(&rd->fifo) > 0); |
119 | 119 | ||
120 | /* Note that smp_load_acquire() is not strictly required | ||
121 | * as CIRC_SPACE_TO_END() does not access the tail more | ||
122 | * than once. | ||
123 | */ | ||
120 | n = min(sz, circ_space_to_end(&rd->fifo)); | 124 | n = min(sz, circ_space_to_end(&rd->fifo)); |
121 | memcpy(fptr, ptr, n); | 125 | memcpy(fptr, ptr, n); |
122 | 126 | ||
123 | fifo->head = (fifo->head + n) & (BUF_SZ - 1); | 127 | smp_store_release(&fifo->head, (fifo->head + n) & (BUF_SZ - 1)); |
124 | sz -= n; | 128 | sz -= n; |
125 | ptr += n; | 129 | ptr += n; |
126 | 130 | ||
@@ -151,13 +155,17 @@ static ssize_t rd_read(struct file *file, char __user *buf, | |||
151 | if (ret) | 155 | if (ret) |
152 | goto out; | 156 | goto out; |
153 | 157 | ||
158 | /* Note that smp_load_acquire() is not strictly required | ||
159 | * as CIRC_CNT_TO_END() does not access the head more than | ||
160 | * once. | ||
161 | */ | ||
154 | n = min_t(int, sz, circ_count_to_end(&rd->fifo)); | 162 | n = min_t(int, sz, circ_count_to_end(&rd->fifo)); |
155 | if (copy_to_user(buf, fptr, n)) { | 163 | if (copy_to_user(buf, fptr, n)) { |
156 | ret = -EFAULT; | 164 | ret = -EFAULT; |
157 | goto out; | 165 | goto out; |
158 | } | 166 | } |
159 | 167 | ||
160 | fifo->tail = (fifo->tail + n) & (BUF_SZ - 1); | 168 | smp_store_release(&fifo->tail, (fifo->tail + n) & (BUF_SZ - 1)); |
161 | *ppos += n; | 169 | *ppos += n; |
162 | 170 | ||
163 | wake_up_all(&rd->fifo_event); | 171 | wake_up_all(&rd->fifo_event); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c index f7707849bb53..2b12d82aac15 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | |||
@@ -223,7 +223,7 @@ void | |||
223 | nouveau_fbcon_accel_save_disable(struct drm_device *dev) | 223 | nouveau_fbcon_accel_save_disable(struct drm_device *dev) |
224 | { | 224 | { |
225 | struct nouveau_drm *drm = nouveau_drm(dev); | 225 | struct nouveau_drm *drm = nouveau_drm(dev); |
226 | if (drm->fbcon) { | 226 | if (drm->fbcon && drm->fbcon->helper.fbdev) { |
227 | drm->fbcon->saved_flags = drm->fbcon->helper.fbdev->flags; | 227 | drm->fbcon->saved_flags = drm->fbcon->helper.fbdev->flags; |
228 | drm->fbcon->helper.fbdev->flags |= FBINFO_HWACCEL_DISABLED; | 228 | drm->fbcon->helper.fbdev->flags |= FBINFO_HWACCEL_DISABLED; |
229 | } | 229 | } |
@@ -233,7 +233,7 @@ void | |||
233 | nouveau_fbcon_accel_restore(struct drm_device *dev) | 233 | nouveau_fbcon_accel_restore(struct drm_device *dev) |
234 | { | 234 | { |
235 | struct nouveau_drm *drm = nouveau_drm(dev); | 235 | struct nouveau_drm *drm = nouveau_drm(dev); |
236 | if (drm->fbcon) { | 236 | if (drm->fbcon && drm->fbcon->helper.fbdev) { |
237 | drm->fbcon->helper.fbdev->flags = drm->fbcon->saved_flags; | 237 | drm->fbcon->helper.fbdev->flags = drm->fbcon->saved_flags; |
238 | } | 238 | } |
239 | } | 239 | } |
@@ -245,7 +245,8 @@ nouveau_fbcon_accel_fini(struct drm_device *dev) | |||
245 | struct nouveau_fbdev *fbcon = drm->fbcon; | 245 | struct nouveau_fbdev *fbcon = drm->fbcon; |
246 | if (fbcon && drm->channel) { | 246 | if (fbcon && drm->channel) { |
247 | console_lock(); | 247 | console_lock(); |
248 | fbcon->helper.fbdev->flags |= FBINFO_HWACCEL_DISABLED; | 248 | if (fbcon->helper.fbdev) |
249 | fbcon->helper.fbdev->flags |= FBINFO_HWACCEL_DISABLED; | ||
249 | console_unlock(); | 250 | console_unlock(); |
250 | nouveau_channel_idle(drm->channel); | 251 | nouveau_channel_idle(drm->channel); |
251 | nvif_object_fini(&fbcon->twod); | 252 | nvif_object_fini(&fbcon->twod); |
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index 2dbf62a2ac41..e4751f92b342 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
@@ -3265,11 +3265,14 @@ nv50_mstm = { | |||
3265 | void | 3265 | void |
3266 | nv50_mstm_service(struct nv50_mstm *mstm) | 3266 | nv50_mstm_service(struct nv50_mstm *mstm) |
3267 | { | 3267 | { |
3268 | struct drm_dp_aux *aux = mstm->mgr.aux; | 3268 | struct drm_dp_aux *aux = mstm ? mstm->mgr.aux : NULL; |
3269 | bool handled = true; | 3269 | bool handled = true; |
3270 | int ret; | 3270 | int ret; |
3271 | u8 esi[8] = {}; | 3271 | u8 esi[8] = {}; |
3272 | 3272 | ||
3273 | if (!aux) | ||
3274 | return; | ||
3275 | |||
3273 | while (handled) { | 3276 | while (handled) { |
3274 | ret = drm_dp_dpcd_read(aux, DP_SINK_COUNT_ESI, esi, 8); | 3277 | ret = drm_dp_dpcd_read(aux, DP_SINK_COUNT_ESI, esi, 8); |
3275 | if (ret != 8) { | 3278 | if (ret != 8) { |
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c b/drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c index 8e2e24a74774..44e116f7880d 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c | |||
@@ -39,5 +39,5 @@ int | |||
39 | g84_bsp_new(struct nvkm_device *device, int index, struct nvkm_engine **pengine) | 39 | g84_bsp_new(struct nvkm_device *device, int index, struct nvkm_engine **pengine) |
40 | { | 40 | { |
41 | return nvkm_xtensa_new_(&g84_bsp, device, index, | 41 | return nvkm_xtensa_new_(&g84_bsp, device, index, |
42 | true, 0x103000, pengine); | 42 | device->chipset != 0x92, 0x103000, pengine); |
43 | } | 43 | } |
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c index d06ad2c372bf..455da298227f 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c | |||
@@ -241,6 +241,8 @@ nvkm_vm_unmap_pgt(struct nvkm_vm *vm, int big, u32 fpde, u32 lpde) | |||
241 | mmu->func->map_pgt(vpgd->obj, pde, vpgt->mem); | 241 | mmu->func->map_pgt(vpgd->obj, pde, vpgt->mem); |
242 | } | 242 | } |
243 | 243 | ||
244 | mmu->func->flush(vm); | ||
245 | |||
244 | nvkm_memory_del(&pgt); | 246 | nvkm_memory_del(&pgt); |
245 | } | 247 | } |
246 | } | 248 | } |
diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c index 6a573d21d3cc..658fa2d3e40c 100644 --- a/drivers/gpu/ipu-v3/ipu-common.c +++ b/drivers/gpu/ipu-v3/ipu-common.c | |||
@@ -405,6 +405,14 @@ int ipu_idmac_lock_enable(struct ipuv3_channel *channel, int num_bursts) | |||
405 | return -EINVAL; | 405 | return -EINVAL; |
406 | } | 406 | } |
407 | 407 | ||
408 | /* | ||
409 | * IPUv3EX / i.MX51 has a different register layout, and on IPUv3M / | ||
410 | * i.MX53 channel arbitration locking doesn't seem to work properly. | ||
411 | * Allow enabling the lock feature on IPUv3H / i.MX6 only. | ||
412 | */ | ||
413 | if (bursts && ipu->ipu_type != IPUV3H) | ||
414 | return -EINVAL; | ||
415 | |||
408 | for (i = 0; i < ARRAY_SIZE(idmac_lock_en_info); i++) { | 416 | for (i = 0; i < ARRAY_SIZE(idmac_lock_en_info); i++) { |
409 | if (channel->num == idmac_lock_en_info[i].chnum) | 417 | if (channel->num == idmac_lock_en_info[i].chnum) |
410 | break; | 418 | break; |
diff --git a/drivers/gpu/ipu-v3/ipu-pre.c b/drivers/gpu/ipu-v3/ipu-pre.c index c35f74c83065..c860a7997cb5 100644 --- a/drivers/gpu/ipu-v3/ipu-pre.c +++ b/drivers/gpu/ipu-v3/ipu-pre.c | |||
@@ -73,6 +73,14 @@ | |||
73 | #define IPU_PRE_STORE_ENG_CTRL_WR_NUM_BYTES(v) ((v & 0x7) << 1) | 73 | #define IPU_PRE_STORE_ENG_CTRL_WR_NUM_BYTES(v) ((v & 0x7) << 1) |
74 | #define IPU_PRE_STORE_ENG_CTRL_OUTPUT_ACTIVE_BPP(v) ((v & 0x3) << 4) | 74 | #define IPU_PRE_STORE_ENG_CTRL_OUTPUT_ACTIVE_BPP(v) ((v & 0x3) << 4) |
75 | 75 | ||
76 | #define IPU_PRE_STORE_ENG_STATUS 0x120 | ||
77 | #define IPU_PRE_STORE_ENG_STATUS_STORE_BLOCK_X_MASK 0xffff | ||
78 | #define IPU_PRE_STORE_ENG_STATUS_STORE_BLOCK_X_SHIFT 0 | ||
79 | #define IPU_PRE_STORE_ENG_STATUS_STORE_BLOCK_Y_MASK 0x3fff | ||
80 | #define IPU_PRE_STORE_ENG_STATUS_STORE_BLOCK_Y_SHIFT 16 | ||
81 | #define IPU_PRE_STORE_ENG_STATUS_STORE_FIFO_FULL (1 << 30) | ||
82 | #define IPU_PRE_STORE_ENG_STATUS_STORE_FIELD (1 << 31) | ||
83 | |||
76 | #define IPU_PRE_STORE_ENG_SIZE 0x130 | 84 | #define IPU_PRE_STORE_ENG_SIZE 0x130 |
77 | #define IPU_PRE_STORE_ENG_SIZE_INPUT_WIDTH(v) ((v & 0xffff) << 0) | 85 | #define IPU_PRE_STORE_ENG_SIZE_INPUT_WIDTH(v) ((v & 0xffff) << 0) |
78 | #define IPU_PRE_STORE_ENG_SIZE_INPUT_HEIGHT(v) ((v & 0xffff) << 16) | 86 | #define IPU_PRE_STORE_ENG_SIZE_INPUT_HEIGHT(v) ((v & 0xffff) << 16) |
@@ -93,6 +101,7 @@ struct ipu_pre { | |||
93 | dma_addr_t buffer_paddr; | 101 | dma_addr_t buffer_paddr; |
94 | void *buffer_virt; | 102 | void *buffer_virt; |
95 | bool in_use; | 103 | bool in_use; |
104 | unsigned int safe_window_end; | ||
96 | }; | 105 | }; |
97 | 106 | ||
98 | static DEFINE_MUTEX(ipu_pre_list_mutex); | 107 | static DEFINE_MUTEX(ipu_pre_list_mutex); |
@@ -160,6 +169,9 @@ void ipu_pre_configure(struct ipu_pre *pre, unsigned int width, | |||
160 | u32 active_bpp = info->cpp[0] >> 1; | 169 | u32 active_bpp = info->cpp[0] >> 1; |
161 | u32 val; | 170 | u32 val; |
162 | 171 | ||
172 | /* calculate safe window for ctrl register updates */ | ||
173 | pre->safe_window_end = height - 2; | ||
174 | |||
163 | writel(bufaddr, pre->regs + IPU_PRE_CUR_BUF); | 175 | writel(bufaddr, pre->regs + IPU_PRE_CUR_BUF); |
164 | writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF); | 176 | writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF); |
165 | 177 | ||
@@ -199,7 +211,24 @@ void ipu_pre_configure(struct ipu_pre *pre, unsigned int width, | |||
199 | 211 | ||
200 | void ipu_pre_update(struct ipu_pre *pre, unsigned int bufaddr) | 212 | void ipu_pre_update(struct ipu_pre *pre, unsigned int bufaddr) |
201 | { | 213 | { |
214 | unsigned long timeout = jiffies + msecs_to_jiffies(5); | ||
215 | unsigned short current_yblock; | ||
216 | u32 val; | ||
217 | |||
202 | writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF); | 218 | writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF); |
219 | |||
220 | do { | ||
221 | if (time_after(jiffies, timeout)) { | ||
222 | dev_warn(pre->dev, "timeout waiting for PRE safe window\n"); | ||
223 | return; | ||
224 | } | ||
225 | |||
226 | val = readl(pre->regs + IPU_PRE_STORE_ENG_STATUS); | ||
227 | current_yblock = | ||
228 | (val >> IPU_PRE_STORE_ENG_STATUS_STORE_BLOCK_Y_SHIFT) & | ||
229 | IPU_PRE_STORE_ENG_STATUS_STORE_BLOCK_Y_MASK; | ||
230 | } while (current_yblock == 0 || current_yblock >= pre->safe_window_end); | ||
231 | |||
203 | writel(IPU_PRE_CTRL_SDW_UPDATE, pre->regs + IPU_PRE_CTRL_SET); | 232 | writel(IPU_PRE_CTRL_SDW_UPDATE, pre->regs + IPU_PRE_CTRL_SET); |
204 | } | 233 | } |
205 | 234 | ||
diff --git a/drivers/gpu/ipu-v3/ipu-prg.c b/drivers/gpu/ipu-v3/ipu-prg.c index ecc9ea44dc50..0013ca9f72c8 100644 --- a/drivers/gpu/ipu-v3/ipu-prg.c +++ b/drivers/gpu/ipu-v3/ipu-prg.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <drm/drm_fourcc.h> | 14 | #include <drm/drm_fourcc.h> |
15 | #include <linux/clk.h> | 15 | #include <linux/clk.h> |
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <linux/iopoll.h> | ||
17 | #include <linux/mfd/syscon.h> | 18 | #include <linux/mfd/syscon.h> |
18 | #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> | 19 | #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> |
19 | #include <linux/module.h> | 20 | #include <linux/module.h> |
@@ -329,6 +330,12 @@ int ipu_prg_channel_configure(struct ipuv3_channel *ipu_chan, | |||
329 | val = IPU_PRG_REG_UPDATE_REG_UPDATE; | 330 | val = IPU_PRG_REG_UPDATE_REG_UPDATE; |
330 | writel(val, prg->regs + IPU_PRG_REG_UPDATE); | 331 | writel(val, prg->regs + IPU_PRG_REG_UPDATE); |
331 | 332 | ||
333 | /* wait for both double buffers to be filled */ | ||
334 | readl_poll_timeout(prg->regs + IPU_PRG_STATUS, val, | ||
335 | (val & IPU_PRG_STATUS_BUFFER0_READY(prg_chan)) && | ||
336 | (val & IPU_PRG_STATUS_BUFFER1_READY(prg_chan)), | ||
337 | 5, 1000); | ||
338 | |||
332 | clk_disable_unprepare(prg->clk_ipg); | 339 | clk_disable_unprepare(prg->clk_ipg); |
333 | 340 | ||
334 | chan->enabled = true; | 341 | chan->enabled = true; |