Skip to content
This repository was archived by the owner on Oct 3, 2024. It is now read-only.

Gvt stable 4.12 #4

Open
wants to merge 80 commits into
base: gvt-staging
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
2964362
arch/x86/xen: add infrastruction in xen to support gvt
pei6 Mar 7, 2017
87554c5
drm/i915/gvt: write guest ppgtt entry for xengt support
pei6 Mar 31, 2017
b39cc44
drm/i915/xengt: xengt moudule initial files
pei6 Apr 10, 2017
03967c2
i915/gvt/opregion.c: Clean vgpu opregion instead of return error when…
xiongzha Apr 12, 2017
16d47c0
Disable plane fault error interrupts
Mar 22, 2017
e0fa540
drm/i915/xengt: check on_destroy on pfn_to_mfn
pei6 Apr 14, 2017
e9df54f
arch/x86/xen: Import x4.9 interface for ioreq
xiongzha Apr 18, 2017
c2c1608
i915/gvt/xengt.c: Use new dm_op instead of hvm_op
xiongzha Apr 18, 2017
79cd54b
i915/gvt/xengt.c: New interface to write protect PPGTT
xiongzha Apr 19, 2017
d1a8e1d
xen/interface/memory.h: New hypercall number for XENMEM_get_mfn_from_pfn
xiongzha Apr 19, 2017
d2829d5
xen/interface/xen.h: update XEN_DOMCTL_INTERFACE_VERSION to 0x0000000d
xiongzha Apr 19, 2017
ef3744e
i915/gvt/xengt.c: Select vgpu type according to low_gm_sz in hvm.cfg
xiongzha May 8, 2017
1e023fc
drm/i915/gvt: Don't output error message when DomU max gfn don't alig…
xiongzha May 16, 2017
2f2a388
drm/i915/gvt/xengt: Correctly get low mem max gfn
xiongzha May 25, 2017
c9c8327
drm/i915/gvt: Fix dom0 call trace at shutdown or reboot sometimes
xiongzha Jun 1, 2017
ded5108
drm/i915/gvt: rewrite the trace gvt:gvt_command using trace style app…
May 3, 2017
7749f09
drm/i915/gvt: implement per-vm mmio switching optimization
May 4, 2017
bbdccfa
drm/i915/gvt: add RING_INSTDONE and SC_INSTDONE mmio handler in GVT-g
weinanl May 19, 2017
41a3fbe
drm/i915/gvt: Change flood gvt dmesg into trace
xiongzha May 22, 2017
d6beaf9
drm/i915/gvt: Delete gvt_dbg_cmd() in cmd_parser_exec()
xiongzha May 22, 2017
6c67f1d
drm/i915/gvt: Support event based scheduling
May 24, 2017
657f70a
drm/i915/gvt: Trigger scheduling after context complete
May 24, 2017
caefad0
drm/i915/gvt: remove redundant -Wall
nickdesaulniers May 21, 2017
e4a08da
drm/i915/gvt: Add runtime_pm get/put to proctect MMIO accessing
cxdong Jun 2, 2017
6d97351
drm/i915/gvt: add gtt_invalidate API to flush the GTT TLB
cxdong Jun 2, 2017
c2a9472
drm/i915/gvt: Optimize MMIO register handling for some large MMIO blocks
Jun 6, 2017
e8b4057
drm/i915/gvt: Cleanup struct intel_gvt_mmio_info
Jun 6, 2017
c9a5585
drm/i915/gvt: Make mmio_attribute as type u8 to save 1.5MB memory
Jun 6, 2017
ab315df
drm/i915/gvt: Make the MMIO attribute wrappers be inline
Jun 6, 2017
fa9ab99
drm/i915/gvt: Add helper for tuning MMIO hash table
Jun 6, 2017
0a533c2
drm/i915/gvt: Tuning the size of MMIO hash lookup table to 2048
Jun 6, 2017
8c0e096
drm/i915/gvt: Fix GDRST vreg state after reset
fred1gao May 24, 2017
f84557a
drm/i915/gvt: Refine virtual reset function
fred1gao May 25, 2017
170bcf4
drm/i915/gvt: Use gvt_err to print the resource not enough error
cxdong Jun 13, 2017
2af97f4
drm/i915/gvt: Make function dpy_reg_mmio_readx safe
Jun 13, 2017
65b17b5
drm/i915/gvt: remove scheduler_mutex in per-engine workload_thread
weinanl Jun 19, 2017
ec4e9a1
drm/i915/gvt: Use fence error from GVT request for workload status
cxdong Jun 23, 2017
be88136
drm/i915/gvt: Optimize ring siwtch 2x faster by removing unnecessary …
Jun 23, 2017
f926958
drm/i915/gvt: Optimize ring siwtch 2x faster again by light weight mm…
Jun 23, 2017
bbe7226
drm/i915/gvt: Set initial PORT_CLK_SEL vreg for BDW
xiongzha Jun 20, 2017
ab1b860
drm/i915/gvt: Don't read ADPA_CRT_HOTPLUG_MONITOR from host
xiongzha Jun 27, 2017
2580463
drm/i915/gvt: Factor out scan and shadow from workload dispatch
Jun 29, 2017
7ae754c
drm/i915/gvt: Audit and shadow workload during ELSP writing
Jun 29, 2017
8a87e1f
drm/i915/gvt: To check whether workload scan and shadow has mutex hold
Jul 4, 2017
8586601
drm/i915/gvt: Replace duplicated code with exist function
Jul 4, 2017
9fcf853
drm/i915/gvt: Fix a memory leak in intel_gvt_init_gtt()
Jul 4, 2017
eeb86a1
drm/i915/gvt: Audit the command buffer address
Jul 4, 2017
9b5d447
drm/i915/gvt: take runtime pm when do early scan and shadow
zhenyw Jul 10, 2017
15de3f1
drm/i915/gvt: Fix the vblank timer close issue after shutdown VMs in …
fred1gao Jul 17, 2017
8fe8a2d
vfio: Fix group release deadlock
awilliam Jun 19, 2017
72557ad
vfio: Remove unnecessary uses of vfio_container.group_lock
awilliam Jul 7, 2017
c161ebf
drm/i915/gvt: Extend KBL platform support in GVT-g
chejianj Jul 19, 2017
2da3e81
drm/i915/gvt: Remove duplicated MMIO entries
chejianj Jul 19, 2017
693a0c1
drm/i915/gvt: Change the max length of mmio_reg_rw from 4 to 8
xiongzha Aug 2, 2017
9e79bd4
efi: Process the MEMATTR table only if EFI_MEMMAP is enabled
Jun 22, 2017
d86c8a0
x86/xen/efi: Initialize only the EFI struct members used by Xen
Jun 22, 2017
4c8f539
drm/i915/gvt: change resetting to resetting_eng
cxdong Aug 1, 2017
d5ad759
drm/i915/gvt: clean workload queue if error happened
cxdong Aug 1, 2017
66d9d3e
drm/i915/gvt: Refine the intel_vgpu_reset_gtt reset function
cxdong Aug 4, 2017
3bc1a10
drm/i915/gvt: Initialize MMIO Block with HW state
TinaZhangZW Aug 4, 2017
51d30ea
xen/events: Fix interrupt lost during irq_disable and irq_enable
Jul 29, 2017
0d23b82
hvm/dm_op.h: Sync dm_op interface to xen 4.9 release
xiongzha Aug 22, 2017
2b0e3b7
drm/i915/gvt: Apply g2h adjust for GTT mmio access
yulei-zhang May 27, 2017
1ad5939
drm/i915/gvt: Apply g2h adjustment during fence mmio access
yulei-zhang May 27, 2017
f710182
drm/i915/gvt: Patch the gma in gpu commands during command parser
yulei-zhang May 27, 2017
6742c55
drm/i915/gvt: Retrieve the guest gm base address from PVINFO
yulei-zhang May 27, 2017
76f1fe1
drm/i915/gvt: Align the guest gm aperture start offset for live migra…
yulei-zhang May 27, 2017
5a196ce
drm/i915/gvt: Add support to new VFIO subregion VFIO_REGION_SUBTYPE_D…
yulei-zhang May 27, 2017
11e6185
drm/i915/gvt: Implement vGPU status save and restore through new VFIO…
yulei-zhang May 27, 2017
f94e16b
vfio: Implement new Ioctl VFIO_IOMMU_GET_DIRTY_BITMAP
yulei-zhang May 27, 2017
7e2ee2a
drm/i915/gvt: Add dev node for vGPU state save/restore in XENGT
yulei-zhang Aug 30, 2017
bdb4273
drm/i915/gvt: Add interface to control the vGPU running state in XENGT
yulei-zhang Aug 30, 2017
2e36a04
drm/i915/gvt: Modify the vGPU save/restore logic for XENGT
yulei-zhang Aug 30, 2017
c250743
drm/i915/gvt: Add log dirty support for XENGT migration
yulei-zhang Aug 31, 2017
479afcc
drm/i915/gvt: Add support for PCIe extended configuration space
Aug 23, 2017
ae75072
drm/i915: Clear lost context-switch interrupts across reset
ickle Aug 7, 2017
3bfd551
drm/i915/gvt: Fix GPU hang after reusing vGPU instance across differe…
Sep 20, 2017
a2f273a
drm/i915/gvt: Invalidate PPGTT shadows of vGPU in all-engine reset
weinanl Sep 20, 2017
1ab753b
drm/i915/gvt: Init virtual DP port according to host VBT info
xiongzha Aug 14, 2017
3bcd9aa
drm/i915/gvt/xengt: Add iosrv_enabled to track iosrv status
xiongzha Oct 12, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions arch/x86/include/asm/xen/hypercall.h
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,14 @@ HYPERVISOR_hvm_op(int op, void *arg)
return _hypercall2(unsigned long, hvm_op, op, arg);
}

