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/gpu | |
| 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/gpu')
| -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 | } |
