diff options
author | Zhao Yan <yan.y.zhao@intel.com> | 2017-03-08 21:09:44 -0500 |
---|---|---|
committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2017-03-17 04:46:45 -0400 |
commit | 4938ca90166d6d3061793789e2eef42cd934fa97 (patch) | |
tree | 467da64107cd9022a813038d5018171e43e05765 | |
parent | 6aef660370a9c246956ba6d01eebd8063c4214cb (diff) |
drm/i915/gvt: handle force-nonpriv registers, cmd parser part
this patch adds force non-priv registers check in LRI cmds handler
v4:
transform is_force_nonpriv_mmio() from macro to inline fuction to eliminate
checkpatch warning
v3:
per zhenyu's comment, fix some style warnings
v2:
per zhenyu's comment, refine the code to remove cascaded ifs
Signed-off-by: Zhao Yan <yan.y.zhao@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/gvt/cmd_parser.c | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/handlers.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/mmio.h | 3 |
3 files changed, 43 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c index 7ae6e2b241c8..919c83abaeb1 100644 --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c | |||
@@ -817,6 +817,25 @@ static bool is_shadowed_mmio(unsigned int offset) | |||
817 | return ret; | 817 | return ret; |
818 | } | 818 | } |
819 | 819 | ||
820 | static inline bool is_force_nonpriv_mmio(unsigned int offset) | ||
821 | { | ||
822 | return (offset >= 0x24d0 && offset < 0x2500); | ||
823 | } | ||
824 | |||
825 | static int force_nonpriv_reg_handler(struct parser_exec_state *s, | ||
826 | unsigned int offset, unsigned int index) | ||
827 | { | ||
828 | struct intel_gvt *gvt = s->vgpu->gvt; | ||
829 | unsigned int data = cmd_val(s, index + 1); | ||
830 | |||
831 | if (!intel_gvt_in_force_nonpriv_whitelist(gvt, data)) { | ||
832 | gvt_err("Unexpected forcenonpriv 0x%x LRI write, value=0x%x\n", | ||
833 | offset, data); | ||
834 | return -EINVAL; | ||
835 | } | ||
836 | return 0; | ||
837 | } | ||
838 | |||
820 | static int cmd_reg_handler(struct parser_exec_state *s, | 839 | static int cmd_reg_handler(struct parser_exec_state *s, |
821 | unsigned int offset, unsigned int index, char *cmd) | 840 | unsigned int offset, unsigned int index, char *cmd) |
822 | { | 841 | { |
@@ -841,6 +860,10 @@ static int cmd_reg_handler(struct parser_exec_state *s, | |||
841 | return 0; | 860 | return 0; |
842 | } | 861 | } |
843 | 862 | ||
863 | if (is_force_nonpriv_mmio(offset) && | ||
864 | force_nonpriv_reg_handler(s, offset, index)) | ||
865 | return -EINVAL; | ||
866 | |||
844 | if (offset == i915_mmio_reg_offset(DERRMR) || | 867 | if (offset == i915_mmio_reg_offset(DERRMR) || |
845 | offset == i915_mmio_reg_offset(FORCEWAKE_MT)) { | 868 | offset == i915_mmio_reg_offset(FORCEWAKE_MT)) { |
846 | /* Writing to HW VGT_PVINFO_PAGE offset will be discarded */ | 869 | /* Writing to HW VGT_PVINFO_PAGE offset will be discarded */ |
diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c index 8e43395c748a..de975f40aebf 100644 --- a/drivers/gpu/drm/i915/gvt/handlers.c +++ b/drivers/gpu/drm/i915/gvt/handlers.c | |||
@@ -2988,3 +2988,20 @@ int intel_vgpu_default_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, | |||
2988 | write_vreg(vgpu, offset, p_data, bytes); | 2988 | write_vreg(vgpu, offset, p_data, bytes); |
2989 | return 0; | 2989 | return 0; |
2990 | } | 2990 | } |
2991 | |||
2992 | /** | ||
2993 | * intel_gvt_in_force_nonpriv_whitelist - if a mmio is in whitelist to be | ||
2994 | * force-nopriv register | ||
2995 | * | ||
2996 | * @gvt: a GVT device | ||
2997 | * @offset: register offset | ||
2998 | * | ||
2999 | * Returns: | ||
3000 | * True if the register is in force-nonpriv whitelist; | ||
3001 | * False if outside; | ||
3002 | */ | ||
3003 | bool intel_gvt_in_force_nonpriv_whitelist(struct intel_gvt *gvt, | ||
3004 | unsigned int offset) | ||
3005 | { | ||
3006 | return in_whitelist(offset); | ||
3007 | } | ||
diff --git a/drivers/gpu/drm/i915/gvt/mmio.h b/drivers/gpu/drm/i915/gvt/mmio.h index 3bc620f56f35..a3a027025cd0 100644 --- a/drivers/gpu/drm/i915/gvt/mmio.h +++ b/drivers/gpu/drm/i915/gvt/mmio.h | |||
@@ -107,4 +107,7 @@ int intel_vgpu_default_mmio_read(struct intel_vgpu *vgpu, unsigned int offset, | |||
107 | void *p_data, unsigned int bytes); | 107 | void *p_data, unsigned int bytes); |
108 | int intel_vgpu_default_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, | 108 | int intel_vgpu_default_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, |
109 | void *p_data, unsigned int bytes); | 109 | void *p_data, unsigned int bytes); |
110 | |||
111 | bool intel_gvt_in_force_nonpriv_whitelist(struct intel_gvt *gvt, | ||
112 | unsigned int offset); | ||
110 | #endif | 113 | #endif |