static inline int
HYPERVISOR_domctl(
struct xen_domctl *arg)
{
return _hypercall1(int, domctl, arg);
}


static inline int
HYPERVISOR_tmem_op(
struct tmem_op *op)
Expand Down
4 changes: 4 additions & 0 deletions arch/x86/include/asm/xen/hypervisor.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,11 @@ extern bool xen_hvm_need_lapic(void);

static inline bool xen_x2apic_para_available(void)
{
#ifdef CONFIG_XEN_PVHVM
return xen_hvm_need_lapic();
#else
return false;
#endif
}
#else
static inline bool xen_x2apic_para_available(void)
Expand Down
1 change: 1 addition & 0 deletions arch/x86/include/asm/xen/interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ typedef long xen_long_t;
/* Guest handles for primitive C types. */
__DEFINE_GUEST_HANDLE(uchar, unsigned char);
__DEFINE_GUEST_HANDLE(uint, unsigned int);
__DEFINE_GUEST_HANDLE(ulong, unsigned long);
DEFINE_GUEST_HANDLE(char);
DEFINE_GUEST_HANDLE(int);
DEFINE_GUEST_HANDLE(void);
Expand Down
45 changes: 12 additions & 33 deletions arch/x86/xen/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,38 +54,6 @@ static efi_system_table_t efi_systab_xen __initdata = {
.tables = EFI_INVALID_TABLE_ADDR /* Initialized later. */
};

