Linux Audio

Check our new training course

In-person Linux kernel drivers training

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