s390/ap: exploit new B bit from QCI config info
authorHarald Freudenberger <freude@linux.ibm.com>
Tue, 20 Sep 2022 13:12:01 +0000 (15:12 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 20 Mar 2023 10:12:48 +0000 (11:12 +0100)
This patch introduces an update to the ap_config_info
struct which is filled with the QCI subfunction. There
is a new bit apsb (short 'B') showing if the AP secure
bind facility is available. The patch also includes a
simple function ap_sb_available() wrapping this bit test.

Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Reviewed-by: Tony Krowiak <akrowiak@linux.ibm.com>
Reviewed-by: Holger Dengler <dengler@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/include/asm/ap.h
drivers/s390/crypto/ap_bus.c
drivers/s390/crypto/ap_bus.h
drivers/s390/crypto/vfio_ap_ops.c

index 6bb536e878971a3109dfd439e5097a1bb1c3dc52..5e4a88460a5702e12b2977c72e74a712030a448c 100644 (file)
@@ -180,15 +180,16 @@ struct ap_config_info {
        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             : 4;
+       unsigned int apsb        : 1;   /* B bit */
+       unsigned int             : 23;
+       unsigned char na;               /* max # of APs - 1 */
+       unsigned char nd;               /* max # of Domains - 1 */
+       unsigned char _reserved0[10];
        unsigned int apm[8];            /* AP ID mask */
        unsigned int aqm[8];            /* AP (usage) queue mask */
        unsigned int adm[8];            /* AP (control) domain mask */
-       unsigned char _reserved4[16];
+       unsigned char _reserved1[16];
 } __aligned(8);
 
 /**
index 2bc184ee8952aeb3e7c90b8275dd1cf4aae90a19..b3c350e9fc1dfda960bf0e30045a4c7610bd8a10 100644 (file)
@@ -200,6 +200,18 @@ static inline int ap_qact_available(void)
        return 0;
 }
 
+/*
+ * ap_sb_available(): Test if the AP secure binding facility is available.
+ *
+ * Returns 1 if secure binding facility is available.
+ */
+int ap_sb_available(void)
+{
+       if (ap_qci_info)
+               return ap_qci_info->apsb;
+       return 0;
+}
+
 /*
  * ap_fetch_qci_info(): Fetch cryptographic config info
  *
@@ -248,13 +260,13 @@ static void __init ap_init_qci_info(void)
        AP_DBF_INFO("%s successful fetched initial qci info\n", __func__);
 
        if (ap_qci_info->apxa) {
-               if (ap_qci_info->Na) {
-                       ap_max_adapter_id = ap_qci_info->Na;
+               if (ap_qci_info->na) {
+                       ap_max_adapter_id = ap_qci_info->na;
                        AP_DBF_INFO("%s new ap_max_adapter_id is %d\n",
                                    __func__, ap_max_adapter_id);
                }
-               if (ap_qci_info->Nd) {
-                       ap_max_domain_id = ap_qci_info->Nd;
+               if (ap_qci_info->nd) {
+                       ap_max_domain_id = ap_qci_info->nd;
                        AP_DBF_INFO("%s new ap_max_domain_id is %d\n",
                                    __func__, ap_max_domain_id);
                }
index b5d7ccbc07840b11449d1104fb81525c620595c6..5ce020879a38b1c8065a1222e181590ea1529fa5 100644 (file)
@@ -296,6 +296,7 @@ void ap_cancel_message(struct ap_queue *aq, struct ap_message *ap_msg);
 void ap_flush_queue(struct ap_queue *aq);
 
 void *ap_airq_ptr(void);
+int ap_sb_available(void);
 void ap_wait(enum ap_sm_wait wait);
 void ap_request_timeout(struct timer_list *t);
 void ap_bus_force_rescan(void);
index 72e10abb103a09cc194ae3ccbd1d084f4b47ff83..bfe995116a6a47bc9c3710bda5339dad1aac11e1 100644 (file)
@@ -599,9 +599,9 @@ out_unlock:
 static void vfio_ap_matrix_init(struct ap_config_info *info,
                                struct ap_matrix *matrix)
 {
-       matrix->apm_max = info->apxa ? info->Na : 63;
-       matrix->aqm_max = info->apxa ? info->Nd : 15;
-       matrix->adm_max = info->apxa ? info->Nd : 15;
+       matrix->apm_max = info->apxa ? info->na : 63;
+       matrix->aqm_max = info->apxa ? info->nd : 15;
+       matrix->adm_max = info->apxa ? info->nd : 15;
 }
 
 static void vfio_ap_mdev_update_guest_apcb(struct ap_matrix_mdev *matrix_mdev)