static const struct efi efi_xen __initconst = {
.systab = NULL, /* Initialized later. */
.runtime_version = 0, /* Initialized later. */
.mps = EFI_INVALID_TABLE_ADDR,
.acpi = EFI_INVALID_TABLE_ADDR,
.acpi20 = EFI_INVALID_TABLE_ADDR,
.smbios = EFI_INVALID_TABLE_ADDR,
.smbios3 = EFI_INVALID_TABLE_ADDR,
.sal_systab = EFI_INVALID_TABLE_ADDR,
.boot_info = EFI_INVALID_TABLE_ADDR,
.hcdp = EFI_INVALID_TABLE_ADDR,
.uga = EFI_INVALID_TABLE_ADDR,
.uv_systab = EFI_INVALID_TABLE_ADDR,
.fw_vendor = EFI_INVALID_TABLE_ADDR,
.runtime = EFI_INVALID_TABLE_ADDR,
.config_table = EFI_INVALID_TABLE_ADDR,
.get_time = xen_efi_get_time,
.set_time = xen_efi_set_time,
.get_wakeup_time = xen_efi_get_wakeup_time,
.set_wakeup_time = xen_efi_set_wakeup_time,
.get_variable = xen_efi_get_variable,
.get_next_variable = xen_efi_get_next_variable,
.set_variable = xen_efi_set_variable,
.query_variable_info = xen_efi_query_variable_info,
.update_capsule = xen_efi_update_capsule,
.query_capsule_caps = xen_efi_query_capsule_caps,
.get_next_high_mono_count = xen_efi_get_next_high_mono_count,
.reset_system = xen_efi_reset_system,
.set_virtual_address_map = NULL, /* Not used under Xen. */
.flags = 0 /* Initialized later. */
};

static efi_system_table_t __init *xen_efi_probe(void)
{
struct xen_platform_op op = {
Expand All @@ -102,7 +70,18 @@ static efi_system_table_t __init *xen_efi_probe(void)

/* Here we know that Xen runs on EFI platform. */

efi = efi_xen;
efi.get_time = xen_efi_get_time;
efi.set_time = xen_efi_set_time;
efi.get_wakeup_time = xen_efi_get_wakeup_time;
efi.set_wakeup_time = xen_efi_set_wakeup_time;
efi.get_variable = xen_efi_get_variable;
efi.get_next_variable = xen_efi_get_next_variable;
efi.set_variable = xen_efi_set_variable;
efi.query_variable_info = xen_efi_query_variable_info;
efi.update_capsule = xen_efi_update_capsule;
efi.query_capsule_caps = xen_efi_query_capsule_caps;
efi.get_next_high_mono_count = xen_efi_get_next_high_mono_count;
efi.reset_system = xen_efi_reset_system;

efi_systab_xen.tables = info->cfg.addr;
efi_systab_xen.nr_tables = info->cfg.nent;
Expand Down
82 changes: 82 additions & 0 deletions arch/x86/xen/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <asm/xen/page.h>
#include <asm/xen/hypercall.h>
#include <xen/interface/memory.h>
#include <linux/vmalloc.h>

#include "multicalls.h"
#include "mmu.h"
Expand Down Expand Up @@ -201,3 +202,84 @@ int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
return -EINVAL;
}
EXPORT_SYMBOL_GPL(xen_unmap_domain_gfn_range);

/* Note: here 'mfn' is actually gfn!!! */
struct vm_struct * xen_remap_domain_mfn_range_in_kernel(unsigned long mfn,
int nr, unsigned domid)
{
struct vm_struct *area;
struct remap_data rmd;
struct mmu_update mmu_update[REMAP_BATCH_SIZE];
int batch;
unsigned long range, addr;
pgprot_t prot;
int err;

WARN_ON(in_interrupt() || irqs_disabled());

area = alloc_vm_area(nr << PAGE_SHIFT, NULL);
if (!area)
return NULL;

addr = (unsigned long)area->addr;

prot = __pgprot(pgprot_val(PAGE_KERNEL));
rmd.mfn = &mfn;
rmd.prot = prot;
rmd.contiguous = true;

while (nr) {
batch = min(REMAP_BATCH_SIZE, nr);
range = (unsigned long)batch << PAGE_SHIFT;

rmd.mmu_update = mmu_update;
err = apply_to_page_range(&init_mm, addr, range,
remap_area_mfn_pte_fn, &rmd);
if (err || HYPERVISOR_mmu_update(mmu_update, batch, NULL, domid) < 0)
goto err;

nr -= batch;
addr += range;
}

xen_flush_tlb_all();
return area;
err:
free_vm_area(area);
xen_flush_tlb_all();
return NULL;
}
EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range_in_kernel);

void xen_unmap_domain_mfn_range_in_kernel(struct vm_struct *area, int nr,
unsigned domid)
{
struct remap_data rmd;
struct mmu_update mmu_update;
unsigned long range, addr = (unsigned long)area->addr;
#define INVALID_MFN (~0UL)
unsigned long invalid_mfn = INVALID_MFN;
int err;

WARN_ON(in_interrupt() || irqs_disabled());

rmd.prot = PAGE_NONE;

while (nr) {
range = (unsigned long)(1 << PAGE_SHIFT);

rmd.mfn = &invalid_mfn;
rmd.mmu_update = &mmu_update;
err = apply_to_page_range(&init_mm, addr, range,
remap_area_mfn_pte_fn, &rmd);
BUG_ON(err);
BUG_ON(HYPERVISOR_mmu_update(&mmu_update, 1, NULL, domid) < 0);

nr--;
addr += range;
}

free_vm_area(area);
xen_flush_tlb_all();
}
EXPORT_SYMBOL_GPL(xen_unmap_domain_mfn_range_in_kernel);
3 changes: 2 additions & 1 deletion drivers/firmware/efi/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,8 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
}
}

efi_memattr_init();
if (efi_enabled(EFI_MEMMAP))
efi_memattr_init();

