18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Common interface for I/O on S/390 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci#ifndef _ASM_S390_CIO_H_ 68c2ecf20Sopenharmony_ci#define _ASM_S390_CIO_H_ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 98c2ecf20Sopenharmony_ci#include <linux/bitops.h> 108c2ecf20Sopenharmony_ci#include <linux/genalloc.h> 118c2ecf20Sopenharmony_ci#include <asm/types.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#define LPM_ANYPATH 0xff 148c2ecf20Sopenharmony_ci#define __MAX_CSSID 0 158c2ecf20Sopenharmony_ci#define __MAX_SUBCHANNEL 65535 168c2ecf20Sopenharmony_ci#define __MAX_SSID 3 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <asm/scsw.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci/** 218c2ecf20Sopenharmony_ci * struct ccw1 - channel command word 228c2ecf20Sopenharmony_ci * @cmd_code: command code 238c2ecf20Sopenharmony_ci * @flags: flags, like IDA addressing, etc. 248c2ecf20Sopenharmony_ci * @count: byte count 258c2ecf20Sopenharmony_ci * @cda: data address 268c2ecf20Sopenharmony_ci * 278c2ecf20Sopenharmony_ci * The ccw is the basic structure to build channel programs that perform 288c2ecf20Sopenharmony_ci * operations with the device or the control unit. Only Format-1 channel 298c2ecf20Sopenharmony_ci * command words are supported. 308c2ecf20Sopenharmony_ci */ 318c2ecf20Sopenharmony_cistruct ccw1 { 328c2ecf20Sopenharmony_ci __u8 cmd_code; 338c2ecf20Sopenharmony_ci __u8 flags; 348c2ecf20Sopenharmony_ci __u16 count; 358c2ecf20Sopenharmony_ci __u32 cda; 368c2ecf20Sopenharmony_ci} __attribute__ ((packed,aligned(8))); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci/** 398c2ecf20Sopenharmony_ci * struct ccw0 - channel command word 408c2ecf20Sopenharmony_ci * @cmd_code: command code 418c2ecf20Sopenharmony_ci * @cda: data address 428c2ecf20Sopenharmony_ci * @flags: flags, like IDA addressing, etc. 438c2ecf20Sopenharmony_ci * @reserved: will be ignored 448c2ecf20Sopenharmony_ci * @count: byte count 458c2ecf20Sopenharmony_ci * 468c2ecf20Sopenharmony_ci * The format-0 ccw structure. 478c2ecf20Sopenharmony_ci */ 488c2ecf20Sopenharmony_cistruct ccw0 { 498c2ecf20Sopenharmony_ci __u8 cmd_code; 508c2ecf20Sopenharmony_ci __u32 cda : 24; 518c2ecf20Sopenharmony_ci __u8 flags; 528c2ecf20Sopenharmony_ci __u8 reserved; 538c2ecf20Sopenharmony_ci __u16 count; 548c2ecf20Sopenharmony_ci} __packed __aligned(8); 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci#define CCW_FLAG_DC 0x80 578c2ecf20Sopenharmony_ci#define CCW_FLAG_CC 0x40 588c2ecf20Sopenharmony_ci#define CCW_FLAG_SLI 0x20 598c2ecf20Sopenharmony_ci#define CCW_FLAG_SKIP 0x10 608c2ecf20Sopenharmony_ci#define CCW_FLAG_PCI 0x08 618c2ecf20Sopenharmony_ci#define CCW_FLAG_IDA 0x04 628c2ecf20Sopenharmony_ci#define CCW_FLAG_SUSPEND 0x02 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci#define CCW_CMD_READ_IPL 0x02 658c2ecf20Sopenharmony_ci#define CCW_CMD_NOOP 0x03 668c2ecf20Sopenharmony_ci#define CCW_CMD_BASIC_SENSE 0x04 678c2ecf20Sopenharmony_ci#define CCW_CMD_TIC 0x08 688c2ecf20Sopenharmony_ci#define CCW_CMD_STLCK 0x14 698c2ecf20Sopenharmony_ci#define CCW_CMD_SENSE_PGID 0x34 708c2ecf20Sopenharmony_ci#define CCW_CMD_SUSPEND_RECONN 0x5B 718c2ecf20Sopenharmony_ci#define CCW_CMD_RDC 0x64 728c2ecf20Sopenharmony_ci#define CCW_CMD_RELEASE 0x94 738c2ecf20Sopenharmony_ci#define CCW_CMD_SET_PGID 0xAF 748c2ecf20Sopenharmony_ci#define CCW_CMD_SENSE_ID 0xE4 758c2ecf20Sopenharmony_ci#define CCW_CMD_DCTL 0xF3 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#define SENSE_MAX_COUNT 0x20 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci/** 808c2ecf20Sopenharmony_ci * struct erw - extended report word 818c2ecf20Sopenharmony_ci * @res0: reserved 828c2ecf20Sopenharmony_ci * @auth: authorization check 838c2ecf20Sopenharmony_ci * @pvrf: path-verification-required flag 848c2ecf20Sopenharmony_ci * @cpt: channel-path timeout 858c2ecf20Sopenharmony_ci * @fsavf: failing storage address validity flag 868c2ecf20Sopenharmony_ci * @cons: concurrent sense 878c2ecf20Sopenharmony_ci * @scavf: secondary ccw address validity flag 888c2ecf20Sopenharmony_ci * @fsaf: failing storage address format 898c2ecf20Sopenharmony_ci * @scnt: sense count, if @cons == %1 908c2ecf20Sopenharmony_ci * @res16: reserved 918c2ecf20Sopenharmony_ci */ 928c2ecf20Sopenharmony_cistruct erw { 938c2ecf20Sopenharmony_ci __u32 res0 : 3; 948c2ecf20Sopenharmony_ci __u32 auth : 1; 958c2ecf20Sopenharmony_ci __u32 pvrf : 1; 968c2ecf20Sopenharmony_ci __u32 cpt : 1; 978c2ecf20Sopenharmony_ci __u32 fsavf : 1; 988c2ecf20Sopenharmony_ci __u32 cons : 1; 998c2ecf20Sopenharmony_ci __u32 scavf : 1; 1008c2ecf20Sopenharmony_ci __u32 fsaf : 1; 1018c2ecf20Sopenharmony_ci __u32 scnt : 6; 1028c2ecf20Sopenharmony_ci __u32 res16 : 16; 1038c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci/** 1068c2ecf20Sopenharmony_ci * struct erw_eadm - EADM Subchannel extended report word 1078c2ecf20Sopenharmony_ci * @b: aob error 1088c2ecf20Sopenharmony_ci * @r: arsb error 1098c2ecf20Sopenharmony_ci */ 1108c2ecf20Sopenharmony_cistruct erw_eadm { 1118c2ecf20Sopenharmony_ci __u32 : 16; 1128c2ecf20Sopenharmony_ci __u32 b : 1; 1138c2ecf20Sopenharmony_ci __u32 r : 1; 1148c2ecf20Sopenharmony_ci __u32 : 14; 1158c2ecf20Sopenharmony_ci} __packed; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci/** 1188c2ecf20Sopenharmony_ci * struct sublog - subchannel logout area 1198c2ecf20Sopenharmony_ci * @res0: reserved 1208c2ecf20Sopenharmony_ci * @esf: extended status flags 1218c2ecf20Sopenharmony_ci * @lpum: last path used mask 1228c2ecf20Sopenharmony_ci * @arep: ancillary report 1238c2ecf20Sopenharmony_ci * @fvf: field-validity flags 1248c2ecf20Sopenharmony_ci * @sacc: storage access code 1258c2ecf20Sopenharmony_ci * @termc: termination code 1268c2ecf20Sopenharmony_ci * @devsc: device-status check 1278c2ecf20Sopenharmony_ci * @serr: secondary error 1288c2ecf20Sopenharmony_ci * @ioerr: i/o-error alert 1298c2ecf20Sopenharmony_ci * @seqc: sequence code 1308c2ecf20Sopenharmony_ci */ 1318c2ecf20Sopenharmony_cistruct sublog { 1328c2ecf20Sopenharmony_ci __u32 res0 : 1; 1338c2ecf20Sopenharmony_ci __u32 esf : 7; 1348c2ecf20Sopenharmony_ci __u32 lpum : 8; 1358c2ecf20Sopenharmony_ci __u32 arep : 1; 1368c2ecf20Sopenharmony_ci __u32 fvf : 5; 1378c2ecf20Sopenharmony_ci __u32 sacc : 2; 1388c2ecf20Sopenharmony_ci __u32 termc : 2; 1398c2ecf20Sopenharmony_ci __u32 devsc : 1; 1408c2ecf20Sopenharmony_ci __u32 serr : 1; 1418c2ecf20Sopenharmony_ci __u32 ioerr : 1; 1428c2ecf20Sopenharmony_ci __u32 seqc : 3; 1438c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci/** 1468c2ecf20Sopenharmony_ci * struct esw0 - Format 0 Extended Status Word (ESW) 1478c2ecf20Sopenharmony_ci * @sublog: subchannel logout 1488c2ecf20Sopenharmony_ci * @erw: extended report word 1498c2ecf20Sopenharmony_ci * @faddr: failing storage address 1508c2ecf20Sopenharmony_ci * @saddr: secondary ccw address 1518c2ecf20Sopenharmony_ci */ 1528c2ecf20Sopenharmony_cistruct esw0 { 1538c2ecf20Sopenharmony_ci struct sublog sublog; 1548c2ecf20Sopenharmony_ci struct erw erw; 1558c2ecf20Sopenharmony_ci __u32 faddr[2]; 1568c2ecf20Sopenharmony_ci __u32 saddr; 1578c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci/** 1608c2ecf20Sopenharmony_ci * struct esw1 - Format 1 Extended Status Word (ESW) 1618c2ecf20Sopenharmony_ci * @zero0: reserved zeros 1628c2ecf20Sopenharmony_ci * @lpum: last path used mask 1638c2ecf20Sopenharmony_ci * @zero16: reserved zeros 1648c2ecf20Sopenharmony_ci * @erw: extended report word 1658c2ecf20Sopenharmony_ci * @zeros: three fullwords of zeros 1668c2ecf20Sopenharmony_ci */ 1678c2ecf20Sopenharmony_cistruct esw1 { 1688c2ecf20Sopenharmony_ci __u8 zero0; 1698c2ecf20Sopenharmony_ci __u8 lpum; 1708c2ecf20Sopenharmony_ci __u16 zero16; 1718c2ecf20Sopenharmony_ci struct erw erw; 1728c2ecf20Sopenharmony_ci __u32 zeros[3]; 1738c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci/** 1768c2ecf20Sopenharmony_ci * struct esw2 - Format 2 Extended Status Word (ESW) 1778c2ecf20Sopenharmony_ci * @zero0: reserved zeros 1788c2ecf20Sopenharmony_ci * @lpum: last path used mask 1798c2ecf20Sopenharmony_ci * @dcti: device-connect-time interval 1808c2ecf20Sopenharmony_ci * @erw: extended report word 1818c2ecf20Sopenharmony_ci * @zeros: three fullwords of zeros 1828c2ecf20Sopenharmony_ci */ 1838c2ecf20Sopenharmony_cistruct esw2 { 1848c2ecf20Sopenharmony_ci __u8 zero0; 1858c2ecf20Sopenharmony_ci __u8 lpum; 1868c2ecf20Sopenharmony_ci __u16 dcti; 1878c2ecf20Sopenharmony_ci struct erw erw; 1888c2ecf20Sopenharmony_ci __u32 zeros[3]; 1898c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci/** 1928c2ecf20Sopenharmony_ci * struct esw3 - Format 3 Extended Status Word (ESW) 1938c2ecf20Sopenharmony_ci * @zero0: reserved zeros 1948c2ecf20Sopenharmony_ci * @lpum: last path used mask 1958c2ecf20Sopenharmony_ci * @res: reserved 1968c2ecf20Sopenharmony_ci * @erw: extended report word 1978c2ecf20Sopenharmony_ci * @zeros: three fullwords of zeros 1988c2ecf20Sopenharmony_ci */ 1998c2ecf20Sopenharmony_cistruct esw3 { 2008c2ecf20Sopenharmony_ci __u8 zero0; 2018c2ecf20Sopenharmony_ci __u8 lpum; 2028c2ecf20Sopenharmony_ci __u16 res; 2038c2ecf20Sopenharmony_ci struct erw erw; 2048c2ecf20Sopenharmony_ci __u32 zeros[3]; 2058c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci/** 2088c2ecf20Sopenharmony_ci * struct esw_eadm - EADM Subchannel Extended Status Word (ESW) 2098c2ecf20Sopenharmony_ci * @sublog: subchannel logout 2108c2ecf20Sopenharmony_ci * @erw: extended report word 2118c2ecf20Sopenharmony_ci */ 2128c2ecf20Sopenharmony_cistruct esw_eadm { 2138c2ecf20Sopenharmony_ci __u32 sublog; 2148c2ecf20Sopenharmony_ci struct erw_eadm erw; 2158c2ecf20Sopenharmony_ci __u32 : 32; 2168c2ecf20Sopenharmony_ci __u32 : 32; 2178c2ecf20Sopenharmony_ci __u32 : 32; 2188c2ecf20Sopenharmony_ci} __packed; 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci/** 2218c2ecf20Sopenharmony_ci * struct irb - interruption response block 2228c2ecf20Sopenharmony_ci * @scsw: subchannel status word 2238c2ecf20Sopenharmony_ci * @esw: extended status word 2248c2ecf20Sopenharmony_ci * @ecw: extended control word 2258c2ecf20Sopenharmony_ci * 2268c2ecf20Sopenharmony_ci * The irb that is handed to the device driver when an interrupt occurs. For 2278c2ecf20Sopenharmony_ci * solicited interrupts, the common I/O layer already performs checks whether 2288c2ecf20Sopenharmony_ci * a field is valid; a field not being valid is always passed as %0. 2298c2ecf20Sopenharmony_ci * If a unit check occurred, @ecw may contain sense data; this is retrieved 2308c2ecf20Sopenharmony_ci * by the common I/O layer itself if the device doesn't support concurrent 2318c2ecf20Sopenharmony_ci * sense (so that the device driver never needs to perform basic sense itself). 2328c2ecf20Sopenharmony_ci * For unsolicited interrupts, the irb is passed as-is (expect for sense data, 2338c2ecf20Sopenharmony_ci * if applicable). 2348c2ecf20Sopenharmony_ci */ 2358c2ecf20Sopenharmony_cistruct irb { 2368c2ecf20Sopenharmony_ci union scsw scsw; 2378c2ecf20Sopenharmony_ci union { 2388c2ecf20Sopenharmony_ci struct esw0 esw0; 2398c2ecf20Sopenharmony_ci struct esw1 esw1; 2408c2ecf20Sopenharmony_ci struct esw2 esw2; 2418c2ecf20Sopenharmony_ci struct esw3 esw3; 2428c2ecf20Sopenharmony_ci struct esw_eadm eadm; 2438c2ecf20Sopenharmony_ci } esw; 2448c2ecf20Sopenharmony_ci __u8 ecw[32]; 2458c2ecf20Sopenharmony_ci} __attribute__ ((packed,aligned(4))); 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci/** 2488c2ecf20Sopenharmony_ci * struct ciw - command information word (CIW) layout 2498c2ecf20Sopenharmony_ci * @et: entry type 2508c2ecf20Sopenharmony_ci * @reserved: reserved bits 2518c2ecf20Sopenharmony_ci * @ct: command type 2528c2ecf20Sopenharmony_ci * @cmd: command code 2538c2ecf20Sopenharmony_ci * @count: command count 2548c2ecf20Sopenharmony_ci */ 2558c2ecf20Sopenharmony_cistruct ciw { 2568c2ecf20Sopenharmony_ci __u32 et : 2; 2578c2ecf20Sopenharmony_ci __u32 reserved : 2; 2588c2ecf20Sopenharmony_ci __u32 ct : 4; 2598c2ecf20Sopenharmony_ci __u32 cmd : 8; 2608c2ecf20Sopenharmony_ci __u32 count : 16; 2618c2ecf20Sopenharmony_ci} __attribute__ ((packed)); 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci#define CIW_TYPE_RCD 0x0 /* read configuration data */ 2648c2ecf20Sopenharmony_ci#define CIW_TYPE_SII 0x1 /* set interface identifier */ 2658c2ecf20Sopenharmony_ci#define CIW_TYPE_RNI 0x2 /* read node identifier */ 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci/* 2688c2ecf20Sopenharmony_ci * Node Descriptor as defined in SA22-7204, "Common I/O-Device Commands" 2698c2ecf20Sopenharmony_ci */ 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ci#define ND_VALIDITY_VALID 0 2728c2ecf20Sopenharmony_ci#define ND_VALIDITY_OUTDATED 1 2738c2ecf20Sopenharmony_ci#define ND_VALIDITY_INVALID 2 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_cistruct node_descriptor { 2768c2ecf20Sopenharmony_ci /* Flags. */ 2778c2ecf20Sopenharmony_ci union { 2788c2ecf20Sopenharmony_ci struct { 2798c2ecf20Sopenharmony_ci u32 validity:3; 2808c2ecf20Sopenharmony_ci u32 reserved:5; 2818c2ecf20Sopenharmony_ci } __packed; 2828c2ecf20Sopenharmony_ci u8 byte0; 2838c2ecf20Sopenharmony_ci } __packed; 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci /* Node parameters. */ 2868c2ecf20Sopenharmony_ci u32 params:24; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci /* Node ID. */ 2898c2ecf20Sopenharmony_ci char type[6]; 2908c2ecf20Sopenharmony_ci char model[3]; 2918c2ecf20Sopenharmony_ci char manufacturer[3]; 2928c2ecf20Sopenharmony_ci char plant[2]; 2938c2ecf20Sopenharmony_ci char seq[12]; 2948c2ecf20Sopenharmony_ci u16 tag; 2958c2ecf20Sopenharmony_ci} __packed; 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci/* 2988c2ecf20Sopenharmony_ci * Flags used as input parameters for do_IO() 2998c2ecf20Sopenharmony_ci */ 3008c2ecf20Sopenharmony_ci#define DOIO_ALLOW_SUSPEND 0x0001 /* allow for channel prog. suspend */ 3018c2ecf20Sopenharmony_ci#define DOIO_DENY_PREFETCH 0x0002 /* don't allow for CCW prefetch */ 3028c2ecf20Sopenharmony_ci#define DOIO_SUPPRESS_INTER 0x0004 /* suppress intermediate inter. */ 3038c2ecf20Sopenharmony_ci /* ... for suspended CCWs */ 3048c2ecf20Sopenharmony_ci/* Device or subchannel gone. */ 3058c2ecf20Sopenharmony_ci#define CIO_GONE 0x0001 3068c2ecf20Sopenharmony_ci/* No path to device. */ 3078c2ecf20Sopenharmony_ci#define CIO_NO_PATH 0x0002 3088c2ecf20Sopenharmony_ci/* Device has appeared. */ 3098c2ecf20Sopenharmony_ci#define CIO_OPER 0x0004 3108c2ecf20Sopenharmony_ci/* Sick revalidation of device. */ 3118c2ecf20Sopenharmony_ci#define CIO_REVALIDATE 0x0008 3128c2ecf20Sopenharmony_ci/* Device did not respond in time. */ 3138c2ecf20Sopenharmony_ci#define CIO_BOXED 0x0010 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci/** 3168c2ecf20Sopenharmony_ci * struct ccw_dev_id - unique identifier for ccw devices 3178c2ecf20Sopenharmony_ci * @ssid: subchannel set id 3188c2ecf20Sopenharmony_ci * @devno: device number 3198c2ecf20Sopenharmony_ci * 3208c2ecf20Sopenharmony_ci * This structure is not directly based on any hardware structure. The 3218c2ecf20Sopenharmony_ci * hardware identifies a device by its device number and its subchannel, 3228c2ecf20Sopenharmony_ci * which is in turn identified by its id. In order to get a unique identifier 3238c2ecf20Sopenharmony_ci * for ccw devices across subchannel sets, @struct ccw_dev_id has been 3248c2ecf20Sopenharmony_ci * introduced. 3258c2ecf20Sopenharmony_ci */ 3268c2ecf20Sopenharmony_cistruct ccw_dev_id { 3278c2ecf20Sopenharmony_ci u8 ssid; 3288c2ecf20Sopenharmony_ci u16 devno; 3298c2ecf20Sopenharmony_ci}; 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci/** 3328c2ecf20Sopenharmony_ci * ccw_device_id_is_equal() - compare two ccw_dev_ids 3338c2ecf20Sopenharmony_ci * @dev_id1: a ccw_dev_id 3348c2ecf20Sopenharmony_ci * @dev_id2: another ccw_dev_id 3358c2ecf20Sopenharmony_ci * Returns: 3368c2ecf20Sopenharmony_ci * %1 if the two structures are equal field-by-field, 3378c2ecf20Sopenharmony_ci * %0 if not. 3388c2ecf20Sopenharmony_ci * Context: 3398c2ecf20Sopenharmony_ci * any 3408c2ecf20Sopenharmony_ci */ 3418c2ecf20Sopenharmony_cistatic inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1, 3428c2ecf20Sopenharmony_ci struct ccw_dev_id *dev_id2) 3438c2ecf20Sopenharmony_ci{ 3448c2ecf20Sopenharmony_ci if ((dev_id1->ssid == dev_id2->ssid) && 3458c2ecf20Sopenharmony_ci (dev_id1->devno == dev_id2->devno)) 3468c2ecf20Sopenharmony_ci return 1; 3478c2ecf20Sopenharmony_ci return 0; 3488c2ecf20Sopenharmony_ci} 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci/** 3518c2ecf20Sopenharmony_ci * pathmask_to_pos() - find the position of the left-most bit in a pathmask 3528c2ecf20Sopenharmony_ci * @mask: pathmask with at least one bit set 3538c2ecf20Sopenharmony_ci */ 3548c2ecf20Sopenharmony_cistatic inline u8 pathmask_to_pos(u8 mask) 3558c2ecf20Sopenharmony_ci{ 3568c2ecf20Sopenharmony_ci return 8 - ffs(mask); 3578c2ecf20Sopenharmony_ci} 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ciextern void css_schedule_reprobe(void); 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ciextern void *cio_dma_zalloc(size_t size); 3628c2ecf20Sopenharmony_ciextern void cio_dma_free(void *cpu_addr, size_t size); 3638c2ecf20Sopenharmony_ciextern struct device *cio_get_dma_css_dev(void); 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_civoid *cio_gp_dma_zalloc(struct gen_pool *gp_dma, struct device *dma_dev, 3668c2ecf20Sopenharmony_ci size_t size); 3678c2ecf20Sopenharmony_civoid cio_gp_dma_free(struct gen_pool *gp_dma, void *cpu_addr, size_t size); 3688c2ecf20Sopenharmony_civoid cio_gp_dma_destroy(struct gen_pool *gp_dma, struct device *dma_dev); 3698c2ecf20Sopenharmony_cistruct gen_pool *cio_gp_dma_create(struct device *dma_dev, int nr_pages); 3708c2ecf20Sopenharmony_ci 3718c2ecf20Sopenharmony_ci/* Function from drivers/s390/cio/chsc.c */ 3728c2ecf20Sopenharmony_ciint chsc_sstpc(void *page, unsigned int op, u16 ctrl, u64 *clock_delta); 3738c2ecf20Sopenharmony_ciint chsc_sstpi(void *page, void *result, size_t size); 3748c2ecf20Sopenharmony_ciint chsc_stzi(void *page, void *result, size_t size); 3758c2ecf20Sopenharmony_ciint chsc_sgib(u32 origin); 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci#endif 378