[Intel-gfx] [RFC 02/29] drm/i915: Introduce host graphics memory balloon for gvt

Daniel Vetter daniel at ffwll.ch
Wed Feb 10 08:08:34 UTC 2016


On Thu, Jan 28, 2016 at 06:21:24PM +0800, Zhi Wang wrote:
> From: Bing Niu <bing.niu at intel.com>
> 
> This patch introduces host graphics memory ballon when GVT-g is enabled.
> 
> As under GVT-g, i915 only owned limited graphics resources, others are
> managed by GVT-g resource allocator and kept for other vGPUs.
> 
> For graphics memory space partition, a typical layout looks like:
> 
> +-------+-----------------------+------+-----------------------+
> |* Host |   *GVT-g Resource     |* Host|   *GVT-g Resource     |
> | Owned |   Allocator Managed   | Owned|   Allocator Managed   |
> |       |                       |      |                       |
> +---------------+-------+----------------------+-------+-------+
> |       |       |       |       |      |       |       |       |
> | i915  | vm 1  | vm 2  | vm 3  | i915 | vm 1  | vm 2  | vm 3  |
> |       |       |       |       |      |       |       |       |
> +-------+-------+-------+--------------+-------+-------+-------+
> |           Aperture            |            Hidden            |
> +-------------------------------+------------------------------+
> |                       GGTT memory space                      |
> +--------------------------------------------------------------+
> 
> Similar with fence registers partition:
> 
>  +------ +-----------------------+
>  | * Host|    GVT-g Resource     |
>  | Owned |   Allocator Managed   +
>  0       |                       31
>  +---------------+-------+-------+
>  |       |       |       |       |
>  | i915  | vm 1  | vm 2  | vm 3  |
>  |       |       |       |       |
>  +-------+-------+-------+-------+

This kind of pretty graphs should be in the kerneldoc - with the asciidoc
support we have already in drm-intel-nightly (and hopefully soonish in
upstream). See http://blog.ffwll.ch/2016/01/better-markup-for-kernel-gpu-docbook.html

Cheers, Daniel

> 
> i915 host will read the amount of allocated resources via GVT-g kernel parameters.
> 
> Signed-off-by: Bing Niu <bing.niu at intel.com>
> Signed-off-by: Zhi Wang <zhi.a.wang at intel.com>
> ---
>  drivers/gpu/drm/i915/gvt/params.h   |  3 +++
>  drivers/gpu/drm/i915/i915_gem.c     |  3 +++
>  drivers/gpu/drm/i915/i915_gem_gtt.c |  4 ++--
>  drivers/gpu/drm/i915/i915_vgpu.c    | 16 ++++++++++++----
>  drivers/gpu/drm/i915/i915_vgpu.h    |  1 +
>  5 files changed, 21 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/params.h b/drivers/gpu/drm/i915/gvt/params.h
> index d2955b9..0656a98 100644
> --- a/drivers/gpu/drm/i915/gvt/params.h
> +++ b/drivers/gpu/drm/i915/gvt/params.h
> @@ -27,6 +27,9 @@
>  struct gvt_kernel_params {
>  	bool enable;
>  	int debug;
> +	int dom0_low_gm_sz;
> +	int dom0_high_gm_sz;
> +	int dom0_fence_sz;
>  };
>  
>  extern struct gvt_kernel_params gvt;
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 799a53a..e916e43 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -5080,6 +5080,9 @@ i915_gem_load(struct drm_device *dev)
>  	else
>  		dev_priv->num_fence_regs = 8;
>  
> +	if(intel_gvt_host_active(dev))
> +		dev_priv->num_fence_regs = gvt.dom0_fence_sz;
> +
>  	if (intel_vgpu_active(dev))
>  		dev_priv->num_fence_regs =
>  				I915_READ(vgtif_reg(avail_rs.fence_num));
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 7377b67..0540de2 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -2713,7 +2713,7 @@ static int i915_gem_setup_global_gtt(struct drm_device *dev,
>  	i915_address_space_init(ggtt_vm, dev_priv);
>  	ggtt_vm->total += PAGE_SIZE;
>  
> -	if (intel_vgpu_active(dev)) {
> +	if (intel_vgpu_active(dev) || intel_gvt_host_active(dev)) {
>  		ret = intel_vgt_balloon(dev);
>  		if (ret)
>  			return ret;
> @@ -2810,7 +2810,7 @@ void i915_global_gtt_cleanup(struct drm_device *dev)
>  	}
>  
>  	if (drm_mm_initialized(&vm->mm)) {
> -		if (intel_vgpu_active(dev))
> +		if (intel_vgpu_active(dev) || intel_gvt_host_active(dev))
>  			intel_vgt_deballoon();
>  
>  		drm_mm_takedown(&vm->mm);
> diff --git a/drivers/gpu/drm/i915/i915_vgpu.c b/drivers/gpu/drm/i915/i915_vgpu.c
> index dea7429..fbe6114 100644
> --- a/drivers/gpu/drm/i915/i915_vgpu.c
> +++ b/drivers/gpu/drm/i915/i915_vgpu.c
> @@ -188,10 +188,18 @@ int intel_vgt_balloon(struct drm_device *dev)
>  	unsigned long unmappable_base, unmappable_size, unmappable_end;
>  	int ret;
>  
> -	mappable_base = I915_READ(vgtif_reg(avail_rs.mappable_gmadr.base));
> -	mappable_size = I915_READ(vgtif_reg(avail_rs.mappable_gmadr.size));
> -	unmappable_base = I915_READ(vgtif_reg(avail_rs.nonmappable_gmadr.base));
> -	unmappable_size = I915_READ(vgtif_reg(avail_rs.nonmappable_gmadr.size));
> +	if(intel_gvt_host_active(dev)) {
> +		mappable_base = 0;
> +		mappable_size = gvt.dom0_low_gm_sz << 20;
> +		unmappable_base = dev_priv->gtt.mappable_end;
> +		unmappable_size = gvt.dom0_high_gm_sz << 20;
> +	} else if (intel_vgpu_active(dev)) {
> +		mappable_base = I915_READ(vgtif_reg(avail_rs.mappable_gmadr.base));
> +		mappable_size = I915_READ(vgtif_reg(avail_rs.mappable_gmadr.size));
> +		unmappable_base = I915_READ(vgtif_reg(avail_rs.nonmappable_gmadr.base));
> +		unmappable_size = I915_READ(vgtif_reg(avail_rs.nonmappable_gmadr.size));
> +	} else
> +		return -ENODEV;
>  
>  	mappable_end = mappable_base + mappable_size;
>  	unmappable_end = unmappable_base + unmappable_size;
> diff --git a/drivers/gpu/drm/i915/i915_vgpu.h b/drivers/gpu/drm/i915/i915_vgpu.h
> index 942490a..b8a49e6 100644
> --- a/drivers/gpu/drm/i915/i915_vgpu.h
> +++ b/drivers/gpu/drm/i915/i915_vgpu.h
> @@ -24,6 +24,7 @@
>  #ifndef _I915_VGPU_H_
>  #define _I915_VGPU_H_
>  
> +#include "gvt/params.h"
>  /* The MMIO offset of the shared info between guest and host emulator */
>  #define VGT_PVINFO_PAGE	0x78000
>  #define VGT_PVINFO_SIZE	0x1000
> -- 
> 1.9.1
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the Intel-gfx mailing list