aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRodrigo Vivi <rodrigo.vivi@intel.com>2018-07-12 03:15:52 -0400
committerRodrigo Vivi <rodrigo.vivi@intel.com>2018-07-12 03:15:53 -0400
commit09d2da310d61c4bfae33ea05b88e7a8f31350d9e (patch)
tree2bcf3661ce744e5dd151b9e7c4652960d55c6532 /drivers
parent96a85cc517a9ee4ae5e8d7f5a36cba05023784eb (diff)
parent6cef21a1964933b77c855c55bac2723053cc676d (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.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
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 */
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}