Commit 1e6aaae9 authored by Jacob Pan's avatar Jacob Pan Committed by Joerg Roedel

iommu/uapi: Add argsz for user filled data

As IOMMU UAPI gets extended, user data size may increase. To support
backward compatibiliy, this patch introduces a size field to each UAPI
data structures. It is *always* the responsibility for the user to fill in
the correct size. Padding fields are adjusted to ensure 8 byte alignment.

Specific scenarios for user data handling are documented in:
Documentation/userspace-api/iommu.rst

As there is no current users of the API, struct version is not
incremented.
Signed-off-by: default avatarLiu Yi L <yi.l.liu@intel.com>
Signed-off-by: default avatarJacob Pan <jacob.jun.pan@linux.intel.com>
Reviewed-by: default avatarEric Auger <eric.auger@redhat.com>
Link: https://lore.kernel.org/r/1601051567-54787-3-git-send-email-jacob.jun.pan@linux.intel.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent d0023e3e
...@@ -139,6 +139,7 @@ enum iommu_page_response_code { ...@@ -139,6 +139,7 @@ enum iommu_page_response_code {
/** /**
* struct iommu_page_response - Generic page response information * struct iommu_page_response - Generic page response information
* @argsz: User filled size of this data
* @version: API version of this structure * @version: API version of this structure
* @flags: encodes whether the corresponding fields are valid * @flags: encodes whether the corresponding fields are valid
* (IOMMU_FAULT_PAGE_RESPONSE_* values) * (IOMMU_FAULT_PAGE_RESPONSE_* values)
...@@ -147,6 +148,7 @@ enum iommu_page_response_code { ...@@ -147,6 +148,7 @@ enum iommu_page_response_code {
* @code: response code from &enum iommu_page_response_code * @code: response code from &enum iommu_page_response_code
*/ */
struct iommu_page_response { struct iommu_page_response {
__u32 argsz;
#define IOMMU_PAGE_RESP_VERSION_1 1 #define IOMMU_PAGE_RESP_VERSION_1 1
__u32 version; __u32 version;
#define IOMMU_PAGE_RESP_PASID_VALID (1 << 0) #define IOMMU_PAGE_RESP_PASID_VALID (1 << 0)
...@@ -222,6 +224,7 @@ struct iommu_inv_pasid_info { ...@@ -222,6 +224,7 @@ struct iommu_inv_pasid_info {
/** /**
* struct iommu_cache_invalidate_info - First level/stage invalidation * struct iommu_cache_invalidate_info - First level/stage invalidation
* information * information
* @argsz: User filled size of this data
* @version: API version of this structure * @version: API version of this structure
* @cache: bitfield that allows to select which caches to invalidate * @cache: bitfield that allows to select which caches to invalidate
* @granularity: defines the lowest granularity used for the invalidation: * @granularity: defines the lowest granularity used for the invalidation:
...@@ -250,6 +253,7 @@ struct iommu_inv_pasid_info { ...@@ -250,6 +253,7 @@ struct iommu_inv_pasid_info {
* must support the used granularity. * must support the used granularity.
*/ */
struct iommu_cache_invalidate_info { struct iommu_cache_invalidate_info {
__u32 argsz;
#define IOMMU_CACHE_INVALIDATE_INFO_VERSION_1 1 #define IOMMU_CACHE_INVALIDATE_INFO_VERSION_1 1
__u32 version; __u32 version;
/* IOMMU paging structure cache */ /* IOMMU paging structure cache */
...@@ -259,7 +263,7 @@ struct iommu_cache_invalidate_info { ...@@ -259,7 +263,7 @@ struct iommu_cache_invalidate_info {
#define IOMMU_CACHE_INV_TYPE_NR (3) #define IOMMU_CACHE_INV_TYPE_NR (3)
__u8 cache; __u8 cache;
__u8 granularity; __u8 granularity;
__u8 padding[2]; __u8 padding[6];
union { union {
struct iommu_inv_pasid_info pasid_info; struct iommu_inv_pasid_info pasid_info;
struct iommu_inv_addr_info addr_info; struct iommu_inv_addr_info addr_info;
...@@ -296,6 +300,7 @@ struct iommu_gpasid_bind_data_vtd { ...@@ -296,6 +300,7 @@ struct iommu_gpasid_bind_data_vtd {
/** /**
* struct iommu_gpasid_bind_data - Information about device and guest PASID binding * struct iommu_gpasid_bind_data - Information about device and guest PASID binding
* @argsz: User filled size of this data
* @version: Version of this data structure * @version: Version of this data structure
* @format: PASID table entry format * @format: PASID table entry format
* @flags: Additional information on guest bind request * @flags: Additional information on guest bind request
...@@ -313,17 +318,18 @@ struct iommu_gpasid_bind_data_vtd { ...@@ -313,17 +318,18 @@ struct iommu_gpasid_bind_data_vtd {
* PASID to host PASID based on this bind data. * PASID to host PASID based on this bind data.
*/ */
struct iommu_gpasid_bind_data { struct iommu_gpasid_bind_data {
__u32 argsz;
#define IOMMU_GPASID_BIND_VERSION_1 1 #define IOMMU_GPASID_BIND_VERSION_1 1
__u32 version; __u32 version;
#define IOMMU_PASID_FORMAT_INTEL_VTD 1 #define IOMMU_PASID_FORMAT_INTEL_VTD 1
__u32 format; __u32 format;
__u32 addr_width;
#define IOMMU_SVA_GPASID_VAL (1 << 0) /* guest PASID valid */ #define IOMMU_SVA_GPASID_VAL (1 << 0) /* guest PASID valid */
__u64 flags; __u64 flags;
__u64 gpgd; __u64 gpgd;
__u64 hpasid; __u64 hpasid;
__u64 gpasid; __u64 gpasid;
__u32 addr_width; __u8 padding[8];
__u8 padding[12];
/* Vendor specific data */ /* Vendor specific data */
union { union {
struct iommu_gpasid_bind_data_vtd vtd; struct iommu_gpasid_bind_data_vtd vtd;
......
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