/* Parse the EFI Properties table if it exists */
if (efi.properties_table != EFI_INVALID_TABLE_ADDR) {
Expand Down
9 changes: 9 additions & 0 deletions drivers/gpu/drm/i915/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,15 @@ config DRM_I915_GVT_KVMGT
Choose this option if you want to enable KVMGT support for
Intel GVT-g.

config DRM_I915_GVT_XENGT
tristate "Enable XEN support for Intel GVT-g"
depends on DRM_I915_GVT
depends on XEN
default n
help
Choose this option if you want to enable XENGT support for
Intel GVT-g under XEN hypervisor environment.

menu "drm/i915 Debugging"
depends on DRM_I915
depends on EXPERT
Expand Down
5 changes: 3 additions & 2 deletions drivers/gpu/drm/i915/gvt/Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
GVT_DIR := gvt
GVT_SOURCE := gvt.o aperture_gm.o handlers.o vgpu.o trace_points.o firmware.o \
interrupt.o gtt.o cfg_space.o opregion.o mmio.o display.o edid.o \
execlist.o scheduler.o sched_policy.o render.o cmd_parser.o
execlist.o scheduler.o sched_policy.o render.o cmd_parser.o migrate.o

ccflags-y += -I$(src) -I$(src)/$(GVT_DIR) -Wall
ccflags-y += -I$(src) -I$(src)/$(GVT_DIR)
i915-y += $(addprefix $(GVT_DIR)/, $(GVT_SOURCE))
obj-$(CONFIG_DRM_I915_GVT_KVMGT) += $(GVT_DIR)/kvmgt.o
obj-$(CONFIG_DRM_I915_GVT_XENGT) += $(GVT_DIR)/xengt.o
10 changes: 6 additions & 4 deletions drivers/gpu/drm/i915/gvt/aperture_gm.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,10 @@ void intel_vgpu_write_fence(struct intel_vgpu *vgpu,
I915_WRITE(fence_reg_lo, 0);
POSTING_READ(fence_reg_lo);

I915_WRITE(fence_reg_hi, upper_32_bits(value));
I915_WRITE(fence_reg_lo, lower_32_bits(value));
I915_WRITE(fence_reg_hi,
intel_gvt_reg_g2h(vgpu, upper_32_bits(value), 0xFFFFF000));
I915_WRITE(fence_reg_lo,
intel_gvt_reg_g2h(vgpu, lower_32_bits(value), 0xFFFFF000));
POSTING_READ(fence_reg_lo);
}

Expand Down Expand Up @@ -285,8 +287,8 @@ static int alloc_resource(struct intel_vgpu *vgpu,
return 0;

no_enough_resource:
gvt_vgpu_err("fail to allocate resource %s\n", item);
gvt_vgpu_err("request %luMB avail %luMB max %luMB taken %luMB\n",
gvt_err("fail to allocate resource %s\n", item);
gvt_err("request %luMB avail %luMB max %luMB taken %luMB\n",
BYTES_TO_MB(request), BYTES_TO_MB(avail),
BYTES_TO_MB(max), BYTES_TO_MB(taken));
return -ENOSPC;
Expand Down
7 changes: 4 additions & 3 deletions drivers/gpu/drm/i915/gvt/cfg_space.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

#include "i915_drv.h"
#include "gvt.h"
#include "i915_pvinfo.h"

enum {
INTEL_GVT_PCI_BAR_GTTMMIO = 0,
Expand Down Expand Up @@ -101,7 +102,7 @@ int intel_vgpu_emulate_cfg_read(struct intel_vgpu *vgpu, unsigned int offset,
if (WARN_ON(bytes > 4))
return -EINVAL;

if (WARN_ON(offset + bytes > INTEL_GVT_MAX_CFG_SPACE_SZ))
if (WARN_ON(offset + bytes > vgpu->gvt->device_info.cfg_space_size))
return -EINVAL;

memcpy(p_data, vgpu_cfg_space(vgpu) + offset, bytes);
Expand All @@ -123,7 +124,7 @@ static int map_aperture(struct intel_vgpu *vgpu, bool map)
else
val = *(u32 *)(vgpu_cfg_space(vgpu) + PCI_BASE_ADDRESS_2);

first_gfn = (val + vgpu_aperture_offset(vgpu)) >> PAGE_SHIFT;
first_gfn = (val + vgpu_guest_aperture_offset(vgpu)) >> PAGE_SHIFT;
first_mfn = vgpu_aperture_pa_base(vgpu) >> PAGE_SHIFT;

ret = intel_gvt_hypervisor_map_gfn_to_mfn(vgpu, first_gfn,
Expand Down Expand Up @@ -288,7 +289,7 @@ int intel_vgpu_emulate_cfg_write(struct intel_vgpu *vgpu, unsigned int offset,
if (WARN_ON(bytes > 4))
return -EINVAL;

if (WARN_ON(offset + bytes > INTEL_GVT_MAX_CFG_SPACE_SZ))
if (WARN_ON(offset + bytes > vgpu->gvt->device_info.cfg_space_size))
return -EINVAL;

/* First check if it's PCI_COMMAND */
Expand Down
Loading