diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-07-16 13:20:43 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-07-16 13:20:43 -0400 |
commit | 706bf68b4339adf57cf7325561fddd8a3b41fa8e (patch) | |
tree | 11c8b520d505d88b6e77e13030c6c384342be6a9 | |
parent | d1b47a7c9efcf3c3384b70f6e3c8f1423b44d8c7 (diff) | |
parent | bf642e3a1996f1ed8f083c5ecd4b51270a9e11bc (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
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 | ||
14 | static int alpha_core_agp_vm_fault(struct vm_fault *vmf) | 14 | static 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 | ||
147 | static enum drm_connector_status | 143 | static 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 | ||
632 | enum ddc_result dal_ddc_service_read_dpcd_data( | 632 | ssize_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 | ||
744 | static 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 | |||
756 | static 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 | ||
745 | void dce_mem_input_construct( | 768 | void 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 | ||
775 | void dce120_mem_input_construct( | 798 | void 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 | ||
105 | enum ddc_result dal_ddc_service_read_dpcd_data( | 105 | ssize_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 | ||
114 | enum ddc_result dal_ddc_service_write_dpcd_data( | 113 | enum 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, | |||
1116 | static int armada_drm_crtc_enable_vblank(struct drm_crtc *crtc) | 1117 | static 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 | ||
1124 | static void armada_drm_crtc_disable_vblank(struct drm_crtc *crtc) | 1128 | static 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 | ||
1131 | static const struct drm_crtc_funcs armada_crtc_funcs = { | 1138 | static 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 | ||
33 | struct armada_ovl_plane { | 34 | struct 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 | */ | ||
653 | static 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 | */ | ||
665 | static 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 | |||
642 | int intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu); | 671 | int intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu); |
643 | void intel_gvt_debugfs_remove_vgpu(struct intel_vgpu *vgpu); | 672 | void intel_gvt_debugfs_remove_vgpu(struct intel_vgpu *vgpu); |
644 | int intel_gvt_debugfs_init(struct intel_gvt *gvt); | 673 | int 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 | */ | ||
3058 | int 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, | |||
98 | int intel_vgpu_mmio_reg_rw(struct intel_vgpu *vgpu, unsigned int offset, | 98 | int 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 | ||
101 | int 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 | ||
1999 | static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv) | 1999 | static 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 | |||
32 | obj-$(CONFIG_DRM_SUN4I) += sun4i_tv.o | 32 | obj-$(CONFIG_DRM_SUN4I) += sun4i_tv.o |
33 | obj-$(CONFIG_DRM_SUN4I) += sun6i_drc.o | 33 | obj-$(CONFIG_DRM_SUN4I) += sun6i_drc.o |
34 | 34 | ||
35 | obj-$(CONFIG_DRM_SUN4I_BACKEND) += sun4i-backend.o sun4i-frontend.o | 35 | obj-$(CONFIG_DRM_SUN4I_BACKEND) += sun4i-backend.o |
36 | ifdef CONFIG_DRM_SUN4I_BACKEND | ||
37 | obj-$(CONFIG_DRM_SUN4I) += sun4i-frontend.o | ||
38 | endif | ||
36 | obj-$(CONFIG_DRM_SUN4I_HDMI) += sun4i-drm-hdmi.o | 39 | obj-$(CONFIG_DRM_SUN4I_HDMI) += sun4i-drm-hdmi.o |
37 | obj-$(CONFIG_DRM_SUN6I_DSI) += sun6i-dsi.o | 40 | obj-$(CONFIG_DRM_SUN6I_DSI) += sun6i-dsi.o |
38 | obj-$(CONFIG_DRM_SUN8I_DW_HDMI) += sun8i-drm-hdmi.o | 41 | obj-$(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, |