drm/i915: gvt: Introduce the basic architecture of GVT-g
This patch introduces the very basic framework of GVT-g device model,
includes basic prototypes, definitions, initialization.
v12:
- Call intel_gvt_init() in driver early initialization stage. (Chris)
v8:
- Remove the GVT idr and mutex in intel_gvt_host. (Joonas)
v7:
- Refine the URL link in Kconfig. (Joonas)
- Refine the introduction of GVT-g host support in Kconfig. (Joonas)
- Remove the macro GVT_ALIGN(), use round_down() instead. (Joonas)
- Make "struct intel_gvt" a data member in struct drm_i915_private.(Joonas)
- Remove {alloc, free}_gvt_device()
- Rename intel_gvt_{create, destroy}_gvt_device()
- Expost intel_gvt_init_host()
- Remove the dummy "struct intel_gvt" declaration in intel_gvt.h (Joonas)
v6:
- Refine introduction in Kconfig. (Chris)
- The exposed API functions will take struct intel_gvt * instead of
void *. (Chris/Tvrtko)
- Remove most memebers of strct intel_gvt_device_info. Will add them
in the device model patches.(Chris)
- Remove gvt_info() and gvt_err() in debug.h. (Chris)
- Move GVT kernel parameter into i915_params. (Chris)
- Remove include/drm/i915_gvt.h, as GVT-g will be built within i915.
- Remove the redundant struct i915_gvt *, as the functions in i915
will directly take struct intel_gvt *.
- Add more comments for reviewer.
v5:
Take Tvrtko's comments:
- Fix the misspelled words in Kconfig
- Let functions take drm_i915_private * instead of struct drm_device *
- Remove redundant prints/local varible initialization
v3:
Take Joonas' comments:
- Change file name i915_gvt.* to intel_gvt.*
- Move GVT kernel parameter into intel_gvt.c
- Remove redundant debug macros
- Change error handling style
- Add introductions for some stub functions
- Introduce drm/i915_gvt.h.
Take Kevin's comments:
- Move GVT-g host/guest check into intel_vgt_balloon in i915_gem_gtt.c
v2:
- Introduce i915_gvt.c.
It's necessary to introduce the stubs between i915 driver and GVT-g host,
as GVT-g components is configurable in kernel config. When disabled, the
stubs here do nothing.
Take Joonas' comments:
- Replace boolean return value with int.
- Replace customized info/warn/debug macros with DRM macros.
- Document all non-static functions like i915.
- Remove empty and unused functions.
- Replace magic number with marcos.
- Set GVT-g in kernel config to "n" by default.
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Cc: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1466078825-6662-5-git-send-email-zhi.a.wang@intel.com
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2016-06-16 08:07:00 -04:00
/*
* Copyright ( c ) 2011 - 2016 Intel Corporation . All rights reserved .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
2016-07-05 12:40:49 -04:00
*
* Authors :
* Eddie Dong < eddie . dong @ intel . com >
* Dexuan Cui
* Jike Song < jike . song @ intel . com >
*
* Contributors :
* Zhi Wang < zhi . a . wang @ intel . com >
*
drm/i915: gvt: Introduce the basic architecture of GVT-g
This patch introduces the very basic framework of GVT-g device model,
includes basic prototypes, definitions, initialization.
v12:
- Call intel_gvt_init() in driver early initialization stage. (Chris)
v8:
- Remove the GVT idr and mutex in intel_gvt_host. (Joonas)
v7:
- Refine the URL link in Kconfig. (Joonas)
- Refine the introduction of GVT-g host support in Kconfig. (Joonas)
- Remove the macro GVT_ALIGN(), use round_down() instead. (Joonas)
- Make "struct intel_gvt" a data member in struct drm_i915_private.(Joonas)
- Remove {alloc, free}_gvt_device()
- Rename intel_gvt_{create, destroy}_gvt_device()
- Expost intel_gvt_init_host()
- Remove the dummy "struct intel_gvt" declaration in intel_gvt.h (Joonas)
v6:
- Refine introduction in Kconfig. (Chris)
- The exposed API functions will take struct intel_gvt * instead of
void *. (Chris/Tvrtko)
- Remove most memebers of strct intel_gvt_device_info. Will add them
in the device model patches.(Chris)
- Remove gvt_info() and gvt_err() in debug.h. (Chris)
- Move GVT kernel parameter into i915_params. (Chris)
- Remove include/drm/i915_gvt.h, as GVT-g will be built within i915.
- Remove the redundant struct i915_gvt *, as the functions in i915
will directly take struct intel_gvt *.
- Add more comments for reviewer.
v5:
Take Tvrtko's comments:
- Fix the misspelled words in Kconfig
- Let functions take drm_i915_private * instead of struct drm_device *
- Remove redundant prints/local varible initialization
v3:
Take Joonas' comments:
- Change file name i915_gvt.* to intel_gvt.*
- Move GVT kernel parameter into intel_gvt.c
- Remove redundant debug macros
- Change error handling style
- Add introductions for some stub functions
- Introduce drm/i915_gvt.h.
Take Kevin's comments:
- Move GVT-g host/guest check into intel_vgt_balloon in i915_gem_gtt.c
v2:
- Introduce i915_gvt.c.
It's necessary to introduce the stubs between i915 driver and GVT-g host,
as GVT-g components is configurable in kernel config. When disabled, the
stubs here do nothing.
Take Joonas' comments:
- Replace boolean return value with int.
- Replace customized info/warn/debug macros with DRM macros.
- Document all non-static functions like i915.
- Remove empty and unused functions.
- Replace magic number with marcos.
- Set GVT-g in kernel config to "n" by default.
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Cc: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1466078825-6662-5-git-send-email-zhi.a.wang@intel.com
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2016-06-16 08:07:00 -04:00
*/
# ifndef _GVT_MPT_H_
# define _GVT_MPT_H_
/**
* DOC : Hypervisor Service APIs for GVT - g Core Logic
*
* This is the glue layer between specific hypervisor MPT modules and GVT - g core
* logic . Each kind of hypervisor MPT module provides a collection of function
* callbacks and will be attached to GVT host when the driver is loading .
* GVT - g core logic will call these APIs to request specific services from
* hypervisor .
*/
2016-11-03 18:38:33 +08:00
/**
* intel_gvt_hypervisor_host_init - init GVT - g host side
*
* Returns :
* Zero on success , negative error code if failed
*/
static inline int intel_gvt_hypervisor_host_init ( struct device * dev ,
void * gvt , const void * ops )
{
2016-11-03 18:38:34 +08:00
/* optional to provide */
if ( ! intel_gvt_host . mpt - > host_init )
return 0 ;
2016-11-03 18:38:33 +08:00
return intel_gvt_host . mpt - > host_init ( dev , gvt , ops ) ;
}
/**
* intel_gvt_hypervisor_host_exit - exit GVT - g host side
*/
static inline void intel_gvt_hypervisor_host_exit ( struct device * dev ,
void * gvt )
{
2016-11-03 18:38:34 +08:00
/* optional to provide */
if ( ! intel_gvt_host . mpt - > host_exit )
return ;
2016-11-03 18:38:33 +08:00
intel_gvt_host . mpt - > host_exit ( dev , gvt ) ;
}
2016-07-05 12:40:49 -04:00
/**
* intel_gvt_hypervisor_attach_vgpu - call hypervisor to initialize vGPU
* related stuffs inside hypervisor .
*
* Returns :
* Zero on success , negative error code if failed .
*/
static inline int intel_gvt_hypervisor_attach_vgpu ( struct intel_vgpu * vgpu )
{
2016-11-03 18:38:34 +08:00
/* optional to provide */
if ( ! intel_gvt_host . mpt - > attach_vgpu )
return 0 ;
2016-07-05 12:40:49 -04:00
return intel_gvt_host . mpt - > attach_vgpu ( vgpu , & vgpu - > handle ) ;
}
/**
* intel_gvt_hypervisor_detach_vgpu - call hypervisor to release vGPU
* related stuffs inside hypervisor .
*
* Returns :
* Zero on success , negative error code if failed .
*/
static inline void intel_gvt_hypervisor_detach_vgpu ( struct intel_vgpu * vgpu )
{
2016-11-03 18:38:34 +08:00
/* optional to provide */
if ( ! intel_gvt_host . mpt - > detach_vgpu )
return ;
2016-07-05 12:40:49 -04:00
intel_gvt_host . mpt - > detach_vgpu ( vgpu - > handle ) ;
}
2015-09-17 09:22:08 +08:00
# define MSI_CAP_CONTROL(offset) (offset + 2)
# define MSI_CAP_ADDRESS(offset) (offset + 4)
# define MSI_CAP_DATA(offset) (offset + 8)
# define MSI_CAP_EN 0x1
/**
* intel_gvt_hypervisor_inject_msi - inject a MSI interrupt into vGPU
*
* Returns :
* Zero on success , negative error code if failed .
*/
static inline int intel_gvt_hypervisor_inject_msi ( struct intel_vgpu * vgpu )
{
unsigned long offset = vgpu - > gvt - > device_info . msi_cap_offset ;
u16 control , data ;
u32 addr ;
int ret ;
control = * ( u16 * ) ( vgpu_cfg_space ( vgpu ) + MSI_CAP_CONTROL ( offset ) ) ;
addr = * ( u32 * ) ( vgpu_cfg_space ( vgpu ) + MSI_CAP_ADDRESS ( offset ) ) ;
data = * ( u16 * ) ( vgpu_cfg_space ( vgpu ) + MSI_CAP_DATA ( offset ) ) ;
/* Do not generate MSI if MSIEN is disable */
if ( ! ( control & MSI_CAP_EN ) )
return 0 ;
if ( WARN ( control & GENMASK ( 15 , 1 ) , " only support one MSI format \n " ) )
return - EINVAL ;
2017-05-23 05:38:08 +08:00
trace_inject_msi ( vgpu - > id , addr , data ) ;
2015-09-17 09:22:08 +08:00
ret = intel_gvt_host . mpt - > inject_msi ( vgpu - > handle , addr , data ) ;
if ( ret )
return ret ;
return 0 ;
}
2016-03-28 23:23:16 +08:00
/**
* intel_gvt_hypervisor_set_wp_page - translate a host VA into MFN
* @ p : host kernel virtual address
*
* Returns :
* MFN on success , INTEL_GVT_INVALID_ADDR if failed .
*/
static inline unsigned long intel_gvt_hypervisor_virt_to_mfn ( void * p )
{
return intel_gvt_host . mpt - > from_virt_to_mfn ( p ) ;
}
/**
* intel_gvt_hypervisor_set_wp_page - set a guest page to write - protected
* @ vgpu : a vGPU
* @ p : intel_vgpu_guest_page
*
* Returns :
* Zero on success , negative error code if failed .
*/
static inline int intel_gvt_hypervisor_set_wp_page ( struct intel_vgpu * vgpu ,
struct intel_vgpu_guest_page * p )
{
int ret ;
if ( p - > writeprotection )
return 0 ;
ret = intel_gvt_host . mpt - > set_wp_page ( vgpu - > handle , p - > gfn ) ;
if ( ret )
return ret ;
p - > writeprotection = true ;
atomic_inc ( & vgpu - > gtt . n_write_protected_guest_page ) ;
return 0 ;
}
/**
* intel_gvt_hypervisor_unset_wp_page - remove the write - protection of a
* guest page
* @ vgpu : a vGPU
* @ p : intel_vgpu_guest_page
*
* Returns :
* Zero on success , negative error code if failed .
*/
static inline int intel_gvt_hypervisor_unset_wp_page ( struct intel_vgpu * vgpu ,
struct intel_vgpu_guest_page * p )
{
int ret ;
if ( ! p - > writeprotection )
return 0 ;
ret = intel_gvt_host . mpt - > unset_wp_page ( vgpu - > handle , p - > gfn ) ;
if ( ret )
return ret ;
p - > writeprotection = false ;
atomic_dec ( & vgpu - > gtt . n_write_protected_guest_page ) ;
return 0 ;
}
/**
* intel_gvt_hypervisor_read_gpa - copy data from GPA to host data buffer
* @ vgpu : a vGPU
* @ gpa : guest physical address
* @ buf : host data buffer
* @ len : data length
*
* Returns :
* Zero on success , negative error code if failed .
*/
static inline int intel_gvt_hypervisor_read_gpa ( struct intel_vgpu * vgpu ,
unsigned long gpa , void * buf , unsigned long len )
{
return intel_gvt_host . mpt - > read_gpa ( vgpu - > handle , gpa , buf , len ) ;
}
/**
* intel_gvt_hypervisor_write_gpa - copy data from host data buffer to GPA
* @ vgpu : a vGPU
* @ gpa : guest physical address
* @ buf : host data buffer
* @ len : data length
*
* Returns :
* Zero on success , negative error code if failed .
*/
static inline int intel_gvt_hypervisor_write_gpa ( struct intel_vgpu * vgpu ,
unsigned long gpa , void * buf , unsigned long len )
{
return intel_gvt_host . mpt - > write_gpa ( vgpu - > handle , gpa , buf , len ) ;
}
/**
* intel_gvt_hypervisor_gfn_to_mfn - translate a GFN to MFN
* @ vgpu : a vGPU
* @ gpfn : guest pfn
*
* Returns :
* MFN on success , INTEL_GVT_INVALID_ADDR if failed .
*/
static inline unsigned long intel_gvt_hypervisor_gfn_to_mfn (
struct intel_vgpu * vgpu , unsigned long gfn )
{
return intel_gvt_host . mpt - > gfn_to_mfn ( vgpu - > handle , gfn ) ;
}
2016-07-20 01:14:38 -04:00
/**
* intel_gvt_hypervisor_map_gfn_to_mfn - map a GFN region to MFN
* @ vgpu : a vGPU
* @ gfn : guest PFN
* @ mfn : host PFN
* @ nr : amount of PFNs
* @ map : map or unmap
*
* Returns :
* Zero on success , negative error code if failed .
*/
static inline int intel_gvt_hypervisor_map_gfn_to_mfn (
struct intel_vgpu * vgpu , unsigned long gfn ,
unsigned long mfn , unsigned int nr ,
2016-11-03 18:38:32 +08:00
bool map )
2016-07-20 01:14:38 -04:00
{
2016-11-03 18:38:34 +08:00
/* a MPT implementation could have MMIO mapped elsewhere */
if ( ! intel_gvt_host . mpt - > map_gfn_to_mfn )
return 0 ;
2016-07-20 01:14:38 -04:00
return intel_gvt_host . mpt - > map_gfn_to_mfn ( vgpu - > handle , gfn , mfn , nr ,
2016-11-03 18:38:32 +08:00
map ) ;
2016-07-20 01:14:38 -04:00
}
/**
* intel_gvt_hypervisor_set_trap_area - Trap a guest PA region
* @ vgpu : a vGPU
* @ start : the beginning of the guest physical address region
* @ end : the end of the guest physical address region
* @ map : map or unmap
*
* Returns :
* Zero on success , negative error code if failed .
*/
static inline int intel_gvt_hypervisor_set_trap_area (
struct intel_vgpu * vgpu , u64 start , u64 end , bool map )
{
2016-11-03 18:38:34 +08:00
/* a MPT implementation could have MMIO trapped elsewhere */
if ( ! intel_gvt_host . mpt - > set_trap_area )
return 0 ;
2016-07-20 01:14:38 -04:00
return intel_gvt_host . mpt - > set_trap_area ( vgpu - > handle , start , end , map ) ;
}
drm/i915: gvt: Introduce the basic architecture of GVT-g
This patch introduces the very basic framework of GVT-g device model,
includes basic prototypes, definitions, initialization.
v12:
- Call intel_gvt_init() in driver early initialization stage. (Chris)
v8:
- Remove the GVT idr and mutex in intel_gvt_host. (Joonas)
v7:
- Refine the URL link in Kconfig. (Joonas)
- Refine the introduction of GVT-g host support in Kconfig. (Joonas)
- Remove the macro GVT_ALIGN(), use round_down() instead. (Joonas)
- Make "struct intel_gvt" a data member in struct drm_i915_private.(Joonas)
- Remove {alloc, free}_gvt_device()
- Rename intel_gvt_{create, destroy}_gvt_device()
- Expost intel_gvt_init_host()
- Remove the dummy "struct intel_gvt" declaration in intel_gvt.h (Joonas)
v6:
- Refine introduction in Kconfig. (Chris)
- The exposed API functions will take struct intel_gvt * instead of
void *. (Chris/Tvrtko)
- Remove most memebers of strct intel_gvt_device_info. Will add them
in the device model patches.(Chris)
- Remove gvt_info() and gvt_err() in debug.h. (Chris)
- Move GVT kernel parameter into i915_params. (Chris)
- Remove include/drm/i915_gvt.h, as GVT-g will be built within i915.
- Remove the redundant struct i915_gvt *, as the functions in i915
will directly take struct intel_gvt *.
- Add more comments for reviewer.
v5:
Take Tvrtko's comments:
- Fix the misspelled words in Kconfig
- Let functions take drm_i915_private * instead of struct drm_device *
- Remove redundant prints/local varible initialization
v3:
Take Joonas' comments:
- Change file name i915_gvt.* to intel_gvt.*
- Move GVT kernel parameter into intel_gvt.c
- Remove redundant debug macros
- Change error handling style
- Add introductions for some stub functions
- Introduce drm/i915_gvt.h.
Take Kevin's comments:
- Move GVT-g host/guest check into intel_vgt_balloon in i915_gem_gtt.c
v2:
- Introduce i915_gvt.c.
It's necessary to introduce the stubs between i915 driver and GVT-g host,
as GVT-g components is configurable in kernel config. When disabled, the
stubs here do nothing.
Take Joonas' comments:
- Replace boolean return value with int.
- Replace customized info/warn/debug macros with DRM macros.
- Document all non-static functions like i915.
- Remove empty and unused functions.
- Replace magic number with marcos.
- Set GVT-g in kernel config to "n" by default.
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Cc: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1466078825-6662-5-git-send-email-zhi.a.wang@intel.com
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2016-06-16 08:07:00 -04:00
# endif /* _GVT_MPT_H_ */