Received: by 10.213.65.68 with SMTP id h4csp1165489imn; Wed, 14 Mar 2018 11:31:08 -0700 (PDT) X-Google-Smtp-Source: AG47ELsBsfQMEJx/JCKHfI9fcVpCIBm4wo/nwSHUMIv2aSCt0aijEn+mvJSIECI2EamXd9vFVBh0 X-Received: by 10.98.201.194 with SMTP id l63mr5190451pfk.126.1521052268377; Wed, 14 Mar 2018 11:31:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521052268; cv=none; d=google.com; s=arc-20160816; b=DzLPWx7J6++gIFrrctkSk2WJ8HN3iun6BOdGGSfktLFVVQy+FPQTSzjAVYEFLG9zGI RjbBMLrII03Y5Z7RGVIeDswQzGn+wicxuqvZAdC02owMzU/OpmTRC3cTaSkEzbB83CTm hEVw5idNM5H42VYJIGXr120Edab1Qt/JT/25++SIkibSw6WxZp7lWz3YwRDRwDDXV+je Vkh08w867vYbk78KPkp4Cq5SB4+FQa1W69HSTjFNzQ/jHIXn7C42frMCxknNdr2yaJ+G 2bBbQHehZSyAFLjLLZXFeMDBbHlIHsFN0WTsO9FH3qD61YKJAoCp2iMe2f8qg/NLLuA0 3y0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:references:in-reply-to:date :subject:cc:to:from:arc-authentication-results; bh=QtXgCzzg7syfWbZ7kjuhprHi1/IlHAabhZOaKpHIH4I=; b=QxLzMeY8+v0xibRZCBnXRPz6LcTTyp28CEQ236P/Rdb34s4TTSY/CezwbsahrY/+7X rlRboHDUTHbpHfLYEK1mofPSDC2RSHNuhAvpQm0FAbWZEia6Qk2CK86+gywKWmq6Xm9k K+l+AN4zjC39wIFGx7WCs83W6sxFrChZ26wEB7u++7h5ATFcU5RaygrDTf9wsbu4tko6 hxao/pQ/BFDqPoGBldh+g83XRePbXXdNKy32vWK4CXDPh5xavTG8ZvaR11LuDSZx19u2 whJ/u4GdMn7giq33Y0ygQbET27HDbsPSnQkyStzf1onw7tJUyflan35CKB2AUlKDxPVy mOhA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g31-v6si2340487pld.714.2018.03.14.11.30.53; Wed, 14 Mar 2018 11:31:08 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752678AbeCNS0v (ORCPT + 99 others); Wed, 14 Mar 2018 14:26:51 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:58812 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752301AbeCNS0r (ORCPT ); Wed, 14 Mar 2018 14:26:47 -0400 Received: from pps.filterd (m0098420.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w2EIKHSx006467 for ; Wed, 14 Mar 2018 14:26:47 -0400 Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.152]) by mx0b-001b2d01.pphosted.com with ESMTP id 2gq88phr6m-1 (version=TLSv1.2 cipher=AES256-SHA256 bits=256 verify=NOT) for ; Wed, 14 Mar 2018 14:26:46 -0400 Received: from localhost by e34.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 14 Mar 2018 12:26:46 -0600 Received: from b03cxnp07029.gho.boulder.ibm.com (9.17.130.16) by e34.co.us.ibm.com (192.168.1.134) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 14 Mar 2018 12:26:41 -0600 Received: from b03ledav002.gho.boulder.ibm.com (b03ledav002.gho.boulder.ibm.com [9.17.130.233]) by b03cxnp07029.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w2EIQe5X11928058; Wed, 14 Mar 2018 11:26:40 -0700 Received: from b03ledav002.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 402A2136040; Wed, 14 Mar 2018 12:26:40 -0600 (MDT) Received: from localhost.localdomain (unknown [9.85.151.171]) by b03ledav002.gho.boulder.ibm.com (Postfix) with ESMTPS id A0A8213603A; Wed, 14 Mar 2018 12:26:37 -0600 (MDT) From: Tony Krowiak To: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: freude@de.ibm.com, schwidefsky@de.ibm.com, heiko.carstens@de.ibm.com, borntraeger@de.ibm.com, cohuck@redhat.com, kwankhede@nvidia.com, bjsdjshi@linux.vnet.ibm.com, pbonzini@redhat.com, alex.williamson@redhat.com, pmorel@linux.vnet.ibm.com, alifm@linux.vnet.ibm.com, mjrosato@linux.vnet.ibm.com, jjherne@linux.vnet.ibm.com, thuth@redhat.com, pasic@linux.vnet.ibm.com, berrange@redhat.com, fiuczy@linux.vnet.ibm.com, buendgen@de.ibm.com, akrowiak@linux.vnet.ibm.com Subject: [PATCH v3 10/14] s390: vfio-ap: sysfs interfaces to configure control domains Date: Wed, 14 Mar 2018 14:25:50 -0400 X-Mailer: git-send-email 1.7.1 In-Reply-To: <1521051954-25715-1-git-send-email-akrowiak@linux.vnet.ibm.com> References: <1521051954-25715-1-git-send-email-akrowiak@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18031418-0016-0000-0000-000008644F50 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00008674; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000254; SDB=6.01003025; UDB=6.00510424; IPR=6.00782355; MB=3.00020035; MTD=3.00000008; XFM=3.00000015; UTC=2018-03-14 18:26:44 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18031418-0017-0000-0000-00003DD7A007 Message-Id: <1521051954-25715-11-git-send-email-akrowiak@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2018-03-14_09:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1803140201 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Provides the sysfs interfaces for assigning AP control domains to and unassigning AP control domains from a mediated matrix device. The IDs of the AP control domains assigned to the mediated matrix device are stored in an AP domain mask (ADM). The bits in the ADM, from most significant to least significant bit, correspond to AP domain numbers 0 to 255. When a control domain is assigned, the bit corresponding its domain ID will be set in the ADM. Likewise, when a domain is unassigned, the bit corresponding to its domain ID will be cleared in the ADM. The relevant sysfs structures are: /sys/devices/vfio_ap ... [matrix] ...... [mdev_supported_types] ......... [vfio_ap-passthrough] ............ [devices] ...............[$uuid] .................. assign_control_domain .................. unassign_control_domain To assign a control domain to the $uuid mediated matrix device's ADM, write its domain number to the assign_control_domain file. To unassign a domain, write its domain number to the unassign_control_domain file. The domain number is specified using conventional semantics: If it begins with 0x the number will be parsed as a hexadecimal (case insensitive) number; otherwise, it will be parsed as a decimal number. For example, to assign control domain 173 (0xad) to the mediated matrix device $uuid: echo 173 > assign_control_domain or echo 0xad > assign_control_domain To unassign control domain 173 (0xad): echo 173 > unassign_control_domain or echo 0xad > unassign_control_domain The assignment will be rejected if the APQI exceeds the maximum value for an AP domain: * If the AP Extended Addressing (APXA) facility is installed, the max value is 255 * Else the max value is 15 Signed-off-by: Tony Krowiak --- arch/s390/include/asm/kvm-ap.h | 1 + drivers/s390/crypto/vfio_ap_ops.c | 107 +++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 0 deletions(-) diff --git a/arch/s390/include/asm/kvm-ap.h b/arch/s390/include/asm/kvm-ap.h index 8ec42e7..679e026 100644 --- a/arch/s390/include/asm/kvm-ap.h +++ b/arch/s390/include/asm/kvm-ap.h @@ -17,6 +17,7 @@ #define KVM_AP_MASK_BYTES(n) DIV_ROUND_UP(n, BITS_PER_BYTE) #define KVM_AP_MAX_APM_INDEX(matrix) (matrix->apm_max - 1) #define KVM_AP_MAX_AQM_INDEX(matrix) (matrix->aqm_max - 1) +#define KVM_AP_MAX_ADM_INDEX(matrix) (matrix->adm_max - 1) /** * The AP matrix is comprised of three bit masks identifying the adapters, diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c index c448835..461d450 100644 --- a/drivers/s390/crypto/vfio_ap_ops.c +++ b/drivers/s390/crypto/vfio_ap_ops.c @@ -588,11 +588,118 @@ static ssize_t unassign_domain_store(struct device *dev, } DEVICE_ATTR_WO(unassign_domain); + +/** + * assign_control_domain_store + * + * @dev: the matrix device + * @attr: a mediated matrix device attribute + * @buf: a buffer containing the adapter ID (APID) to be assigned + * @count: the number of bytes in @buf + * + * Parses the domain ID from @buf and assigns it to the mediated matrix device. + * + * Returns the number of bytes processed if the domain ID is valid; otherwise + * returns an error. + */ +static ssize_t assign_control_domain_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret; + unsigned long id; + struct mdev_device *mdev = mdev_from_dev(dev); + struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev); + int maxid = KVM_AP_MAX_ADM_INDEX(matrix_mdev->matrix); + + ret = kstrtoul(buf, 0, &id); + if (ret || (id > maxid)) { + pr_err("%s: control domain id '%s' not a value from 0 to %02d(%#04x)", + VFIO_AP_MATRIX_MODULE_NAME, buf, maxid, maxid); + + return ret ? ret : -EINVAL; + } + + /* Set the bit in the ADM (bitmask) corresponding to the AP control + * domain number (id). The bits in the mask, from most significant to + * least significant, correspond to IDs 0 up to the one less than the + * number of control domains that can be assigned. + */ + set_bit_inv(id, matrix_mdev->matrix->adm); + + return count; +} +DEVICE_ATTR_WO(assign_control_domain); + +/** + * unassign_control_domain_store + * + * @dev: the matrix device + * @attr: a mediated matrix device attribute + * @buf: a buffer containing the adapter ID (APID) to be assigned + * @count: the number of bytes in @buf + * + * Parses the domain ID from @buf and unassigns it from the mediated matrix + * device. + * + * Returns the number of bytes processed if the domain ID is valid; otherwise + * returns an error. + */ +static ssize_t unassign_control_domain_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret; + unsigned long apqi; + struct mdev_device *mdev = mdev_from_dev(dev); + struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev); + int maxid = KVM_AP_MAX_ADM_INDEX(matrix_mdev->matrix); + + ret = kstrtoul(buf, 0, &apqi); + if (ret || (apqi > maxid)) { + pr_err("%s: control domain id '%s' not a value from 0 to %02d(%#04x)", + VFIO_AP_MATRIX_MODULE_NAME, buf, maxid, maxid); + + return ret ? ret : -EINVAL; + } + + clear_bit_inv((unsigned long)apqi, + (unsigned long *)matrix_mdev->matrix->adm); + + return count; +} +DEVICE_ATTR_WO(unassign_control_domain); + +static ssize_t control_domains_show(struct device *dev, + struct device_attribute *dev_attr, + char *buf) +{ + unsigned long id; + int nchars = 0; + int n; + char *bufpos = buf; + struct mdev_device *mdev = mdev_from_dev(dev); + struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev); + + for_each_set_bit_inv(id, matrix_mdev->matrix->adm, + matrix_mdev->matrix->adm_max) { + n = sprintf(bufpos, "%04lx\n", id); + bufpos += n; + nchars += n; + } + + return nchars; +} +DEVICE_ATTR_RO(control_domains); + static struct attribute *vfio_ap_mdev_attrs[] = { &dev_attr_assign_adapter.attr, &dev_attr_unassign_adapter.attr, &dev_attr_assign_domain.attr, &dev_attr_unassign_domain.attr, + &dev_attr_assign_control_domain.attr, + &dev_attr_unassign_control_domain.attr, + &dev_attr_control_domains.attr, NULL, }; -- 1.7.1