All of lore.kernel.org
 help / color / mirror / Atom feed
From: Baptiste Reynal <b.reynal@virtualopensystems.com>
To: kvmarm@lists.cs.columbia.edu, iommu@lists.linux-fundation.org,
	alex.williamson@redhat.com
Cc: will.deacon@arm.com, tech@virtualopensystems.com,
	christoffer.dall@linaro.org, eric.auger@linaro.org,
	kim.phillips@freescale.com, marc.zyngier@arm.com,
	Antonios Motakis <a.motakis@virtualopensystems.com>,
	Baptiste Reynal <b.reynal@virtualopensystems.com>,
	kvm@vger.kernel.org (open list:VFIO DRIVER),
	linux-kernel@vger.kernel.org (open list)
Subject: [PATCH v12 07/18] vfio/platform: support MMAP of MMIO regions
Date: Wed, 21 Jan 2015 13:49:55 +0100	[thread overview]
Message-ID: <1421844606-24751-8-git-send-email-b.reynal@virtualopensystems.com> (raw)
In-Reply-To: <1421844606-24751-1-git-send-email-b.reynal@virtualopensystems.com>

From: Antonios Motakis <a.motakis@virtualopensystems.com>

Allow to memory map the MMIO regions of the device so userspace can
directly access them. PIO regions are not being handled at this point.

Signed-off-by: Antonios Motakis <a.motakis@virtualopensystems.com>
---
 drivers/vfio/platform/vfio_platform_common.c | 65 ++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/drivers/vfio/platform/vfio_platform_common.c b/drivers/vfio/platform/vfio_platform_common.c
index fda4c30..6bf78ee 100644
--- a/drivers/vfio/platform/vfio_platform_common.c
+++ b/drivers/vfio/platform/vfio_platform_common.c
@@ -54,6 +54,16 @@ static int vfio_platform_regions_init(struct vfio_platform_device *vdev)
 			if (!(res->flags & IORESOURCE_READONLY))
 				vdev->regions[i].flags |=
 					VFIO_REGION_INFO_FLAG_WRITE;
+
+			/*
+			 * Only regions addressed with PAGE granularity may be
+			 * MMAPed securely.
+			 */
+			if (!(vdev->regions[i].addr & ~PAGE_MASK) &&
+					!(vdev->regions[i].size & ~PAGE_MASK))
+				vdev->regions[i].flags |=
+					VFIO_REGION_INFO_FLAG_MMAP;
+
 			break;
 		case IORESOURCE_IO:
 			vdev->regions[i].type = VFIO_PLATFORM_REGION_TYPE_PIO;
@@ -333,8 +343,63 @@ static ssize_t vfio_platform_write(void *device_data, const char __user *buf,
 	return -EINVAL;
 }
 
+static int vfio_platform_mmap_mmio(struct vfio_platform_region region,
+				   struct vm_area_struct *vma)
+{
+	u64 req_len, pgoff, req_start;
+
+	req_len = vma->vm_end - vma->vm_start;
+	pgoff = vma->vm_pgoff &
+		((1U << (VFIO_PLATFORM_OFFSET_SHIFT - PAGE_SHIFT)) - 1);
+	req_start = pgoff << PAGE_SHIFT;
+
+	if (region.size < PAGE_SIZE || req_start + req_len > region.size)
+		return -EINVAL;
+
+	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+	vma->vm_pgoff = (region.addr >> PAGE_SHIFT) + pgoff;
+
+	return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
+			       req_len, vma->vm_page_prot);
+}
+
 static int vfio_platform_mmap(void *device_data, struct vm_area_struct *vma)
 {
+	struct vfio_platform_device *vdev = device_data;
+	unsigned int index;
+
+	index = vma->vm_pgoff >> (VFIO_PLATFORM_OFFSET_SHIFT - PAGE_SHIFT);
+
+	if (vma->vm_end < vma->vm_start)
+		return -EINVAL;
+	if (!(vma->vm_flags & VM_SHARED))
+		return -EINVAL;
+	if (index >= vdev->num_regions)
+		return -EINVAL;
+	if (vma->vm_start & ~PAGE_MASK)
+		return -EINVAL;
+	if (vma->vm_end & ~PAGE_MASK)
+		return -EINVAL;
+
+	if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_MMAP))
+		return -EINVAL;
+
+	if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_READ)
+			&& (vma->vm_flags & VM_READ))
+		return -EINVAL;
+
+	if (!(vdev->regions[index].flags & VFIO_REGION_INFO_FLAG_WRITE)
+			&& (vma->vm_flags & VM_WRITE))
+		return -EINVAL;
+
+	vma->vm_private_data = vdev;
+
+	if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_MMIO)
+		return vfio_platform_mmap_mmio(vdev->regions[index], vma);
+
+	else if (vdev->regions[index].type & VFIO_PLATFORM_REGION_TYPE_PIO)
+		return -EINVAL; /* not implemented */
+
 	return -EINVAL;
 }
 
