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