提交 3be0bf5a 编写于 作者: Y Yu Zhang 提交者: Daniel Vetter

drm/i915: Create vGPU specific MMIO operations to reduce traps

In the virtualized environment, forcewake operations are not
necessary for the driver, because mmio accesses will be trapped
and emulated by the host side, and real forcewake operations are
also done in the host. New mmio access handlers are added to directly
call the __raw_i915_read/write, therefore will reduce many traps and
increase the overall performance for drivers running in the VM with
Intel GVT-g enhancement.

v2:
take Chris' comments:
        - register the mmio hooks in intel_uncore_init()
v3:
take Daniel's comments:
        - use macros to assign mmio write functions for vGPU
v4:
take Tvrtko's comments:
        - also use mmio hooks for read operations
Signed-off-by: NYu Zhang <yu.c.zhang@linux.intel.com>
Signed-off-by: NJike Song <jike.song@intel.com>
Signed-off-by: Kevin Tian <kevin.tian@intel.com>k
Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 f61018b1
...@@ -640,6 +640,14 @@ static inline void __force_wake_get(struct drm_i915_private *dev_priv, ...@@ -640,6 +640,14 @@ static inline void __force_wake_get(struct drm_i915_private *dev_priv,
dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains); dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains);
} }
#define __vgpu_read(x) \
static u##x \
vgpu_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
GEN6_READ_HEADER(x); \
val = __raw_i915_read##x(dev_priv, reg); \
GEN6_READ_FOOTER; \
}
#define __gen6_read(x) \ #define __gen6_read(x) \
static u##x \ static u##x \
gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
...@@ -703,6 +711,10 @@ gen9_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ ...@@ -703,6 +711,10 @@ gen9_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
GEN6_READ_FOOTER; \ GEN6_READ_FOOTER; \
} }
__vgpu_read(8)
__vgpu_read(16)
__vgpu_read(32)
__vgpu_read(64)
__gen9_read(8) __gen9_read(8)
__gen9_read(16) __gen9_read(16)
__gen9_read(32) __gen9_read(32)
...@@ -724,6 +736,7 @@ __gen6_read(64) ...@@ -724,6 +736,7 @@ __gen6_read(64)
#undef __chv_read #undef __chv_read
#undef __vlv_read #undef __vlv_read
#undef __gen6_read #undef __gen6_read
#undef __vgpu_read
#undef GEN6_READ_FOOTER #undef GEN6_READ_FOOTER
#undef GEN6_READ_HEADER #undef GEN6_READ_HEADER
...@@ -807,6 +820,14 @@ hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) ...@@ -807,6 +820,14 @@ hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace)
GEN6_WRITE_FOOTER; \ GEN6_WRITE_FOOTER; \
} }
#define __vgpu_write(x) \
static void vgpu_write##x(struct drm_i915_private *dev_priv, \
off_t reg, u##x val, bool trace) { \
GEN6_WRITE_HEADER; \
__raw_i915_write##x(dev_priv, reg, val); \
GEN6_WRITE_FOOTER; \
}
static const u32 gen8_shadowed_regs[] = { static const u32 gen8_shadowed_regs[] = {
FORCEWAKE_MT, FORCEWAKE_MT,
GEN6_RPNSWREQ, GEN6_RPNSWREQ,
...@@ -924,12 +945,17 @@ __gen6_write(8) ...@@ -924,12 +945,17 @@ __gen6_write(8)
__gen6_write(16) __gen6_write(16)
__gen6_write(32) __gen6_write(32)
__gen6_write(64) __gen6_write(64)
__vgpu_write(8)
__vgpu_write(16)
__vgpu_write(32)
__vgpu_write(64)
#undef __gen9_write #undef __gen9_write
#undef __chv_write #undef __chv_write
#undef __gen8_write #undef __gen8_write
#undef __hsw_write #undef __hsw_write
#undef __gen6_write #undef __gen6_write
#undef __vgpu_write
#undef GEN6_WRITE_FOOTER #undef GEN6_WRITE_FOOTER
#undef GEN6_WRITE_HEADER #undef GEN6_WRITE_HEADER
...@@ -1126,6 +1152,11 @@ void intel_uncore_init(struct drm_device *dev) ...@@ -1126,6 +1152,11 @@ void intel_uncore_init(struct drm_device *dev)
break; break;
} }
if (intel_vgpu_active(dev)) {
ASSIGN_WRITE_MMIO_VFUNCS(vgpu);
ASSIGN_READ_MMIO_VFUNCS(vgpu);
}
i915_check_and_clear_faults(dev); i915_check_and_clear_faults(dev);
} }
#undef ASSIGN_WRITE_MMIO_VFUNCS #undef ASSIGN_WRITE_MMIO_VFUNCS
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册