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