Linux Audio

Check our new training course

Loading...
v6.2
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * Copyright IBM Corp. 2016
  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
 19static void __ap_flush_queue(struct ap_queue *aq);
 20
 21/**
 22 * ap_queue_enable_irq(): Enable interrupt support on this AP queue.
 23 * @aq: The AP queue
 24 * @ind: the notification indicator byte
 25 *
 26 * Enables interruption on AP queue via ap_aqic(). Based on the return
 27 * value it waits a while and tests the AP queue if interrupts
 28 * have been switched on using ap_test_queue().
 29 */
 30static int ap_queue_enable_irq(struct ap_queue *aq, void *ind)
 31{
 32	struct ap_queue_status status;
 33	struct ap_qirq_ctrl qirqctrl = { 0 };
 34
 35	qirqctrl.ir = 1;
 36	qirqctrl.isc = AP_ISC;
 37	status = ap_aqic(aq->qid, qirqctrl, virt_to_phys(ind));
 38	switch (status.response_code) {
 39	case AP_RESPONSE_NORMAL:
 40	case AP_RESPONSE_OTHERWISE_CHANGED:
 41		return 0;
 42	case AP_RESPONSE_Q_NOT_AVAIL:
 43	case AP_RESPONSE_DECONFIGURED:
 44	case AP_RESPONSE_CHECKSTOPPED:
 45	case AP_RESPONSE_INVALID_ADDRESS:
 46		pr_err("Registering adapter interrupts for AP device %02x.%04x failed\n",
 47		       AP_QID_CARD(aq->qid),
 48		       AP_QID_QUEUE(aq->qid));
 49		return -EOPNOTSUPP;
 50	case AP_RESPONSE_RESET_IN_PROGRESS:
 51	case AP_RESPONSE_BUSY:
 52	default:
 53		return -EBUSY;
 54	}
 55}
 56
 57/**
 58 * __ap_send(): Send message to adjunct processor queue.
 59 * @qid: The AP queue number
 60 * @psmid: The program supplied message identifier
 61 * @msg: The message text
 62 * @length: The message length
 63 * @special: Special Bit
 64 *
 65 * Returns AP queue status structure.
 66 * Condition code 1 on NQAP can't happen because the L bit is 1.
 67 * Condition code 2 on NQAP also means the send is incomplete,
 68 * because a segment boundary was reached. The NQAP is repeated.
 69 */
 70static inline struct ap_queue_status
 71__ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length,
 72	  int special)
 73{
 74	if (special)
 75		qid |= 0x400000UL;
 76	return ap_nqap(qid, psmid, msg, length);
 77}
 78
 79int ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length)
 80{
 81	struct ap_queue_status status;
 82
 83	status = __ap_send(qid, psmid, msg, length, 0);
 84	switch (status.response_code) {
 85	case AP_RESPONSE_NORMAL:
 86		return 0;
 87	case AP_RESPONSE_Q_FULL:
 88	case AP_RESPONSE_RESET_IN_PROGRESS:
 89		return -EBUSY;
 90	case AP_RESPONSE_REQ_FAC_NOT_INST:
 91		return -EINVAL;
 92	default:	/* Device is gone. */
 93		return -ENODEV;
 94	}
 95}
 96EXPORT_SYMBOL(ap_send);
 97
 98int ap_recv(ap_qid_t qid, unsigned long long *psmid, void *msg, size_t length)
 99{
100	struct ap_queue_status status;
101
102	if (!msg)
103		return -EINVAL;
104	status = ap_dqap(qid, psmid, msg, length, NULL, NULL);
105	switch (status.response_code) {
106	case AP_RESPONSE_NORMAL:
107		return 0;
108	case AP_RESPONSE_NO_PENDING_REPLY:
109		if (status.queue_empty)
110			return -ENOENT;
111		return -EBUSY;
112	case AP_RESPONSE_RESET_IN_PROGRESS:
113		return -EBUSY;
114	default:
115		return -ENODEV;
116	}
117}
118EXPORT_SYMBOL(ap_recv);
119
120/* State machine definitions and helpers */
121
122static enum ap_sm_wait ap_sm_nop(struct ap_queue *aq)
123{
124	return AP_SM_WAIT_NONE;
125}
126
127/**
128 * ap_sm_recv(): Receive pending reply messages from an AP queue but do
129 *	not change the state of the device.
130 * @aq: pointer to the AP queue
131 *
132 * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
133 */
134static struct ap_queue_status ap_sm_recv(struct ap_queue *aq)
135{
136	struct ap_queue_status status;
137	struct ap_message *ap_msg;
138	bool found = false;
139	size_t reslen;
140	unsigned long resgr0 = 0;
141	int parts = 0;
142
143	/*
144	 * DQAP loop until response code and resgr0 indicate that
145	 * the msg is totally received. As we use the very same buffer
146	 * the msg is overwritten with each invocation. That's intended
147	 * and the receiver of the msg is informed with a msg rc code
148	 * of EMSGSIZE in such a case.
149	 */
150	do {
151		status = ap_dqap(aq->qid, &aq->reply->psmid,
152				 aq->reply->msg, aq->reply->bufsize,
153				 &reslen, &resgr0);
154		parts++;
155	} while (status.response_code == 0xFF && resgr0 != 0);
156
 
 
157	switch (status.response_code) {
158	case AP_RESPONSE_NORMAL:
159		aq->queue_count = max_t(int, 0, aq->queue_count - 1);
160		if (!status.queue_empty && !aq->queue_count)
161			aq->queue_count++;
162		if (aq->queue_count > 0)
163			mod_timer(&aq->timeout,
164				  jiffies + aq->request_timeout);
165		list_for_each_entry(ap_msg, &aq->pendingq, list) {
166			if (ap_msg->psmid != aq->reply->psmid)
167				continue;
168			list_del_init(&ap_msg->list);
169			aq->pendingq_count--;
170			if (parts > 1) {
171				ap_msg->rc = -EMSGSIZE;
172				ap_msg->receive(aq, ap_msg, NULL);
173			} else {
174				ap_msg->receive(aq, ap_msg, aq->reply);
175			}
176			found = true;
177			break;
178		}
179		if (!found) {
180			AP_DBF_WARN("%s unassociated reply psmid=0x%016llx on 0x%02x.%04x\n",
181				    __func__, aq->reply->psmid,
182				    AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
183		}
184		fallthrough;
185	case AP_RESPONSE_NO_PENDING_REPLY:
186		if (!status.queue_empty || aq->queue_count <= 0)
187			break;
188		/* The card shouldn't forget requests but who knows. */
189		aq->queue_count = 0;
190		list_splice_init(&aq->pendingq, &aq->requestq);
191		aq->requestq_count += aq->pendingq_count;
192		aq->pendingq_count = 0;
193		break;
194	default:
195		break;
196	}
197	return status;
198}
199
200/**
201 * ap_sm_read(): Receive pending reply messages from an AP queue.
202 * @aq: pointer to the AP queue
203 *
204 * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
205 */
206static enum ap_sm_wait ap_sm_read(struct ap_queue *aq)
207{
208	struct ap_queue_status status;
209
210	if (!aq->reply)
211		return AP_SM_WAIT_NONE;
212	status = ap_sm_recv(aq);
213	switch (status.response_code) {
214	case AP_RESPONSE_NORMAL:
215		if (aq->queue_count > 0) {
216			aq->sm_state = AP_SM_STATE_WORKING;
217			return AP_SM_WAIT_AGAIN;
218		}
219		aq->sm_state = AP_SM_STATE_IDLE;
220		return AP_SM_WAIT_NONE;
221	case AP_RESPONSE_NO_PENDING_REPLY:
222		if (aq->queue_count > 0)
223			return aq->interrupt ?
224				AP_SM_WAIT_INTERRUPT : AP_SM_WAIT_TIMEOUT;
225		aq->sm_state = AP_SM_STATE_IDLE;
226		return AP_SM_WAIT_NONE;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227	default:
228		aq->dev_state = AP_DEV_STATE_ERROR;
229		aq->last_err_rc = status.response_code;
230		AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
231			    __func__, status.response_code,
232			    AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
233		return AP_SM_WAIT_NONE;
234	}
235}
236
237/**
238 * ap_sm_write(): Send messages from the request queue to an AP queue.
239 * @aq: pointer to the AP queue
240 *
241 * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
242 */
243static enum ap_sm_wait ap_sm_write(struct ap_queue *aq)
244{
245	struct ap_queue_status status;
246	struct ap_message *ap_msg;
247	ap_qid_t qid = aq->qid;
248
249	if (aq->requestq_count <= 0)
250		return AP_SM_WAIT_NONE;
251
252	/* Start the next request on the queue. */
253	ap_msg = list_entry(aq->requestq.next, struct ap_message, list);
254#ifdef CONFIG_ZCRYPT_DEBUG
255	if (ap_msg->fi.action == AP_FI_ACTION_NQAP_QID_INVAL) {
256		AP_DBF_WARN("%s fi cmd 0x%04x: forcing invalid qid 0xFF00\n",
257			    __func__, ap_msg->fi.cmd);
258		qid = 0xFF00;
259	}
260#endif
261	status = __ap_send(qid, ap_msg->psmid,
262			   ap_msg->msg, ap_msg->len,
263			   ap_msg->flags & AP_MSG_FLAG_SPECIAL);
264	switch (status.response_code) {
265	case AP_RESPONSE_NORMAL:
266		aq->queue_count = max_t(int, 1, aq->queue_count + 1);
267		if (aq->queue_count == 1)
268			mod_timer(&aq->timeout, jiffies + aq->request_timeout);
269		list_move_tail(&ap_msg->list, &aq->pendingq);
270		aq->requestq_count--;
271		aq->pendingq_count++;
272		if (aq->queue_count < aq->card->queue_depth) {
273			aq->sm_state = AP_SM_STATE_WORKING;
274			return AP_SM_WAIT_AGAIN;
275		}
276		fallthrough;
277	case AP_RESPONSE_Q_FULL:
278		aq->sm_state = AP_SM_STATE_QUEUE_FULL;
279		return aq->interrupt ?
280			AP_SM_WAIT_INTERRUPT : AP_SM_WAIT_TIMEOUT;
281	case AP_RESPONSE_RESET_IN_PROGRESS:
282		aq->sm_state = AP_SM_STATE_RESET_WAIT;
283		return AP_SM_WAIT_TIMEOUT;
284	case AP_RESPONSE_INVALID_DOMAIN:
285		AP_DBF_WARN("%s RESPONSE_INVALID_DOMAIN on NQAP\n", __func__);
286		fallthrough;
287	case AP_RESPONSE_MESSAGE_TOO_BIG:
288	case AP_RESPONSE_REQ_FAC_NOT_INST:
289		list_del_init(&ap_msg->list);
290		aq->requestq_count--;
291		ap_msg->rc = -EINVAL;
292		ap_msg->receive(aq, ap_msg, NULL);
293		return AP_SM_WAIT_AGAIN;
294	default:
295		aq->dev_state = AP_DEV_STATE_ERROR;
296		aq->last_err_rc = status.response_code;
297		AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
298			    __func__, status.response_code,
299			    AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
300		return AP_SM_WAIT_NONE;
301	}
302}
303
304/**
305 * ap_sm_read_write(): Send and receive messages to/from an AP queue.
306 * @aq: pointer to the AP queue
307 *
308 * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
309 */
310static enum ap_sm_wait ap_sm_read_write(struct ap_queue *aq)
311{
312	return min(ap_sm_read(aq), ap_sm_write(aq));
313}
314
315/**
316 * ap_sm_reset(): Reset an AP queue.
317 * @aq: The AP queue
318 *
319 * Submit the Reset command to an AP queue.
320 */
321static enum ap_sm_wait ap_sm_reset(struct ap_queue *aq)
322{
323	struct ap_queue_status status;
324
325	status = ap_rapq(aq->qid);
326	switch (status.response_code) {
327	case AP_RESPONSE_NORMAL:
328	case AP_RESPONSE_RESET_IN_PROGRESS:
329		aq->sm_state = AP_SM_STATE_RESET_WAIT;
330		aq->interrupt = false;
331		return AP_SM_WAIT_TIMEOUT;
 
 
 
 
 
332	default:
333		aq->dev_state = AP_DEV_STATE_ERROR;
334		aq->last_err_rc = status.response_code;
335		AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
336			    __func__, status.response_code,
337			    AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
338		return AP_SM_WAIT_NONE;
339	}
340}
341
342/**
343 * ap_sm_reset_wait(): Test queue for completion of the reset operation
344 * @aq: pointer to the AP queue
345 *
346 * Returns AP_POLL_IMMEDIATELY, AP_POLL_AFTER_TIMEROUT or 0.
347 */
348static enum ap_sm_wait ap_sm_reset_wait(struct ap_queue *aq)
349{
350	struct ap_queue_status status;
351	void *lsi_ptr;
352
353	if (aq->queue_count > 0 && aq->reply)
354		/* Try to read a completed message and get the status */
355		status = ap_sm_recv(aq);
356	else
357		/* Get the status with TAPQ */
358		status = ap_tapq(aq->qid, NULL);
359
360	switch (status.response_code) {
361	case AP_RESPONSE_NORMAL:
362		lsi_ptr = ap_airq_ptr();
363		if (lsi_ptr && ap_queue_enable_irq(aq, lsi_ptr) == 0)
364			aq->sm_state = AP_SM_STATE_SETIRQ_WAIT;
365		else
366			aq->sm_state = (aq->queue_count > 0) ?
367				AP_SM_STATE_WORKING : AP_SM_STATE_IDLE;
368		return AP_SM_WAIT_AGAIN;
369	case AP_RESPONSE_BUSY:
370	case AP_RESPONSE_RESET_IN_PROGRESS:
371		return AP_SM_WAIT_TIMEOUT;
372	case AP_RESPONSE_Q_NOT_AVAIL:
373	case AP_RESPONSE_DECONFIGURED:
374	case AP_RESPONSE_CHECKSTOPPED:
375	default:
376		aq->dev_state = AP_DEV_STATE_ERROR;
377		aq->last_err_rc = status.response_code;
378		AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
379			    __func__, status.response_code,
380			    AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
381		return AP_SM_WAIT_NONE;
382	}
383}
384
385/**
386 * ap_sm_setirq_wait(): Test queue for completion of the irq enablement
387 * @aq: pointer to the AP queue
388 *
389 * Returns AP_POLL_IMMEDIATELY, AP_POLL_AFTER_TIMEROUT or 0.
390 */
391static enum ap_sm_wait ap_sm_setirq_wait(struct ap_queue *aq)
392{
393	struct ap_queue_status status;
394
395	if (aq->queue_count > 0 && aq->reply)
396		/* Try to read a completed message and get the status */
397		status = ap_sm_recv(aq);
398	else
399		/* Get the status with TAPQ */
400		status = ap_tapq(aq->qid, NULL);
401
402	if (status.irq_enabled == 1) {
403		/* Irqs are now enabled */
404		aq->interrupt = true;
405		aq->sm_state = (aq->queue_count > 0) ?
406			AP_SM_STATE_WORKING : AP_SM_STATE_IDLE;
407	}
408
409	switch (status.response_code) {
410	case AP_RESPONSE_NORMAL:
411		if (aq->queue_count > 0)
412			return AP_SM_WAIT_AGAIN;
413		fallthrough;
414	case AP_RESPONSE_NO_PENDING_REPLY:
415		return AP_SM_WAIT_TIMEOUT;
416	default:
417		aq->dev_state = AP_DEV_STATE_ERROR;
418		aq->last_err_rc = status.response_code;
419		AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
420			    __func__, status.response_code,
421			    AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
422		return AP_SM_WAIT_NONE;
423	}
424}
425
426/*
427 * AP state machine jump table
428 */
429static ap_func_t *ap_jumptable[NR_AP_SM_STATES][NR_AP_SM_EVENTS] = {
430	[AP_SM_STATE_RESET_START] = {
431		[AP_SM_EVENT_POLL] = ap_sm_reset,
432		[AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
433	},
434	[AP_SM_STATE_RESET_WAIT] = {
435		[AP_SM_EVENT_POLL] = ap_sm_reset_wait,
436		[AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
437	},
438	[AP_SM_STATE_SETIRQ_WAIT] = {
439		[AP_SM_EVENT_POLL] = ap_sm_setirq_wait,
440		[AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
441	},
442	[AP_SM_STATE_IDLE] = {
443		[AP_SM_EVENT_POLL] = ap_sm_write,
444		[AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
445	},
446	[AP_SM_STATE_WORKING] = {
447		[AP_SM_EVENT_POLL] = ap_sm_read_write,
448		[AP_SM_EVENT_TIMEOUT] = ap_sm_reset,
449	},
450	[AP_SM_STATE_QUEUE_FULL] = {
451		[AP_SM_EVENT_POLL] = ap_sm_read,
452		[AP_SM_EVENT_TIMEOUT] = ap_sm_reset,
 
 
 
 
 
 
 
 
453	},
454};
455
456enum ap_sm_wait ap_sm_event(struct ap_queue *aq, enum ap_sm_event event)
457{
458	if (aq->config && !aq->chkstop &&
459	    aq->dev_state > AP_DEV_STATE_UNINITIATED)
460		return ap_jumptable[aq->sm_state][event](aq);
461	else
462		return AP_SM_WAIT_NONE;
463}
464
465enum ap_sm_wait ap_sm_event_loop(struct ap_queue *aq, enum ap_sm_event event)
466{
467	enum ap_sm_wait wait;
468
469	while ((wait = ap_sm_event(aq, event)) == AP_SM_WAIT_AGAIN)
470		;
471	return wait;
472}
473
474/*
475 * AP queue related attributes.
476 */
477static ssize_t request_count_show(struct device *dev,
478				  struct device_attribute *attr,
479				  char *buf)
480{
481	struct ap_queue *aq = to_ap_queue(dev);
482	bool valid = false;
483	u64 req_cnt;
484
 
485	spin_lock_bh(&aq->lock);
486	if (aq->dev_state > AP_DEV_STATE_UNINITIATED) {
487		req_cnt = aq->total_request_count;
488		valid = true;
489	}
490	spin_unlock_bh(&aq->lock);
 
 
491
492	if (valid)
493		return scnprintf(buf, PAGE_SIZE, "%llu\n", req_cnt);
494	else
495		return scnprintf(buf, PAGE_SIZE, "-\n");
496}
 
497
498static ssize_t request_count_store(struct device *dev,
499				   struct device_attribute *attr,
500				   const char *buf, size_t count)
 
 
 
501{
502	struct ap_queue *aq = to_ap_queue(dev);
 
503
504	spin_lock_bh(&aq->lock);
505	aq->total_request_count = 0;
506	spin_unlock_bh(&aq->lock);
507
508	return count;
509}
510
511static DEVICE_ATTR_RW(request_count);
512
513static ssize_t requestq_count_show(struct device *dev,
514				   struct device_attribute *attr, char *buf)
515{
516	struct ap_queue *aq = to_ap_queue(dev);
517	unsigned int reqq_cnt = 0;
518
519	spin_lock_bh(&aq->lock);
520	if (aq->dev_state > AP_DEV_STATE_UNINITIATED)
521		reqq_cnt = aq->requestq_count;
522	spin_unlock_bh(&aq->lock);
523	return scnprintf(buf, PAGE_SIZE, "%d\n", reqq_cnt);
524}
525
526static DEVICE_ATTR_RO(requestq_count);
527
528static ssize_t pendingq_count_show(struct device *dev,
529				   struct device_attribute *attr, char *buf)
530{
531	struct ap_queue *aq = to_ap_queue(dev);
532	unsigned int penq_cnt = 0;
533
534	spin_lock_bh(&aq->lock);
535	if (aq->dev_state > AP_DEV_STATE_UNINITIATED)
536		penq_cnt = aq->pendingq_count;
537	spin_unlock_bh(&aq->lock);
538	return scnprintf(buf, PAGE_SIZE, "%d\n", penq_cnt);
539}
540
541static DEVICE_ATTR_RO(pendingq_count);
542
543static ssize_t reset_show(struct device *dev,
544			  struct device_attribute *attr, char *buf)
545{
546	struct ap_queue *aq = to_ap_queue(dev);
547	int rc = 0;
548
549	spin_lock_bh(&aq->lock);
550	switch (aq->sm_state) {
551	case AP_SM_STATE_RESET_START:
552	case AP_SM_STATE_RESET_WAIT:
553		rc = scnprintf(buf, PAGE_SIZE, "Reset in progress.\n");
554		break;
555	case AP_SM_STATE_WORKING:
556	case AP_SM_STATE_QUEUE_FULL:
557		rc = scnprintf(buf, PAGE_SIZE, "Reset Timer armed.\n");
558		break;
559	default:
560		rc = scnprintf(buf, PAGE_SIZE, "No Reset Timer set.\n");
561	}
562	spin_unlock_bh(&aq->lock);
563	return rc;
564}
565
566static ssize_t reset_store(struct device *dev,
567			   struct device_attribute *attr,
568			   const char *buf, size_t count)
569{
570	struct ap_queue *aq = to_ap_queue(dev);
571
572	spin_lock_bh(&aq->lock);
573	__ap_flush_queue(aq);
574	aq->sm_state = AP_SM_STATE_RESET_START;
575	ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
576	spin_unlock_bh(&aq->lock);
577
578	AP_DBF_INFO("%s reset queue=%02x.%04x triggered by user\n",
579		    __func__, AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
580
581	return count;
582}
583
584static DEVICE_ATTR_RW(reset);
585
586static ssize_t interrupt_show(struct device *dev,
587			      struct device_attribute *attr, char *buf)
588{
589	struct ap_queue *aq = to_ap_queue(dev);
590	int rc = 0;
591
592	spin_lock_bh(&aq->lock);
593	if (aq->sm_state == AP_SM_STATE_SETIRQ_WAIT)
594		rc = scnprintf(buf, PAGE_SIZE, "Enable Interrupt pending.\n");
595	else if (aq->interrupt)
596		rc = scnprintf(buf, PAGE_SIZE, "Interrupts enabled.\n");
597	else
598		rc = scnprintf(buf, PAGE_SIZE, "Interrupts disabled.\n");
599	spin_unlock_bh(&aq->lock);
600	return rc;
601}
602
603static DEVICE_ATTR_RO(interrupt);
604
605static ssize_t config_show(struct device *dev,
606			   struct device_attribute *attr, char *buf)
607{
608	struct ap_queue *aq = to_ap_queue(dev);
609	int rc;
610
611	spin_lock_bh(&aq->lock);
612	rc = scnprintf(buf, PAGE_SIZE, "%d\n", aq->config ? 1 : 0);
613	spin_unlock_bh(&aq->lock);
614	return rc;
615}
616
617static DEVICE_ATTR_RO(config);
618
619static ssize_t chkstop_show(struct device *dev,
620			    struct device_attribute *attr, char *buf)
621{
622	struct ap_queue *aq = to_ap_queue(dev);
623	int rc;
624
625	spin_lock_bh(&aq->lock);
626	rc = scnprintf(buf, PAGE_SIZE, "%d\n", aq->chkstop ? 1 : 0);
627	spin_unlock_bh(&aq->lock);
628	return rc;
629}
630
631static DEVICE_ATTR_RO(chkstop);
632
633#ifdef CONFIG_ZCRYPT_DEBUG
634static ssize_t states_show(struct device *dev,
635			   struct device_attribute *attr, char *buf)
636{
637	struct ap_queue *aq = to_ap_queue(dev);
638	int rc = 0;
639
640	spin_lock_bh(&aq->lock);
641	/* queue device state */
642	switch (aq->dev_state) {
643	case AP_DEV_STATE_UNINITIATED:
644		rc = scnprintf(buf, PAGE_SIZE, "UNINITIATED\n");
645		break;
646	case AP_DEV_STATE_OPERATING:
647		rc = scnprintf(buf, PAGE_SIZE, "OPERATING");
648		break;
649	case AP_DEV_STATE_SHUTDOWN:
650		rc = scnprintf(buf, PAGE_SIZE, "SHUTDOWN");
651		break;
652	case AP_DEV_STATE_ERROR:
653		rc = scnprintf(buf, PAGE_SIZE, "ERROR");
654		break;
655	default:
656		rc = scnprintf(buf, PAGE_SIZE, "UNKNOWN");
657	}
658	/* state machine state */
659	if (aq->dev_state) {
660		switch (aq->sm_state) {
661		case AP_SM_STATE_RESET_START:
662			rc += scnprintf(buf + rc, PAGE_SIZE - rc,
663					" [RESET_START]\n");
664			break;
665		case AP_SM_STATE_RESET_WAIT:
666			rc += scnprintf(buf + rc, PAGE_SIZE - rc,
667					" [RESET_WAIT]\n");
668			break;
669		case AP_SM_STATE_SETIRQ_WAIT:
670			rc += scnprintf(buf + rc, PAGE_SIZE - rc,
671					" [SETIRQ_WAIT]\n");
672			break;
673		case AP_SM_STATE_IDLE:
674			rc += scnprintf(buf + rc, PAGE_SIZE - rc,
675					" [IDLE]\n");
676			break;
677		case AP_SM_STATE_WORKING:
678			rc += scnprintf(buf + rc, PAGE_SIZE - rc,
679					" [WORKING]\n");
680			break;
681		case AP_SM_STATE_QUEUE_FULL:
682			rc += scnprintf(buf + rc, PAGE_SIZE - rc,
683					" [FULL]\n");
684			break;
685		default:
686			rc += scnprintf(buf + rc, PAGE_SIZE - rc,
687					" [UNKNOWN]\n");
688		}
689	}
690	spin_unlock_bh(&aq->lock);
691
692	return rc;
693}
694static DEVICE_ATTR_RO(states);
695
696static ssize_t last_err_rc_show(struct device *dev,
697				struct device_attribute *attr, char *buf)
698{
699	struct ap_queue *aq = to_ap_queue(dev);
700	int rc;
701
702	spin_lock_bh(&aq->lock);
703	rc = aq->last_err_rc;
704	spin_unlock_bh(&aq->lock);
705
706	switch (rc) {
707	case AP_RESPONSE_NORMAL:
708		return scnprintf(buf, PAGE_SIZE, "NORMAL\n");
709	case AP_RESPONSE_Q_NOT_AVAIL:
710		return scnprintf(buf, PAGE_SIZE, "Q_NOT_AVAIL\n");
711	case AP_RESPONSE_RESET_IN_PROGRESS:
712		return scnprintf(buf, PAGE_SIZE, "RESET_IN_PROGRESS\n");
713	case AP_RESPONSE_DECONFIGURED:
714		return scnprintf(buf, PAGE_SIZE, "DECONFIGURED\n");
715	case AP_RESPONSE_CHECKSTOPPED:
716		return scnprintf(buf, PAGE_SIZE, "CHECKSTOPPED\n");
717	case AP_RESPONSE_BUSY:
718		return scnprintf(buf, PAGE_SIZE, "BUSY\n");
719	case AP_RESPONSE_INVALID_ADDRESS:
720		return scnprintf(buf, PAGE_SIZE, "INVALID_ADDRESS\n");
721	case AP_RESPONSE_OTHERWISE_CHANGED:
722		return scnprintf(buf, PAGE_SIZE, "OTHERWISE_CHANGED\n");
723	case AP_RESPONSE_Q_FULL:
724		return scnprintf(buf, PAGE_SIZE, "Q_FULL/NO_PENDING_REPLY\n");
725	case AP_RESPONSE_INDEX_TOO_BIG:
726		return scnprintf(buf, PAGE_SIZE, "INDEX_TOO_BIG\n");
727	case AP_RESPONSE_NO_FIRST_PART:
728		return scnprintf(buf, PAGE_SIZE, "NO_FIRST_PART\n");
729	case AP_RESPONSE_MESSAGE_TOO_BIG:
730		return scnprintf(buf, PAGE_SIZE, "MESSAGE_TOO_BIG\n");
731	case AP_RESPONSE_REQ_FAC_NOT_INST:
732		return scnprintf(buf, PAGE_SIZE, "REQ_FAC_NOT_INST\n");
733	default:
734		return scnprintf(buf, PAGE_SIZE, "response code %d\n", rc);
735	}
736}
737static DEVICE_ATTR_RO(last_err_rc);
738#endif
739
740static struct attribute *ap_queue_dev_attrs[] = {
741	&dev_attr_request_count.attr,
742	&dev_attr_requestq_count.attr,
743	&dev_attr_pendingq_count.attr,
744	&dev_attr_reset.attr,
745	&dev_attr_interrupt.attr,
746	&dev_attr_config.attr,
747	&dev_attr_chkstop.attr,
748#ifdef CONFIG_ZCRYPT_DEBUG
749	&dev_attr_states.attr,
750	&dev_attr_last_err_rc.attr,
751#endif
752	NULL
753};
754
755static struct attribute_group ap_queue_dev_attr_group = {
756	.attrs = ap_queue_dev_attrs
757};
758
759static const struct attribute_group *ap_queue_dev_attr_groups[] = {
760	&ap_queue_dev_attr_group,
761	NULL
762};
763
764static struct device_type ap_queue_type = {
765	.name = "ap_queue",
766	.groups = ap_queue_dev_attr_groups,
767};
768
769static void ap_queue_device_release(struct device *dev)
770{
771	struct ap_queue *aq = to_ap_queue(dev);
772
773	spin_lock_bh(&ap_queues_lock);
774	hash_del(&aq->hnode);
775	spin_unlock_bh(&ap_queues_lock);
776
777	kfree(aq);
778}
779
780struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type)
781{
782	struct ap_queue *aq;
783
784	aq = kzalloc(sizeof(*aq), GFP_KERNEL);
785	if (!aq)
786		return NULL;
787	aq->ap_dev.device.release = ap_queue_device_release;
788	aq->ap_dev.device.type = &ap_queue_type;
789	aq->ap_dev.device_type = device_type;
 
 
 
790	aq->qid = qid;
791	aq->interrupt = false;
 
792	spin_lock_init(&aq->lock);
793	INIT_LIST_HEAD(&aq->pendingq);
794	INIT_LIST_HEAD(&aq->requestq);
795	timer_setup(&aq->timeout, ap_request_timeout, 0);
796
797	return aq;
798}
799
800void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *reply)
801{
802	aq->reply = reply;
803
804	spin_lock_bh(&aq->lock);
805	ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
806	spin_unlock_bh(&aq->lock);
807}
808EXPORT_SYMBOL(ap_queue_init_reply);
809
810/**
811 * ap_queue_message(): Queue a request to an AP device.
812 * @aq: The AP device to queue the message to
813 * @ap_msg: The message that is to be added
814 */
815int ap_queue_message(struct ap_queue *aq, struct ap_message *ap_msg)
816{
817	int rc = 0;
818
819	/* msg needs to have a valid receive-callback */
820	BUG_ON(!ap_msg->receive);
821
822	spin_lock_bh(&aq->lock);
823
824	/* only allow to queue new messages if device state is ok */
825	if (aq->dev_state == AP_DEV_STATE_OPERATING) {
826		list_add_tail(&ap_msg->list, &aq->requestq);
827		aq->requestq_count++;
828		aq->total_request_count++;
829		atomic64_inc(&aq->card->total_request_count);
830	} else {
831		rc = -ENODEV;
832	}
833
834	/* Send/receive as many request from the queue as possible. */
835	ap_wait(ap_sm_event_loop(aq, AP_SM_EVENT_POLL));
836
837	spin_unlock_bh(&aq->lock);
838
839	return rc;
840}
841EXPORT_SYMBOL(ap_queue_message);
842
843/**
844 * ap_cancel_message(): Cancel a crypto request.
845 * @aq: The AP device that has the message queued
846 * @ap_msg: The message that is to be removed
847 *
848 * Cancel a crypto request. This is done by removing the request
849 * from the device pending or request queue. Note that the
850 * request stays on the AP queue. When it finishes the message
851 * reply will be discarded because the psmid can't be found.
852 */
853void ap_cancel_message(struct ap_queue *aq, struct ap_message *ap_msg)
854{
855	struct ap_message *tmp;
856
857	spin_lock_bh(&aq->lock);
858	if (!list_empty(&ap_msg->list)) {
859		list_for_each_entry(tmp, &aq->pendingq, list)
860			if (tmp->psmid == ap_msg->psmid) {
861				aq->pendingq_count--;
862				goto found;
863			}
864		aq->requestq_count--;
865found:
866		list_del_init(&ap_msg->list);
867	}
868	spin_unlock_bh(&aq->lock);
869}
870EXPORT_SYMBOL(ap_cancel_message);
871
872/**
873 * __ap_flush_queue(): Flush requests.
874 * @aq: Pointer to the AP queue
875 *
876 * Flush all requests from the request/pending queue of an AP device.
877 */
878static void __ap_flush_queue(struct ap_queue *aq)
879{
880	struct ap_message *ap_msg, *next;
881
882	list_for_each_entry_safe(ap_msg, next, &aq->pendingq, list) {
883		list_del_init(&ap_msg->list);
884		aq->pendingq_count--;
885		ap_msg->rc = -EAGAIN;
886		ap_msg->receive(aq, ap_msg, NULL);
887	}
888	list_for_each_entry_safe(ap_msg, next, &aq->requestq, list) {
889		list_del_init(&ap_msg->list);
890		aq->requestq_count--;
891		ap_msg->rc = -EAGAIN;
892		ap_msg->receive(aq, ap_msg, NULL);
893	}
894	aq->queue_count = 0;
895}
896
897void ap_flush_queue(struct ap_queue *aq)
898{
899	spin_lock_bh(&aq->lock);
900	__ap_flush_queue(aq);
901	spin_unlock_bh(&aq->lock);
902}
903EXPORT_SYMBOL(ap_flush_queue);
904
905void ap_queue_prepare_remove(struct ap_queue *aq)
906{
907	spin_lock_bh(&aq->lock);
908	/* flush queue */
909	__ap_flush_queue(aq);
910	/* move queue device state to SHUTDOWN in progress */
911	aq->dev_state = AP_DEV_STATE_SHUTDOWN;
912	spin_unlock_bh(&aq->lock);
913	del_timer_sync(&aq->timeout);
914}
915
916void ap_queue_remove(struct ap_queue *aq)
917{
918	/*
919	 * all messages have been flushed and the device state
920	 * is SHUTDOWN. Now reset with zero which also clears
921	 * the irq registration and move the device state
922	 * to the initial value AP_DEV_STATE_UNINITIATED.
923	 */
924	spin_lock_bh(&aq->lock);
925	ap_zapq(aq->qid);
926	aq->dev_state = AP_DEV_STATE_UNINITIATED;
927	spin_unlock_bh(&aq->lock);
928}
929
930void ap_queue_init_state(struct ap_queue *aq)
931{
932	spin_lock_bh(&aq->lock);
933	aq->dev_state = AP_DEV_STATE_OPERATING;
934	aq->sm_state = AP_SM_STATE_RESET_START;
935	aq->last_err_rc = 0;
936	ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
937	spin_unlock_bh(&aq->lock);
938}
939EXPORT_SYMBOL(ap_queue_init_state);
v4.10.11
 
  1/*
  2 * Copyright IBM Corp. 2016
  3 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
  4 *
  5 * Adjunct processor bus, queue related code.
  6 */
  7
  8#define KMSG_COMPONENT "ap"
  9#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
 10
 11#include <linux/init.h>
 12#include <linux/slab.h>
 13#include <asm/facility.h>
 14
 15#include "ap_bus.h"
 16#include "ap_asm.h"
 
 
 17
 18/**
 19 * ap_queue_enable_interruption(): Enable interruption on an AP queue.
 20 * @qid: The AP queue number
 21 * @ind: the notification indicator byte
 22 *
 23 * Enables interruption on AP queue via ap_aqic(). Based on the return
 24 * value it waits a while and tests the AP queue if interrupts
 25 * have been switched on using ap_test_queue().
 26 */
 27static int ap_queue_enable_interruption(struct ap_queue *aq, void *ind)
 28{
 29	struct ap_queue_status status;
 
 30
 31	status = ap_aqic(aq->qid, ind);
 
 
 32	switch (status.response_code) {
 33	case AP_RESPONSE_NORMAL:
 34	case AP_RESPONSE_OTHERWISE_CHANGED:
 35		return 0;
 36	case AP_RESPONSE_Q_NOT_AVAIL:
 37	case AP_RESPONSE_DECONFIGURED:
 38	case AP_RESPONSE_CHECKSTOPPED:
 39	case AP_RESPONSE_INVALID_ADDRESS:
 40		pr_err("Registering adapter interrupts for AP device %02x.%04x failed\n",
 41		       AP_QID_CARD(aq->qid),
 42		       AP_QID_QUEUE(aq->qid));
 43		return -EOPNOTSUPP;
 44	case AP_RESPONSE_RESET_IN_PROGRESS:
 45	case AP_RESPONSE_BUSY:
 46	default:
 47		return -EBUSY;
 48	}
 49}
 50
 51/**
 52 * __ap_send(): Send message to adjunct processor queue.
 53 * @qid: The AP queue number
 54 * @psmid: The program supplied message identifier
 55 * @msg: The message text
 56 * @length: The message length
 57 * @special: Special Bit
 58 *
 59 * Returns AP queue status structure.
 60 * Condition code 1 on NQAP can't happen because the L bit is 1.
 61 * Condition code 2 on NQAP also means the send is incomplete,
 62 * because a segment boundary was reached. The NQAP is repeated.
 63 */
 64static inline struct ap_queue_status
 65__ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length,
 66	  unsigned int special)
 67{
 68	if (special == 1)
 69		qid |= 0x400000UL;
 70	return ap_nqap(qid, psmid, msg, length);
 71}
 72
 73int ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length)
 74{
 75	struct ap_queue_status status;
 76
 77	status = __ap_send(qid, psmid, msg, length, 0);
 78	switch (status.response_code) {
 79	case AP_RESPONSE_NORMAL:
 80		return 0;
 81	case AP_RESPONSE_Q_FULL:
 82	case AP_RESPONSE_RESET_IN_PROGRESS:
 83		return -EBUSY;
 84	case AP_RESPONSE_REQ_FAC_NOT_INST:
 85		return -EINVAL;
 86	default:	/* Device is gone. */
 87		return -ENODEV;
 88	}
 89}
 90EXPORT_SYMBOL(ap_send);
 91
 92int ap_recv(ap_qid_t qid, unsigned long long *psmid, void *msg, size_t length)
 93{
 94	struct ap_queue_status status;
 95
 96	if (msg == NULL)
 97		return -EINVAL;
 98	status = ap_dqap(qid, psmid, msg, length);
 99	switch (status.response_code) {
100	case AP_RESPONSE_NORMAL:
101		return 0;
102	case AP_RESPONSE_NO_PENDING_REPLY:
103		if (status.queue_empty)
104			return -ENOENT;
105		return -EBUSY;
106	case AP_RESPONSE_RESET_IN_PROGRESS:
107		return -EBUSY;
108	default:
109		return -ENODEV;
110	}
111}
112EXPORT_SYMBOL(ap_recv);
113
114/* State machine definitions and helpers */
115
116static enum ap_wait ap_sm_nop(struct ap_queue *aq)
117{
118	return AP_WAIT_NONE;
119}
120
121/**
122 * ap_sm_recv(): Receive pending reply messages from an AP queue but do
123 *	not change the state of the device.
124 * @aq: pointer to the AP queue
125 *
126 * Returns AP_WAIT_NONE, AP_WAIT_AGAIN, or AP_WAIT_INTERRUPT
127 */
128static struct ap_queue_status ap_sm_recv(struct ap_queue *aq)
129{
130	struct ap_queue_status status;
131	struct ap_message *ap_msg;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
133	status = ap_dqap(aq->qid, &aq->reply->psmid,
134			 aq->reply->message, aq->reply->length);
135	switch (status.response_code) {
136	case AP_RESPONSE_NORMAL:
137		aq->queue_count--;
 
 
138		if (aq->queue_count > 0)
139			mod_timer(&aq->timeout,
140				  jiffies + aq->request_timeout);
141		list_for_each_entry(ap_msg, &aq->pendingq, list) {
142			if (ap_msg->psmid != aq->reply->psmid)
143				continue;
144			list_del_init(&ap_msg->list);
145			aq->pendingq_count--;
146			ap_msg->receive(aq, ap_msg, aq->reply);
 
 
 
 
 
 
147			break;
148		}
 
 
 
 
 
 
149	case AP_RESPONSE_NO_PENDING_REPLY:
150		if (!status.queue_empty || aq->queue_count <= 0)
151			break;
152		/* The card shouldn't forget requests but who knows. */
153		aq->queue_count = 0;
154		list_splice_init(&aq->pendingq, &aq->requestq);
155		aq->requestq_count += aq->pendingq_count;
156		aq->pendingq_count = 0;
157		break;
158	default:
159		break;
160	}
161	return status;
162}
163
164/**
165 * ap_sm_read(): Receive pending reply messages from an AP queue.
166 * @aq: pointer to the AP queue
167 *
168 * Returns AP_WAIT_NONE, AP_WAIT_AGAIN, or AP_WAIT_INTERRUPT
169 */
170static enum ap_wait ap_sm_read(struct ap_queue *aq)
171{
172	struct ap_queue_status status;
173
174	if (!aq->reply)
175		return AP_WAIT_NONE;
176	status = ap_sm_recv(aq);
177	switch (status.response_code) {
178	case AP_RESPONSE_NORMAL:
179		if (aq->queue_count > 0) {
180			aq->state = AP_STATE_WORKING;
181			return AP_WAIT_AGAIN;
182		}
183		aq->state = AP_STATE_IDLE;
184		return AP_WAIT_NONE;
185	case AP_RESPONSE_NO_PENDING_REPLY:
186		if (aq->queue_count > 0)
187			return AP_WAIT_INTERRUPT;
188		aq->state = AP_STATE_IDLE;
189		return AP_WAIT_NONE;
190	default:
191		aq->state = AP_STATE_BORKED;
192		return AP_WAIT_NONE;
193	}
194}
195
196/**
197 * ap_sm_suspend_read(): Receive pending reply messages from an AP queue
198 * without changing the device state in between. In suspend mode we don't
199 * allow sending new requests, therefore just fetch pending replies.
200 * @aq: pointer to the AP queue
201 *
202 * Returns AP_WAIT_NONE or AP_WAIT_AGAIN
203 */
204static enum ap_wait ap_sm_suspend_read(struct ap_queue *aq)
205{
206	struct ap_queue_status status;
207
208	if (!aq->reply)
209		return AP_WAIT_NONE;
210	status = ap_sm_recv(aq);
211	switch (status.response_code) {
212	case AP_RESPONSE_NORMAL:
213		if (aq->queue_count > 0)
214			return AP_WAIT_AGAIN;
215		/* fall through */
216	default:
217		return AP_WAIT_NONE;
 
 
 
 
 
218	}
219}
220
221/**
222 * ap_sm_write(): Send messages from the request queue to an AP queue.
223 * @aq: pointer to the AP queue
224 *
225 * Returns AP_WAIT_NONE, AP_WAIT_AGAIN, or AP_WAIT_INTERRUPT
226 */
227static enum ap_wait ap_sm_write(struct ap_queue *aq)
228{
229	struct ap_queue_status status;
230	struct ap_message *ap_msg;
 
231
232	if (aq->requestq_count <= 0)
233		return AP_WAIT_NONE;
 
234	/* Start the next request on the queue. */
235	ap_msg = list_entry(aq->requestq.next, struct ap_message, list);
236	status = __ap_send(aq->qid, ap_msg->psmid,
237			   ap_msg->message, ap_msg->length, ap_msg->special);
 
 
 
 
 
 
 
 
238	switch (status.response_code) {
239	case AP_RESPONSE_NORMAL:
240		aq->queue_count++;
241		if (aq->queue_count == 1)
242			mod_timer(&aq->timeout, jiffies + aq->request_timeout);
243		list_move_tail(&ap_msg->list, &aq->pendingq);
244		aq->requestq_count--;
245		aq->pendingq_count++;
246		if (aq->queue_count < aq->card->queue_depth) {
247			aq->state = AP_STATE_WORKING;
248			return AP_WAIT_AGAIN;
249		}
250		/* fall through */
251	case AP_RESPONSE_Q_FULL:
252		aq->state = AP_STATE_QUEUE_FULL;
253		return AP_WAIT_INTERRUPT;
 
254	case AP_RESPONSE_RESET_IN_PROGRESS:
255		aq->state = AP_STATE_RESET_WAIT;
256		return AP_WAIT_TIMEOUT;
 
 
 
257	case AP_RESPONSE_MESSAGE_TOO_BIG:
258	case AP_RESPONSE_REQ_FAC_NOT_INST:
259		list_del_init(&ap_msg->list);
260		aq->requestq_count--;
261		ap_msg->rc = -EINVAL;
262		ap_msg->receive(aq, ap_msg, NULL);
263		return AP_WAIT_AGAIN;
264	default:
265		aq->state = AP_STATE_BORKED;
266		return AP_WAIT_NONE;
 
 
 
 
267	}
268}
269
270/**
271 * ap_sm_read_write(): Send and receive messages to/from an AP queue.
272 * @aq: pointer to the AP queue
273 *
274 * Returns AP_WAIT_NONE, AP_WAIT_AGAIN, or AP_WAIT_INTERRUPT
275 */
276static enum ap_wait ap_sm_read_write(struct ap_queue *aq)
277{
278	return min(ap_sm_read(aq), ap_sm_write(aq));
279}
280
281/**
282 * ap_sm_reset(): Reset an AP queue.
283 * @qid: The AP queue number
284 *
285 * Submit the Reset command to an AP queue.
286 */
287static enum ap_wait ap_sm_reset(struct ap_queue *aq)
288{
289	struct ap_queue_status status;
290
291	status = ap_rapq(aq->qid);
292	switch (status.response_code) {
293	case AP_RESPONSE_NORMAL:
294	case AP_RESPONSE_RESET_IN_PROGRESS:
295		aq->state = AP_STATE_RESET_WAIT;
296		aq->interrupt = AP_INTR_DISABLED;
297		return AP_WAIT_TIMEOUT;
298	case AP_RESPONSE_BUSY:
299		return AP_WAIT_TIMEOUT;
300	case AP_RESPONSE_Q_NOT_AVAIL:
301	case AP_RESPONSE_DECONFIGURED:
302	case AP_RESPONSE_CHECKSTOPPED:
303	default:
304		aq->state = AP_STATE_BORKED;
305		return AP_WAIT_NONE;
 
 
 
 
306	}
307}
308
309/**
310 * ap_sm_reset_wait(): Test queue for completion of the reset operation
311 * @aq: pointer to the AP queue
312 *
313 * Returns AP_POLL_IMMEDIATELY, AP_POLL_AFTER_TIMEROUT or 0.
314 */
315static enum ap_wait ap_sm_reset_wait(struct ap_queue *aq)
316{
317	struct ap_queue_status status;
318	void *lsi_ptr;
319
320	if (aq->queue_count > 0 && aq->reply)
321		/* Try to read a completed message and get the status */
322		status = ap_sm_recv(aq);
323	else
324		/* Get the status with TAPQ */
325		status = ap_tapq(aq->qid, NULL);
326
327	switch (status.response_code) {
328	case AP_RESPONSE_NORMAL:
329		lsi_ptr = ap_airq_ptr();
330		if (lsi_ptr && ap_queue_enable_interruption(aq, lsi_ptr) == 0)
331			aq->state = AP_STATE_SETIRQ_WAIT;
332		else
333			aq->state = (aq->queue_count > 0) ?
334				AP_STATE_WORKING : AP_STATE_IDLE;
335		return AP_WAIT_AGAIN;
336	case AP_RESPONSE_BUSY:
337	case AP_RESPONSE_RESET_IN_PROGRESS:
338		return AP_WAIT_TIMEOUT;
339	case AP_RESPONSE_Q_NOT_AVAIL:
340	case AP_RESPONSE_DECONFIGURED:
341	case AP_RESPONSE_CHECKSTOPPED:
342	default:
343		aq->state = AP_STATE_BORKED;
344		return AP_WAIT_NONE;
 
 
 
 
345	}
346}
347
348/**
349 * ap_sm_setirq_wait(): Test queue for completion of the irq enablement
350 * @aq: pointer to the AP queue
351 *
352 * Returns AP_POLL_IMMEDIATELY, AP_POLL_AFTER_TIMEROUT or 0.
353 */
354static enum ap_wait ap_sm_setirq_wait(struct ap_queue *aq)
355{
356	struct ap_queue_status status;
357
358	if (aq->queue_count > 0 && aq->reply)
359		/* Try to read a completed message and get the status */
360		status = ap_sm_recv(aq);
361	else
362		/* Get the status with TAPQ */
363		status = ap_tapq(aq->qid, NULL);
364
365	if (status.int_enabled == 1) {
366		/* Irqs are now enabled */
367		aq->interrupt = AP_INTR_ENABLED;
368		aq->state = (aq->queue_count > 0) ?
369			AP_STATE_WORKING : AP_STATE_IDLE;
370	}
371
372	switch (status.response_code) {
373	case AP_RESPONSE_NORMAL:
374		if (aq->queue_count > 0)
375			return AP_WAIT_AGAIN;
376		/* fallthrough */
377	case AP_RESPONSE_NO_PENDING_REPLY:
378		return AP_WAIT_TIMEOUT;
379	default:
380		aq->state = AP_STATE_BORKED;
381		return AP_WAIT_NONE;
 
 
 
 
382	}
383}
384
385/*
386 * AP state machine jump table
387 */
388static ap_func_t *ap_jumptable[NR_AP_STATES][NR_AP_EVENTS] = {
389	[AP_STATE_RESET_START] = {
390		[AP_EVENT_POLL] = ap_sm_reset,
391		[AP_EVENT_TIMEOUT] = ap_sm_nop,
392	},
393	[AP_STATE_RESET_WAIT] = {
394		[AP_EVENT_POLL] = ap_sm_reset_wait,
395		[AP_EVENT_TIMEOUT] = ap_sm_nop,
396	},
397	[AP_STATE_SETIRQ_WAIT] = {
398		[AP_EVENT_POLL] = ap_sm_setirq_wait,
399		[AP_EVENT_TIMEOUT] = ap_sm_nop,
400	},
401	[AP_STATE_IDLE] = {
402		[AP_EVENT_POLL] = ap_sm_write,
403		[AP_EVENT_TIMEOUT] = ap_sm_nop,
404	},
405	[AP_STATE_WORKING] = {
406		[AP_EVENT_POLL] = ap_sm_read_write,
407		[AP_EVENT_TIMEOUT] = ap_sm_reset,
408	},
409	[AP_STATE_QUEUE_FULL] = {
410		[AP_EVENT_POLL] = ap_sm_read,
411		[AP_EVENT_TIMEOUT] = ap_sm_reset,
412	},
413	[AP_STATE_SUSPEND_WAIT] = {
414		[AP_EVENT_POLL] = ap_sm_suspend_read,
415		[AP_EVENT_TIMEOUT] = ap_sm_nop,
416	},
417	[AP_STATE_BORKED] = {
418		[AP_EVENT_POLL] = ap_sm_nop,
419		[AP_EVENT_TIMEOUT] = ap_sm_nop,
420	},
421};
422
423enum ap_wait ap_sm_event(struct ap_queue *aq, enum ap_event event)
424{
425	return ap_jumptable[aq->state][event](aq);
 
 
 
 
426}
427
428enum ap_wait ap_sm_event_loop(struct ap_queue *aq, enum ap_event event)
429{
430	enum ap_wait wait;
431
432	while ((wait = ap_sm_event(aq, event)) == AP_WAIT_AGAIN)
433		;
434	return wait;
435}
436
437/*
438 * Power management for queue devices
439 */
440void ap_queue_suspend(struct ap_device *ap_dev)
 
 
441{
442	struct ap_queue *aq = to_ap_queue(&ap_dev->device);
 
 
443
444	/* Poll on the device until all requests are finished. */
445	spin_lock_bh(&aq->lock);
446	aq->state = AP_STATE_SUSPEND_WAIT;
447	while (ap_sm_event(aq, AP_EVENT_POLL) != AP_WAIT_NONE)
448		;
449	aq->state = AP_STATE_BORKED;
450	spin_unlock_bh(&aq->lock);
451}
452EXPORT_SYMBOL(ap_queue_suspend);
453
454void ap_queue_resume(struct ap_device *ap_dev)
455{
 
 
456}
457EXPORT_SYMBOL(ap_queue_resume);
458
459/*
460 * AP queue related attributes.
461 */
462static ssize_t ap_request_count_show(struct device *dev,
463				     struct device_attribute *attr,
464				     char *buf)
465{
466	struct ap_queue *aq = to_ap_queue(dev);
467	unsigned int req_cnt;
468
469	spin_lock_bh(&aq->lock);
470	req_cnt = aq->total_request_count;
471	spin_unlock_bh(&aq->lock);
472	return snprintf(buf, PAGE_SIZE, "%d\n", req_cnt);
 
473}
474
475static DEVICE_ATTR(request_count, 0444, ap_request_count_show, NULL);
476
477static ssize_t ap_requestq_count_show(struct device *dev,
478				      struct device_attribute *attr, char *buf)
479{
480	struct ap_queue *aq = to_ap_queue(dev);
481	unsigned int reqq_cnt = 0;
482
483	spin_lock_bh(&aq->lock);
484	reqq_cnt = aq->requestq_count;
 
485	spin_unlock_bh(&aq->lock);
486	return snprintf(buf, PAGE_SIZE, "%d\n", reqq_cnt);
487}
488
489static DEVICE_ATTR(requestq_count, 0444, ap_requestq_count_show, NULL);
490
491static ssize_t ap_pendingq_count_show(struct device *dev,
492				      struct device_attribute *attr, char *buf)
493{
494	struct ap_queue *aq = to_ap_queue(dev);
495	unsigned int penq_cnt = 0;
496
497	spin_lock_bh(&aq->lock);
498	penq_cnt = aq->pendingq_count;
 
499	spin_unlock_bh(&aq->lock);
500	return snprintf(buf, PAGE_SIZE, "%d\n", penq_cnt);
501}
502
503static DEVICE_ATTR(pendingq_count, 0444, ap_pendingq_count_show, NULL);
504
505static ssize_t ap_reset_show(struct device *dev,
506				      struct device_attribute *attr, char *buf)
507{
508	struct ap_queue *aq = to_ap_queue(dev);
509	int rc = 0;
510
511	spin_lock_bh(&aq->lock);
512	switch (aq->state) {
513	case AP_STATE_RESET_START:
514	case AP_STATE_RESET_WAIT:
515		rc = snprintf(buf, PAGE_SIZE, "Reset in progress.\n");
516		break;
517	case AP_STATE_WORKING:
518	case AP_STATE_QUEUE_FULL:
519		rc = snprintf(buf, PAGE_SIZE, "Reset Timer armed.\n");
520		break;
521	default:
522		rc = snprintf(buf, PAGE_SIZE, "No Reset Timer set.\n");
523	}
524	spin_unlock_bh(&aq->lock);
525	return rc;
526}
527
528static DEVICE_ATTR(reset, 0444, ap_reset_show, NULL);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
529
530static ssize_t ap_interrupt_show(struct device *dev,
531				 struct device_attribute *attr, char *buf)
532{
533	struct ap_queue *aq = to_ap_queue(dev);
534	int rc = 0;
535
536	spin_lock_bh(&aq->lock);
537	if (aq->state == AP_STATE_SETIRQ_WAIT)
538		rc = snprintf(buf, PAGE_SIZE, "Enable Interrupt pending.\n");
539	else if (aq->interrupt == AP_INTR_ENABLED)
540		rc = snprintf(buf, PAGE_SIZE, "Interrupts enabled.\n");
541	else
542		rc = snprintf(buf, PAGE_SIZE, "Interrupts disabled.\n");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
543	spin_unlock_bh(&aq->lock);
 
544	return rc;
545}
 
546
547static DEVICE_ATTR(interrupt, 0444, ap_interrupt_show, NULL);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
548
549static struct attribute *ap_queue_dev_attrs[] = {
550	&dev_attr_request_count.attr,
551	&dev_attr_requestq_count.attr,
552	&dev_attr_pendingq_count.attr,
553	&dev_attr_reset.attr,
554	&dev_attr_interrupt.attr,
 
 
 
 
 
 
555	NULL
556};
557
558static struct attribute_group ap_queue_dev_attr_group = {
559	.attrs = ap_queue_dev_attrs
560};
561
562static const struct attribute_group *ap_queue_dev_attr_groups[] = {
563	&ap_queue_dev_attr_group,
564	NULL
565};
566
567struct device_type ap_queue_type = {
568	.name = "ap_queue",
569	.groups = ap_queue_dev_attr_groups,
570};
571
572static void ap_queue_device_release(struct device *dev)
573{
574	kfree(to_ap_queue(dev));
 
 
 
 
 
 
575}
576
577struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type)
578{
579	struct ap_queue *aq;
580
581	aq = kzalloc(sizeof(*aq), GFP_KERNEL);
582	if (!aq)
583		return NULL;
584	aq->ap_dev.device.release = ap_queue_device_release;
585	aq->ap_dev.device.type = &ap_queue_type;
586	aq->ap_dev.device_type = device_type;
587	/* CEX6 toleration: map to CEX5 */
588	if (device_type == AP_DEVICE_TYPE_CEX6)
589		aq->ap_dev.device_type = AP_DEVICE_TYPE_CEX5;
590	aq->qid = qid;
591	aq->state = AP_STATE_RESET_START;
592	aq->interrupt = AP_INTR_DISABLED;
593	spin_lock_init(&aq->lock);
594	INIT_LIST_HEAD(&aq->pendingq);
595	INIT_LIST_HEAD(&aq->requestq);
596	setup_timer(&aq->timeout, ap_request_timeout, (unsigned long) aq);
597
598	return aq;
599}
600
601void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *reply)
602{
603	aq->reply = reply;
604
605	spin_lock_bh(&aq->lock);
606	ap_wait(ap_sm_event(aq, AP_EVENT_POLL));
607	spin_unlock_bh(&aq->lock);
608}
609EXPORT_SYMBOL(ap_queue_init_reply);
610
611/**
612 * ap_queue_message(): Queue a request to an AP device.
613 * @aq: The AP device to queue the message to
614 * @ap_msg: The message that is to be added
615 */
616void ap_queue_message(struct ap_queue *aq, struct ap_message *ap_msg)
617{
618	/* For asynchronous message handling a valid receive-callback
619	 * is required.
620	 */
621	BUG_ON(!ap_msg->receive);
622
623	spin_lock_bh(&aq->lock);
624	/* Queue the message. */
625	list_add_tail(&ap_msg->list, &aq->requestq);
626	aq->requestq_count++;
627	aq->total_request_count++;
628	atomic_inc(&aq->card->total_request_count);
 
 
 
 
 
 
629	/* Send/receive as many request from the queue as possible. */
630	ap_wait(ap_sm_event_loop(aq, AP_EVENT_POLL));
 
631	spin_unlock_bh(&aq->lock);
 
 
632}
633EXPORT_SYMBOL(ap_queue_message);
634
635/**
636 * ap_cancel_message(): Cancel a crypto request.
637 * @aq: The AP device that has the message queued
638 * @ap_msg: The message that is to be removed
639 *
640 * Cancel a crypto request. This is done by removing the request
641 * from the device pending or request queue. Note that the
642 * request stays on the AP queue. When it finishes the message
643 * reply will be discarded because the psmid can't be found.
644 */
645void ap_cancel_message(struct ap_queue *aq, struct ap_message *ap_msg)
646{
647	struct ap_message *tmp;
648
649	spin_lock_bh(&aq->lock);
650	if (!list_empty(&ap_msg->list)) {
651		list_for_each_entry(tmp, &aq->pendingq, list)
652			if (tmp->psmid == ap_msg->psmid) {
653				aq->pendingq_count--;
654				goto found;
655			}
656		aq->requestq_count--;
657found:
658		list_del_init(&ap_msg->list);
659	}
660	spin_unlock_bh(&aq->lock);
661}
662EXPORT_SYMBOL(ap_cancel_message);
663
664/**
665 * __ap_flush_queue(): Flush requests.
666 * @aq: Pointer to the AP queue
667 *
668 * Flush all requests from the request/pending queue of an AP device.
669 */
670static void __ap_flush_queue(struct ap_queue *aq)
671{
672	struct ap_message *ap_msg, *next;
673
674	list_for_each_entry_safe(ap_msg, next, &aq->pendingq, list) {
675		list_del_init(&ap_msg->list);
676		aq->pendingq_count--;
677		ap_msg->rc = -EAGAIN;
678		ap_msg->receive(aq, ap_msg, NULL);
679	}
680	list_for_each_entry_safe(ap_msg, next, &aq->requestq, list) {
681		list_del_init(&ap_msg->list);
682		aq->requestq_count--;
683		ap_msg->rc = -EAGAIN;
684		ap_msg->receive(aq, ap_msg, NULL);
685	}
 
686}
687
688void ap_flush_queue(struct ap_queue *aq)
689{
690	spin_lock_bh(&aq->lock);
691	__ap_flush_queue(aq);
692	spin_unlock_bh(&aq->lock);
693}
694EXPORT_SYMBOL(ap_flush_queue);
695
 
 
 
 
 
 
 
 
 
 
 
696void ap_queue_remove(struct ap_queue *aq)
697{
698	ap_flush_queue(aq);
699	del_timer_sync(&aq->timeout);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
700}
701EXPORT_SYMBOL(ap_queue_remove);