Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp347017imm; Thu, 11 Oct 2018 22:19:55 -0700 (PDT) X-Google-Smtp-Source: ACcGV61Gj+qIbpeSBE9S3U7a56AgLvYvpq7//XFgZyRj1tNVn6+kfnXZ/wvjlAyiseETgqd2WdyH X-Received: by 2002:a17:902:4225:: with SMTP id g34-v6mr4464048pld.161.1539321594979; Thu, 11 Oct 2018 22:19:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539321594; cv=none; d=google.com; s=arc-20160816; b=BWEXuLEPCJr+cgnBRsChGDUaRUBwoSt7qNxNpAosnAGZvRmrf03ZDp5sUQXuwnCxDB kMfYcu63KUT7F6ZC6VlFy4D1l6or9x4tCFaLyxuijtIeLzvc9yVNC0KGcjycJ55SV7+H kbTmJ1gNVv3py0UflczBOLgQ1hbvU9yZIehp8+U1AkJAIwoEAhjVwpCLhLCsNDHs4ovh fVousdI+Antw6ByNLwi9PZrd3vtlajnIQOa9h9alsrR1u31jiejbxrVCwyidqSiReyyC FrsJvQ3px8cdT9glwRJWN9Wa2JWBinDQ+wZWoDBtUvwrfDiamsy6ZyNpOi4Ta1SN0yWI 4s6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=S0BPebGJcVISZ4cRqAYhlThaSP0PV/XcO1R3MsROTE0=; b=aAmYroahpAoMkWWhcnRWjEtp1Qw5JKNEFLSkllvv0syfqHDSALKSN3X+uJddFWaoUe i+6bYOZeLfxCFvJUp8PDFNO1hAlcrnBQXZLHlkYTpufaZFpDdqOwLttVgXDQfPQV36CV 3SQl3Y0uTcw2rW4Hm208ZNa78MlVD/A6VaTTaLmTMZ8ML8wnD/DaXaD3yCP23KDdTjcW tuSt89tyxB7x7So9vepztpbE9iixsp4xixBAd0AjML6xqAx56sxuKU60bggUnt0xBEnu zLRxIJFoYZTDk+y5160b7k9ZwGuZOgj7Peiu/1UKJyXnPZK65vISBMnUzZTx4lsK4QyF jasQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k22-v6si121587pgh.340.2018.10.11.22.19.40; Thu, 11 Oct 2018 22:19:54 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727640AbeJLMtm (ORCPT + 99 others); Fri, 12 Oct 2018 08:49:42 -0400 Received: from mga11.intel.com ([192.55.52.93]:62493 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726969AbeJLMtl (ORCPT ); Fri, 12 Oct 2018 08:49:41 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Oct 2018 22:19:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,371,1534834800"; d="scan'208";a="80842257" Received: from allen-box.sh.intel.com ([10.239.161.122]) by orsmga008.jf.intel.com with ESMTP; 11 Oct 2018 22:18:59 -0700 From: Lu Baolu To: Joerg Roedel , David Woodhouse , Alex Williamson , Kirti Wankhede Cc: ashok.raj@intel.com, sanjay.k.kumar@intel.com, jacob.jun.pan@intel.com, kevin.tian@intel.com, Jean-Philippe Brucker , yi.l.liu@intel.com, yi.y.sun@intel.com, peterx@redhat.com, tiwei.bie@intel.com, iommu@lists.linux-foundation.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Lu Baolu , Jacob Pan Subject: [PATCH v3 6/8] vfio/mdev: Add iommu place holders in mdev_device Date: Fri, 12 Oct 2018 13:16:30 +0800 Message-Id: <20181012051632.26064-7-baolu.lu@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181012051632.26064-1-baolu.lu@linux.intel.com> References: <20181012051632.26064-1-baolu.lu@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A parent device might create different types of mediated devices. For example, a mediated device could be created by the parent device with full isolation and protection provided by the IOMMU. One usage case could be found on Intel platforms where a mediated device is an assignable subset of a PCI, the DMA requests on behalf of it are all tagged with a PASID. Since IOMMU supports PASID-granular translations (scalable mode in vt-d 3.0), this mediated device could be individually protected and isolated by an IOMMU. This patch adds two new members in struct mdev_device: * iommu_device - This, if set, indicates that the mediated device could be fully isolated and protected by IOMMU via attaching an iommu domain to this device. If empty, it indicates using vendor defined isolation. * iommu_domain - This is a place holder for an iommu domain. A domain could be store here for later use once it has been attached to the iommu_device of this mdev. Below helpers are added to set and get above iommu device and iommu domain pointers. * mdev_set/get_iommu_device(dev, iommu_device) - Set or get the iommu device which represents this mdev in IOMMU's device scope. Drivers don't need to set the iommu device if it uses vendor defined isolation. * mdev_set/get_iommu_domain(domain) - A iommu domain which has been attached to the iommu device in order to protect and isolate the mediated device will be kept in the mdev data structure and could be retrieved later. Cc: Ashok Raj Cc: Jacob Pan Cc: Kevin Tian Cc: Liu Yi L Suggested-by: Kevin Tian Suggested-by: Alex Williamson Signed-off-by: Lu Baolu --- drivers/vfio/mdev/mdev_core.c | 36 ++++++++++++++++++++++++++++++++ drivers/vfio/mdev/mdev_private.h | 2 ++ include/linux/mdev.h | 23 ++++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c index 0212f0ee8aea..5119809225c5 100644 --- a/drivers/vfio/mdev/mdev_core.c +++ b/drivers/vfio/mdev/mdev_core.c @@ -390,6 +390,42 @@ int mdev_device_remove(struct device *dev, bool force_remove) return 0; } +int mdev_set_iommu_device(struct device *dev, struct device *iommu_device) +{ + struct mdev_device *mdev = to_mdev_device(dev); + + mdev->iommu_device = iommu_device; + + return 0; +} +EXPORT_SYMBOL(mdev_set_iommu_device); + +struct device *mdev_get_iommu_device(struct device *dev) +{ + struct mdev_device *mdev = to_mdev_device(dev); + + return mdev->iommu_device; +} +EXPORT_SYMBOL(mdev_get_iommu_device); + +int mdev_set_iommu_domain(struct device *dev, void *domain) +{ + struct mdev_device *mdev = to_mdev_device(dev); + + mdev->iommu_domain = domain; + + return 0; +} +EXPORT_SYMBOL(mdev_set_iommu_domain); + +void *mdev_get_iommu_domain(struct device *dev) +{ + struct mdev_device *mdev = to_mdev_device(dev); + + return mdev->iommu_domain; +} +EXPORT_SYMBOL(mdev_get_iommu_domain); + static int __init mdev_init(void) { return mdev_bus_register(); diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_private.h index b5819b7d7ef7..c01518068e84 100644 --- a/drivers/vfio/mdev/mdev_private.h +++ b/drivers/vfio/mdev/mdev_private.h @@ -34,6 +34,8 @@ struct mdev_device { struct list_head next; struct kobject *type_kobj; bool active; + struct device *iommu_device; + void *iommu_domain; }; #define to_mdev_device(dev) container_of(dev, struct mdev_device, dev) diff --git a/include/linux/mdev.h b/include/linux/mdev.h index b6e048e1045f..c46777d3e568 100644 --- a/include/linux/mdev.h +++ b/include/linux/mdev.h @@ -14,6 +14,29 @@ #define MDEV_H struct mdev_device; +struct iommu_domain; + +/* + * Called by the parent device driver to set the PCI device which represents + * this mdev in iommu protection scope. By default, the iommu device is NULL, + * that indicates using vendor defined isolation. + * + * @dev: the mediated device that iommu will isolate. + * @iommu_device: a pci device which represents the iommu for @dev. + * + * Return 0 for success, otherwise negative error value. + */ +int mdev_set_iommu_device(struct device *dev, struct device *iommu_device); + +struct device *mdev_get_iommu_device(struct device *dev); + +/* + * Called by vfio iommu modules to save the iommu domain after a domain being + * attached to the mediated device. + */ +int mdev_set_iommu_domain(struct device *dev, void *domain); + +void *mdev_get_iommu_domain(struct device *dev); /** * struct mdev_parent_ops - Structure to be registered for each parent device to -- 2.17.1