aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-07-16 13:20:43 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-07-16 13:20:43 -0400
commit706bf68b4339adf57cf7325561fddd8a3b41fa8e (patch)
tree11c8b520d505d88b6e77e13030c6c384342be6a9
parentd1b47a7c9efcf3c3384b70f6e3c8f1423b44d8c7 (diff)
parentbf642e3a1996f1ed8f083c5ecd4b51270a9e11bc (diff)
Merge tag 'drm-fixes-2018-07-16-1' of git://anongit.freedesktop.org/drm/drm
Pull drm fixes from Dave Airlie: - two AGP fixes in here - a bunch of mostly amdgpu fixes - sun4i build fix - two armada fixes - some tegra fixes - one i915 core and one i915 gvt fix * tag 'drm-fixes-2018-07-16-1' of git://anongit.freedesktop.org/drm/drm: drm/amdgpu/pp/smu7: use a local variable for toc indexing amd/dc/dce100: On dce100, set clocks to 0 on suspend drm/amd/display: Convert 10kHz clks from PPLib into kHz for Vega drm/amdgpu: Verify root PD is mapped into kernel address space (v4) drm/amd/display: fix invalid function table override drm/amdgpu: Reserve VM root shared fence slot for command submission (v3) Revert "drm/amd/display: Don't return ddc result and read_bytes in same return value" char: amd64-agp: Use 64-bit arithmetic instead of 32-bit char: agp: Change return type to vm_fault_t drm/i915: Fix hotplug irq ack on i965/g4x drm/armada: fix irq handling drm/armada: fix colorkey mode property drm/tegra: Fix comparison operator for buffer size gpu: host1x: Check whether size of unpin isn't 0 gpu: host1x: Skip IOMMU initialization if firewall is enabled drm/sun4i: link in front-end code if needed drm/i915/gvt: update vreg on inhibit context lri command
-rw-r--r--drivers/char/agp/alpha-agp.c2
-rw-r--r--drivers/char/agp/amd64-agp.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c4
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c20
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c5
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c10
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c27
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c19
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h5
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c23
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.c12
-rw-r--r--drivers/gpu/drm/armada/armada_hw.h1
-rw-r--r--drivers/gpu/drm/armada/armada_overlay.c30
-rw-r--r--drivers/gpu/drm/i915/gvt/cmd_parser.c23
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.h29
-rw-r--r--drivers/gpu/drm/i915/gvt/handlers.c24
-rw-r--r--drivers/gpu/drm/i915/gvt/mmio.h2
-rw-r--r--drivers/gpu/drm/i915/gvt/mmio_context.c4
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c32
-rw-r--r--drivers/gpu/drm/sun4i/Makefile5
-rw-r--r--drivers/gpu/drm/tegra/drm.c2
-rw-r--r--drivers/gpu/host1x/dev.c3
-rw-r--r--drivers/gpu/host1x/job.c3
24 files changed, 233 insertions, 60 deletions
diff --git a/drivers/char/agp/alpha-agp.c b/drivers/char/agp/alpha-agp.c
index 53fe633df1e8..c9bf2c219841 100644
--- a/drivers/char/agp/alpha-agp.c
+++ b/drivers/char/agp/alpha-agp.c
@@ -11,7 +11,7 @@
11 11
12#include "agp.h" 12#include "agp.h"
13 13
14static int alpha_core_agp_vm_fault(struct vm_fault *vmf) 14static vm_fault_t alpha_core_agp_vm_fault(struct vm_fault *vmf)
15{ 15{
16 alpha_agp_info *agp = agp_bridge->dev_private_data; 16 alpha_agp_info *agp = agp_bridge->dev_private_data;
17 dma_addr_t dma_addr; 17 dma_addr_t dma_addr;
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
index e50c29c97ca7..c69e39fdd02b 100644
--- a/drivers/char/agp/amd64-agp.c
+++ b/drivers/char/agp/amd64-agp.c
@@ -156,7 +156,7 @@ static u64 amd64_configure(struct pci_dev *hammer, u64 gatt_table)
156 156
157 /* Address to map to */ 157 /* Address to map to */
158 pci_read_config_dword(hammer, AMD64_GARTAPERTUREBASE, &tmp); 158 pci_read_config_dword(hammer, AMD64_GARTAPERTUREBASE, &tmp);
159 aperturebase = tmp << 25; 159 aperturebase = (u64)tmp << 25;
160 aper_base = (aperturebase & PCI_BASE_ADDRESS_MEM_MASK); 160 aper_base = (aperturebase & PCI_BASE_ADDRESS_MEM_MASK);
161 161
162 enable_gart_translation(hammer, gatt_table); 162 enable_gart_translation(hammer, gatt_table);
@@ -277,7 +277,7 @@ static int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, u16 cap)
277 pci_read_config_dword(nb, AMD64_GARTAPERTURECTL, &nb_order); 277 pci_read_config_dword(nb, AMD64_GARTAPERTURECTL, &nb_order);
278 nb_order = (nb_order >> 1) & 7; 278 nb_order = (nb_order >> 1) & 7;
279 pci_read_config_dword(nb, AMD64_GARTAPERTUREBASE, &nb_base); 279 pci_read_config_dword(nb, AMD64_GARTAPERTUREBASE, &nb_base);
280 nb_aper = nb_base << 25; 280 nb_aper = (u64)nb_base << 25;
281 281
282 /* Northbridge seems to contain crap. Try the AGP bridge. */ 282 /* Northbridge seems to contain crap. Try the AGP bridge. */
283 283
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 82312a7bc6ad..9c85a90be293 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -927,6 +927,10 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
927 r = amdgpu_bo_vm_update_pte(p); 927 r = amdgpu_bo_vm_update_pte(p);
928 if (r) 928 if (r)
929 return r; 929 return r;
930
931 r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv);
932 if (r)
933 return r;
930 } 934 }
931 935
932 return amdgpu_cs_sync_rings(p); 936 return amdgpu_cs_sync_rings(p);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index edf16b2b957a..fdcb498f6d19 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -107,6 +107,9 @@ static void amdgpu_vm_bo_base_init(struct amdgpu_vm_bo_base *base,
107 return; 107 return;
108 list_add_tail(&base->bo_list, &bo->va); 108 list_add_tail(&base->bo_list, &bo->va);
109 109
110 if (bo->tbo.type == ttm_bo_type_kernel)
111 list_move(&base->vm_status, &vm->relocated);
112
110 if (bo->tbo.resv != vm->root.base.bo->tbo.resv) 113 if (bo->tbo.resv != vm->root.base.bo->tbo.resv)
111 return; 114 return;
112 115
@@ -468,7 +471,6 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,
468 pt->parent = amdgpu_bo_ref(parent->base.bo); 471 pt->parent = amdgpu_bo_ref(parent->base.bo);
469 472
470 amdgpu_vm_bo_base_init(&entry->base, vm, pt); 473 amdgpu_vm_bo_base_init(&entry->base, vm, pt);
471 list_move(&entry->base.vm_status, &vm->relocated);
472 } 474 }
473 475
474 if (level < AMDGPU_VM_PTB) { 476 if (level < AMDGPU_VM_PTB) {
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 4304d9e408b8..ace9ad578ca0 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -83,22 +83,21 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
83 enum i2c_mot_mode mot = (msg->request & DP_AUX_I2C_MOT) ? 83 enum i2c_mot_mode mot = (msg->request & DP_AUX_I2C_MOT) ?
84 I2C_MOT_TRUE : I2C_MOT_FALSE; 84 I2C_MOT_TRUE : I2C_MOT_FALSE;
85 enum ddc_result res; 85 enum ddc_result res;
86 uint32_t read_bytes = msg->size; 86 ssize_t read_bytes;
87 87
88 if (WARN_ON(msg->size > 16)) 88 if (WARN_ON(msg->size > 16))
89 return -E2BIG; 89 return -E2BIG;
90 90
91 switch (msg->request & ~DP_AUX_I2C_MOT) { 91 switch (msg->request & ~DP_AUX_I2C_MOT) {
92 case DP_AUX_NATIVE_READ: 92 case DP_AUX_NATIVE_READ:
93 res = dal_ddc_service_read_dpcd_data( 93 read_bytes = dal_ddc_service_read_dpcd_data(
94 TO_DM_AUX(aux)->ddc_service, 94 TO_DM_AUX(aux)->ddc_service,
95 false, 95 false,
96 I2C_MOT_UNDEF, 96 I2C_MOT_UNDEF,
97 msg->address, 97 msg->address,
98 msg->buffer, 98 msg->buffer,
99 msg->size, 99 msg->size);
100 &read_bytes); 100 return read_bytes;
101 break;
102 case DP_AUX_NATIVE_WRITE: 101 case DP_AUX_NATIVE_WRITE:
103 res = dal_ddc_service_write_dpcd_data( 102 res = dal_ddc_service_write_dpcd_data(
104 TO_DM_AUX(aux)->ddc_service, 103 TO_DM_AUX(aux)->ddc_service,
@@ -109,15 +108,14 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
109 msg->size); 108 msg->size);
110 break; 109 break;
111 case DP_AUX_I2C_READ: 110 case DP_AUX_I2C_READ:
112 res = dal_ddc_service_read_dpcd_data( 111 read_bytes = dal_ddc_service_read_dpcd_data(
113 TO_DM_AUX(aux)->ddc_service, 112 TO_DM_AUX(aux)->ddc_service,
114 true, 113 true,
115 mot, 114 mot,
116 msg->address, 115 msg->address,
117 msg->buffer, 116 msg->buffer,
118 msg->size, 117 msg->size);
119 &read_bytes); 118 return read_bytes;
120 break;
121 case DP_AUX_I2C_WRITE: 119 case DP_AUX_I2C_WRITE:
122 res = dal_ddc_service_write_dpcd_data( 120 res = dal_ddc_service_write_dpcd_data(
123 TO_DM_AUX(aux)->ddc_service, 121 TO_DM_AUX(aux)->ddc_service,
@@ -139,9 +137,7 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
139 r == DDC_RESULT_SUCESSFULL); 137 r == DDC_RESULT_SUCESSFULL);
140#endif 138#endif
141 139
142 if (res != DDC_RESULT_SUCESSFULL) 140 return msg->size;
143 return -EIO;
144 return read_bytes;
145} 141}
146 142
147static enum drm_connector_status 143static enum drm_connector_status
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c
index 5a3346124a01..5a2e952c5bea 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c
@@ -255,8 +255,9 @@ static void pp_to_dc_clock_levels_with_latency(
255 DC_DECODE_PP_CLOCK_TYPE(dc_clk_type)); 255 DC_DECODE_PP_CLOCK_TYPE(dc_clk_type));
256 256
257 for (i = 0; i < clk_level_info->num_levels; i++) { 257 for (i = 0; i < clk_level_info->num_levels; i++) {
258 DRM_DEBUG("DM_PPLIB:\t %d\n", pp_clks->data[i].clocks_in_khz); 258 DRM_DEBUG("DM_PPLIB:\t %d in 10kHz\n", pp_clks->data[i].clocks_in_khz);
259 clk_level_info->data[i].clocks_in_khz = pp_clks->data[i].clocks_in_khz; 259 /* translate 10kHz to kHz */
260 clk_level_info->data[i].clocks_in_khz = pp_clks->data[i].clocks_in_khz * 10;
260 clk_level_info->data[i].latency_in_us = pp_clks->data[i].latency_in_us; 261 clk_level_info->data[i].latency_in_us = pp_clks->data[i].latency_in_us;
261 } 262 }
262} 263}
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
index ae48d603ebd6..49c2face1e7a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
@@ -629,14 +629,13 @@ bool dal_ddc_service_query_ddc_data(
629 return ret; 629 return ret;
630} 630}
631 631
632enum ddc_result dal_ddc_service_read_dpcd_data( 632ssize_t dal_ddc_service_read_dpcd_data(
633 struct ddc_service *ddc, 633 struct ddc_service *ddc,
634 bool i2c, 634 bool i2c,
635 enum i2c_mot_mode mot, 635 enum i2c_mot_mode mot,
636 uint32_t address, 636 uint32_t address,
637 uint8_t *data, 637 uint8_t *data,
638 uint32_t len, 638 uint32_t len)
639 uint32_t *read)
640{ 639{
641 struct aux_payload read_payload = { 640 struct aux_payload read_payload = {
642 .i2c_over_aux = i2c, 641 .i2c_over_aux = i2c,
@@ -653,8 +652,6 @@ enum ddc_result dal_ddc_service_read_dpcd_data(
653 .mot = mot 652 .mot = mot
654 }; 653 };
655 654
656 *read = 0;
657
658 if (len > DEFAULT_AUX_MAX_DATA_SIZE) { 655 if (len > DEFAULT_AUX_MAX_DATA_SIZE) {
659 BREAK_TO_DEBUGGER(); 656 BREAK_TO_DEBUGGER();
660 return DDC_RESULT_FAILED_INVALID_OPERATION; 657 return DDC_RESULT_FAILED_INVALID_OPERATION;
@@ -664,8 +661,7 @@ enum ddc_result dal_ddc_service_read_dpcd_data(
664 ddc->ctx->i2caux, 661 ddc->ctx->i2caux,
665 ddc->ddc_pin, 662 ddc->ddc_pin,
666 &command)) { 663 &command)) {
667 *read = command.payloads->length; 664 return (ssize_t)command.payloads->length;
668 return DDC_RESULT_SUCESSFULL;
669 } 665 }
670 666
671 return DDC_RESULT_FAILED_OPERATION; 667 return DDC_RESULT_FAILED_OPERATION;
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c
index b235a75355b8..bae752332a9f 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c
@@ -741,6 +741,29 @@ static struct mem_input_funcs dce_mi_funcs = {
741 .mem_input_is_flip_pending = dce_mi_is_flip_pending 741 .mem_input_is_flip_pending = dce_mi_is_flip_pending
742}; 742};
743 743
744static struct mem_input_funcs dce112_mi_funcs = {
745 .mem_input_program_display_marks = dce112_mi_program_display_marks,
746 .allocate_mem_input = dce_mi_allocate_dmif,
747 .free_mem_input = dce_mi_free_dmif,
748 .mem_input_program_surface_flip_and_addr =
749 dce_mi_program_surface_flip_and_addr,
750 .mem_input_program_pte_vm = dce_mi_program_pte_vm,
751 .mem_input_program_surface_config =
752 dce_mi_program_surface_config,
753 .mem_input_is_flip_pending = dce_mi_is_flip_pending
754};
755
756static struct mem_input_funcs dce120_mi_funcs = {
757 .mem_input_program_display_marks = dce120_mi_program_display_marks,
758 .allocate_mem_input = dce_mi_allocate_dmif,
759 .free_mem_input = dce_mi_free_dmif,
760 .mem_input_program_surface_flip_and_addr =
761 dce_mi_program_surface_flip_and_addr,
762 .mem_input_program_pte_vm = dce_mi_program_pte_vm,
763 .mem_input_program_surface_config =
764 dce_mi_program_surface_config,
765 .mem_input_is_flip_pending = dce_mi_is_flip_pending
766};
744 767
745void dce_mem_input_construct( 768void dce_mem_input_construct(
746 struct dce_mem_input *dce_mi, 769 struct dce_mem_input *dce_mi,
@@ -769,7 +792,7 @@ void dce112_mem_input_construct(
769 const struct dce_mem_input_mask *mi_mask) 792 const struct dce_mem_input_mask *mi_mask)
770{ 793{
771 dce_mem_input_construct(dce_mi, ctx, inst, regs, mi_shift, mi_mask); 794 dce_mem_input_construct(dce_mi, ctx, inst, regs, mi_shift, mi_mask);
772 dce_mi->base.funcs->mem_input_program_display_marks = dce112_mi_program_display_marks; 795 dce_mi->base.funcs = &dce112_mi_funcs;
773} 796}
774 797
775void dce120_mem_input_construct( 798void dce120_mem_input_construct(
@@ -781,5 +804,5 @@ void dce120_mem_input_construct(
781 const struct dce_mem_input_mask *mi_mask) 804 const struct dce_mem_input_mask *mi_mask)
782{ 805{
783 dce_mem_input_construct(dce_mi, ctx, inst, regs, mi_shift, mi_mask); 806 dce_mem_input_construct(dce_mi, ctx, inst, regs, mi_shift, mi_mask);
784 dce_mi->base.funcs->mem_input_program_display_marks = dce120_mi_program_display_marks; 807 dce_mi->base.funcs = &dce120_mi_funcs;
785} 808}
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
index 38ec0d609297..344dd2e69e7c 100644
--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
@@ -678,9 +678,22 @@ bool dce100_validate_bandwidth(
678 struct dc *dc, 678 struct dc *dc,
679 struct dc_state *context) 679 struct dc_state *context)
680{ 680{
681 /* TODO implement when needed but for now hardcode max value*/ 681 int i;
682 context->bw.dce.dispclk_khz = 681000; 682 bool at_least_one_pipe = false;
683 context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER; 683
684 for (i = 0; i < dc->res_pool->pipe_count; i++) {
685 if (context->res_ctx.pipe_ctx[i].stream)
686 at_least_one_pipe = true;
687 }
688
689 if (at_least_one_pipe) {
690 /* TODO implement when needed but for now hardcode max value*/
691 context->bw.dce.dispclk_khz = 681000;
692 context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER;
693 } else {
694 context->bw.dce.dispclk_khz = 0;
695 context->bw.dce.yclk_khz = 0;
696 }
684 697
685 return true; 698 return true;
686} 699}
diff --git a/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h b/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h
index 30b3a08b91be..090b7a8dd67b 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h
@@ -102,14 +102,13 @@ bool dal_ddc_service_query_ddc_data(
102 uint8_t *read_buf, 102 uint8_t *read_buf,
103 uint32_t read_size); 103 uint32_t read_size);
104 104
105enum ddc_result dal_ddc_service_read_dpcd_data( 105ssize_t dal_ddc_service_read_dpcd_data(
106 struct ddc_service *ddc, 106 struct ddc_service *ddc,
107 bool i2c, 107 bool i2c,
108 enum i2c_mot_mode mot, 108 enum i2c_mot_mode mot,
109 uint32_t address, 109 uint32_t address,
110 uint8_t *data, 110 uint8_t *data,
111 uint32_t len, 111 uint32_t len);
112 uint32_t *read);
113 112
114enum ddc_result dal_ddc_service_write_dpcd_data( 113enum ddc_result dal_ddc_service_write_dpcd_data(
115 struct ddc_service *ddc, 114 struct ddc_service *ddc,
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
index d644a9bb9078..9f407c48d4f0 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
@@ -381,6 +381,7 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr)
381 uint32_t fw_to_load; 381 uint32_t fw_to_load;
382 int result = 0; 382 int result = 0;
383 struct SMU_DRAMData_TOC *toc; 383 struct SMU_DRAMData_TOC *toc;
384 uint32_t num_entries = 0;
384 385
385 if (!hwmgr->reload_fw) { 386 if (!hwmgr->reload_fw) {
386 pr_info("skip reloading...\n"); 387 pr_info("skip reloading...\n");
@@ -422,41 +423,41 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr)
422 } 423 }
423 424
424 toc = (struct SMU_DRAMData_TOC *)smu_data->header; 425 toc = (struct SMU_DRAMData_TOC *)smu_data->header;
425 toc->num_entries = 0;
426 toc->structure_version = 1; 426 toc->structure_version = 1;
427 427
428 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 428 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
429 UCODE_ID_RLC_G, &toc->entry[toc->num_entries++]), 429 UCODE_ID_RLC_G, &toc->entry[num_entries++]),
430 "Failed to Get Firmware Entry.", return -EINVAL); 430 "Failed to Get Firmware Entry.", return -EINVAL);
431 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 431 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
432 UCODE_ID_CP_CE, &toc->entry[toc->num_entries++]), 432 UCODE_ID_CP_CE, &toc->entry[num_entries++]),
433 "Failed to Get Firmware Entry.", return -EINVAL); 433 "Failed to Get Firmware Entry.", return -EINVAL);
434 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 434 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
435 UCODE_ID_CP_PFP, &toc->entry[toc->num_entries++]), 435 UCODE_ID_CP_PFP, &toc->entry[num_entries++]),
436 "Failed to Get Firmware Entry.", return -EINVAL); 436 "Failed to Get Firmware Entry.", return -EINVAL);
437 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 437 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
438 UCODE_ID_CP_ME, &toc->entry[toc->num_entries++]), 438 UCODE_ID_CP_ME, &toc->entry[num_entries++]),
439 "Failed to Get Firmware Entry.", return -EINVAL); 439 "Failed to Get Firmware Entry.", return -EINVAL);
440 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 440 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
441 UCODE_ID_CP_MEC, &toc->entry[toc->num_entries++]), 441 UCODE_ID_CP_MEC, &toc->entry[num_entries++]),
442 "Failed to Get Firmware Entry.", return -EINVAL); 442 "Failed to Get Firmware Entry.", return -EINVAL);
443 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 443 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
444 UCODE_ID_CP_MEC_JT1, &toc->entry[toc->num_entries++]), 444 UCODE_ID_CP_MEC_JT1, &toc->entry[num_entries++]),
445 "Failed to Get Firmware Entry.", return -EINVAL); 445 "Failed to Get Firmware Entry.", return -EINVAL);
446 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 446 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
447 UCODE_ID_CP_MEC_JT2, &toc->entry[toc->num_entries++]), 447 UCODE_ID_CP_MEC_JT2, &toc->entry[num_entries++]),
448 "Failed to Get Firmware Entry.", return -EINVAL); 448 "Failed to Get Firmware Entry.", return -EINVAL);
449 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 449 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
450 UCODE_ID_SDMA0, &toc->entry[toc->num_entries++]), 450 UCODE_ID_SDMA0, &toc->entry[num_entries++]),
451 "Failed to Get Firmware Entry.", return -EINVAL); 451 "Failed to Get Firmware Entry.", return -EINVAL);
452 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 452 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
453 UCODE_ID_SDMA1, &toc->entry[toc->num_entries++]), 453 UCODE_ID_SDMA1, &toc->entry[num_entries++]),
454 "Failed to Get Firmware Entry.", return -EINVAL); 454 "Failed to Get Firmware Entry.", return -EINVAL);
455 if (!hwmgr->not_vf) 455 if (!hwmgr->not_vf)
456 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr, 456 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
457 UCODE_ID_MEC_STORAGE, &toc->entry[toc->num_entries++]), 457 UCODE_ID_MEC_STORAGE, &toc->entry[num_entries++]),
458 "Failed to Get Firmware Entry.", return -EINVAL); 458 "Failed to Get Firmware Entry.", return -EINVAL);
459 459
460 toc->num_entries = num_entries;
460 smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_HI, upper_32_bits(smu_data->header_buffer.mc_addr)); 461 smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_HI, upper_32_bits(smu_data->header_buffer.mc_addr));
461 smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_LO, lower_32_bits(smu_data->header_buffer.mc_addr)); 462 smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_LO, lower_32_bits(smu_data->header_buffer.mc_addr));
462 463
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
index 03eeee11dd5b..42a40daff132 100644
--- a/drivers/gpu/drm/armada/armada_crtc.c
+++ b/drivers/gpu/drm/armada/armada_crtc.c
@@ -519,8 +519,9 @@ static irqreturn_t armada_drm_irq(int irq, void *arg)
519 u32 v, stat = readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR); 519 u32 v, stat = readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR);
520 520
521 /* 521 /*
522 * This is rediculous - rather than writing bits to clear, we 522 * Reading the ISR appears to clear bits provided CLEAN_SPU_IRQ_ISR
523 * have to set the actual status register value. This is racy. 523 * is set. Writing has some other effect to acknowledge the IRQ -
524 * without this, we only get a single IRQ.
524 */ 525 */
525 writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR); 526 writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR);
526 527
@@ -1116,16 +1117,22 @@ armada_drm_crtc_set_property(struct drm_crtc *crtc,
1116static int armada_drm_crtc_enable_vblank(struct drm_crtc *crtc) 1117static int armada_drm_crtc_enable_vblank(struct drm_crtc *crtc)
1117{ 1118{
1118 struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); 1119 struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
1120 unsigned long flags;
1119 1121
1122 spin_lock_irqsave(&dcrtc->irq_lock, flags);
1120 armada_drm_crtc_enable_irq(dcrtc, VSYNC_IRQ_ENA); 1123 armada_drm_crtc_enable_irq(dcrtc, VSYNC_IRQ_ENA);
1124 spin_unlock_irqrestore(&dcrtc->irq_lock, flags);
1121 return 0; 1125 return 0;
1122} 1126}
1123 1127
1124static void armada_drm_crtc_disable_vblank(struct drm_crtc *crtc) 1128static void armada_drm_crtc_disable_vblank(struct drm_crtc *crtc)
1125{ 1129{
1126 struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); 1130 struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
1131 unsigned long flags;
1127 1132
1133 spin_lock_irqsave(&dcrtc->irq_lock, flags);
1128 armada_drm_crtc_disable_irq(dcrtc, VSYNC_IRQ_ENA); 1134 armada_drm_crtc_disable_irq(dcrtc, VSYNC_IRQ_ENA);
1135 spin_unlock_irqrestore(&dcrtc->irq_lock, flags);
1129} 1136}
1130 1137
1131static const struct drm_crtc_funcs armada_crtc_funcs = { 1138static const struct drm_crtc_funcs armada_crtc_funcs = {
@@ -1415,6 +1422,7 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
1415 CFG_PDWN64x66, dcrtc->base + LCD_SPU_SRAM_PARA1); 1422 CFG_PDWN64x66, dcrtc->base + LCD_SPU_SRAM_PARA1);
1416 writel_relaxed(0x2032ff81, dcrtc->base + LCD_SPU_DMA_CTRL1); 1423 writel_relaxed(0x2032ff81, dcrtc->base + LCD_SPU_DMA_CTRL1);
1417 writel_relaxed(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA); 1424 writel_relaxed(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA);
1425 readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR);
1418 writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR); 1426 writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR);
1419 1427
1420 ret = devm_request_irq(dev, irq, armada_drm_irq, 0, "armada_drm_crtc", 1428 ret = devm_request_irq(dev, irq, armada_drm_irq, 0, "armada_drm_crtc",
diff --git a/drivers/gpu/drm/armada/armada_hw.h b/drivers/gpu/drm/armada/armada_hw.h
index 27319a8335e2..345dc4d0851e 100644
--- a/drivers/gpu/drm/armada/armada_hw.h
+++ b/drivers/gpu/drm/armada/armada_hw.h
@@ -160,6 +160,7 @@ enum {
160 CFG_ALPHAM_GRA = 0x1 << 16, 160 CFG_ALPHAM_GRA = 0x1 << 16,
161 CFG_ALPHAM_CFG = 0x2 << 16, 161 CFG_ALPHAM_CFG = 0x2 << 16,
162 CFG_ALPHA_MASK = 0xff << 8, 162 CFG_ALPHA_MASK = 0xff << 8,
163#define CFG_ALPHA(x) ((x) << 8)
163 CFG_PIXCMD_MASK = 0xff, 164 CFG_PIXCMD_MASK = 0xff,
164}; 165};
165 166
diff --git a/drivers/gpu/drm/armada/armada_overlay.c b/drivers/gpu/drm/armada/armada_overlay.c
index c391955009d6..afa7ded3ae31 100644
--- a/drivers/gpu/drm/armada/armada_overlay.c
+++ b/drivers/gpu/drm/armada/armada_overlay.c
@@ -28,6 +28,7 @@ struct armada_ovl_plane_properties {
28 uint16_t contrast; 28 uint16_t contrast;
29 uint16_t saturation; 29 uint16_t saturation;
30 uint32_t colorkey_mode; 30 uint32_t colorkey_mode;
31 uint32_t colorkey_enable;
31}; 32};
32 33
33struct armada_ovl_plane { 34struct armada_ovl_plane {
@@ -54,11 +55,13 @@ armada_ovl_update_attr(struct armada_ovl_plane_properties *prop,
54 writel_relaxed(0x00002000, dcrtc->base + LCD_SPU_CBSH_HUE); 55 writel_relaxed(0x00002000, dcrtc->base + LCD_SPU_CBSH_HUE);
55 56
56 spin_lock_irq(&dcrtc->irq_lock); 57 spin_lock_irq(&dcrtc->irq_lock);
57 armada_updatel(prop->colorkey_mode | CFG_ALPHAM_GRA, 58 armada_updatel(prop->colorkey_mode,
58 CFG_CKMODE_MASK | CFG_ALPHAM_MASK | CFG_ALPHA_MASK, 59 CFG_CKMODE_MASK | CFG_ALPHAM_MASK | CFG_ALPHA_MASK,
59 dcrtc->base + LCD_SPU_DMA_CTRL1); 60 dcrtc->base + LCD_SPU_DMA_CTRL1);
60 61 if (dcrtc->variant->has_spu_adv_reg)
61 armada_updatel(ADV_GRACOLORKEY, 0, dcrtc->base + LCD_SPU_ADV_REG); 62 armada_updatel(prop->colorkey_enable,
63 ADV_GRACOLORKEY | ADV_VIDCOLORKEY,
64 dcrtc->base + LCD_SPU_ADV_REG);
62 spin_unlock_irq(&dcrtc->irq_lock); 65 spin_unlock_irq(&dcrtc->irq_lock);
63} 66}
64 67
@@ -321,8 +324,17 @@ static int armada_ovl_plane_set_property(struct drm_plane *plane,
321 dplane->prop.colorkey_vb |= K2B(val); 324 dplane->prop.colorkey_vb |= K2B(val);
322 update_attr = true; 325 update_attr = true;
323 } else if (property == priv->colorkey_mode_prop) { 326 } else if (property == priv->colorkey_mode_prop) {
324 dplane->prop.colorkey_mode &= ~CFG_CKMODE_MASK; 327 if (val == CKMODE_DISABLE) {
325 dplane->prop.colorkey_mode |= CFG_CKMODE(val); 328 dplane->prop.colorkey_mode =
329 CFG_CKMODE(CKMODE_DISABLE) |
330 CFG_ALPHAM_CFG | CFG_ALPHA(255);
331 dplane->prop.colorkey_enable = 0;
332 } else {
333 dplane->prop.colorkey_mode =
334 CFG_CKMODE(val) |
335 CFG_ALPHAM_GRA | CFG_ALPHA(0);
336 dplane->prop.colorkey_enable = ADV_GRACOLORKEY;
337 }
326 update_attr = true; 338 update_attr = true;
327 } else if (property == priv->brightness_prop) { 339 } else if (property == priv->brightness_prop) {
328 dplane->prop.brightness = val - 256; 340 dplane->prop.brightness = val - 256;
@@ -453,7 +465,9 @@ int armada_overlay_plane_create(struct drm_device *dev, unsigned long crtcs)
453 dplane->prop.colorkey_yr = 0xfefefe00; 465 dplane->prop.colorkey_yr = 0xfefefe00;
454 dplane->prop.colorkey_ug = 0x01010100; 466 dplane->prop.colorkey_ug = 0x01010100;
455 dplane->prop.colorkey_vb = 0x01010100; 467 dplane->prop.colorkey_vb = 0x01010100;
456 dplane->prop.colorkey_mode = CFG_CKMODE(CKMODE_RGB); 468 dplane->prop.colorkey_mode = CFG_CKMODE(CKMODE_RGB) |
469 CFG_ALPHAM_GRA | CFG_ALPHA(0);
470 dplane->prop.colorkey_enable = ADV_GRACOLORKEY;
457 dplane->prop.brightness = 0; 471 dplane->prop.brightness = 0;
458 dplane->prop.contrast = 0x4000; 472 dplane->prop.contrast = 0x4000;
459 dplane->prop.saturation = 0x4000; 473 dplane->prop.saturation = 0x4000;
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c
index b51c05d03f14..7f562410f9cf 100644
--- a/drivers/gpu/drm/i915/gvt/cmd_parser.c
+++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c
@@ -862,6 +862,7 @@ static int cmd_reg_handler(struct parser_exec_state *s,
862{ 862{
863 struct intel_vgpu *vgpu = s->vgpu; 863 struct intel_vgpu *vgpu = s->vgpu;
864 struct intel_gvt *gvt = vgpu->gvt; 864 struct intel_gvt *gvt = vgpu->gvt;
865 u32 ctx_sr_ctl;
865 866
866 if (offset + 4 > gvt->device_info.mmio_size) { 867 if (offset + 4 > gvt->device_info.mmio_size) {
867 gvt_vgpu_err("%s access to (%x) outside of MMIO range\n", 868 gvt_vgpu_err("%s access to (%x) outside of MMIO range\n",
@@ -894,6 +895,28 @@ static int cmd_reg_handler(struct parser_exec_state *s,
894 patch_value(s, cmd_ptr(s, index), VGT_PVINFO_PAGE); 895 patch_value(s, cmd_ptr(s, index), VGT_PVINFO_PAGE);
895 } 896 }
896 897
898 /* TODO
899 * Right now only scan LRI command on KBL and in inhibit context.
900 * It's good enough to support initializing mmio by lri command in
901 * vgpu inhibit context on KBL.
902 */
903 if (IS_KABYLAKE(s->vgpu->gvt->dev_priv) &&
904 intel_gvt_mmio_is_in_ctx(gvt, offset) &&
905 !strncmp(cmd, "lri", 3)) {
906 intel_gvt_hypervisor_read_gpa(s->vgpu,
907 s->workload->ring_context_gpa + 12, &ctx_sr_ctl, 4);
908 /* check inhibit context */
909 if (ctx_sr_ctl & 1) {
910 u32 data = cmd_val(s, index + 1);
911
912 if (intel_gvt_mmio_has_mode_mask(s->vgpu->gvt, offset))
913 intel_vgpu_mask_mmio_write(vgpu,
914 offset, &data, 4);
915 else
916 vgpu_vreg(vgpu, offset) = data;
917 }
918 }
919
897 /* TODO: Update the global mask if this MMIO is a masked-MMIO */ 920 /* TODO: Update the global mask if this MMIO is a masked-MMIO */
898 intel_gvt_mmio_set_cmd_accessed(gvt, offset); 921 intel_gvt_mmio_set_cmd_accessed(gvt, offset);
899 return 0; 922 return 0;
diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index 05d15a095310..858967daf04b 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -268,6 +268,8 @@ struct intel_gvt_mmio {
268#define F_CMD_ACCESSED (1 << 5) 268#define F_CMD_ACCESSED (1 << 5)
269/* This reg could be accessed by unaligned address */ 269/* This reg could be accessed by unaligned address */
270#define F_UNALIGN (1 << 6) 270#define F_UNALIGN (1 << 6)
271/* This reg is saved/restored in context */
272#define F_IN_CTX (1 << 7)
271 273
272 struct gvt_mmio_block *mmio_block; 274 struct gvt_mmio_block *mmio_block;
273 unsigned int num_mmio_block; 275 unsigned int num_mmio_block;
@@ -639,6 +641,33 @@ static inline bool intel_gvt_mmio_has_mode_mask(
639 return gvt->mmio.mmio_attribute[offset >> 2] & F_MODE_MASK; 641 return gvt->mmio.mmio_attribute[offset >> 2] & F_MODE_MASK;
640} 642}
641 643
644/**
645 * intel_gvt_mmio_is_in_ctx - check if a MMIO has in-ctx mask
646 * @gvt: a GVT device
647 * @offset: register offset
648 *
649 * Returns:
650 * True if a MMIO has a in-context mask, false if it isn't.
651 *
652 */
653static inline bool intel_gvt_mmio_is_in_ctx(
654 struct intel_gvt *gvt, unsigned int offset)
655{
656 return gvt->mmio.mmio_attribute[offset >> 2] & F_IN_CTX;
657}
658
659/**
660 * intel_gvt_mmio_set_in_ctx - mask a MMIO in logical context
661 * @gvt: a GVT device
662 * @offset: register offset
663 *
664 */
665static inline void intel_gvt_mmio_set_in_ctx(
666 struct intel_gvt *gvt, unsigned int offset)
667{
668 gvt->mmio.mmio_attribute[offset >> 2] |= F_IN_CTX;
669}
670
642int intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu); 671int intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu);
643void intel_gvt_debugfs_remove_vgpu(struct intel_vgpu *vgpu); 672void intel_gvt_debugfs_remove_vgpu(struct intel_vgpu *vgpu);
644int intel_gvt_debugfs_init(struct intel_gvt *gvt); 673int intel_gvt_debugfs_init(struct intel_gvt *gvt);
diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c
index bcbc47a88a70..8f1caacdc78a 100644
--- a/drivers/gpu/drm/i915/gvt/handlers.c
+++ b/drivers/gpu/drm/i915/gvt/handlers.c
@@ -3046,6 +3046,30 @@ int intel_vgpu_default_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
3046} 3046}
3047 3047
3048/** 3048/**
3049 * intel_vgpu_mask_mmio_write - write mask register
3050 * @vgpu: a vGPU
3051 * @offset: access offset
3052 * @p_data: write data buffer
3053 * @bytes: access data length
3054 *
3055 * Returns:
3056 * Zero on success, negative error code if failed.
3057 */
3058int intel_vgpu_mask_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
3059 void *p_data, unsigned int bytes)
3060{
3061 u32 mask, old_vreg;
3062
3063 old_vreg = vgpu_vreg(vgpu, offset);
3064 write_vreg(vgpu, offset, p_data, bytes);
3065 mask = vgpu_vreg(vgpu, offset) >> 16;
3066 vgpu_vreg(vgpu, offset) = (old_vreg & ~mask) |
3067 (vgpu_vreg(vgpu, offset) & mask);
3068
3069 return 0;
3070}
3071
3072/**
3049 * intel_gvt_in_force_nonpriv_whitelist - if a mmio is in whitelist to be 3073 * intel_gvt_in_force_nonpriv_whitelist - if a mmio is in whitelist to be
3050 * force-nopriv register 3074 * force-nopriv register
3051 * 3075 *
diff --git a/drivers/gpu/drm/i915/gvt/mmio.h b/drivers/gpu/drm/i915/gvt/mmio.h
index 71b620875943..dac8c6401e26 100644
--- a/drivers/gpu/drm/i915/gvt/mmio.h
+++ b/drivers/gpu/drm/i915/gvt/mmio.h
@@ -98,4 +98,6 @@ bool intel_gvt_in_force_nonpriv_whitelist(struct intel_gvt *gvt,
98int intel_vgpu_mmio_reg_rw(struct intel_vgpu *vgpu, unsigned int offset, 98int intel_vgpu_mmio_reg_rw(struct intel_vgpu *vgpu, unsigned int offset,
99 void *pdata, unsigned int bytes, bool is_read); 99 void *pdata, unsigned int bytes, bool is_read);
100 100
101int intel_vgpu_mask_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
102 void *p_data, unsigned int bytes);
101#endif 103#endif
diff --git a/drivers/gpu/drm/i915/gvt/mmio_context.c b/drivers/gpu/drm/i915/gvt/mmio_context.c
index 0f949554d118..5ca9caf7552a 100644
--- a/drivers/gpu/drm/i915/gvt/mmio_context.c
+++ b/drivers/gpu/drm/i915/gvt/mmio_context.c
@@ -581,7 +581,9 @@ void intel_gvt_init_engine_mmio_context(struct intel_gvt *gvt)
581 581
582 for (mmio = gvt->engine_mmio_list.mmio; 582 for (mmio = gvt->engine_mmio_list.mmio;
583 i915_mmio_reg_valid(mmio->reg); mmio++) { 583 i915_mmio_reg_valid(mmio->reg); mmio++) {
584 if (mmio->in_context) 584 if (mmio->in_context) {
585 gvt->engine_mmio_list.ctx_mmio_count[mmio->ring_id]++; 585 gvt->engine_mmio_list.ctx_mmio_count[mmio->ring_id]++;
586 intel_gvt_mmio_set_in_ctx(gvt, mmio->reg.reg);
587 }
586 } 588 }
587} 589}
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 4a02747ac658..c16cb025755e 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1998,10 +1998,38 @@ static void valleyview_pipestat_irq_handler(struct drm_i915_private *dev_priv,
1998 1998
1999static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv) 1999static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv)
2000{ 2000{
2001 u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); 2001 u32 hotplug_status = 0, hotplug_status_mask;
2002 int i;
2003
2004 if (IS_G4X(dev_priv) ||
2005 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2006 hotplug_status_mask = HOTPLUG_INT_STATUS_G4X |
2007 DP_AUX_CHANNEL_MASK_INT_STATUS_G4X;
2008 else
2009 hotplug_status_mask = HOTPLUG_INT_STATUS_I915;
2002 2010
2003 if (hotplug_status) 2011 /*
2012 * We absolutely have to clear all the pending interrupt
2013 * bits in PORT_HOTPLUG_STAT. Otherwise the ISR port
2014 * interrupt bit won't have an edge, and the i965/g4x
2015 * edge triggered IIR will not notice that an interrupt
2016 * is still pending. We can't use PORT_HOTPLUG_EN to
2017 * guarantee the edge as the act of toggling the enable
2018 * bits can itself generate a new hotplug interrupt :(
2019 */
2020 for (i = 0; i < 10; i++) {
2021 u32 tmp = I915_READ(PORT_HOTPLUG_STAT) & hotplug_status_mask;
2022
2023 if (tmp == 0)
2024 return hotplug_status;
2025
2026 hotplug_status |= tmp;
2004 I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); 2027 I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
2028 }
2029
2030 WARN_ONCE(1,
2031 "PORT_HOTPLUG_STAT did not clear (0x%08x)\n",
2032 I915_READ(PORT_HOTPLUG_STAT));
2005 2033
2006 return hotplug_status; 2034 return hotplug_status;
2007} 2035}
diff --git a/drivers/gpu/drm/sun4i/Makefile b/drivers/gpu/drm/sun4i/Makefile
index 2589f4acd5ae..9c81301d0eed 100644
--- a/drivers/gpu/drm/sun4i/Makefile
+++ b/drivers/gpu/drm/sun4i/Makefile
@@ -32,7 +32,10 @@ obj-$(CONFIG_DRM_SUN4I) += sun4i-tcon.o
32obj-$(CONFIG_DRM_SUN4I) += sun4i_tv.o 32obj-$(CONFIG_DRM_SUN4I) += sun4i_tv.o
33obj-$(CONFIG_DRM_SUN4I) += sun6i_drc.o 33obj-$(CONFIG_DRM_SUN4I) += sun6i_drc.o
34 34
35obj-$(CONFIG_DRM_SUN4I_BACKEND) += sun4i-backend.o sun4i-frontend.o 35obj-$(CONFIG_DRM_SUN4I_BACKEND) += sun4i-backend.o
36ifdef CONFIG_DRM_SUN4I_BACKEND
37obj-$(CONFIG_DRM_SUN4I) += sun4i-frontend.o
38endif
36obj-$(CONFIG_DRM_SUN4I_HDMI) += sun4i-drm-hdmi.o 39obj-$(CONFIG_DRM_SUN4I_HDMI) += sun4i-drm-hdmi.o
37obj-$(CONFIG_DRM_SUN6I_DSI) += sun6i-dsi.o 40obj-$(CONFIG_DRM_SUN6I_DSI) += sun6i-dsi.o
38obj-$(CONFIG_DRM_SUN8I_DW_HDMI) += sun8i-drm-hdmi.o 41obj-$(CONFIG_DRM_SUN8I_DW_HDMI) += sun8i-drm-hdmi.o
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 776c1513e582..a2bd5876c633 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -398,7 +398,7 @@ int tegra_drm_submit(struct tegra_drm_context *context,
398 * unaligned offset is malformed and cause commands stream 398 * unaligned offset is malformed and cause commands stream
399 * corruption on the buffer address relocation. 399 * corruption on the buffer address relocation.
400 */ 400 */
401 if (offset & 3 || offset >= obj->gem.size) { 401 if (offset & 3 || offset > obj->gem.size) {
402 err = -EINVAL; 402 err = -EINVAL;
403 goto fail; 403 goto fail;
404 } 404 }
diff --git a/drivers/gpu/host1x/dev.c b/drivers/gpu/host1x/dev.c
index f1d5f76e9c33..d88073e7d22d 100644
--- a/drivers/gpu/host1x/dev.c
+++ b/drivers/gpu/host1x/dev.c
@@ -218,6 +218,9 @@ static int host1x_probe(struct platform_device *pdev)
218 return err; 218 return err;
219 } 219 }
220 220
221 if (IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL))
222 goto skip_iommu;
223
221 host->group = iommu_group_get(&pdev->dev); 224 host->group = iommu_group_get(&pdev->dev);
222 if (host->group) { 225 if (host->group) {
223 struct iommu_domain_geometry *geometry; 226 struct iommu_domain_geometry *geometry;
diff --git a/drivers/gpu/host1x/job.c b/drivers/gpu/host1x/job.c
index e2f4a4d93d20..527a1cddb14f 100644
--- a/drivers/gpu/host1x/job.c
+++ b/drivers/gpu/host1x/job.c
@@ -569,7 +569,8 @@ void host1x_job_unpin(struct host1x_job *job)
569 for (i = 0; i < job->num_unpins; i++) { 569 for (i = 0; i < job->num_unpins; i++) {
570 struct host1x_job_unpin_data *unpin = &job->unpins[i]; 570 struct host1x_job_unpin_data *unpin = &job->unpins[i];
571 571
572 if (!IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL) && host->domain) { 572 if (!IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL) &&
573 unpin->size && host->domain) {
573 iommu_unmap(host->domain, job->addr_phys[i], 574 iommu_unmap(host->domain, job->addr_phys[i],
574 unpin->size); 575 unpin->size);
575 free_iova(&host->iova, 576 free_iova(&host->iova,