Path: csiph.com!eternal-september.org!feeder.eternal-september.org!aioe.org!bofh.it!news.nic.it!robomod From: Baptiste Reynal Newsgroups: linux.kernel Subject: [RFC PATCH v5 3/3] vfio: platform: return device properties as arrays of unsigned integers Date: Wed, 30 Sep 2015 11:20:02 +0200 Message-ID: References: X-Original-To: kvmarm@lists.cs.columbia.edu, iommu@lists.linux-foundation.org, alex.williamson@redhat.com, christoffer.dall@linaro.org, eric.auger@linaro.org X-Google-Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MGqGKsxYteIVYtXkig+WPfaYg9LKjoJI9CzA6b/VsJ0=; b=hvO4yN1PBoEjsNUenocHyR7aNlMkA288FYeQMBRDEz8hDYJDZYtI8xGRZeuBrwAeo8 StIYFnlH5lmYHdTI/AZJzB5QBuepQmbvx6iT8tU0wP0HF3OyyOfN3j5QMwlrNOuy7mJp aNGum6/GFgGq1HSPHDbA6O/qx1BjEuTh+ATkAlSqIQeaqz/CVOxS3vt6DP3CIZ+Zvo9E BkADhiSyg91qcFdJJ/Fk81pxpxI0biQCGfjcP72UNaHxvEOitEsx9Xe0SQ/VLNmmULwf dLLejPUaIX6ae6Fg0G9829iSLTAWaKshnMEV2J9Hnrn4q/kDVVjRuvwp+CytsE1sYPOp yJXQ== X-Gm-Message-State: ALoCoQlxCmBT6fFEdoRD7khWsnazCvIFHXtIiaqT7W95t2swiClS819R5zxEm/vVfp4UjOKhq3co X-Received: by 10.180.182.84 with SMTP id ec20mr3576950wic.42.1443604163269; Wed, 30 Sep 2015 02:09:23 -0700 (PDT) X-Mailer: git-send-email 2.6.0 Sender: robomod@news.nic.it List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Approved: robomod@news.nic.it Lines: 97 Organization: linux.* mail to news gateway X-Original-Cc: tech@virtualopensystems.com, kvm@vger.kernel.org (open list:VFIO PLATFORM DRIVER), linux-kernel@vger.kernel.org (open list) X-Original-Date: Wed, 30 Sep 2015 11:09:07 +0200 X-Original-Message-ID: <1443604149-3242-3-git-send-email-b.reynal@virtualopensystems.com> X-Original-References: <1443604149-3242-1-git-send-email-b.reynal@virtualopensystems.com> X-Original-Sender: linux-kernel-owner@vger.kernel.org Xref: csiph.com linux.kernel:1235927 From: Antonios Motakis Certain properties of a device are accessible as an array of unsigned integers, either u64, u32, u16, or u8. Let the VFIO user query this type of device properties. Signed-off-by: Antonios Motakis Signed-off-by: Baptiste Reynal --- v4 -> v5: - fix return error when the buffer size is too small --- drivers/vfio/platform/properties.c | 62 +++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/drivers/vfio/platform/properties.c b/drivers/vfio/platform/properties.c index 212755f..a4b6955 100644 --- a/drivers/vfio/platform/properties.c +++ b/drivers/vfio/platform/properties.c @@ -70,7 +70,67 @@ static int dev_property_get_uint(struct device *dev, char *name, uint32_t type, unsigned *lenp, void __user *datap, unsigned long datasz) { - return -EINVAL; + int ret, n; + u8 *out; + size_t sz; + int (*func)(const struct device *, const char *, void *, size_t) + = NULL; + + switch (type) { + case VFIO_DEV_PROPERTY_TYPE_U64: + sz = sizeof(u64); + func = (int (*)(const struct device *, + const char *, void *, size_t)) + device_property_read_u64_array; + break; + case VFIO_DEV_PROPERTY_TYPE_U32: + sz = sizeof(u32); + func = (int (*)(const struct device *, + const char *, void *, size_t)) + device_property_read_u32_array; + break; + case VFIO_DEV_PROPERTY_TYPE_U16: + sz = sizeof(u16); + func = (int (*)(const struct device *, + const char *, void *, size_t)) + device_property_read_u16_array; + break; + case VFIO_DEV_PROPERTY_TYPE_U8: + sz = sizeof(u8); + func = (int (*)(const struct device *, + const char *, void *, size_t)) + device_property_read_u8_array; + break; + + default: + return -EINVAL; + } + + /* get size of array */ + n = func(dev, name, NULL, 0); + if (n < 0) + return n; + + if (lenp) + *lenp = n * sz; + + if (n * sz > datasz) + return -ENOSPC; + + out = kcalloc(n, sz, GFP_KERNEL); + if (!out) + return -ENOMEM; + + ret = func(dev, name, out, n); + if (ret) + goto out; + + if (copy_to_user(datap, out, n * sz)) + ret = -EFAULT; + +out: + kfree(out); + return ret; } int vfio_platform_dev_properties(struct device *dev, -- 2.6.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/