1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright IBM Corp. 2016, 2023
4 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
5 *
6 * Adjunct processor bus, queue related code.
7 */
8
9 #define KMSG_COMPONENT "ap"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11
12 #include <linux/init.h>
13 #include <linux/slab.h>
14 #include <asm/facility.h>
15
16 #include "ap_bus.h"
17 #include "ap_debug.h"
18
19 static void __ap_flush_queue(struct ap_queue *aq);
20
21 /*
22 * some AP queue helper functions
23 */
24
ap_q_supported_in_se(struct ap_queue * aq)25 static inline bool ap_q_supported_in_se(struct ap_queue *aq)
26 {
27 return aq->card->hwinfo.ep11 || aq->card->hwinfo.accel;
28 }
29
ap_q_supports_bind(struct ap_queue * aq)30 static inline bool ap_q_supports_bind(struct ap_queue *aq)
31 {
32 return aq->card->hwinfo.ep11 || aq->card->hwinfo.accel;
33 }
34
ap_q_supports_assoc(struct ap_queue * aq)35 static inline bool ap_q_supports_assoc(struct ap_queue *aq)
36 {
37 return aq->card->hwinfo.ep11;
38 }
39
ap_q_needs_bind(struct ap_queue * aq)40 static inline bool ap_q_needs_bind(struct ap_queue *aq)
41 {
42 return ap_q_supports_bind(aq) && ap_sb_available();
43 }
44
45 /**
46 * ap_queue_enable_irq(): Enable interrupt support on this AP queue.
47 * @aq: The AP queue
48 * @ind: the notification indicator byte
49 *
50 * Enables interruption on AP queue via ap_aqic(). Based on the return
51 * value it waits a while and tests the AP queue if interrupts
52 * have been switched on using ap_test_queue().
53 */
ap_queue_enable_irq(struct ap_queue * aq,void * ind)54 static int ap_queue_enable_irq(struct ap_queue *aq, void *ind)
55 {
56 union ap_qirq_ctrl qirqctrl = { .value = 0 };
57 struct ap_queue_status status;
58
59 qirqctrl.ir = 1;
60 qirqctrl.isc = AP_ISC;
61 status = ap_aqic(aq->qid, qirqctrl, virt_to_phys(ind));
62 if (status.async)
63 return -EPERM;
64 switch (status.response_code) {
65 case AP_RESPONSE_NORMAL:
66 case AP_RESPONSE_OTHERWISE_CHANGED:
67 return 0;
68 case AP_RESPONSE_Q_NOT_AVAIL:
69 case AP_RESPONSE_DECONFIGURED:
70 case AP_RESPONSE_CHECKSTOPPED:
71 case AP_RESPONSE_INVALID_ADDRESS:
72 pr_err("Registering adapter interrupts for AP device %02x.%04x failed\n",
73 AP_QID_CARD(aq->qid),
74 AP_QID_QUEUE(aq->qid));
75 return -EOPNOTSUPP;
76 case AP_RESPONSE_RESET_IN_PROGRESS:
77 case AP_RESPONSE_BUSY:
78 default:
79 return -EBUSY;
80 }
81 }
82
83 /**
84 * __ap_send(): Send message to adjunct processor queue.
85 * @qid: The AP queue number
86 * @psmid: The program supplied message identifier
87 * @msg: The message text
88 * @msglen: The message length
89 * @special: Special Bit
90 *
91 * Returns AP queue status structure.
92 * Condition code 1 on NQAP can't happen because the L bit is 1.
93 * Condition code 2 on NQAP also means the send is incomplete,
94 * because a segment boundary was reached. The NQAP is repeated.
95 */
96 static inline struct ap_queue_status
__ap_send(ap_qid_t qid,unsigned long psmid,void * msg,size_t msglen,int special)97 __ap_send(ap_qid_t qid, unsigned long psmid, void *msg, size_t msglen,
98 int special)
99 {
100 if (special)
101 qid |= 0x400000UL;
102 return ap_nqap(qid, psmid, msg, msglen);
103 }
104
105 /* State machine definitions and helpers */
106
ap_sm_nop(struct ap_queue * aq)107 static enum ap_sm_wait ap_sm_nop(struct ap_queue *aq)
108 {
109 return AP_SM_WAIT_NONE;
110 }
111
112 /**
113 * ap_sm_recv(): Receive pending reply messages from an AP queue but do
114 * not change the state of the device.
115 * @aq: pointer to the AP queue
116 *
117 * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
118 */
ap_sm_recv(struct ap_queue * aq)119 static struct ap_queue_status ap_sm_recv(struct ap_queue *aq)
120 {
121 struct ap_queue_status status;
122 struct ap_message *ap_msg;
123 bool found = false;
124 size_t reslen;
125 unsigned long resgr0 = 0;
126 int parts = 0;
127
128 /*
129 * DQAP loop until response code and resgr0 indicate that
130 * the msg is totally received. As we use the very same buffer
131 * the msg is overwritten with each invocation. That's intended
132 * and the receiver of the msg is informed with a msg rc code
133 * of EMSGSIZE in such a case.
134 */
135 do {
136 status = ap_dqap(aq->qid, &aq->reply->psmid,
137 aq->reply->msg, aq->reply->bufsize,
138 &aq->reply->len, &reslen, &resgr0);
139 parts++;
140 } while (status.response_code == 0xFF && resgr0 != 0);
141
142 switch (status.response_code) {
143 case AP_RESPONSE_NORMAL:
144 print_hex_dump_debug("aprpl: ", DUMP_PREFIX_ADDRESS, 16, 1,
145 aq->reply->msg, aq->reply->len, false);
146 aq->queue_count = max_t(int, 0, aq->queue_count - 1);
147 if (!status.queue_empty && !aq->queue_count)
148 aq->queue_count++;
149 if (aq->queue_count > 0)
150 mod_timer(&aq->timeout,
151 jiffies + aq->request_timeout);
152 list_for_each_entry(ap_msg, &aq->pendingq, list) {
153 if (ap_msg->psmid != aq->reply->psmid)
154 continue;
155 list_del_init(&ap_msg->list);
156 aq->pendingq_count--;
157 if (parts > 1) {
158 ap_msg->rc = -EMSGSIZE;
159 ap_msg->receive(aq, ap_msg, NULL);
160 } else {
161 ap_msg->receive(aq, ap_msg, aq->reply);
162 }
163 found = true;
164 break;
165 }
166 if (!found) {
167 AP_DBF_WARN("%s unassociated reply psmid=0x%016lx on 0x%02x.%04x\n",
168 __func__, aq->reply->psmid,
169 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
170 }
171 fallthrough;
172 case AP_RESPONSE_NO_PENDING_REPLY:
173 if (!status.queue_empty || aq->queue_count <= 0)
174 break;
175 /* The card shouldn't forget requests but who knows. */
176 aq->queue_count = 0;
177 list_splice_init(&aq->pendingq, &aq->requestq);
178 aq->requestq_count += aq->pendingq_count;
179 pr_debug("queue 0x%02x.%04x rescheduled %d reqs (new req %d)\n",
180 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid),
181 aq->pendingq_count, aq->requestq_count);
182 aq->pendingq_count = 0;
183 break;
184 default:
185 break;
186 }
187 return status;
188 }
189
190 /**
191 * ap_sm_read(): Receive pending reply messages from an AP queue.
192 * @aq: pointer to the AP queue
193 *
194 * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
195 */
ap_sm_read(struct ap_queue * aq)196 static enum ap_sm_wait ap_sm_read(struct ap_queue *aq)
197 {
198 struct ap_queue_status status;
199
200 if (!aq->reply)
201 return AP_SM_WAIT_NONE;
202 status = ap_sm_recv(aq);
203 if (status.async)
204 return AP_SM_WAIT_NONE;
205 switch (status.response_code) {
206 case AP_RESPONSE_NORMAL:
207 if (aq->queue_count > 0) {
208 aq->sm_state = AP_SM_STATE_WORKING;
209 return AP_SM_WAIT_AGAIN;
210 }
211 aq->sm_state = AP_SM_STATE_IDLE;
212 break;
213 case AP_RESPONSE_NO_PENDING_REPLY:
214 if (aq->queue_count > 0)
215 return status.irq_enabled ?
216 AP_SM_WAIT_INTERRUPT : AP_SM_WAIT_HIGH_TIMEOUT;
217 aq->sm_state = AP_SM_STATE_IDLE;
218 break;
219 default:
220 aq->dev_state = AP_DEV_STATE_ERROR;
221 aq->last_err_rc = status.response_code;
222 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
223 __func__, status.response_code,
224 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
225 return AP_SM_WAIT_NONE;
226 }
227 /* Check and maybe enable irq support (again) on this queue */
228 if (!status.irq_enabled && status.queue_empty) {
229 void *lsi_ptr = ap_airq_ptr();
230
231 if (lsi_ptr && ap_queue_enable_irq(aq, lsi_ptr) == 0) {
232 aq->sm_state = AP_SM_STATE_SETIRQ_WAIT;
233 return AP_SM_WAIT_AGAIN;
234 }
235 }
236 return AP_SM_WAIT_NONE;
237 }
238
239 /**
240 * ap_sm_write(): Send messages from the request queue to an AP queue.
241 * @aq: pointer to the AP queue
242 *
243 * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
244 */
ap_sm_write(struct ap_queue * aq)245 static enum ap_sm_wait ap_sm_write(struct ap_queue *aq)
246 {
247 struct ap_queue_status status;
248 struct ap_message *ap_msg;
249 ap_qid_t qid = aq->qid;
250
251 if (aq->requestq_count <= 0)
252 return AP_SM_WAIT_NONE;
253
254 /* Start the next request on the queue. */
255 ap_msg = list_entry(aq->requestq.next, struct ap_message, list);
256 print_hex_dump_debug("apreq: ", DUMP_PREFIX_ADDRESS, 16, 1,
257 ap_msg->msg, ap_msg->len, false);
258 status = __ap_send(qid, ap_msg->psmid,
259 ap_msg->msg, ap_msg->len,
260 ap_msg->flags & AP_MSG_FLAG_SPECIAL);
261 if (status.async)
262 return AP_SM_WAIT_NONE;
263 switch (status.response_code) {
264 case AP_RESPONSE_NORMAL:
265 aq->queue_count = max_t(int, 1, aq->queue_count + 1);
266 if (aq->queue_count == 1)
267 mod_timer(&aq->timeout, jiffies + aq->request_timeout);
268 list_move_tail(&ap_msg->list, &aq->pendingq);
269 aq->requestq_count--;
270 aq->pendingq_count++;
271 if (aq->queue_count < aq->card->hwinfo.qd) {
272 aq->sm_state = AP_SM_STATE_WORKING;
273 return AP_SM_WAIT_AGAIN;
274 }
275 fallthrough;
276 case AP_RESPONSE_Q_FULL:
277 aq->sm_state = AP_SM_STATE_QUEUE_FULL;
278 return status.irq_enabled ?
279 AP_SM_WAIT_INTERRUPT : AP_SM_WAIT_HIGH_TIMEOUT;
280 case AP_RESPONSE_RESET_IN_PROGRESS:
281 aq->sm_state = AP_SM_STATE_RESET_WAIT;
282 return AP_SM_WAIT_LOW_TIMEOUT;
283 case AP_RESPONSE_INVALID_DOMAIN:
284 AP_DBF_WARN("%s RESPONSE_INVALID_DOMAIN on NQAP\n", __func__);
285 fallthrough;
286 case AP_RESPONSE_MESSAGE_TOO_BIG:
287 case AP_RESPONSE_REQ_FAC_NOT_INST:
288 list_del_init(&ap_msg->list);
289 aq->requestq_count--;
290 ap_msg->rc = -EINVAL;
291 ap_msg->receive(aq, ap_msg, NULL);
292 return AP_SM_WAIT_AGAIN;
293 default:
294 aq->dev_state = AP_DEV_STATE_ERROR;
295 aq->last_err_rc = status.response_code;
296 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
297 __func__, status.response_code,
298 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
299 return AP_SM_WAIT_NONE;
300 }
301 }
302
303 /**
304 * ap_sm_read_write(): Send and receive messages to/from an AP queue.
305 * @aq: pointer to the AP queue
306 *
307 * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
308 */
ap_sm_read_write(struct ap_queue * aq)309 static enum ap_sm_wait ap_sm_read_write(struct ap_queue *aq)
310 {
311 return min(ap_sm_read(aq), ap_sm_write(aq));
312 }
313
314 /**
315 * ap_sm_reset(): Reset an AP queue.
316 * @aq: The AP queue
317 *
318 * Submit the Reset command to an AP queue.
319 */
ap_sm_reset(struct ap_queue * aq)320 static enum ap_sm_wait ap_sm_reset(struct ap_queue *aq)
321 {
322 struct ap_queue_status status;
323
324 status = ap_rapq(aq->qid, aq->rapq_fbit);
325 if (status.async)
326 return AP_SM_WAIT_NONE;
327 switch (status.response_code) {
328 case AP_RESPONSE_NORMAL:
329 case AP_RESPONSE_RESET_IN_PROGRESS:
330 aq->sm_state = AP_SM_STATE_RESET_WAIT;
331 aq->rapq_fbit = 0;
332 return AP_SM_WAIT_LOW_TIMEOUT;
333 default:
334 aq->dev_state = AP_DEV_STATE_ERROR;
335 aq->last_err_rc = status.response_code;
336 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
337 __func__, status.response_code,
338 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
339 return AP_SM_WAIT_NONE;
340 }
341 }
342
343 /**
344 * ap_sm_reset_wait(): Test queue for completion of the reset operation
345 * @aq: pointer to the AP queue
346 *
347 * Returns AP_POLL_IMMEDIATELY, AP_POLL_AFTER_TIMEROUT or 0.
348 */
ap_sm_reset_wait(struct ap_queue * aq)349 static enum ap_sm_wait ap_sm_reset_wait(struct ap_queue *aq)
350 {
351 struct ap_queue_status status;
352 struct ap_tapq_hwinfo hwinfo;
353 void *lsi_ptr;
354
355 /* Get the status with TAPQ */
356 status = ap_test_queue(aq->qid, 1, &hwinfo);
357
358 switch (status.response_code) {
359 case AP_RESPONSE_NORMAL:
360 aq->se_bstate = hwinfo.bs;
361 lsi_ptr = ap_airq_ptr();
362 if (lsi_ptr && ap_queue_enable_irq(aq, lsi_ptr) == 0)
363 aq->sm_state = AP_SM_STATE_SETIRQ_WAIT;
364 else
365 aq->sm_state = (aq->queue_count > 0) ?
366 AP_SM_STATE_WORKING : AP_SM_STATE_IDLE;
367 return AP_SM_WAIT_AGAIN;
368 case AP_RESPONSE_BUSY:
369 case AP_RESPONSE_RESET_IN_PROGRESS:
370 return AP_SM_WAIT_LOW_TIMEOUT;
371 case AP_RESPONSE_Q_NOT_AVAIL:
372 case AP_RESPONSE_DECONFIGURED:
373 case AP_RESPONSE_CHECKSTOPPED:
374 default:
375 aq->dev_state = AP_DEV_STATE_ERROR;
376 aq->last_err_rc = status.response_code;
377 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
378 __func__, status.response_code,
379 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
380 return AP_SM_WAIT_NONE;
381 }
382 }
383
384 /**
385 * ap_sm_setirq_wait(): Test queue for completion of the irq enablement
386 * @aq: pointer to the AP queue
387 *
388 * Returns AP_POLL_IMMEDIATELY, AP_POLL_AFTER_TIMEROUT or 0.
389 */
ap_sm_setirq_wait(struct ap_queue * aq)390 static enum ap_sm_wait ap_sm_setirq_wait(struct ap_queue *aq)
391 {
392 struct ap_queue_status status;
393
394 if (aq->queue_count > 0 && aq->reply)
395 /* Try to read a completed message and get the status */
396 status = ap_sm_recv(aq);
397 else
398 /* Get the status with TAPQ */
399 status = ap_tapq(aq->qid, NULL);
400
401 if (status.irq_enabled == 1) {
402 /* Irqs are now enabled */
403 aq->sm_state = (aq->queue_count > 0) ?
404 AP_SM_STATE_WORKING : AP_SM_STATE_IDLE;
405 }
406
407 switch (status.response_code) {
408 case AP_RESPONSE_NORMAL:
409 if (aq->queue_count > 0)
410 return AP_SM_WAIT_AGAIN;
411 fallthrough;
412 case AP_RESPONSE_NO_PENDING_REPLY:
413 return AP_SM_WAIT_LOW_TIMEOUT;
414 default:
415 aq->dev_state = AP_DEV_STATE_ERROR;
416 aq->last_err_rc = status.response_code;
417 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
418 __func__, status.response_code,
419 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
420 return AP_SM_WAIT_NONE;
421 }
422 }
423
424 /**
425 * ap_sm_assoc_wait(): Test queue for completion of a pending
426 * association request.
427 * @aq: pointer to the AP queue
428 */
ap_sm_assoc_wait(struct ap_queue * aq)429 static enum ap_sm_wait ap_sm_assoc_wait(struct ap_queue *aq)
430 {
431 struct ap_queue_status status;
432 struct ap_tapq_hwinfo hwinfo;
433
434 status = ap_test_queue(aq->qid, 1, &hwinfo);
435 /* handle asynchronous error on this queue */
436 if (status.async && status.response_code) {
437 aq->dev_state = AP_DEV_STATE_ERROR;
438 aq->last_err_rc = status.response_code;
439 AP_DBF_WARN("%s asynch RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
440 __func__, status.response_code,
441 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
442 return AP_SM_WAIT_NONE;
443 }
444 if (status.response_code > AP_RESPONSE_BUSY) {
445 aq->dev_state = AP_DEV_STATE_ERROR;
446 aq->last_err_rc = status.response_code;
447 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
448 __func__, status.response_code,
449 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
450 return AP_SM_WAIT_NONE;
451 }
452
453 /* update queue's SE bind state */
454 aq->se_bstate = hwinfo.bs;
455
456 /* check bs bits */
457 switch (hwinfo.bs) {
458 case AP_BS_Q_USABLE:
459 /* association is through */
460 aq->sm_state = AP_SM_STATE_IDLE;
461 pr_debug("queue 0x%02x.%04x associated with %u\n",
462 AP_QID_CARD(aq->qid),
463 AP_QID_QUEUE(aq->qid), aq->assoc_idx);
464 return AP_SM_WAIT_NONE;
465 case AP_BS_Q_USABLE_NO_SECURE_KEY:
466 /* association still pending */
467 return AP_SM_WAIT_LOW_TIMEOUT;
468 default:
469 /* reset from 'outside' happened or no idea at all */
470 aq->assoc_idx = ASSOC_IDX_INVALID;
471 aq->dev_state = AP_DEV_STATE_ERROR;
472 aq->last_err_rc = status.response_code;
473 AP_DBF_WARN("%s bs 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
474 __func__, hwinfo.bs,
475 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
476 return AP_SM_WAIT_NONE;
477 }
478 }
479
480 /*
481 * AP state machine jump table
482 */
483 static ap_func_t *ap_jumptable[NR_AP_SM_STATES][NR_AP_SM_EVENTS] = {
484 [AP_SM_STATE_RESET_START] = {
485 [AP_SM_EVENT_POLL] = ap_sm_reset,
486 [AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
487 },
488 [AP_SM_STATE_RESET_WAIT] = {
489 [AP_SM_EVENT_POLL] = ap_sm_reset_wait,
490 [AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
491 },
492 [AP_SM_STATE_SETIRQ_WAIT] = {
493 [AP_SM_EVENT_POLL] = ap_sm_setirq_wait,
494 [AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
495 },
496 [AP_SM_STATE_IDLE] = {
497 [AP_SM_EVENT_POLL] = ap_sm_write,
498 [AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
499 },
500 [AP_SM_STATE_WORKING] = {
501 [AP_SM_EVENT_POLL] = ap_sm_read_write,
502 [AP_SM_EVENT_TIMEOUT] = ap_sm_reset,
503 },
504 [AP_SM_STATE_QUEUE_FULL] = {
505 [AP_SM_EVENT_POLL] = ap_sm_read,
506 [AP_SM_EVENT_TIMEOUT] = ap_sm_reset,
507 },
508 [AP_SM_STATE_ASSOC_WAIT] = {
509 [AP_SM_EVENT_POLL] = ap_sm_assoc_wait,
510 [AP_SM_EVENT_TIMEOUT] = ap_sm_reset,
511 },
512 };
513
ap_sm_event(struct ap_queue * aq,enum ap_sm_event event)514 enum ap_sm_wait ap_sm_event(struct ap_queue *aq, enum ap_sm_event event)
515 {
516 if (aq->config && !aq->chkstop &&
517 aq->dev_state > AP_DEV_STATE_UNINITIATED)
518 return ap_jumptable[aq->sm_state][event](aq);
519 else
520 return AP_SM_WAIT_NONE;
521 }
522
ap_sm_event_loop(struct ap_queue * aq,enum ap_sm_event event)523 enum ap_sm_wait ap_sm_event_loop(struct ap_queue *aq, enum ap_sm_event event)
524 {
525 enum ap_sm_wait wait;
526
527 while ((wait = ap_sm_event(aq, event)) == AP_SM_WAIT_AGAIN)
528 ;
529 return wait;
530 }
531
532 /*
533 * AP queue related attributes.
534 */
request_count_show(struct device * dev,struct device_attribute * attr,char * buf)535 static ssize_t request_count_show(struct device *dev,
536 struct device_attribute *attr,
537 char *buf)
538 {
539 struct ap_queue *aq = to_ap_queue(dev);
540 bool valid = false;
541 u64 req_cnt;
542
543 spin_lock_bh(&aq->lock);
544 if (aq->dev_state > AP_DEV_STATE_UNINITIATED) {
545 req_cnt = aq->total_request_count;
546 valid = true;
547 }
548 spin_unlock_bh(&aq->lock);
549
550 if (valid)
551 return sysfs_emit(buf, "%llu\n", req_cnt);
552 else
553 return sysfs_emit(buf, "-\n");
554 }
555
request_count_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)556 static ssize_t request_count_store(struct device *dev,
557 struct device_attribute *attr,
558 const char *buf, size_t count)
559 {
560 struct ap_queue *aq = to_ap_queue(dev);
561
562 spin_lock_bh(&aq->lock);
563 aq->total_request_count = 0;
564 spin_unlock_bh(&aq->lock);
565
566 return count;
567 }
568
569 static DEVICE_ATTR_RW(request_count);
570
requestq_count_show(struct device * dev,struct device_attribute * attr,char * buf)571 static ssize_t requestq_count_show(struct device *dev,
572 struct device_attribute *attr, char *buf)
573 {
574 struct ap_queue *aq = to_ap_queue(dev);
575 unsigned int reqq_cnt = 0;
576
577 spin_lock_bh(&aq->lock);
578 if (aq->dev_state > AP_DEV_STATE_UNINITIATED)
579 reqq_cnt = aq->requestq_count;
580 spin_unlock_bh(&aq->lock);
581 return sysfs_emit(buf, "%d\n", reqq_cnt);
582 }
583
584 static DEVICE_ATTR_RO(requestq_count);
585
pendingq_count_show(struct device * dev,struct device_attribute * attr,char * buf)586 static ssize_t pendingq_count_show(struct device *dev,
587 struct device_attribute *attr, char *buf)
588 {
589 struct ap_queue *aq = to_ap_queue(dev);
590 unsigned int penq_cnt = 0;
591
592 spin_lock_bh(&aq->lock);
593 if (aq->dev_state > AP_DEV_STATE_UNINITIATED)
594 penq_cnt = aq->pendingq_count;
595 spin_unlock_bh(&aq->lock);
596 return sysfs_emit(buf, "%d\n", penq_cnt);
597 }
598
599 static DEVICE_ATTR_RO(pendingq_count);
600
reset_show(struct device * dev,struct device_attribute * attr,char * buf)601 static ssize_t reset_show(struct device *dev,
602 struct device_attribute *attr, char *buf)
603 {
604 struct ap_queue *aq = to_ap_queue(dev);
605 int rc = 0;
606
607 spin_lock_bh(&aq->lock);
608 switch (aq->sm_state) {
609 case AP_SM_STATE_RESET_START:
610 case AP_SM_STATE_RESET_WAIT:
611 rc = sysfs_emit(buf, "Reset in progress.\n");
612 break;
613 case AP_SM_STATE_WORKING:
614 case AP_SM_STATE_QUEUE_FULL:
615 rc = sysfs_emit(buf, "Reset Timer armed.\n");
616 break;
617 default:
618 rc = sysfs_emit(buf, "No Reset Timer set.\n");
619 }
620 spin_unlock_bh(&aq->lock);
621 return rc;
622 }
623
reset_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)624 static ssize_t reset_store(struct device *dev,
625 struct device_attribute *attr,
626 const char *buf, size_t count)
627 {
628 struct ap_queue *aq = to_ap_queue(dev);
629
630 spin_lock_bh(&aq->lock);
631 __ap_flush_queue(aq);
632 aq->sm_state = AP_SM_STATE_RESET_START;
633 ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
634 spin_unlock_bh(&aq->lock);
635
636 AP_DBF_INFO("%s reset queue=%02x.%04x triggered by user\n",
637 __func__, AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
638
639 return count;
640 }
641
642 static DEVICE_ATTR_RW(reset);
643
interrupt_show(struct device * dev,struct device_attribute * attr,char * buf)644 static ssize_t interrupt_show(struct device *dev,
645 struct device_attribute *attr, char *buf)
646 {
647 struct ap_queue *aq = to_ap_queue(dev);
648 struct ap_queue_status status;
649 int rc = 0;
650
651 spin_lock_bh(&aq->lock);
652 if (aq->sm_state == AP_SM_STATE_SETIRQ_WAIT) {
653 rc = sysfs_emit(buf, "Enable Interrupt pending.\n");
654 } else {
655 status = ap_tapq(aq->qid, NULL);
656 if (status.irq_enabled)
657 rc = sysfs_emit(buf, "Interrupts enabled.\n");
658 else
659 rc = sysfs_emit(buf, "Interrupts disabled.\n");
660 }
661 spin_unlock_bh(&aq->lock);
662
663 return rc;
664 }
665
666 static DEVICE_ATTR_RO(interrupt);
667
config_show(struct device * dev,struct device_attribute * attr,char * buf)668 static ssize_t config_show(struct device *dev,
669 struct device_attribute *attr, char *buf)
670 {
671 struct ap_queue *aq = to_ap_queue(dev);
672 int rc;
673
674 spin_lock_bh(&aq->lock);
675 rc = sysfs_emit(buf, "%d\n", aq->config ? 1 : 0);
676 spin_unlock_bh(&aq->lock);
677 return rc;
678 }
679
680 static DEVICE_ATTR_RO(config);
681
chkstop_show(struct device * dev,struct device_attribute * attr,char * buf)682 static ssize_t chkstop_show(struct device *dev,
683 struct device_attribute *attr, char *buf)
684 {
685 struct ap_queue *aq = to_ap_queue(dev);
686 int rc;
687
688 spin_lock_bh(&aq->lock);
689 rc = sysfs_emit(buf, "%d\n", aq->chkstop ? 1 : 0);
690 spin_unlock_bh(&aq->lock);
691 return rc;
692 }
693
694 static DEVICE_ATTR_RO(chkstop);
695
ap_functions_show(struct device * dev,struct device_attribute * attr,char * buf)696 static ssize_t ap_functions_show(struct device *dev,
697 struct device_attribute *attr, char *buf)
698 {
699 struct ap_queue *aq = to_ap_queue(dev);
700 struct ap_queue_status status;
701 struct ap_tapq_hwinfo hwinfo;
702
703 status = ap_test_queue(aq->qid, 1, &hwinfo);
704 if (status.response_code > AP_RESPONSE_BUSY) {
705 pr_debug("RC 0x%02x on tapq(0x%02x.%04x)\n",
706 status.response_code,
707 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
708 return -EIO;
709 }
710
711 return sysfs_emit(buf, "0x%08X\n", hwinfo.fac);
712 }
713
714 static DEVICE_ATTR_RO(ap_functions);
715
716 #ifdef CONFIG_AP_DEBUG
states_show(struct device * dev,struct device_attribute * attr,char * buf)717 static ssize_t states_show(struct device *dev,
718 struct device_attribute *attr, char *buf)
719 {
720 struct ap_queue *aq = to_ap_queue(dev);
721 int rc = 0;
722
723 spin_lock_bh(&aq->lock);
724 /* queue device state */
725 switch (aq->dev_state) {
726 case AP_DEV_STATE_UNINITIATED:
727 rc = sysfs_emit(buf, "UNINITIATED\n");
728 break;
729 case AP_DEV_STATE_OPERATING:
730 rc = sysfs_emit(buf, "OPERATING");
731 break;
732 case AP_DEV_STATE_SHUTDOWN:
733 rc = sysfs_emit(buf, "SHUTDOWN");
734 break;
735 case AP_DEV_STATE_ERROR:
736 rc = sysfs_emit(buf, "ERROR");
737 break;
738 default:
739 rc = sysfs_emit(buf, "UNKNOWN");
740 }
741 /* state machine state */
742 if (aq->dev_state) {
743 switch (aq->sm_state) {
744 case AP_SM_STATE_RESET_START:
745 rc += sysfs_emit_at(buf, rc, " [RESET_START]\n");
746 break;
747 case AP_SM_STATE_RESET_WAIT:
748 rc += sysfs_emit_at(buf, rc, " [RESET_WAIT]\n");
749 break;
750 case AP_SM_STATE_SETIRQ_WAIT:
751 rc += sysfs_emit_at(buf, rc, " [SETIRQ_WAIT]\n");
752 break;
753 case AP_SM_STATE_IDLE:
754 rc += sysfs_emit_at(buf, rc, " [IDLE]\n");
755 break;
756 case AP_SM_STATE_WORKING:
757 rc += sysfs_emit_at(buf, rc, " [WORKING]\n");
758 break;
759 case AP_SM_STATE_QUEUE_FULL:
760 rc += sysfs_emit_at(buf, rc, " [FULL]\n");
761 break;
762 case AP_SM_STATE_ASSOC_WAIT:
763 rc += sysfs_emit_at(buf, rc, " [ASSOC_WAIT]\n");
764 break;
765 default:
766 rc += sysfs_emit_at(buf, rc, " [UNKNOWN]\n");
767 }
768 }
769 spin_unlock_bh(&aq->lock);
770
771 return rc;
772 }
773 static DEVICE_ATTR_RO(states);
774
last_err_rc_show(struct device * dev,struct device_attribute * attr,char * buf)775 static ssize_t last_err_rc_show(struct device *dev,
776 struct device_attribute *attr, char *buf)
777 {
778 struct ap_queue *aq = to_ap_queue(dev);
779 int rc;
780
781 spin_lock_bh(&aq->lock);
782 rc = aq->last_err_rc;
783 spin_unlock_bh(&aq->lock);
784
785 switch (rc) {
786 case AP_RESPONSE_NORMAL:
787 return sysfs_emit(buf, "NORMAL\n");
788 case AP_RESPONSE_Q_NOT_AVAIL:
789 return sysfs_emit(buf, "Q_NOT_AVAIL\n");
790 case AP_RESPONSE_RESET_IN_PROGRESS:
791 return sysfs_emit(buf, "RESET_IN_PROGRESS\n");
792 case AP_RESPONSE_DECONFIGURED:
793 return sysfs_emit(buf, "DECONFIGURED\n");
794 case AP_RESPONSE_CHECKSTOPPED:
795 return sysfs_emit(buf, "CHECKSTOPPED\n");
796 case AP_RESPONSE_BUSY:
797 return sysfs_emit(buf, "BUSY\n");
798 case AP_RESPONSE_INVALID_ADDRESS:
799 return sysfs_emit(buf, "INVALID_ADDRESS\n");
800 case AP_RESPONSE_OTHERWISE_CHANGED:
801 return sysfs_emit(buf, "OTHERWISE_CHANGED\n");
802 case AP_RESPONSE_Q_FULL:
803 return sysfs_emit(buf, "Q_FULL/NO_PENDING_REPLY\n");
804 case AP_RESPONSE_INDEX_TOO_BIG:
805 return sysfs_emit(buf, "INDEX_TOO_BIG\n");
806 case AP_RESPONSE_NO_FIRST_PART:
807 return sysfs_emit(buf, "NO_FIRST_PART\n");
808 case AP_RESPONSE_MESSAGE_TOO_BIG:
809 return sysfs_emit(buf, "MESSAGE_TOO_BIG\n");
810 case AP_RESPONSE_REQ_FAC_NOT_INST:
811 return sysfs_emit(buf, "REQ_FAC_NOT_INST\n");
812 default:
813 return sysfs_emit(buf, "response code %d\n", rc);
814 }
815 }
816 static DEVICE_ATTR_RO(last_err_rc);
817 #endif
818
819 static struct attribute *ap_queue_dev_attrs[] = {
820 &dev_attr_request_count.attr,
821 &dev_attr_requestq_count.attr,
822 &dev_attr_pendingq_count.attr,
823 &dev_attr_reset.attr,
824 &dev_attr_interrupt.attr,
825 &dev_attr_config.attr,
826 &dev_attr_chkstop.attr,
827 &dev_attr_ap_functions.attr,
828 #ifdef CONFIG_AP_DEBUG
829 &dev_attr_states.attr,
830 &dev_attr_last_err_rc.attr,
831 #endif
832 NULL
833 };
834
835 static struct attribute_group ap_queue_dev_attr_group = {
836 .attrs = ap_queue_dev_attrs
837 };
838
839 static const struct attribute_group *ap_queue_dev_attr_groups[] = {
840 &ap_queue_dev_attr_group,
841 NULL
842 };
843
844 static struct device_type ap_queue_type = {
845 .name = "ap_queue",
846 .groups = ap_queue_dev_attr_groups,
847 };
848
se_bind_show(struct device * dev,struct device_attribute * attr,char * buf)849 static ssize_t se_bind_show(struct device *dev,
850 struct device_attribute *attr, char *buf)
851 {
852 struct ap_queue *aq = to_ap_queue(dev);
853 struct ap_queue_status status;
854 struct ap_tapq_hwinfo hwinfo;
855
856 if (!ap_q_supports_bind(aq))
857 return sysfs_emit(buf, "-\n");
858
859 status = ap_test_queue(aq->qid, 1, &hwinfo);
860 if (status.response_code > AP_RESPONSE_BUSY) {
861 pr_debug("RC 0x%02x on tapq(0x%02x.%04x)\n",
862 status.response_code,
863 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
864 return -EIO;
865 }
866
867 /* update queue's SE bind state */
868 spin_lock_bh(&aq->lock);
869 aq->se_bstate = hwinfo.bs;
870 spin_unlock_bh(&aq->lock);
871
872 switch (hwinfo.bs) {
873 case AP_BS_Q_USABLE:
874 case AP_BS_Q_USABLE_NO_SECURE_KEY:
875 return sysfs_emit(buf, "bound\n");
876 default:
877 return sysfs_emit(buf, "unbound\n");
878 }
879 }
880
se_bind_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)881 static ssize_t se_bind_store(struct device *dev,
882 struct device_attribute *attr,
883 const char *buf, size_t count)
884 {
885 struct ap_queue *aq = to_ap_queue(dev);
886 struct ap_queue_status status;
887 struct ap_tapq_hwinfo hwinfo;
888 bool value;
889 int rc;
890
891 if (!ap_q_supports_bind(aq))
892 return -EINVAL;
893
894 /* only 0 (unbind) and 1 (bind) allowed */
895 rc = kstrtobool(buf, &value);
896 if (rc)
897 return rc;
898
899 if (!value) {
900 /* Unbind. Set F bit arg and trigger RAPQ */
901 spin_lock_bh(&aq->lock);
902 __ap_flush_queue(aq);
903 aq->rapq_fbit = 1;
904 _ap_queue_init_state(aq);
905 rc = count;
906 goto out;
907 }
908
909 /* Bind. Check current SE bind state */
910 status = ap_test_queue(aq->qid, 1, &hwinfo);
911 if (status.response_code) {
912 AP_DBF_WARN("%s RC 0x%02x on tapq(0x%02x.%04x)\n",
913 __func__, status.response_code,
914 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
915 return -EIO;
916 }
917
918 /* Update BS state */
919 spin_lock_bh(&aq->lock);
920 aq->se_bstate = hwinfo.bs;
921 if (hwinfo.bs != AP_BS_Q_AVAIL_FOR_BINDING) {
922 AP_DBF_WARN("%s bind attempt with bs %d on queue 0x%02x.%04x\n",
923 __func__, hwinfo.bs,
924 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
925 rc = -EINVAL;
926 goto out;
927 }
928
929 /* Check SM state */
930 if (aq->sm_state < AP_SM_STATE_IDLE) {
931 rc = -EBUSY;
932 goto out;
933 }
934
935 /* invoke BAPQ */
936 status = ap_bapq(aq->qid);
937 if (status.response_code) {
938 AP_DBF_WARN("%s RC 0x%02x on bapq(0x%02x.%04x)\n",
939 __func__, status.response_code,
940 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
941 rc = -EIO;
942 goto out;
943 }
944 aq->assoc_idx = ASSOC_IDX_INVALID;
945
946 /* verify SE bind state */
947 status = ap_test_queue(aq->qid, 1, &hwinfo);
948 if (status.response_code) {
949 AP_DBF_WARN("%s RC 0x%02x on tapq(0x%02x.%04x)\n",
950 __func__, status.response_code,
951 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
952 rc = -EIO;
953 goto out;
954 }
955 aq->se_bstate = hwinfo.bs;
956 if (!(hwinfo.bs == AP_BS_Q_USABLE ||
957 hwinfo.bs == AP_BS_Q_USABLE_NO_SECURE_KEY)) {
958 AP_DBF_WARN("%s BAPQ success, but bs shows %d on queue 0x%02x.%04x\n",
959 __func__, hwinfo.bs,
960 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
961 rc = -EIO;
962 goto out;
963 }
964
965 /* SE bind was successful */
966 AP_DBF_INFO("%s bapq(0x%02x.%04x) success\n", __func__,
967 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
968 rc = count;
969
970 out:
971 spin_unlock_bh(&aq->lock);
972 return rc;
973 }
974
975 static DEVICE_ATTR_RW(se_bind);
976
se_associate_show(struct device * dev,struct device_attribute * attr,char * buf)977 static ssize_t se_associate_show(struct device *dev,
978 struct device_attribute *attr, char *buf)
979 {
980 struct ap_queue *aq = to_ap_queue(dev);
981 struct ap_queue_status status;
982 struct ap_tapq_hwinfo hwinfo;
983
984 if (!ap_q_supports_assoc(aq))
985 return sysfs_emit(buf, "-\n");
986
987 status = ap_test_queue(aq->qid, 1, &hwinfo);
988 if (status.response_code > AP_RESPONSE_BUSY) {
989 pr_debug("RC 0x%02x on tapq(0x%02x.%04x)\n",
990 status.response_code,
991 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
992 return -EIO;
993 }
994
995 /* update queue's SE bind state */
996 spin_lock_bh(&aq->lock);
997 aq->se_bstate = hwinfo.bs;
998 spin_unlock_bh(&aq->lock);
999
1000 switch (hwinfo.bs) {
1001 case AP_BS_Q_USABLE:
1002 if (aq->assoc_idx == ASSOC_IDX_INVALID) {
1003 AP_DBF_WARN("%s AP_BS_Q_USABLE but invalid assoc_idx\n", __func__);
1004 return -EIO;
1005 }
1006 return sysfs_emit(buf, "associated %u\n", aq->assoc_idx);
1007 case AP_BS_Q_USABLE_NO_SECURE_KEY:
1008 if (aq->assoc_idx != ASSOC_IDX_INVALID)
1009 return sysfs_emit(buf, "association pending\n");
1010 fallthrough;
1011 default:
1012 return sysfs_emit(buf, "unassociated\n");
1013 }
1014 }
1015
se_associate_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1016 static ssize_t se_associate_store(struct device *dev,
1017 struct device_attribute *attr,
1018 const char *buf, size_t count)
1019 {
1020 struct ap_queue *aq = to_ap_queue(dev);
1021 struct ap_queue_status status;
1022 struct ap_tapq_hwinfo hwinfo;
1023 unsigned int value;
1024 int rc;
1025
1026 if (!ap_q_supports_assoc(aq))
1027 return -EINVAL;
1028
1029 /* association index needs to be >= 0 */
1030 rc = kstrtouint(buf, 0, &value);
1031 if (rc)
1032 return rc;
1033 if (value >= ASSOC_IDX_INVALID)
1034 return -EINVAL;
1035
1036 /* check current SE bind state */
1037 status = ap_test_queue(aq->qid, 1, &hwinfo);
1038 if (status.response_code) {
1039 AP_DBF_WARN("%s RC 0x%02x on tapq(0x%02x.%04x)\n",
1040 __func__, status.response_code,
1041 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
1042 return -EIO;
1043 }
1044 spin_lock_bh(&aq->lock);
1045 aq->se_bstate = hwinfo.bs;
1046 if (hwinfo.bs != AP_BS_Q_USABLE_NO_SECURE_KEY) {
1047 AP_DBF_WARN("%s association attempt with bs %d on queue 0x%02x.%04x\n",
1048 __func__, hwinfo.bs,
1049 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
1050 rc = -EINVAL;
1051 goto out;
1052 }
1053
1054 /* check SM state */
1055 if (aq->sm_state != AP_SM_STATE_IDLE) {
1056 rc = -EBUSY;
1057 goto out;
1058 }
1059
1060 /* trigger the asynchronous association request */
1061 status = ap_aapq(aq->qid, value);
1062 switch (status.response_code) {
1063 case AP_RESPONSE_NORMAL:
1064 case AP_RESPONSE_STATE_CHANGE_IN_PROGRESS:
1065 aq->sm_state = AP_SM_STATE_ASSOC_WAIT;
1066 aq->assoc_idx = value;
1067 ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
1068 break;
1069 default:
1070 AP_DBF_WARN("%s RC 0x%02x on aapq(0x%02x.%04x)\n",
1071 __func__, status.response_code,
1072 AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
1073 rc = -EIO;
1074 goto out;
1075 }
1076
1077 rc = count;
1078
1079 out:
1080 spin_unlock_bh(&aq->lock);
1081 return rc;
1082 }
1083
1084 static DEVICE_ATTR_RW(se_associate);
1085
1086 static struct attribute *ap_queue_dev_sb_attrs[] = {
1087 &dev_attr_se_bind.attr,
1088 &dev_attr_se_associate.attr,
1089 NULL
1090 };
1091
1092 static struct attribute_group ap_queue_dev_sb_attr_group = {
1093 .attrs = ap_queue_dev_sb_attrs
1094 };
1095
1096 static const struct attribute_group *ap_queue_dev_sb_attr_groups[] = {
1097 &ap_queue_dev_sb_attr_group,
1098 NULL
1099 };
1100
ap_queue_device_release(struct device * dev)1101 static void ap_queue_device_release(struct device *dev)
1102 {
1103 struct ap_queue *aq = to_ap_queue(dev);
1104
1105 spin_lock_bh(&ap_queues_lock);
1106 hash_del(&aq->hnode);
1107 spin_unlock_bh(&ap_queues_lock);
1108
1109 kfree(aq);
1110 }
1111
ap_queue_create(ap_qid_t qid,struct ap_card * ac)1112 struct ap_queue *ap_queue_create(ap_qid_t qid, struct ap_card *ac)
1113 {
1114 struct ap_queue *aq;
1115
1116 aq = kzalloc(sizeof(*aq), GFP_KERNEL);
1117 if (!aq)
1118 return NULL;
1119 aq->card = ac;
1120 aq->ap_dev.device.release = ap_queue_device_release;
1121 aq->ap_dev.device.type = &ap_queue_type;
1122 aq->ap_dev.device_type = ac->ap_dev.device_type;
1123 /* in SE environment add bind/associate attributes group */
1124 if (ap_is_se_guest() && ap_q_supported_in_se(aq))
1125 aq->ap_dev.device.groups = ap_queue_dev_sb_attr_groups;
1126 aq->qid = qid;
1127 spin_lock_init(&aq->lock);
1128 INIT_LIST_HEAD(&aq->pendingq);
1129 INIT_LIST_HEAD(&aq->requestq);
1130 timer_setup(&aq->timeout, ap_request_timeout, 0);
1131
1132 return aq;
1133 }
1134
ap_queue_init_reply(struct ap_queue * aq,struct ap_message * reply)1135 void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *reply)
1136 {
1137 aq->reply = reply;
1138
1139 spin_lock_bh(&aq->lock);
1140 ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
1141 spin_unlock_bh(&aq->lock);
1142 }
1143 EXPORT_SYMBOL(ap_queue_init_reply);
1144
1145 /**
1146 * ap_queue_message(): Queue a request to an AP device.
1147 * @aq: The AP device to queue the message to
1148 * @ap_msg: The message that is to be added
1149 */
ap_queue_message(struct ap_queue * aq,struct ap_message * ap_msg)1150 int ap_queue_message(struct ap_queue *aq, struct ap_message *ap_msg)
1151 {
1152 int rc = 0;
1153
1154 /* msg needs to have a valid receive-callback */
1155 BUG_ON(!ap_msg->receive);
1156
1157 spin_lock_bh(&aq->lock);
1158
1159 /* only allow to queue new messages if device state is ok */
1160 if (aq->dev_state == AP_DEV_STATE_OPERATING) {
1161 list_add_tail(&ap_msg->list, &aq->requestq);
1162 aq->requestq_count++;
1163 aq->total_request_count++;
1164 atomic64_inc(&aq->card->total_request_count);
1165 } else {
1166 rc = -ENODEV;
1167 }
1168
1169 /* Send/receive as many request from the queue as possible. */
1170 ap_wait(ap_sm_event_loop(aq, AP_SM_EVENT_POLL));
1171
1172 spin_unlock_bh(&aq->lock);
1173
1174 return rc;
1175 }
1176 EXPORT_SYMBOL(ap_queue_message);
1177
1178 /**
1179 * ap_queue_usable(): Check if queue is usable just now.
1180 * @aq: The AP queue device to test for usability.
1181 * This function is intended for the scheduler to query if it makes
1182 * sense to enqueue a message into this AP queue device by calling
1183 * ap_queue_message(). The perspective is very short-term as the
1184 * state machine and device state(s) may change at any time.
1185 */
ap_queue_usable(struct ap_queue * aq)1186 bool ap_queue_usable(struct ap_queue *aq)
1187 {
1188 bool rc = true;
1189
1190 spin_lock_bh(&aq->lock);
1191
1192 /* check for not configured or checkstopped */
1193 if (!aq->config || aq->chkstop) {
1194 rc = false;
1195 goto unlock_and_out;
1196 }
1197
1198 /* device state needs to be ok */
1199 if (aq->dev_state != AP_DEV_STATE_OPERATING) {
1200 rc = false;
1201 goto unlock_and_out;
1202 }
1203
1204 /* SE guest's queues additionally need to be bound */
1205 if (ap_is_se_guest()) {
1206 if (!ap_q_supported_in_se(aq)) {
1207 rc = false;
1208 goto unlock_and_out;
1209 }
1210 if (ap_q_needs_bind(aq) &&
1211 !(aq->se_bstate == AP_BS_Q_USABLE ||
1212 aq->se_bstate == AP_BS_Q_USABLE_NO_SECURE_KEY))
1213 rc = false;
1214 }
1215
1216 unlock_and_out:
1217 spin_unlock_bh(&aq->lock);
1218 return rc;
1219 }
1220 EXPORT_SYMBOL(ap_queue_usable);
1221
1222 /**
1223 * ap_cancel_message(): Cancel a crypto request.
1224 * @aq: The AP device that has the message queued
1225 * @ap_msg: The message that is to be removed
1226 *
1227 * Cancel a crypto request. This is done by removing the request
1228 * from the device pending or request queue. Note that the
1229 * request stays on the AP queue. When it finishes the message
1230 * reply will be discarded because the psmid can't be found.
1231 */
ap_cancel_message(struct ap_queue * aq,struct ap_message * ap_msg)1232 void ap_cancel_message(struct ap_queue *aq, struct ap_message *ap_msg)
1233 {
1234 struct ap_message *tmp;
1235
1236 spin_lock_bh(&aq->lock);
1237 if (!list_empty(&ap_msg->list)) {
1238 list_for_each_entry(tmp, &aq->pendingq, list)
1239 if (tmp->psmid == ap_msg->psmid) {
1240 aq->pendingq_count--;
1241 goto found;
1242 }
1243 aq->requestq_count--;
1244 found:
1245 list_del_init(&ap_msg->list);
1246 }
1247 spin_unlock_bh(&aq->lock);
1248 }
1249 EXPORT_SYMBOL(ap_cancel_message);
1250
1251 /**
1252 * __ap_flush_queue(): Flush requests.
1253 * @aq: Pointer to the AP queue
1254 *
1255 * Flush all requests from the request/pending queue of an AP device.
1256 */
__ap_flush_queue(struct ap_queue * aq)1257 static void __ap_flush_queue(struct ap_queue *aq)
1258 {
1259 struct ap_message *ap_msg, *next;
1260
1261 list_for_each_entry_safe(ap_msg, next, &aq->pendingq, list) {
1262 list_del_init(&ap_msg->list);
1263 aq->pendingq_count--;
1264 ap_msg->rc = -EAGAIN;
1265 ap_msg->receive(aq, ap_msg, NULL);
1266 }
1267 list_for_each_entry_safe(ap_msg, next, &aq->requestq, list) {
1268 list_del_init(&ap_msg->list);
1269 aq->requestq_count--;
1270 ap_msg->rc = -EAGAIN;
1271 ap_msg->receive(aq, ap_msg, NULL);
1272 }
1273 aq->queue_count = 0;
1274 }
1275
ap_flush_queue(struct ap_queue * aq)1276 void ap_flush_queue(struct ap_queue *aq)
1277 {
1278 spin_lock_bh(&aq->lock);
1279 __ap_flush_queue(aq);
1280 spin_unlock_bh(&aq->lock);
1281 }
1282 EXPORT_SYMBOL(ap_flush_queue);
1283
ap_queue_prepare_remove(struct ap_queue * aq)1284 void ap_queue_prepare_remove(struct ap_queue *aq)
1285 {
1286 spin_lock_bh(&aq->lock);
1287 /* flush queue */
1288 __ap_flush_queue(aq);
1289 /* move queue device state to SHUTDOWN in progress */
1290 aq->dev_state = AP_DEV_STATE_SHUTDOWN;
1291 spin_unlock_bh(&aq->lock);
1292 del_timer_sync(&aq->timeout);
1293 }
1294
ap_queue_remove(struct ap_queue * aq)1295 void ap_queue_remove(struct ap_queue *aq)
1296 {
1297 /*
1298 * all messages have been flushed and the device state
1299 * is SHUTDOWN. Now reset with zero which also clears
1300 * the irq registration and move the device state
1301 * to the initial value AP_DEV_STATE_UNINITIATED.
1302 */
1303 spin_lock_bh(&aq->lock);
1304 ap_zapq(aq->qid, 0);
1305 aq->dev_state = AP_DEV_STATE_UNINITIATED;
1306 spin_unlock_bh(&aq->lock);
1307 }
1308
_ap_queue_init_state(struct ap_queue * aq)1309 void _ap_queue_init_state(struct ap_queue *aq)
1310 {
1311 aq->dev_state = AP_DEV_STATE_OPERATING;
1312 aq->sm_state = AP_SM_STATE_RESET_START;
1313 aq->last_err_rc = 0;
1314 aq->assoc_idx = ASSOC_IDX_INVALID;
1315 ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
1316 }
1317
ap_queue_init_state(struct ap_queue * aq)1318 void ap_queue_init_state(struct ap_queue *aq)
1319 {
1320 spin_lock_bh(&aq->lock);
1321 _ap_queue_init_state(aq);
1322 spin_unlock_bh(&aq->lock);
1323 }
1324 EXPORT_SYMBOL(ap_queue_init_state);
1325