Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp2062264imm; Thu, 9 Aug 2018 06:46:47 -0700 (PDT) X-Google-Smtp-Source: AA+uWPzcdDmCoR4Kw8I3Tm7CUaq23wxmLHyVGHru3CxrNxGSOQ4qWBozC6N+yHy42DfC9M0jI7XQ X-Received: by 2002:a65:4c41:: with SMTP id l1-v6mr2309669pgr.310.1533822407543; Thu, 09 Aug 2018 06:46:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1533822407; cv=none; d=google.com; s=arc-20160816; b=KAJYWsZcKsM1GiMqCx6H/+faOS70m7dZJaB5+cW1O1Z+KpPzl2UkpYQWjbR9O37Lv/ JI9OQFRhj76VVwzh+I8YTg5lNtiZLOPdJUq0r5DFt4GGI6yRVnYXYm4z0hownU2WZNy7 lDQaOUA7wJJhpAnyOWRX1juZldKHsqIZuqRCXJRU6kq0VWjQR+S0IdwzP4CDMYt1ilyb UxvVUGkwMeM5t1NUEyw9W+6dHYwHiDDwpipyjMRBEVPm76F9R0sZgbgmnpqLNB/EQJU/ rp1kviC85WDKqICvQIK2Hpj30gWSBFsosDNw4vW3q6z2csZuU05461d4t9NJLdZWX8LH dOGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :references:cc:to:from:subject:arc-authentication-results; bh=88h3rxsrlWPQG85j9OWN1cDrUYZxGRJyDwqocLXWFA4=; b=MA9n7jrJwzXVTUCphbtNfXsZ0TOrA8zdg73GOewzkkiaergJNluIHE5ZgbEFNLzOuU LvuT+6Y/G1qI7NEwNLVC8dQx2nkClAC+waZsaVepB2dm2rJVQQsg5DwI8bg/L1DmAMzH w++vSgC4n7Fazqbr8FyrBf+mgNRtCr7uEJu1/LgPeTHC8ceDNilQRdsyCcayYqorgpCb Anl3lINWOzefuKfMDODbPVL3xb5E6yGxkatDwJoK/ZZzDAusqVt3z939QMSa2VRmt/js S+ZTQ8ONstf9R5VC1A7zGOakDvD6VCZ4JFPUX0Z6wf+iyI41aD6V9+mwA4TcWP/GCQk5 3gyw== 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 j62-v6si8142790pfb.348.2018.08.09.06.46.32; Thu, 09 Aug 2018 06:46:47 -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 S1732191AbeHIQKg (ORCPT + 99 others); Thu, 9 Aug 2018 12:10:36 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:36274 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731065AbeHIQKg (ORCPT ); Thu, 9 Aug 2018 12:10:36 -0400 Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w79DhgWj104020 for ; Thu, 9 Aug 2018 09:45:36 -0400 Received: from e06smtp02.uk.ibm.com (e06smtp02.uk.ibm.com [195.75.94.98]) by mx0a-001b2d01.pphosted.com with ESMTP id 2krnmeba6d-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Thu, 09 Aug 2018 09:45:35 -0400 Received: from localhost by e06smtp02.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 9 Aug 2018 14:45:33 +0100 Received: from b06cxnps4074.portsmouth.uk.ibm.com (9.149.109.196) by e06smtp02.uk.ibm.com (192.168.101.132) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Thu, 9 Aug 2018 14:45:28 +0100 Received: from d06av24.portsmouth.uk.ibm.com (d06av24.portsmouth.uk.ibm.com [9.149.105.60]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w79DjRJZ38535294 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 9 Aug 2018 13:45:27 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E873D42042; Thu, 9 Aug 2018 16:45:34 +0100 (BST) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0725F42041; Thu, 9 Aug 2018 16:45:32 +0100 (BST) Received: from [10.0.2.15] (unknown [9.152.224.40]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP; Thu, 9 Aug 2018 16:45:31 +0100 (BST) Subject: Re: [PATCH v8 04/22] s390/zcrypt: Integrate ap_asm.h into include/asm/ap.h. From: Harald Freudenberger To: Cornelia Huck , Tony Krowiak Cc: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, freude@de.ibm.com, schwidefsky@de.ibm.com, heiko.carstens@de.ibm.com, borntraeger@de.ibm.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, frankja@linux.ibm.com References: <1533739472-7172-1-git-send-email-akrowiak@linux.vnet.ibm.com> <1533739472-7172-5-git-send-email-akrowiak@linux.vnet.ibm.com> <20180809110645.33b20c1f.cohuck@redhat.com> Date: Thu, 9 Aug 2018 15:45:24 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Content-Language: en-US X-TM-AS-GCONF: 00 x-cbid: 18080913-0008-0000-0000-0000025F6A57 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18080913-0009-0000-0000-000021C77A63 Message-Id: <95b4c9f8-0964-8649-ad3f-c6f42f13c4f1@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-08-09_05:,, 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 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1807170000 definitions=main-1808090143 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Here is now a reworked version of the integrate ap_asm.h into include/asm/ap.h patch which can be used to apply it within the AP virtualisation patch queue for testing: From c81710e7cd073c4f9a904f3539ecf17fd89c9c2d Mon Sep 17 00:00:00 2001 From: Harald Freudenberger Date: Tue, 12 Jun 2018 15:42:36 +0200 Subject: [PATCH] s390/zcrypt: Integrate ap_asm.h into include/asm/ap.h. Move all the inline functions from the ap bus header file ap_asm.h into the in-kernel api header file arch/s390/include/asm/ap.h so that KVM can make use of all the low level AP functions. Signed-off-by: Harald Freudenberger ---  arch/s390/include/asm/ap.h     | 284 +++++++++++++++++++++++++++++----  drivers/s390/crypto/ap_asm.h   | 261 ------------------------------  drivers/s390/crypto/ap_bus.c   |  23 +--  drivers/s390/crypto/ap_bus.h   |   1 +  drivers/s390/crypto/ap_card.c  |   1 -  drivers/s390/crypto/ap_queue.c |   1 -  6 files changed, 260 insertions(+), 311 deletions(-)  delete mode 100644 drivers/s390/crypto/ap_asm.h diff --git a/arch/s390/include/asm/ap.h b/arch/s390/include/asm/ap.h index c1bedb4c8de0..887494aa164f 100644 --- a/arch/s390/include/asm/ap.h +++ b/arch/s390/include/asm/ap.h @@ -46,6 +46,50 @@ struct ap_queue_status {      unsigned int _pad2        : 16;  };   +/** + * ap_intructions_available() - Test if AP instructions are available. + * + * Returns 1 if the AP instructions are installed, otherwise 0. + */ +static inline int ap_instructions_available(void) +{ +    register unsigned long reg0 asm ("0") = AP_MKQID(0, 0); +    register unsigned long reg1 asm ("1") = 0; +    register unsigned long reg2 asm ("2") = 0; + +    asm volatile( +        "   .long 0xb2af0000\n"        /* PQAP(TAPQ) */ +        "0: la    %0,1\n" +        "1:\n" +        EX_TABLE(0b, 1b) +        : "+d" (reg1), "+d" (reg2) +        : "d" (reg0) +        : "cc"); +    return reg1; +} + +/** + * ap_tapq(): Test adjunct processor queue. + * @qid: The AP queue number + * @info: Pointer to queue descriptor + * + * Returns AP queue status structure. + */ +static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info) +{ +    register unsigned long reg0 asm ("0") = qid; +    register struct ap_queue_status reg1 asm ("1"); +    register unsigned long reg2 asm ("2"); + +    asm volatile(".long 0xb2af0000"        /* PQAP(TAPQ) */ +             : "=d" (reg1), "=d" (reg2) +             : "d" (reg0) +             : "cc"); +    if (info) +        *info = reg2; +    return reg1; +} +  /**   * ap_test_queue(): Test adjunct processor queue.   * @qid: The AP queue number @@ -54,10 +98,57 @@ struct ap_queue_status {   *   * Returns AP queue status structure.   */ -struct ap_queue_status ap_test_queue(ap_qid_t qid, -                     int tbit, -                     unsigned long *info); +static inline struct ap_queue_status ap_test_queue(ap_qid_t qid, +                           int tbit, +                           unsigned long *info) +{ +    if (tbit) +        qid |= 1UL << 23; /* set T bit*/ +    return ap_tapq(qid, info); +}   +/** + * ap_pqap_rapq(): Reset adjunct processor queue. + * @qid: The AP queue number + * + * Returns AP queue status structure. + */ +static inline struct ap_queue_status ap_rapq(ap_qid_t qid) +{ +    register unsigned long reg0 asm ("0") = qid | (1UL << 24); +    register struct ap_queue_status reg1 asm ("1"); + +    asm volatile( +        ".long 0xb2af0000"        /* PQAP(RAPQ) */ +        : "=d" (reg1) +        : "d" (reg0) +        : "cc"); +    return reg1; +} + +/** + * ap_pqap_zapq(): Reset and zeroize adjunct processor queue. + * @qid: The AP queue number + * + * Returns AP queue status structure. + */ +static inline struct ap_queue_status ap_zapq(ap_qid_t qid) +{ +    register unsigned long reg0 asm ("0") = qid | (2UL << 24); +    register struct ap_queue_status reg1 asm ("1"); + +    asm volatile( +        ".long 0xb2af0000"        /* PQAP(ZAPQ) */ +        : "=d" (reg1) +        : "d" (reg0) +        : "cc"); +    return reg1; +} + +/** + * struct ap_config_info - convenience struct for AP crypto + * config info as returned by the ap_qci() function. + */  struct ap_config_info {      unsigned int apsc     : 1;    /* S bit */      unsigned int apxa     : 1;    /* N bit */ @@ -74,50 +165,189 @@ struct ap_config_info {      unsigned char _reserved4[16];  } __aligned(8);   -/* - * ap_query_configuration(): Fetch cryptographic config info +/** + * ap_qci(): Get AP configuration data   * - * Returns the ap configuration info fetched via PQAP(QCI). - * On success 0 is returned, on failure a negative errno - * is returned, e.g. if the PQAP(QCI) instruction is not - * available, the return value will be -EOPNOTSUPP. + * Returns 0 on success, or -EOPNOTSUPP.   */ -int ap_query_configuration(struct ap_config_info *info); +static inline int ap_qci(struct ap_config_info *config) +{ +    register unsigned long reg0 asm ("0") = 4UL << 24; +    register unsigned long reg1 asm ("1") = -EOPNOTSUPP; +    register struct ap_config_info *reg2 asm ("2") = config; + +    asm volatile( +        ".long 0xb2af0000\n"        /* PQAP(QCI) */ +        "0: la    %0,0\n" +        "1:\n" +        EX_TABLE(0b, 1b) +        : "+d" (reg1) +        : "d" (reg0), "d" (reg2) +        : "cc", "memory"); + +    return reg1; +}    /*   * struct ap_qirq_ctrl - convenient struct for easy invocation - * of the ap_queue_irq_ctrl() function. This struct is passed - * as GR1 parameter to the PQAP(AQIC) instruction. For details - * please see the AR documentation. + * of the ap_aqic() function. This struct is passed as GR1 + * parameter to the PQAP(AQIC) instruction. For details please + * see the AR documentation.   */  struct ap_qirq_ctrl {      unsigned int _res1 : 8; -    unsigned int zone  : 8;  /* zone info */ -    unsigned int ir    : 1;  /* ir flag: enable (1) or disable (0) irq */ +    unsigned int zone  : 8;    /* zone info */ +    unsigned int ir    : 1;    /* ir flag: enable (1) or disable (0) irq */      unsigned int _res2 : 4; -    unsigned int gisc  : 3;  /* guest isc field */ +    unsigned int gisc  : 3;    /* guest isc field */      unsigned int _res3 : 6; -    unsigned int gf    : 2;  /* gisa format */ +    unsigned int gf    : 2;    /* gisa format */      unsigned int _res4 : 1; -    unsigned int gisa  : 27; /* gisa origin */ +    unsigned int gisa  : 27;    /* gisa origin */      unsigned int _res5 : 1; -    unsigned int isc   : 3;  /* irq sub class */ +    unsigned int isc   : 3;    /* irq sub class */  };    /** - * ap_queue_irq_ctrl(): Control interruption on a AP queue. + * ap_aqic(): Control interruption for a specific AP.   * @qid: The AP queue number - * @qirqctrl: struct ap_qirq_ctrl, see above + * @qirqctrl: struct ap_qirq_ctrl (64 bit value)   * @ind: The notification indicator byte   *   * Returns AP queue status. + */ +static inline struct ap_queue_status ap_aqic(ap_qid_t qid, +                         struct ap_qirq_ctrl qirqctrl, +                         void *ind) +{ +    register unsigned long reg0 asm ("0") = qid | (3UL << 24); +    register struct ap_qirq_ctrl reg1_in asm ("1") = qirqctrl; +    register struct ap_queue_status reg1_out asm ("1"); +    register void *reg2 asm ("2") = ind; + +    asm volatile( +        ".long 0xb2af0000"        /* PQAP(AQIC) */ +        : "=d" (reg1_out) +        : "d" (reg0), "d" (reg1_in), "d" (reg2) +        : "cc"); +    return reg1_out; +} + +/* + * union ap_qact_ap_info - used together with the + * ap_aqic() function to provide a convenient way + * to handle the ap info needed by the qact function. + */ +union ap_qact_ap_info { +    unsigned long val; +    struct { +        unsigned int      : 3; +        unsigned int mode : 3; +        unsigned int      : 26; +        unsigned int cat  : 8; +        unsigned int      : 8; +        unsigned char ver[2]; +    }; +}; + +/** + * ap_qact(): Query AP combatibility type. + * @qid: The AP queue number + * @apinfo: On input the info about the AP queue. On output the + *        alternate AP queue info provided by the qact function + *        in GR2 is stored in.   * - * Control interruption on the given AP queue. - * Just a simple wrapper function for the low level PQAP(AQIC) - * instruction available for other kernel modules. + * Returns AP queue status. Check response_code field for failures.   */ -struct ap_queue_status ap_queue_irq_ctrl(ap_qid_t qid, -                     struct ap_qirq_ctrl qirqctrl, -                     void *ind); +static inline struct ap_queue_status ap_qact(ap_qid_t qid, int ifbit, +                         union ap_qact_ap_info *apinfo) +{ +    register unsigned long reg0 asm ("0") = qid | (5UL << 24) +        | ((ifbit & 0x01) << 22); +    register unsigned long reg1_in asm ("1") = apinfo->val; +    register struct ap_queue_status reg1_out asm ("1"); +    register unsigned long reg2 asm ("2"); + +    asm volatile( +        ".long 0xb2af0000"        /* PQAP(QACT) */ +        : "+d" (reg1_in), "=d" (reg1_out), "=d" (reg2) +        : "d" (reg0) +        : "cc"); +    apinfo->val = reg2; +    return reg1_out; +} + +/** + * ap_nqap(): Send message to adjunct processor queue. + * @qid: The AP queue number + * @psmid: The program supplied message identifier + * @msg: The message text + * @length: The message length + * + * Returns AP queue status structure. + * Condition code 1 on NQAP can't happen because the L bit is 1. + * Condition code 2 on NQAP also means the send is incomplete, + * because a segment boundary was reached. The NQAP is repeated. + */ +static inline struct ap_queue_status ap_nqap(ap_qid_t qid, +                         unsigned long long psmid, +                         void *msg, size_t length) +{ +    register unsigned long reg0 asm ("0") = qid | 0x40000000UL; +    register struct ap_queue_status reg1 asm ("1"); +    register unsigned long reg2 asm ("2") = (unsigned long) msg; +    register unsigned long reg3 asm ("3") = (unsigned long) length; +    register unsigned long reg4 asm ("4") = (unsigned int) (psmid >> 32); +    register unsigned long reg5 asm ("5") = psmid & 0xffffffff; + +    asm volatile ( +        "0: .long 0xb2ad0042\n"        /* NQAP */ +        "   brc   2,0b" +        : "+d" (reg0), "=d" (reg1), "+d" (reg2), "+d" (reg3) +        : "d" (reg4), "d" (reg5) +        : "cc", "memory"); +    return reg1; +} + +/** + * ap_dqap(): Receive message from adjunct processor queue. + * @qid: The AP queue number + * @psmid: Pointer to program supplied message identifier + * @msg: The message text + * @length: The message length + * + * Returns AP queue status structure. + * Condition code 1 on DQAP means the receive has taken place + * but only partially.    The response is incomplete, hence the + * DQAP is repeated. + * Condition code 2 on DQAP also means the receive is incomplete, + * this time because a segment boundary was reached. Again, the + * DQAP is repeated. + * Note that gpr2 is used by the DQAP instruction to keep track of + * any 'residual' length, in case the instruction gets interrupted. + * Hence it gets zeroed before the instruction. + */ +static inline struct ap_queue_status ap_dqap(ap_qid_t qid, +                         unsigned long long *psmid, +                         void *msg, size_t length) +{ +    register unsigned long reg0 asm("0") = qid | 0x80000000UL; +    register struct ap_queue_status reg1 asm ("1"); +    register unsigned long reg2 asm("2") = 0UL; +    register unsigned long reg4 asm("4") = (unsigned long) msg; +    register unsigned long reg5 asm("5") = (unsigned long) length; +    register unsigned long reg6 asm("6") = 0UL; +    register unsigned long reg7 asm("7") = 0UL; + + +    asm volatile( +        "0: .long 0xb2ae0064\n"        /* DQAP */ +        "   brc   6,0b\n" +        : "+d" (reg0), "=d" (reg1), "+d" (reg2), +          "+d" (reg4), "+d" (reg5), "+d" (reg6), "+d" (reg7) +        : : "cc", "memory"); +    *psmid = (((unsigned long long) reg6) << 32) + reg7; +    return reg1; +}    #endif /* _ASM_S390_AP_H_ */ diff --git a/drivers/s390/crypto/ap_asm.h b/drivers/s390/crypto/ap_asm.h deleted file mode 100644 index e22ee126c9df..000000000000 --- a/drivers/s390/crypto/ap_asm.h +++ /dev/null @@ -1,261 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Copyright IBM Corp. 2016 - * Author(s): Martin Schwidefsky - * - * Adjunct processor bus inline assemblies. - */ - -#ifndef _AP_ASM_H_ -#define _AP_ASM_H_ - -#include - -/** - * ap_intructions_available() - Test if AP instructions are available. - * - * Returns 0 if the AP instructions are installed. - */ -static inline int ap_instructions_available(void) -{ -    register unsigned long reg0 asm ("0") = AP_MKQID(0, 0); -    register unsigned long reg1 asm ("1") = -ENODEV; -    register unsigned long reg2 asm ("2"); - -    asm volatile( -        "   .long 0xb2af0000\n"        /* PQAP(TAPQ) */ -        "0: la    %0,0\n" -        "1:\n" -        EX_TABLE(0b, 1b) -        : "+d" (reg1), "=d" (reg2) -        : "d" (reg0) -        : "cc"); -    return reg1; -} - -/** - * ap_tapq(): Test adjunct processor queue. - * @qid: The AP queue number - * @info: Pointer to queue descriptor - * - * Returns AP queue status structure. - */ -static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info) -{ -    register unsigned long reg0 asm ("0") = qid; -    register struct ap_queue_status reg1 asm ("1"); -    register unsigned long reg2 asm ("2"); - -    asm volatile(".long 0xb2af0000"        /* PQAP(TAPQ) */ -             : "=d" (reg1), "=d" (reg2) -             : "d" (reg0) -             : "cc"); -    if (info) -        *info = reg2; -    return reg1; -} - -/** - * ap_pqap_rapq(): Reset adjunct processor queue. - * @qid: The AP queue number - * - * Returns AP queue status structure. - */ -static inline struct ap_queue_status ap_rapq(ap_qid_t qid) -{ -    register unsigned long reg0 asm ("0") = qid | (1UL << 24); -    register struct ap_queue_status reg1 asm ("1"); - -    asm volatile( -        ".long 0xb2af0000"        /* PQAP(RAPQ) */ -        : "=d" (reg1) -        : "d" (reg0) -        : "cc"); -    return reg1; -} - -/** - * ap_pqap_zapq(): Reset and zeroize adjunct processor queue. - * @qid: The AP queue number - * - * Returns AP queue status structure. - */ -static inline struct ap_queue_status ap_zapq(ap_qid_t qid) -{ -    register unsigned long reg0 asm ("0") = qid | (2UL << 24); -    register struct ap_queue_status reg1 asm ("1"); - -    asm volatile( -        ".long 0xb2af0000"        /* PQAP(ZAPQ) */ -        : "=d" (reg1) -        : "d" (reg0) -        : "cc"); -    return reg1; -} - -/** - * ap_aqic(): Control interruption for a specific AP. - * @qid: The AP queue number - * @qirqctrl: struct ap_qirq_ctrl (64 bit value) - * @ind: The notification indicator byte - * - * Returns AP queue status. - */ -static inline struct ap_queue_status ap_aqic(ap_qid_t qid, -                         struct ap_qirq_ctrl qirqctrl, -                         void *ind) -{ -    register unsigned long reg0 asm ("0") = qid | (3UL << 24); -    register struct ap_qirq_ctrl reg1_in asm ("1") = qirqctrl; -    register struct ap_queue_status reg1_out asm ("1"); -    register void *reg2 asm ("2") = ind; - -    asm volatile( -        ".long 0xb2af0000"        /* PQAP(AQIC) */ -        : "=d" (reg1_out) -        : "d" (reg0), "d" (reg1_in), "d" (reg2) -        : "cc"); -    return reg1_out; -} - -/** - * ap_qci(): Get AP configuration data - * - * Returns 0 on success, or -EOPNOTSUPP. - */ -static inline int ap_qci(void *config) -{ -    register unsigned long reg0 asm ("0") = 4UL << 24; -    register unsigned long reg1 asm ("1") = -EINVAL; -    register void *reg2 asm ("2") = (void *) config; - -    asm volatile( -        ".long 0xb2af0000\n"        /* PQAP(QCI) */ -        "0: la    %0,0\n" -        "1:\n" -        EX_TABLE(0b, 1b) -        : "+d" (reg1) -        : "d" (reg0), "d" (reg2) -        : "cc", "memory"); - -    return reg1; -} - -/* - * union ap_qact_ap_info - used together with the - * ap_aqic() function to provide a convenient way - * to handle the ap info needed by the qact function. - */ -union ap_qact_ap_info { -    unsigned long val; -    struct { -        unsigned int      : 3; -        unsigned int mode : 3; -        unsigned int      : 26; -        unsigned int cat  : 8; -        unsigned int      : 8; -        unsigned char ver[2]; -    }; -}; - -/** - * ap_qact(): Query AP combatibility type. - * @qid: The AP queue number - * @apinfo: On input the info about the AP queue. On output the - *        alternate AP queue info provided by the qact function - *        in GR2 is stored in. - * - * Returns AP queue status. Check response_code field for failures. - */ -static inline struct ap_queue_status ap_qact(ap_qid_t qid, int ifbit, -                         union ap_qact_ap_info *apinfo) -{ -    register unsigned long reg0 asm ("0") = qid | (5UL << 24) -        | ((ifbit & 0x01) << 22); -    register unsigned long reg1_in asm ("1") = apinfo->val; -    register struct ap_queue_status reg1_out asm ("1"); -    register unsigned long reg2 asm ("2"); - -    asm volatile( -        ".long 0xb2af0000"        /* PQAP(QACT) */ -        : "+d" (reg1_in), "=d" (reg1_out), "=d" (reg2) -        : "d" (reg0) -        : "cc"); -    apinfo->val = reg2; -    return reg1_out; -} - -/** - * ap_nqap(): Send message to adjunct processor queue. - * @qid: The AP queue number - * @psmid: The program supplied message identifier - * @msg: The message text - * @length: The message length - * - * Returns AP queue status structure. - * Condition code 1 on NQAP can't happen because the L bit is 1. - * Condition code 2 on NQAP also means the send is incomplete, - * because a segment boundary was reached. The NQAP is repeated. - */ -static inline struct ap_queue_status ap_nqap(ap_qid_t qid, -                         unsigned long long psmid, -                         void *msg, size_t length) -{ -    register unsigned long reg0 asm ("0") = qid | 0x40000000UL; -    register struct ap_queue_status reg1 asm ("1"); -    register unsigned long reg2 asm ("2") = (unsigned long) msg; -    register unsigned long reg3 asm ("3") = (unsigned long) length; -    register unsigned long reg4 asm ("4") = (unsigned int) (psmid >> 32); -    register unsigned long reg5 asm ("5") = psmid & 0xffffffff; - -    asm volatile ( -        "0: .long 0xb2ad0042\n"        /* NQAP */ -        "   brc   2,0b" -        : "+d" (reg0), "=d" (reg1), "+d" (reg2), "+d" (reg3) -        : "d" (reg4), "d" (reg5) -        : "cc", "memory"); -    return reg1; -} - -/** - * ap_dqap(): Receive message from adjunct processor queue. - * @qid: The AP queue number - * @psmid: Pointer to program supplied message identifier - * @msg: The message text - * @length: The message length - * - * Returns AP queue status structure. - * Condition code 1 on DQAP means the receive has taken place - * but only partially.    The response is incomplete, hence the - * DQAP is repeated. - * Condition code 2 on DQAP also means the receive is incomplete, - * this time because a segment boundary was reached. Again, the - * DQAP is repeated. - * Note that gpr2 is used by the DQAP instruction to keep track of - * any 'residual' length, in case the instruction gets interrupted. - * Hence it gets zeroed before the instruction. - */ -static inline struct ap_queue_status ap_dqap(ap_qid_t qid, -                         unsigned long long *psmid, -                         void *msg, size_t length) -{ -    register unsigned long reg0 asm("0") = qid | 0x80000000UL; -    register struct ap_queue_status reg1 asm ("1"); -    register unsigned long reg2 asm("2") = 0UL; -    register unsigned long reg4 asm("4") = (unsigned long) msg; -    register unsigned long reg5 asm("5") = (unsigned long) length; -    register unsigned long reg6 asm("6") = 0UL; -    register unsigned long reg7 asm("7") = 0UL; - - -    asm volatile( -        "0: .long 0xb2ae0064\n"        /* DQAP */ -        "   brc   6,0b\n" -        : "+d" (reg0), "=d" (reg1), "+d" (reg2), -          "+d" (reg4), "+d" (reg5), "+d" (reg6), "+d" (reg7) -        : : "cc", "memory"); -    *psmid = (((unsigned long long) reg6) << 32) + reg7; -    return reg1; -} - -#endif /* _AP_ASM_H_ */ diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index 35a0c2b52f82..aa1bbe6d7842 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c @@ -36,7 +36,6 @@  #include    #include "ap_bus.h" -#include "ap_asm.h"  #include "ap_debug.h"    /* @@ -174,24 +173,6 @@ static inline int ap_qact_available(void)      return 0;  }   -/** - * ap_test_queue(): Test adjunct processor queue. - * @qid: The AP queue number - * @tbit: Test facilities bit - * @info: Pointer to queue descriptor - * - * Returns AP queue status structure. - */ -struct ap_queue_status ap_test_queue(ap_qid_t qid, -                     int tbit, -                     unsigned long *info) -{ -    if (tbit) -        qid |= 1UL << 23; /* set T bit*/ -    return ap_tapq(qid, info); -} -EXPORT_SYMBOL(ap_test_queue); -  /*   * ap_query_configuration(): Fetch cryptographic config info   * @@ -200,7 +181,7 @@ EXPORT_SYMBOL(ap_test_queue);   * is returned, e.g. if the PQAP(QCI) instruction is not   * available, the return value will be -EOPNOTSUPP.   */ -int ap_query_configuration(struct ap_config_info *info) +static inline int ap_query_configuration(struct ap_config_info *info)  {      if (!ap_configuration_available())          return -EOPNOTSUPP; @@ -1220,7 +1201,7 @@ static int __init ap_module_init(void)      if (rc)          return rc;   -    if (ap_instructions_available() != 0) { +    if (!ap_instructions_available()) {          pr_warn("The hardware system does not support AP instructions\n");          return -ENODEV;      } diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h index 6a273c5ebca5..936541937e15 100644 --- a/drivers/s390/crypto/ap_bus.h +++ b/drivers/s390/crypto/ap_bus.h @@ -15,6 +15,7 @@    #include  #include +#include  #include    #define AP_DEVICES 256        /* Number of AP devices. */ diff --git a/drivers/s390/crypto/ap_card.c b/drivers/s390/crypto/ap_card.c index 2c726df210f6..c13e43292cb7 100644 --- a/drivers/s390/crypto/ap_card.c +++ b/drivers/s390/crypto/ap_card.c @@ -14,7 +14,6 @@  #include    #include "ap_bus.h" -#include "ap_asm.h"    /*   * AP card related attributes. diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c index ba3a2e13b0eb..d83c1fa291ae 100644 --- a/drivers/s390/crypto/ap_queue.c +++ b/drivers/s390/crypto/ap_queue.c @@ -14,7 +14,6 @@  #include    #include "ap_bus.h" -#include "ap_asm.h"    /**   * ap_queue_irq_ctrl(): Control interruption on a AP queue. -- 2.17.1