]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
s390/sclp: Add support for SCLP AP adapter config/deconfig
authorHarald Freudenberger <freude@linux.ibm.com>
Mon, 27 Jul 2020 12:34:57 +0000 (14:34 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 7 Oct 2020 19:50:00 +0000 (21:50 +0200)
Add support for AP bus adapter config and deconfig to the sclp
core code. The code is statically build into the kernel when
ZCRYPT is configured either as module or with static support.

This is the base functionality for having configure/deconfigure
support in the AP bus and card code. Another patch will exploit
this soon.

Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Suggested-by: Pierre Morel <pmorel@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/sclp.h
drivers/s390/char/Makefile
drivers/s390/char/sclp.h
drivers/s390/char/sclp_ap.c [new file with mode: 0644]

index 90f34c7e2752bd68aa6a7b22255d1c5933ad0aa4..a7bdd128d85b3e4ef475fa38337fda1190b1629a 100644 (file)
@@ -128,6 +128,8 @@ int sclp_chp_deconfigure(struct chp_id chpid);
 int sclp_chp_read_info(struct sclp_chp_info *info);
 int sclp_pci_configure(u32 fid);
 int sclp_pci_deconfigure(u32 fid);
+int sclp_ap_configure(u32 apid);
+int sclp_ap_deconfigure(u32 apid);
 int sclp_pci_report(struct zpci_report_error_header *report, u32 fh, u32 fid);
 int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count);
 int memcpy_hsa_user(void __user *dest, unsigned long src, size_t count);
index 845e12ac595497c4c6cf363028b6a0136a48ee39..c6fdb81a068a6355dbc78213cebf5bd4732a1507 100644 (file)
@@ -34,6 +34,8 @@ obj-$(CONFIG_SCLP_VT220_TTY) += sclp_vt220.o
 
 obj-$(CONFIG_PCI) += sclp_pci.o
 
+obj-$(subst m,y,$(CONFIG_ZCRYPT)) += sclp_ap.o
+
 obj-$(CONFIG_VMLOGRDR) += vmlogrdr.o
 obj-$(CONFIG_VMCP) += vmcp.o
 
index ccc2d759c575b02e10bfa421bbbe085e97cd985e..69d9cde9ff5a8d7189453b1d9e18ee7ca1651556 100644 (file)
@@ -229,7 +229,7 @@ static inline void sclp_fill_core_info(struct sclp_core_info *info,
 #define SCLP_HAS_CPU_INFO      (sclp.facilities & 0x0800000000000000ULL)
 #define SCLP_HAS_CPU_RECONFIG  (sclp.facilities & 0x0400000000000000ULL)
 #define SCLP_HAS_PCI_RECONFIG  (sclp.facilities & 0x0000000040000000ULL)
-
+#define SCLP_HAS_AP_RECONFIG   (sclp.facilities & 0x0000000100000000ULL)
 
 struct gds_subvector {
        u8      length;
diff --git a/drivers/s390/char/sclp_ap.c b/drivers/s390/char/sclp_ap.c
new file mode 100644 (file)
index 0000000..0dd1ca7
--- /dev/null
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * s390 crypto adapter related sclp functions.
+ *
+ * Copyright IBM Corp. 2020
+ */
+#define KMSG_COMPONENT "sclp_cmd"
+#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
+
+#include <linux/export.h>
+#include <linux/slab.h>
+#include <asm/sclp.h>
+#include "sclp.h"
+
+#define SCLP_CMDW_CONFIGURE_AP                 0x001f0001
+#define SCLP_CMDW_DECONFIGURE_AP               0x001e0001
+
+struct ap_cfg_sccb {
+       struct sccb_header header;
+} __packed;
+
+static int do_ap_configure(sclp_cmdw_t cmd, u32 apid)
+{
+       struct ap_cfg_sccb *sccb;
+       int rc;
+
+       if (!SCLP_HAS_AP_RECONFIG)
+               return -EOPNOTSUPP;
+
+       sccb = (struct ap_cfg_sccb *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
+       if (!sccb)
+               return -ENOMEM;
+
+       sccb->header.length = PAGE_SIZE;
+       cmd |= (apid & 0xFF) << 8;
+       rc = sclp_sync_request(cmd, sccb);
+       if (rc)
+               goto out;
+       switch (sccb->header.response_code) {
+       case 0x0020: case 0x0120: case 0x0440: case 0x0450:
+               break;
+       default:
+               pr_warn("configure AP adapter %u failed: cmd=0x%08x response=0x%04x\n",
+                       apid, cmd, sccb->header.response_code);
+               rc = -EIO;
+               break;
+       }
+out:
+       free_page((unsigned long) sccb);
+       return rc;
+}
+
+int sclp_ap_configure(u32 apid)
+{
+       return do_ap_configure(SCLP_CMDW_CONFIGURE_AP, apid);
+}
+EXPORT_SYMBOL(sclp_ap_configure);
+
+int sclp_ap_deconfigure(u32 apid)
+{
+       return do_ap_configure(SCLP_CMDW_DECONFIGURE_AP, apid);
+}
+EXPORT_SYMBOL(sclp_ap_deconfigure);