Commit 5781cf82 authored by Joonas Lahtinen's avatar Joonas Lahtinen

Merge tag 'gvt-next-2018-09-04' of https://github.com/intel/gvt-linux into drm-intel-next-queued

gvt-next-2018-09-04

- guest context shadow optimization for restore inhibit one (Yan)
- cmd parser optimization (Yan)
- W=1 warning fixes (Zhenyu)
Signed-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>

# Conflicts:
#	drivers/gpu/drm/i915/gvt/reg.h
From: Zhenyu Wang <zhenyuw@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180904030154.GG20737@zhen-hp.sh.intel.com
parents d4da8a4d 69ca5af4
...@@ -56,6 +56,10 @@ static const u8 pci_cfg_space_rw_bmp[PCI_INTERRUPT_LINE + 4] = { ...@@ -56,6 +56,10 @@ static const u8 pci_cfg_space_rw_bmp[PCI_INTERRUPT_LINE + 4] = {
/** /**
* vgpu_pci_cfg_mem_write - write virtual cfg space memory * vgpu_pci_cfg_mem_write - write virtual cfg space memory
* @vgpu: target vgpu
* @off: offset
* @src: src ptr to write
* @bytes: number of bytes
* *
* Use this function to write virtual cfg space memory. * Use this function to write virtual cfg space memory.
* For standard cfg space, only RW bits can be changed, * For standard cfg space, only RW bits can be changed,
...@@ -91,6 +95,10 @@ static void vgpu_pci_cfg_mem_write(struct intel_vgpu *vgpu, unsigned int off, ...@@ -91,6 +95,10 @@ static void vgpu_pci_cfg_mem_write(struct intel_vgpu *vgpu, unsigned int off,
/** /**
* intel_vgpu_emulate_cfg_read - emulate vGPU configuration space read * intel_vgpu_emulate_cfg_read - emulate vGPU configuration space read
* @vgpu: target vgpu
* @offset: offset
* @p_data: return data ptr
* @bytes: number of bytes to read
* *
* Returns: * Returns:
* Zero on success, negative error code if failed. * Zero on success, negative error code if failed.
...@@ -278,6 +286,10 @@ static int emulate_pci_bar_write(struct intel_vgpu *vgpu, unsigned int offset, ...@@ -278,6 +286,10 @@ static int emulate_pci_bar_write(struct intel_vgpu *vgpu, unsigned int offset,
/** /**
* intel_vgpu_emulate_cfg_read - emulate vGPU configuration space write * intel_vgpu_emulate_cfg_read - emulate vGPU configuration space write
* @vgpu: target vgpu
* @offset: offset
* @p_data: write data ptr
* @bytes: number of bytes to write
* *
* Returns: * Returns:
* Zero on success, negative error code if failed. * Zero on success, negative error code if failed.
......
...@@ -1817,6 +1817,8 @@ static int cmd_handler_mi_batch_buffer_start(struct parser_exec_state *s) ...@@ -1817,6 +1817,8 @@ static int cmd_handler_mi_batch_buffer_start(struct parser_exec_state *s)
return ret; return ret;
} }
static int mi_noop_index;
static struct cmd_info cmd_info[] = { static struct cmd_info cmd_info[] = {
{"MI_NOOP", OP_MI_NOOP, F_LEN_CONST, R_ALL, D_ALL, 0, 1, NULL}, {"MI_NOOP", OP_MI_NOOP, F_LEN_CONST, R_ALL, D_ALL, 0, 1, NULL},
...@@ -2502,7 +2504,12 @@ static int cmd_parser_exec(struct parser_exec_state *s) ...@@ -2502,7 +2504,12 @@ static int cmd_parser_exec(struct parser_exec_state *s)
cmd = cmd_val(s, 0); cmd = cmd_val(s, 0);
/* fastpath for MI_NOOP */
if (cmd == MI_NOOP)
info = &cmd_info[mi_noop_index];
else
info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id); info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id);
if (info == NULL) { if (info == NULL) {
gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x, addr_type=%s, ring %d, workload=%p\n", gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x, addr_type=%s, ring %d, workload=%p\n",
cmd, get_opcode(cmd, s->ring_id), cmd, get_opcode(cmd, s->ring_id),
...@@ -2905,6 +2912,8 @@ static int init_cmd_table(struct intel_gvt *gvt) ...@@ -2905,6 +2912,8 @@ static int init_cmd_table(struct intel_gvt *gvt)
kfree(e); kfree(e);
return -EEXIST; return -EEXIST;
} }
if (cmd_info[i].opcode == OP_MI_NOOP)
mi_noop_index = i;
INIT_HLIST_NODE(&e->hlist); INIT_HLIST_NODE(&e->hlist);
add_cmd_entry(gvt, e); add_cmd_entry(gvt, e);
......
...@@ -462,6 +462,7 @@ void intel_vgpu_clean_display(struct intel_vgpu *vgpu) ...@@ -462,6 +462,7 @@ void intel_vgpu_clean_display(struct intel_vgpu *vgpu)
/** /**
* intel_vgpu_init_display- initialize vGPU virtual display emulation * intel_vgpu_init_display- initialize vGPU virtual display emulation
* @vgpu: a vGPU * @vgpu: a vGPU
* @resolution: resolution index for intel_vgpu_edid
* *
* This function is used to initialize vGPU virtual display emulation stuffs * This function is used to initialize vGPU virtual display emulation stuffs
* *
......
...@@ -340,6 +340,9 @@ static int gmbus2_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, ...@@ -340,6 +340,9 @@ static int gmbus2_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
/** /**
* intel_gvt_i2c_handle_gmbus_read - emulate gmbus register mmio read * intel_gvt_i2c_handle_gmbus_read - emulate gmbus register mmio read
* @vgpu: a vGPU * @vgpu: a vGPU
* @offset: reg offset
* @p_data: data return buffer
* @bytes: access data length
* *
* This function is used to emulate gmbus register mmio read * This function is used to emulate gmbus register mmio read
* *
...@@ -365,6 +368,9 @@ int intel_gvt_i2c_handle_gmbus_read(struct intel_vgpu *vgpu, ...@@ -365,6 +368,9 @@ int intel_gvt_i2c_handle_gmbus_read(struct intel_vgpu *vgpu,
/** /**
* intel_gvt_i2c_handle_gmbus_write - emulate gmbus register mmio write * intel_gvt_i2c_handle_gmbus_write - emulate gmbus register mmio write
* @vgpu: a vGPU * @vgpu: a vGPU
* @offset: reg offset
* @p_data: data return buffer
* @bytes: access data length
* *
* This function is used to emulate gmbus register mmio write * This function is used to emulate gmbus register mmio write
* *
...@@ -437,6 +443,9 @@ static inline int get_aux_ch_reg(unsigned int offset) ...@@ -437,6 +443,9 @@ static inline int get_aux_ch_reg(unsigned int offset)
/** /**
* intel_gvt_i2c_handle_aux_ch_write - emulate AUX channel register write * intel_gvt_i2c_handle_aux_ch_write - emulate AUX channel register write
* @vgpu: a vGPU * @vgpu: a vGPU
* @port_idx: port index
* @offset: reg offset
* @p_data: write ptr
* *
* This function is used to emulate AUX channel register write * This function is used to emulate AUX channel register write
* *
......
...@@ -1113,6 +1113,10 @@ static inline void ppgtt_generate_shadow_entry(struct intel_gvt_gtt_entry *se, ...@@ -1113,6 +1113,10 @@ static inline void ppgtt_generate_shadow_entry(struct intel_gvt_gtt_entry *se,
} }
/** /**
* Check if can do 2M page
* @vgpu: target vgpu
* @entry: target pfn's gtt entry
*
* Return 1 if 2MB huge gtt shadowing is possilbe, 0 if miscondition, * Return 1 if 2MB huge gtt shadowing is possilbe, 0 if miscondition,
* negtive if found err. * negtive if found err.
*/ */
...@@ -1943,7 +1947,7 @@ void intel_vgpu_unpin_mm(struct intel_vgpu_mm *mm) ...@@ -1943,7 +1947,7 @@ void intel_vgpu_unpin_mm(struct intel_vgpu_mm *mm)
/** /**
* intel_vgpu_pin_mm - increase the pin count of a vGPU mm object * intel_vgpu_pin_mm - increase the pin count of a vGPU mm object
* @vgpu: a vGPU * @mm: target vgpu mm
* *
* This function is called when user wants to use a vGPU mm object. If this * This function is called when user wants to use a vGPU mm object. If this
* mm object hasn't been shadowed yet, the shadow will be populated at this * mm object hasn't been shadowed yet, the shadow will be populated at this
...@@ -2463,8 +2467,7 @@ static int setup_spt_oos(struct intel_gvt *gvt) ...@@ -2463,8 +2467,7 @@ static int setup_spt_oos(struct intel_gvt *gvt)
/** /**
* intel_vgpu_find_ppgtt_mm - find a PPGTT mm object * intel_vgpu_find_ppgtt_mm - find a PPGTT mm object
* @vgpu: a vGPU * @vgpu: a vGPU
* @page_table_level: PPGTT page table level * @pdps: pdp root array
* @root_entry: PPGTT page table root pointers
* *
* This function is used to find a PPGTT mm object from mm object pool * This function is used to find a PPGTT mm object from mm object pool
* *
......
...@@ -188,7 +188,6 @@ static const struct intel_gvt_ops intel_gvt_ops = { ...@@ -188,7 +188,6 @@ static const struct intel_gvt_ops intel_gvt_ops = {
/** /**
* intel_gvt_init_host - Load MPT modules and detect if we're running in host * intel_gvt_init_host - Load MPT modules and detect if we're running in host
* @gvt: intel gvt device
* *
* This function is called at the driver loading stage. If failed to find a * This function is called at the driver loading stage. If failed to find a
* loadable MPT module or detect currently we're running in a VM, then GVT-g * loadable MPT module or detect currently we're running in a VM, then GVT-g
...@@ -302,7 +301,7 @@ static int init_service_thread(struct intel_gvt *gvt) ...@@ -302,7 +301,7 @@ static int init_service_thread(struct intel_gvt *gvt)
/** /**
* intel_gvt_clean_device - clean a GVT device * intel_gvt_clean_device - clean a GVT device
* @gvt: intel gvt device * @dev_priv: i915 private
* *
* This function is called at the driver unloading stage, to free the * This function is called at the driver unloading stage, to free the
* resources owned by a GVT device. * resources owned by a GVT device.
......
...@@ -3399,6 +3399,7 @@ bool intel_gvt_in_force_nonpriv_whitelist(struct intel_gvt *gvt, ...@@ -3399,6 +3399,7 @@ bool intel_gvt_in_force_nonpriv_whitelist(struct intel_gvt *gvt,
* @offset: register offset * @offset: register offset
* @pdata: data buffer * @pdata: data buffer
* @bytes: data length * @bytes: data length
* @is_read: read or write
* *
* Returns: * Returns:
* Zero on success, negative error code if failed. * Zero on success, negative error code if failed.
......
...@@ -1702,7 +1702,7 @@ static unsigned long kvmgt_gfn_to_pfn(unsigned long handle, unsigned long gfn) ...@@ -1702,7 +1702,7 @@ static unsigned long kvmgt_gfn_to_pfn(unsigned long handle, unsigned long gfn)
return pfn; return pfn;
} }
int kvmgt_dma_map_guest_page(unsigned long handle, unsigned long gfn, static int kvmgt_dma_map_guest_page(unsigned long handle, unsigned long gfn,
unsigned long size, dma_addr_t *dma_addr) unsigned long size, dma_addr_t *dma_addr)
{ {
struct kvmgt_guest_info *info; struct kvmgt_guest_info *info;
...@@ -1751,7 +1751,7 @@ static void __gvt_dma_release(struct kref *ref) ...@@ -1751,7 +1751,7 @@ static void __gvt_dma_release(struct kref *ref)
__gvt_cache_remove_entry(entry->vgpu, entry); __gvt_cache_remove_entry(entry->vgpu, entry);
} }
void kvmgt_dma_unmap_guest_page(unsigned long handle, dma_addr_t dma_addr) static void kvmgt_dma_unmap_guest_page(unsigned long handle, dma_addr_t dma_addr)
{ {
struct kvmgt_guest_info *info; struct kvmgt_guest_info *info;
struct gvt_dma *entry; struct gvt_dma *entry;
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
/** /**
* intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset * intel_vgpu_gpa_to_mmio_offset - translate a GPA to MMIO offset
* @vgpu: a vGPU * @vgpu: a vGPU
* @gpa: guest physical address
* *
* Returns: * Returns:
* Zero on success, negative error code if failed * Zero on success, negative error code if failed
...@@ -228,7 +229,7 @@ int intel_vgpu_emulate_mmio_write(struct intel_vgpu *vgpu, uint64_t pa, ...@@ -228,7 +229,7 @@ int intel_vgpu_emulate_mmio_write(struct intel_vgpu *vgpu, uint64_t pa,
/** /**
* intel_vgpu_reset_mmio - reset virtual MMIO space * intel_vgpu_reset_mmio - reset virtual MMIO space
* @vgpu: a vGPU * @vgpu: a vGPU
* * @dmlr: whether this is device model level reset
*/ */
void intel_vgpu_reset_mmio(struct intel_vgpu *vgpu, bool dmlr) void intel_vgpu_reset_mmio(struct intel_vgpu *vgpu, bool dmlr)
{ {
......
...@@ -37,19 +37,6 @@ ...@@ -37,19 +37,6 @@
#include "gvt.h" #include "gvt.h"
#include "trace.h" #include "trace.h"
/**
* Defined in Intel Open Source PRM.
* Ref: https://01.org/linuxgraphics/documentation/hardware-specification-prms
*/
#define TRVATTL3PTRDW(i) _MMIO(0x4de0 + (i)*4)
#define TRNULLDETCT _MMIO(0x4de8)
#define TRINVTILEDETCT _MMIO(0x4dec)
#define TRVADR _MMIO(0x4df0)
#define TRTTE _MMIO(0x4df4)
#define RING_EXCC(base) _MMIO((base) + 0x28)
#define RING_GFX_MODE(base) _MMIO((base) + 0x29c)
#define VF_GUARDBAND _MMIO(0x83a4)
#define GEN9_MOCS_SIZE 64 #define GEN9_MOCS_SIZE 64
/* Raw offset is appened to each line for convenience. */ /* Raw offset is appened to each line for convenience. */
......
...@@ -53,5 +53,8 @@ bool is_inhibit_context(struct intel_context *ce); ...@@ -53,5 +53,8 @@ bool is_inhibit_context(struct intel_context *ce);
int intel_vgpu_restore_inhibit_context(struct intel_vgpu *vgpu, int intel_vgpu_restore_inhibit_context(struct intel_vgpu *vgpu,
struct i915_request *req); struct i915_request *req);
#define IS_RESTORE_INHIBIT(a) \
(_MASKED_BIT_ENABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT) == \
((a) & _MASKED_BIT_ENABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT)))
#endif #endif
...@@ -216,7 +216,6 @@ static void virt_vbt_generation(struct vbt *v) ...@@ -216,7 +216,6 @@ static void virt_vbt_generation(struct vbt *v)
/** /**
* intel_vgpu_init_opregion - initialize the stuff used to emulate opregion * intel_vgpu_init_opregion - initialize the stuff used to emulate opregion
* @vgpu: a vGPU * @vgpu: a vGPU
* @gpa: guest physical address of opregion
* *
* Returns: * Returns:
* Zero on success, negative error code if failed. * Zero on success, negative error code if failed.
......
...@@ -41,6 +41,8 @@ struct intel_vgpu_page_track *intel_vgpu_find_page_track( ...@@ -41,6 +41,8 @@ struct intel_vgpu_page_track *intel_vgpu_find_page_track(
* intel_vgpu_register_page_track - register a guest page to be tacked * intel_vgpu_register_page_track - register a guest page to be tacked
* @vgpu: a vGPU * @vgpu: a vGPU
* @gfn: the gfn of guest page * @gfn: the gfn of guest page
* @handler: page track handler
* @priv: tracker private
* *
* Returns: * Returns:
* zero on success, negative error code if failed. * zero on success, negative error code if failed.
......
...@@ -86,4 +86,13 @@ ...@@ -86,4 +86,13 @@
#define PCH_GMBUS4 _MMIO(0xc5110) #define PCH_GMBUS4 _MMIO(0xc5110)
#define PCH_GMBUS5 _MMIO(0xc5120) #define PCH_GMBUS5 _MMIO(0xc5120)
#define TRVATTL3PTRDW(i) _MMIO(0x4de0 + (i) * 4)
#define TRNULLDETCT _MMIO(0x4de8)
#define TRINVTILEDETCT _MMIO(0x4dec)
#define TRVADR _MMIO(0x4df0)
#define TRTTE _MMIO(0x4df4)
#define RING_EXCC(base) _MMIO((base) + 0x28)
#define RING_GFX_MODE(base) _MMIO((base) + 0x29c)
#define VF_GUARDBAND _MMIO(0x83a4)
#endif #endif
...@@ -132,35 +132,6 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload) ...@@ -132,35 +132,6 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload)
unsigned long context_gpa, context_page_num; unsigned long context_gpa, context_page_num;
int i; int i;
gvt_dbg_sched("ring id %d workload lrca %x", ring_id,
workload->ctx_desc.lrca);
context_page_num = gvt->dev_priv->engine[ring_id]->context_size;
context_page_num = context_page_num >> PAGE_SHIFT;
if (IS_BROADWELL(gvt->dev_priv) && ring_id == RCS)
context_page_num = 19;
i = 2;
while (i < context_page_num) {
context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
(u32)((workload->ctx_desc.lrca + i) <<
I915_GTT_PAGE_SHIFT));
if (context_gpa == INTEL_GVT_INVALID_ADDR) {
gvt_vgpu_err("Invalid guest context descriptor\n");
return -EFAULT;
}
page = i915_gem_object_get_page(ctx_obj, LRC_HEADER_PAGES + i);
dst = kmap(page);
intel_gvt_hypervisor_read_gpa(vgpu, context_gpa, dst,
I915_GTT_PAGE_SIZE);
kunmap(page);
i++;
}
page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN); page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN);
shadow_ring_context = kmap(page); shadow_ring_context = kmap(page);
...@@ -195,6 +166,37 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload) ...@@ -195,6 +166,37 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload)
sr_oa_regs(workload, (u32 *)shadow_ring_context, false); sr_oa_regs(workload, (u32 *)shadow_ring_context, false);
kunmap(page); kunmap(page);
if (IS_RESTORE_INHIBIT(shadow_ring_context->ctx_ctrl.val))
return 0;
gvt_dbg_sched("ring id %d workload lrca %x", ring_id,
workload->ctx_desc.lrca);
context_page_num = gvt->dev_priv->engine[ring_id]->context_size;
context_page_num = context_page_num >> PAGE_SHIFT;
if (IS_BROADWELL(gvt->dev_priv) && ring_id == RCS)
context_page_num = 19;
i = 2;
while (i < context_page_num) {
context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
(u32)((workload->ctx_desc.lrca + i) <<
I915_GTT_PAGE_SHIFT));
if (context_gpa == INTEL_GVT_INVALID_ADDR) {
gvt_vgpu_err("Invalid guest context descriptor\n");
return -EFAULT;
}
page = i915_gem_object_get_page(ctx_obj, LRC_HEADER_PAGES + i);
dst = kmap(page);
intel_gvt_hypervisor_read_gpa(vgpu, context_gpa, dst,
I915_GTT_PAGE_SIZE);
kunmap(page);
i++;
}
return 0; return 0;
} }
...@@ -1137,6 +1139,7 @@ int intel_vgpu_setup_submission(struct intel_vgpu *vgpu) ...@@ -1137,6 +1139,7 @@ int intel_vgpu_setup_submission(struct intel_vgpu *vgpu)
/** /**
* intel_vgpu_select_submission_ops - select virtual submission interface * intel_vgpu_select_submission_ops - select virtual submission interface
* @vgpu: a vGPU * @vgpu: a vGPU
* @engine_mask: either ALL_ENGINES or target engine mask
* @interface: expected vGPU virtual submission interface * @interface: expected vGPU virtual submission interface
* *
* This function is called when guest configures submission interface. * This function is called when guest configures submission interface.
...@@ -1189,7 +1192,7 @@ int intel_vgpu_select_submission_ops(struct intel_vgpu *vgpu, ...@@ -1189,7 +1192,7 @@ int intel_vgpu_select_submission_ops(struct intel_vgpu *vgpu,
/** /**
* intel_vgpu_destroy_workload - destroy a vGPU workload * intel_vgpu_destroy_workload - destroy a vGPU workload
* @vgpu: a vGPU * @workload: workload to destroy
* *
* This function is called when destroy a vGPU workload. * This function is called when destroy a vGPU workload.
* *
...@@ -1281,6 +1284,7 @@ static int prepare_mm(struct intel_vgpu_workload *workload) ...@@ -1281,6 +1284,7 @@ static int prepare_mm(struct intel_vgpu_workload *workload)
/** /**
* intel_vgpu_create_workload - create a vGPU workload * intel_vgpu_create_workload - create a vGPU workload
* @vgpu: a vGPU * @vgpu: a vGPU
* @ring_id: ring index
* @desc: a guest context descriptor * @desc: a guest context descriptor
* *
* This function is called when creating a vGPU workload. * This function is called when creating a vGPU workload.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment