1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * s390 crypto adapter related sclp functions. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright IBM Corp. 2020 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #define KMSG_COMPONENT "sclp_cmd" 8*4882a593Smuzhiyun #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/export.h> 11*4882a593Smuzhiyun #include <linux/slab.h> 12*4882a593Smuzhiyun #include <asm/sclp.h> 13*4882a593Smuzhiyun #include "sclp.h" 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define SCLP_CMDW_CONFIGURE_AP 0x001f0001 16*4882a593Smuzhiyun #define SCLP_CMDW_DECONFIGURE_AP 0x001e0001 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct ap_cfg_sccb { 19*4882a593Smuzhiyun struct sccb_header header; 20*4882a593Smuzhiyun } __packed; 21*4882a593Smuzhiyun do_ap_configure(sclp_cmdw_t cmd,u32 apid)22*4882a593Smuzhiyunstatic int do_ap_configure(sclp_cmdw_t cmd, u32 apid) 23*4882a593Smuzhiyun { 24*4882a593Smuzhiyun struct ap_cfg_sccb *sccb; 25*4882a593Smuzhiyun int rc; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun if (!SCLP_HAS_AP_RECONFIG) 28*4882a593Smuzhiyun return -EOPNOTSUPP; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun sccb = (struct ap_cfg_sccb *) get_zeroed_page(GFP_KERNEL | GFP_DMA); 31*4882a593Smuzhiyun if (!sccb) 32*4882a593Smuzhiyun return -ENOMEM; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun sccb->header.length = PAGE_SIZE; 35*4882a593Smuzhiyun cmd |= (apid & 0xFF) << 8; 36*4882a593Smuzhiyun rc = sclp_sync_request(cmd, sccb); 37*4882a593Smuzhiyun if (rc) 38*4882a593Smuzhiyun goto out; 39*4882a593Smuzhiyun switch (sccb->header.response_code) { 40*4882a593Smuzhiyun case 0x0020: case 0x0120: case 0x0440: case 0x0450: 41*4882a593Smuzhiyun break; 42*4882a593Smuzhiyun default: 43*4882a593Smuzhiyun pr_warn("configure AP adapter %u failed: cmd=0x%08x response=0x%04x\n", 44*4882a593Smuzhiyun apid, cmd, sccb->header.response_code); 45*4882a593Smuzhiyun rc = -EIO; 46*4882a593Smuzhiyun break; 47*4882a593Smuzhiyun } 48*4882a593Smuzhiyun out: 49*4882a593Smuzhiyun free_page((unsigned long) sccb); 50*4882a593Smuzhiyun return rc; 51*4882a593Smuzhiyun } 52*4882a593Smuzhiyun sclp_ap_configure(u32 apid)53*4882a593Smuzhiyunint sclp_ap_configure(u32 apid) 54*4882a593Smuzhiyun { 55*4882a593Smuzhiyun return do_ap_configure(SCLP_CMDW_CONFIGURE_AP, apid); 56*4882a593Smuzhiyun } 57*4882a593Smuzhiyun EXPORT_SYMBOL(sclp_ap_configure); 58*4882a593Smuzhiyun sclp_ap_deconfigure(u32 apid)59*4882a593Smuzhiyunint sclp_ap_deconfigure(u32 apid) 60*4882a593Smuzhiyun { 61*4882a593Smuzhiyun return do_ap_configure(SCLP_CMDW_DECONFIGURE_AP, apid); 62*4882a593Smuzhiyun } 63*4882a593Smuzhiyun EXPORT_SYMBOL(sclp_ap_deconfigure); 64