diff options
author | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-07-12 03:15:52 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-07-12 03:15:53 -0400 |
commit | 09d2da310d61c4bfae33ea05b88e7a8f31350d9e (patch) | |
tree | 2bcf3661ce744e5dd151b9e7c4652960d55c6532 /drivers | |
parent | 96a85cc517a9ee4ae5e8d7f5a36cba05023784eb (diff) | |
parent | 6cef21a1964933b77c855c55bac2723053cc676d (diff) |
Merge tag 'gvt-fixes-2018-07-11' of https://github.com/intel/gvt-linux into drm-intel-fixes
gvt-fixes-2018-07-11
- Fix KBL virtual register update from LRI for GPU hang (Henry)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180711024056.GV1267@zhen-hp.sh.intel.com
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/gvt/cmd_parser.c | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/gvt.h | 29 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/handlers.c | 24 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/mmio.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/mmio_context.c | 4 |
5 files changed, 81 insertions, 1 deletions
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 | } |