-- 
2.2.2


  parent reply	other threads:[~2015-01-21 12:52 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1421844606-24751-1-git-send-email-b.reynal@virtualopensystems.com>
2015-01-21 12:49 ` [PATCH v12 01/18] vfio/platform: initial skeleton of VFIO support for platform devices Baptiste Reynal
2015-01-21 12:49 ` [PATCH v12 02/18] vfio: platform: probe to devices on the platform bus Baptiste Reynal
2015-01-21 12:49   ` Baptiste Reynal
2015-01-21 12:49 ` [PATCH v12 03/18] vfio: platform: add the VFIO PLATFORM module to Kconfig Baptiste Reynal
2015-01-21 12:49 ` [PATCH v12 04/18] vfio/platform: return info for bound device Baptiste Reynal
2015-01-21 12:49 ` [PATCH v12 05/18] vfio/platform: return info for device memory mapped IO regions Baptiste Reynal
2015-01-21 12:49 ` [PATCH v12 06/18] vfio/platform: read and write support for the device fd Baptiste Reynal
2015-01-21 12:49 ` Baptiste Reynal [this message]
2015-01-21 12:49 ` [PATCH v12 08/18] vfio/platform: return IRQ info Baptiste Reynal
2015-01-21 12:49 ` [PATCH v12 09/18] vfio/platform: initial interrupts support code Baptiste Reynal
2015-01-21 12:49 ` [PATCH v12 10/18] vfio/platform: trigger an interrupt via eventfd Baptiste Reynal
2015-01-21 23:26   ` Alex Williamson
2015-01-21 12:49 ` [PATCH v12 11/18] vfio/platform: support for level sensitive interrupts Baptiste Reynal
2015-01-21 12:50 ` [PATCH v12 12/18] vfio: add a vfio_ prefix to virqfd_enable and virqfd_disable and export Baptiste Reynal
2015-01-21 23:25   ` Alex Williamson
2015-01-21 12:50 ` [PATCH v12 13/18] vfio: virqfd: rename vfio_pci_virqfd_init and vfio_pci_virqfd_exit Baptiste Reynal
2015-01-21 12:50 ` [PATCH v12 14/18] vfio: add local lock for virqfd instead of depending on VFIO PCI Baptiste Reynal
2015-01-21 12:50 ` [PATCH v12 15/18] vfio: pass an opaque pointer on virqfd initialization Baptiste Reynal
2015-01-21 12:50 ` [PATCH v12 16/18] vfio: move eventfd support code for VFIO_PCI to a separate file Baptiste Reynal
2015-01-21 12:50 ` [PATCH v12 17/18] vfio: initialize the virqfd workqueue in VFIO generic code Baptiste Reynal
2015-01-21 12:50 ` [PATCH v12 18/18] vfio/platform: implement IRQ masking/unmasking via an eventfd Baptiste Reynal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1421844606-24751-8-git-send-email-b.reynal@virtualopensystems.com \
    --to=b.reynal@virtualopensystems.com \
    --cc=a.motakis@virtualopensystems.com \
    --cc=alex.williamson@redhat.com \
    --cc=christoffer.dall@linaro.org \
    --cc=eric.auger@linaro.org \
    --cc=iommu@lists.linux-fundation.org \
    --cc=kim.phillips@freescale.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=tech@virtualopensystems.com \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.