Commit adfd3738 authored by Eric Auger's avatar Eric Auger Committed by Joerg Roedel

iommu: Introduce IOMMU_RESV_DIRECT_RELAXABLE reserved memory regions

Introduce a new type for reserved region. This corresponds
to directly mapped regions which are known to be relaxable
in some specific conditions, such as device assignment use
case. Well known examples are those used by USB controllers
providing PS/2 keyboard emulation for pre-boot BIOS and
early BOOT or RMRRs associated to IGD working in legacy mode.

Since commit c875d2c1 ("iommu/vt-d: Exclude devices using RMRRs
from IOMMU API domains") and commit 18436afd ("iommu/vt-d: Allow
RMRR on graphics devices too"), those regions are currently
considered "safe" with respect to device assignment use case
which requires a non direct mapping at IOMMU physical level
(RAM GPA -> HPA mapping).

Those RMRRs currently exist and sometimes the device is
attempting to access it but this has not been considered
an issue until now.

However at the moment, iommu_get_group_resv_regions() is
not able to make any difference between directly mapped
regions: those which must be absolutely enforced and those
like above ones which are known as relaxable.

This is a blocker for reporting severe conflicts between
non relaxable RMRRs (like MSI doorbells) and guest GPA space.

With this new reserved region type we will be able to use
iommu_get_group_resv_regions() to enumerate the IOVA space
that is usable through the IOMMU API without introducing
regressions with respect to existing device assignment
use cases (USB and IGD).
Signed-off-by: default avatarEric Auger <eric.auger@redhat.com>
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 3855ba2d
...@@ -24,3 +24,12 @@ Description: /sys/kernel/iommu_groups/reserved_regions list IOVA ...@@ -24,3 +24,12 @@ Description: /sys/kernel/iommu_groups/reserved_regions list IOVA
region is described on a single line: the 1st field is region is described on a single line: the 1st field is
the base IOVA, the second is the end IOVA and the third the base IOVA, the second is the end IOVA and the third
field describes the type of the region. field describes the type of the region.
What: /sys/kernel/iommu_groups/reserved_regions
Date: June 2019
KernelVersion: v5.3
Contact: Eric Auger <eric.auger@redhat.com>
Description: In case an RMRR is used only by graphics or USB devices
it is now exposed as "direct-relaxable" instead of "direct".
In device assignment use case, for instance, those RMRR
are considered to be relaxable and safe.
...@@ -73,10 +73,11 @@ struct iommu_group_attribute { ...@@ -73,10 +73,11 @@ struct iommu_group_attribute {
}; };
static const char * const iommu_group_resv_type_string[] = { static const char * const iommu_group_resv_type_string[] = {
[IOMMU_RESV_DIRECT] = "direct", [IOMMU_RESV_DIRECT] = "direct",
[IOMMU_RESV_RESERVED] = "reserved", [IOMMU_RESV_DIRECT_RELAXABLE] = "direct-relaxable",
[IOMMU_RESV_MSI] = "msi", [IOMMU_RESV_RESERVED] = "reserved",
[IOMMU_RESV_SW_MSI] = "msi", [IOMMU_RESV_MSI] = "msi",
[IOMMU_RESV_SW_MSI] = "msi",
}; };
#define IOMMU_GROUP_ATTR(_name, _mode, _show, _store) \ #define IOMMU_GROUP_ATTR(_name, _mode, _show, _store) \
...@@ -575,7 +576,8 @@ static int iommu_group_create_direct_mappings(struct iommu_group *group, ...@@ -575,7 +576,8 @@ static int iommu_group_create_direct_mappings(struct iommu_group *group,
start = ALIGN(entry->start, pg_size); start = ALIGN(entry->start, pg_size);
end = ALIGN(entry->start + entry->length, pg_size); end = ALIGN(entry->start + entry->length, pg_size);
if (entry->type != IOMMU_RESV_DIRECT) if (entry->type != IOMMU_RESV_DIRECT &&
entry->type != IOMMU_RESV_DIRECT_RELAXABLE)
continue; continue;
for (addr = start; addr < end; addr += pg_size) { for (addr = start; addr < end; addr += pg_size) {
......
...@@ -135,6 +135,12 @@ enum iommu_attr { ...@@ -135,6 +135,12 @@ enum iommu_attr {
enum iommu_resv_type { enum iommu_resv_type {
/* Memory regions which must be mapped 1:1 at all times */ /* Memory regions which must be mapped 1:1 at all times */
IOMMU_RESV_DIRECT, IOMMU_RESV_DIRECT,
/*
* Memory regions which are advertised to be 1:1 but are
* commonly considered relaxable in some conditions,
* for instance in device assignment use case (USB, Graphics)
*/
IOMMU_RESV_DIRECT_RELAXABLE,
/* Arbitrary "never map this or give it to a device" address ranges */ /* Arbitrary "never map this or give it to a device" address ranges */
IOMMU_RESV_RESERVED, IOMMU_RESV_RESERVED,
/* Hardware MSI region (untranslated) */ /* Hardware MSI region (untranslated) */
......
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