From patchwork Thu Oct 11 06:24:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiaolin Zhang X-Patchwork-Id: 10636131 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E821016B1 for ; Thu, 11 Oct 2018 06:24:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D1C762A511 for ; Thu, 11 Oct 2018 06:24:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C5BA12AD83; Thu, 11 Oct 2018 06:24:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6436E2A511 for ; Thu, 11 Oct 2018 06:24:30 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D53EB6E162; Thu, 11 Oct 2018 06:24:29 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id 272186E132; Thu, 11 Oct 2018 06:24:28 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Oct 2018 23:24:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,367,1534834800"; d="scan'208";a="99295990" Received: from xzhan34-mobl3.bj.intel.com ([10.238.154.62]) by orsmga002.jf.intel.com with ESMTP; 10 Oct 2018 23:24:24 -0700 From: Xiaolin Zhang To: intel-gvt-dev@lists.freedesktop.org, intel-gfx@lists.freedesktop.org Date: Thu, 11 Oct 2018 14:24:19 +0800 Message-Id: <1539239059-11120-1-git-send-email-xiaolin.zhang@intel.com> X-Mailer: git-send-email 2.7.4 Subject: [Intel-gfx] [v1 02/10] drm/i915: get ready of memory for pvmmio X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: zhenyu.z.wang@intel.com, hang.yuan@intel.com, joonas.lahtinen@intel.com, fei.jiang@intel.com, zhiyuan.lv@intel.com MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP To enable pvmmio feature, we need to prepare one 4K shared page which will be accessed by both guest and backend i915 driver. guest i915 allocate one page memory and then the guest physical address is passed to backend i915 driver through PVINFO register so that backend i915 driver can access this shared page without hypeviser trap cost for shared data exchagne via hyperviser read_gpa functionality. v1: addressed RFC comment to move both shared_page_lock and shared_page to i915_virtual_gpu structure v0: RFC Signed-off-by: Xiaolin Zhang --- drivers/gpu/drm/i915/i915_drv.c | 8 ++++++++ drivers/gpu/drm/i915/i915_drv.h | 2 ++ drivers/gpu/drm/i915/i915_pvinfo.h | 24 +++++++++++++++++++++++- drivers/gpu/drm/i915/i915_vgpu.c | 19 ++++++++++++++++++- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 19302342..9b25bb7 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -987,6 +987,10 @@ static void i915_mmio_cleanup(struct drm_i915_private *dev_priv) intel_teardown_mchbar(dev_priv); pci_iounmap(pdev, dev_priv->regs); + if (intel_vgpu_active(dev_priv) && dev_priv->vgpu.shared_page) { + free_page((unsigned long)dev_priv->vgpu.shared_page); + dev_priv->vgpu.shared_page = NULL; + } } /** @@ -1029,6 +1033,10 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv) return 0; err_uncore: + if (intel_vgpu_active(dev_priv) && dev_priv->vgpu.shared_page) { + free_page((unsigned long)dev_priv->vgpu.shared_page); + dev_priv->vgpu.shared_page = NULL; + } intel_uncore_fini(dev_priv); err_bridge: pci_dev_put(dev_priv->bridge_dev); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index d22154a..2c131d4 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1345,6 +1345,8 @@ struct i915_virtual_gpu { bool active; u32 caps; u32 pv_caps; + spinlock_t shared_page_lock; + struct gvt_shared_page *shared_page; }; /* used in computing the new watermarks state */ diff --git a/drivers/gpu/drm/i915/i915_pvinfo.h b/drivers/gpu/drm/i915/i915_pvinfo.h index 26709e8..179d558 100644 --- a/drivers/gpu/drm/i915/i915_pvinfo.h +++ b/drivers/gpu/drm/i915/i915_pvinfo.h @@ -49,6 +49,24 @@ enum vgt_g2v_type { VGT_G2V_MAX, }; +struct pv_ppgtt_update { + u64 pdp; + u64 start; + u64 length; + u32 cache_level; +}; + +/* + * shared page(4KB) between gvt and VM, could be allocated by guest driver + * or a fixed location in PCI bar 0 region + */ +struct gvt_shared_page { + u32 elsp_data[4]; + u32 reg_addr; + u32 disable_irq; + struct pv_ppgtt_update pv_ppgtt; +}; + #define VGPU_PVMMIO(vgpu) vgpu_vreg_t(vgpu, vgtif_reg(enable_pvmmio)) /* @@ -121,8 +139,12 @@ struct vgt_if { u32 execlist_context_descriptor_lo; u32 execlist_context_descriptor_hi; u32 enable_pvmmio; + struct { + u32 lo; + u32 hi; + } shared_page_gpa; - u32 rsv7[0x200 - 25]; /* pad to one page */ + u32 rsv7[0x200 - 27]; /* pad to one page */ } __packed; #define vgtif_reg(x) \ diff --git a/drivers/gpu/drm/i915/i915_vgpu.c b/drivers/gpu/drm/i915/i915_vgpu.c index 907bbd2..609eefe 100644 --- a/drivers/gpu/drm/i915/i915_vgpu.c +++ b/drivers/gpu/drm/i915/i915_vgpu.c @@ -62,6 +62,7 @@ void i915_check_vgpu(struct drm_i915_private *dev_priv) { u64 magic; u16 version_major; + u64 shared_page_gpa; BUILD_BUG_ON(sizeof(struct vgt_if) != VGT_PVINFO_SIZE); @@ -91,7 +92,23 @@ void i915_check_vgpu(struct drm_i915_private *dev_priv) dev_priv->vgpu.pv_caps); dev_priv->vgpu.pv_caps = __raw_i915_read32(dev_priv, vgtif_reg(enable_pvmmio)); - + if (intel_vgpu_active(dev_priv) && dev_priv->vgpu.pv_caps) { + dev_priv->vgpu.shared_page = (struct gvt_shared_page *) + get_zeroed_page(GFP_KERNEL); + if (!dev_priv->vgpu.shared_page) { + DRM_ERROR("out of memory for shared page memory\n"); + return; + } + shared_page_gpa = __pa(dev_priv->vgpu.shared_page); + __raw_i915_write32(dev_priv, vgtif_reg(shared_page_gpa.lo), + lower_32_bits(shared_page_gpa)); + __raw_i915_write32(dev_priv, vgtif_reg(shared_page_gpa.hi), + upper_32_bits(shared_page_gpa)); + + spin_lock_init(&dev_priv->vgpu.shared_page_lock); + + DRM_INFO("VGPU shared page enabled\n"); + } DRM_INFO("Virtual GPU for Intel GVT-g detected with pvmmio 0x%x\n", dev_priv->vgpu.pv_caps); }