memory: Add interface to set iommu page size mask
Allow to set the page size mask supported by an iommu memory region. This enables a vIOMMU to communicate the page size granule supported by an assigned device, on hosts that use page sizes greater than 4kB. Acked-by: Peter Xu <peterx@redhat.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Bharat Bhushan <bbhushan2@marvell.com> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Message-Id: <20201030180510.747225-8-jean-philippe@linaro.org> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
6978bfaa68
commit
457f8cbbd8
|
@ -397,6 +397,32 @@ struct IOMMUMemoryRegionClass {
|
||||||
* @iommu: the IOMMUMemoryRegion
|
* @iommu: the IOMMUMemoryRegion
|
||||||
*/
|
*/
|
||||||
int (*num_indexes)(IOMMUMemoryRegion *iommu);
|
int (*num_indexes)(IOMMUMemoryRegion *iommu);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @iommu_set_page_size_mask:
|
||||||
|
*
|
||||||
|
* Restrict the page size mask that can be supported with a given IOMMU
|
||||||
|
* memory region. Used for example to propagate host physical IOMMU page
|
||||||
|
* size mask limitations to the virtual IOMMU.
|
||||||
|
*
|
||||||
|
* Optional method: if this method is not provided, then the default global
|
||||||
|
* page mask is used.
|
||||||
|
*
|
||||||
|
* @iommu: the IOMMUMemoryRegion
|
||||||
|
*
|
||||||
|
* @page_size_mask: a bitmask of supported page sizes. At least one bit,
|
||||||
|
* representing the smallest page size, must be set. Additional set bits
|
||||||
|
* represent supported block sizes. For example a host physical IOMMU that
|
||||||
|
* uses page tables with a page size of 4kB, and supports 2MB and 4GB
|
||||||
|
* blocks, will set mask 0x40201000. A granule of 4kB with indiscriminate
|
||||||
|
* block sizes is specified with mask 0xfffffffffffff000.
|
||||||
|
*
|
||||||
|
* Returns 0 on success, or a negative error. In case of failure, the error
|
||||||
|
* object must be created.
|
||||||
|
*/
|
||||||
|
int (*iommu_set_page_size_mask)(IOMMUMemoryRegion *iommu,
|
||||||
|
uint64_t page_size_mask,
|
||||||
|
Error **errp);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct CoalescedMemoryRange CoalescedMemoryRange;
|
typedef struct CoalescedMemoryRange CoalescedMemoryRange;
|
||||||
|
@ -1409,6 +1435,18 @@ int memory_region_iommu_attrs_to_index(IOMMUMemoryRegion *iommu_mr,
|
||||||
*/
|
*/
|
||||||
int memory_region_iommu_num_indexes(IOMMUMemoryRegion *iommu_mr);
|
int memory_region_iommu_num_indexes(IOMMUMemoryRegion *iommu_mr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* memory_region_iommu_set_page_size_mask: set the supported page
|
||||||
|
* sizes for a given IOMMU memory region
|
||||||
|
*
|
||||||
|
* @iommu_mr: IOMMU memory region
|
||||||
|
* @page_size_mask: supported page size mask
|
||||||
|
* @errp: pointer to Error*, to store an error if it happens.
|
||||||
|
*/
|
||||||
|
int memory_region_iommu_set_page_size_mask(IOMMUMemoryRegion *iommu_mr,
|
||||||
|
uint64_t page_size_mask,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* memory_region_name: get a memory region's name
|
* memory_region_name: get a memory region's name
|
||||||
*
|
*
|
||||||
|
|
|
@ -1841,6 +1841,19 @@ static int memory_region_update_iommu_notify_flags(IOMMUMemoryRegion *iommu_mr,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int memory_region_iommu_set_page_size_mask(IOMMUMemoryRegion *iommu_mr,
|
||||||
|
uint64_t page_size_mask,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_GET_CLASS(iommu_mr);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (imrc->iommu_set_page_size_mask) {
|
||||||
|
ret = imrc->iommu_set_page_size_mask(iommu_mr, page_size_mask, errp);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int memory_region_register_iommu_notifier(MemoryRegion *mr,
|
int memory_region_register_iommu_notifier(MemoryRegion *mr,
|
||||||
IOMMUNotifier *n, Error **errp)
|
IOMMUNotifier *n, Error **errp)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue