Tony Krowiak | e7fc514 | 2016-11-08 07:09:13 +0100 | [diff] [blame] | 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 | |
Harald Freudenberger | 050349b | 2016-11-08 11:54:28 +0100 | [diff] [blame] | 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 | |
Harald Freudenberger | 46fde9a | 2016-11-09 15:00:23 +0100 | [diff] [blame] | 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 | |
Tony Krowiak | e7fc514 | 2016-11-08 07:09:13 +0100 | [diff] [blame] | 126 | #endif /* _ASM_S390_AP_H_ */ |