s390/zcrypt: externalize AP config info query
authorHarald Freudenberger <freude@linux.vnet.ibm.com>
Tue, 8 Nov 2016 10:54:28 +0000 (11:54 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 6 Sep 2017 07:24:42 +0000 (09:24 +0200)
KVM has a need to fetch the crypto configuration information
as it is returned by the PQAP(QCI) instruction. This patch
introduces a new API ap_query_configuration() which provides
this info in a handy way for the caller.

Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/ap.h
drivers/s390/crypto/ap_bus.c
drivers/s390/crypto/ap_bus.h

index 0f3e6f38db552aeee3817d0374cb2f77ceb1568a..8cefd6ed981da76c5a27637238c12dbd1d8b11bf 100644 (file)
@@ -61,4 +61,30 @@ struct ap_queue_status ap_test_queue(ap_qid_t qid,
                                     int tbit,
                                     unsigned long *info);
 
+struct ap_config_info {
+       unsigned int apsc        : 1;   /* S bit */
+       unsigned int apxa        : 1;   /* N bit */
+       unsigned int qact        : 1;   /* C bit */
+       unsigned int rc8a        : 1;   /* R bit */
+       unsigned char _reserved1 : 4;
+       unsigned char _reserved2[3];
+       unsigned char Na;               /* max # of APs - 1 */
+       unsigned char Nd;               /* max # of Domains - 1 */
+       unsigned char _reserved3[10];
+       unsigned int apm[8];            /* AP ID mask */
+       unsigned int aqm[8];            /* AP queue mask */
+       unsigned int adm[8];            /* AP domain mask */
+       unsigned char _reserved4[16];
+} __aligned(8);
+
+/*
+ * ap_query_configuration(): Fetch cryptographic config info
+ *
+ * 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.
+ */
+int ap_query_configuration(struct ap_config_info *info);
+
 #endif /* _ASM_S390_AP_H_ */
index 4fcfa8d4e0b5cf16e8bee26c02ac17417f75f27f..5f0be20402726d7f6b9c0d4816cf32580077eb09 100644 (file)
@@ -194,12 +194,23 @@ struct ap_queue_status ap_test_queue(ap_qid_t qid,
 }
 EXPORT_SYMBOL(ap_test_queue);
 
-static inline int ap_query_configuration(void)
+/*
+ * ap_query_configuration(): Fetch cryptographic config info
+ *
+ * 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.
+ */
+int ap_query_configuration(struct ap_config_info *info)
 {
-       if (!ap_configuration)
+       if (!ap_configuration_available())
                return -EOPNOTSUPP;
-       return ap_qci(ap_configuration);
+       if (!info)
+               return -EINVAL;
+       return ap_qci(info);
 }
+EXPORT_SYMBOL(ap_query_configuration);
 
 /**
  * ap_init_configuration(): Allocate and query configuration array.
@@ -212,7 +223,7 @@ static void ap_init_configuration(void)
        ap_configuration = kzalloc(sizeof(*ap_configuration), GFP_KERNEL);
        if (!ap_configuration)
                return;
-       if (ap_query_configuration() != 0) {
+       if (ap_query_configuration(ap_configuration) != 0) {
                kfree(ap_configuration);
                ap_configuration = NULL;
                return;
@@ -1009,7 +1020,7 @@ static void ap_scan_bus(struct work_struct *unused)
 
        AP_DBF(DBF_DEBUG, "ap_scan_bus running\n");
 
-       ap_query_configuration();
+       ap_query_configuration(ap_configuration);
        if (ap_select_domain() != 0)
                goto out;
 
index f07698d41f77570a2ed56e24fba9f0643e38ada1..754cf2223cfbdde3f8312acc868e8aadae998851 100644 (file)
@@ -204,17 +204,6 @@ struct ap_message {
                        struct ap_message *);
 };
 
-struct ap_config_info {
-       unsigned int special_command:1;
-       unsigned int ap_extended:1;
-       unsigned char reserved1:6;
-       unsigned char reserved2[15];
-       unsigned int apm[8];            /* AP ID mask */
-       unsigned int aqm[8];            /* AP queue mask */
-       unsigned int adm[8];            /* AP domain mask */
-       unsigned char reserved4[16];
-} __packed;
-
 /**
  * ap_init_message() - Initialize ap_message.
  * Initialize a message before using. Otherwise this might result in