| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- // 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);
|