1 /* 2 * Adjunct processor (AP) interfaces 3 * 4 * Copyright IBM Corp. 2017 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License (version 2 only) 8 * as published by the Free Software Foundation. 9 * 10 * Author(s): Tony Krowiak <akrowia@linux.vnet.ibm.com> 11 * Martin Schwidefsky <schwidefsky@de.ibm.com> 12 * Harald Freudenberger <freude@de.ibm.com> 13 */ 14 15 #ifndef _ASM_S390_AP_H_ 16 #define _ASM_S390_AP_H_ 17 18 /** 19 * The ap_qid_t identifier of an ap queue. 20 * If the AP facilities test (APFT) facility is available, 21 * card and queue index are 8 bit values, otherwise 22 * card index is 6 bit and queue index a 4 bit value. 23 */ 24 typedef unsigned int ap_qid_t; 25 26 #define AP_MKQID(_card, _queue) (((_card) & 63) << 8 | ((_queue) & 255)) 27 #define AP_QID_CARD(_qid) (((_qid) >> 8) & 63) 28 #define AP_QID_QUEUE(_qid) ((_qid) & 255) 29 30 /** 31 * struct ap_queue_status - Holds the AP queue status. 32 * @queue_empty: Shows if queue is empty 33 * @replies_waiting: Waiting replies 34 * @queue_full: Is 1 if the queue is full 35 * @irq_enabled: Shows if interrupts are enabled for the AP 36 * @response_code: Holds the 8 bit response code 37 * 38 * The ap queue status word is returned by all three AP functions 39 * (PQAP, NQAP and DQAP). There's a set of flags in the first 40 * byte, followed by a 1 byte response code. 41 */ 42 struct ap_queue_status { 43 unsigned int queue_empty : 1; 44 unsigned int replies_waiting : 1; 45 unsigned int queue_full : 1; 46 unsigned int _pad1 : 4; 47 unsigned int irq_enabled : 1; 48 unsigned int response_code : 8; 49 unsigned int _pad2 : 16; 50 }; 51 52 /** 53 * ap_test_queue(): Test adjunct processor queue. 54 * @qid: The AP queue number 55 * @tbit: Test facilities bit 56 * @info: Pointer to queue descriptor 57 * 58 * Returns AP queue status structure. 59 */ 60 struct ap_queue_status ap_test_queue(ap_qid_t qid, 61 int tbit, 62 unsigned long *info); 63 64 struct ap_config_info { 65 unsigned int apsc : 1; /* S bit */ 66 unsigned int apxa : 1; /* N bit */ 67 unsigned int qact : 1; /* C bit */ 68 unsigned int rc8a : 1; /* R bit */ 69 unsigned char _reserved1 : 4; 70 unsigned char _reserved2[3]; 71 unsigned char Na; /* max # of APs - 1 */ 72 unsigned char Nd; /* max # of Domains - 1 */ 73 unsigned char _reserved3[10]; 74 unsigned int apm[8]; /* AP ID mask */ 75 unsigned int aqm[8]; /* AP queue mask */ 76 unsigned int adm[8]; /* AP domain mask */ 77 unsigned char _reserved4[16]; 78 } __aligned(8); 79 80 /* 81 * ap_query_configuration(): Fetch cryptographic config info 82 * 83 * Returns the ap configuration info fetched via PQAP(QCI). 84 * On success 0 is returned, on failure a negative errno 85 * is returned, e.g. if the PQAP(QCI) instruction is not 86 * available, the return value will be -EOPNOTSUPP. 87 */ 88 int ap_query_configuration(struct ap_config_info *info); 89 90 /* 91 * struct ap_qirq_ctrl - convenient struct for easy invocation 92 * of the ap_queue_irq_ctrl() function. This struct is passed 93 * as GR1 parameter to the PQAP(AQIC) instruction. For details 94 * please see the AR documentation. 95 */ 96 struct ap_qirq_ctrl { 97 unsigned int _res1 : 8; 98 unsigned int zone : 8; /* zone info */ 99 unsigned int ir : 1; /* ir flag: enable (1) or disable (0) irq */ 100 unsigned int _res2 : 4; 101 unsigned int gisc : 3; /* guest isc field */ 102 unsigned int _res3 : 6; 103 unsigned int gf : 2; /* gisa format */ 104 unsigned int _res4 : 1; 105 unsigned int gisa : 27; /* gisa origin */ 106 unsigned int _res5 : 1; 107 unsigned int isc : 3; /* irq sub class */ 108 }; 109 110 /** 111 * ap_queue_irq_ctrl(): Control interruption on a AP queue. 112 * @qid: The AP queue number 113 * @qirqctrl: struct ap_qirq_ctrl, see above 114 * @ind: The notification indicator byte 115 * 116 * Returns AP queue status. 117 * 118 * Control interruption on the given AP queue. 119 * Just a simple wrapper function for the low level PQAP(AQIC) 120 * instruction available for other kernel modules. 121 */ 122 struct ap_queue_status ap_queue_irq_ctrl(ap_qid_t qid, 123 struct ap_qirq_ctrl qirqctrl, 124 void *ind); 125 126 #endif /* _ASM_S390_AP_H_ */ 127