]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/s390/crypto/ap_bus.c
[S390] zcrypt: Use spin_lock_bh in suspend callback
[mirror_ubuntu-bionic-kernel.git] / drivers / s390 / crypto / ap_bus.c
CommitLineData
1534c382
MS
1/*
2 * linux/drivers/s390/crypto/ap_bus.c
3 *
4 * Copyright (C) 2006 IBM Corporation
5 * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
6 * Martin Schwidefsky <schwidefsky@de.ibm.com>
7 * Ralph Wuerthner <rwuerthn@de.ibm.com>
cb17a636 8 * Felix Beck <felix.beck@de.ibm.com>
1534c382
MS
9 *
10 * Adjunct processor bus.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2, or (at your option)
15 * any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 */
26
136f7a1c
MS
27#define KMSG_COMPONENT "ap"
28#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
29
1534c382
MS
30#include <linux/module.h>
31#include <linux/init.h>
32#include <linux/delay.h>
33#include <linux/err.h>
34#include <linux/interrupt.h>
35#include <linux/workqueue.h>
36#include <linux/notifier.h>
37#include <linux/kthread.h>
38#include <linux/mutex.h>
85eca850 39#include <asm/reset.h>
cb17a636
FB
40#include <asm/airq.h>
41#include <asm/atomic.h>
42#include <asm/system.h>
43#include <asm/isc.h>
fe137230
FB
44#include <linux/hrtimer.h>
45#include <linux/ktime.h>
1534c382
MS
46
47#include "ap_bus.h"
48
49/* Some prototypes. */
4927b3f7 50static void ap_scan_bus(struct work_struct *);
1534c382 51static void ap_poll_all(unsigned long);
fe137230 52static enum hrtimer_restart ap_poll_timeout(struct hrtimer *);
1534c382
MS
53static int ap_poll_thread_start(void);
54static void ap_poll_thread_stop(void);
af512ed0 55static void ap_request_timeout(unsigned long);
cb17a636 56static inline void ap_schedule_poll_timer(void);
772f5472
FB
57static int __ap_poll_device(struct ap_device *ap_dev, unsigned long *flags);
58static int ap_device_remove(struct device *dev);
59static int ap_device_probe(struct device *dev);
60static void ap_interrupt_handler(void *unused1, void *unused2);
61static void ap_reset(struct ap_device *ap_dev);
62static void ap_config_timeout(unsigned long ptr);
1534c382 63
1749a81d 64/*
1534c382
MS
65 * Module description.
66 */
67MODULE_AUTHOR("IBM Corporation");
68MODULE_DESCRIPTION("Adjunct Processor Bus driver, "
69 "Copyright 2006 IBM Corporation");
70MODULE_LICENSE("GPL");
71
1749a81d 72/*
1534c382
MS
73 * Module parameter
74 */
75int ap_domain_index = -1; /* Adjunct Processor Domain Index */
76module_param_named(domain, ap_domain_index, int, 0000);
77MODULE_PARM_DESC(domain, "domain index for ap devices");
78EXPORT_SYMBOL(ap_domain_index);
79
b90b34c6 80static int ap_thread_flag = 0;
1534c382 81module_param_named(poll_thread, ap_thread_flag, int, 0000);
b90b34c6 82MODULE_PARM_DESC(poll_thread, "Turn on/off poll thread, default is 0 (off).");
1534c382
MS
83
84static struct device *ap_root_device = NULL;
43c207e6 85static DEFINE_SPINLOCK(ap_device_list_lock);
cf352ce0 86static LIST_HEAD(ap_device_list);
1534c382 87
1749a81d 88/*
1534c382
MS
89 * Workqueue & timer for bus rescan.
90 */
91static struct workqueue_struct *ap_work_queue;
92static struct timer_list ap_config_timer;
93static int ap_config_time = AP_CONFIG_TIME;
4927b3f7 94static DECLARE_WORK(ap_config_work, ap_scan_bus);
1534c382 95
1749a81d 96/*
cb17a636 97 * Tasklet & timer for AP request polling and interrupts
1534c382 98 */
1534c382
MS
99static DECLARE_TASKLET(ap_tasklet, ap_poll_all, 0);
100static atomic_t ap_poll_requests = ATOMIC_INIT(0);
101static DECLARE_WAIT_QUEUE_HEAD(ap_poll_wait);
102static struct task_struct *ap_poll_kthread = NULL;
103static DEFINE_MUTEX(ap_poll_thread_mutex);
cb17a636 104static void *ap_interrupt_indicator;
fe137230
FB
105static struct hrtimer ap_poll_timer;
106/* In LPAR poll with 4kHz frequency. Poll every 250000 nanoseconds.
107 * If z/VM change to 1500000 nanoseconds to adjust to z/VM polling.*/
108static unsigned long long poll_timeout = 250000;
1534c382 109
772f5472
FB
110/* Suspend flag */
111static int ap_suspend_flag;
112static struct bus_type ap_bus_type;
113
cb17a636
FB
114/**
115 * ap_using_interrupts() - Returns non-zero if interrupt support is
116 * available.
117 */
118static inline int ap_using_interrupts(void)
119{
120 return ap_interrupt_indicator != NULL;
121}
122
1534c382 123/**
1749a81d 124 * ap_intructions_available() - Test if AP instructions are available.
1534c382 125 *
1749a81d 126 * Returns 0 if the AP instructions are installed.
1534c382
MS
127 */
128static inline int ap_instructions_available(void)
129{
130 register unsigned long reg0 asm ("0") = AP_MKQID(0,0);
131 register unsigned long reg1 asm ("1") = -ENODEV;
132 register unsigned long reg2 asm ("2") = 0UL;
133
134 asm volatile(
135 " .long 0xb2af0000\n" /* PQAP(TAPQ) */
136 "0: la %1,0\n"
137 "1:\n"
138 EX_TABLE(0b, 1b)
139 : "+d" (reg0), "+d" (reg1), "+d" (reg2) : : "cc" );
140 return reg1;
141}
142
cb17a636
FB
143/**
144 * ap_interrupts_available(): Test if AP interrupts are available.
145 *
146 * Returns 1 if AP interrupts are available.
147 */
148static int ap_interrupts_available(void)
149{
150 unsigned long long facility_bits[2];
151
152 if (stfle(facility_bits, 2) <= 1)
153 return 0;
154 if (!(facility_bits[0] & (1ULL << 61)) ||
155 !(facility_bits[1] & (1ULL << 62)))
156 return 0;
157 return 1;
158}
159
1534c382 160/**
1749a81d
FB
161 * ap_test_queue(): Test adjunct processor queue.
162 * @qid: The AP queue number
163 * @queue_depth: Pointer to queue depth value
164 * @device_type: Pointer to device type value
1534c382 165 *
1749a81d 166 * Returns AP queue status structure.
1534c382
MS
167 */
168static inline struct ap_queue_status
169ap_test_queue(ap_qid_t qid, int *queue_depth, int *device_type)
170{
171 register unsigned long reg0 asm ("0") = qid;
172 register struct ap_queue_status reg1 asm ("1");
173 register unsigned long reg2 asm ("2") = 0UL;
174
175 asm volatile(".long 0xb2af0000" /* PQAP(TAPQ) */
176 : "+d" (reg0), "=d" (reg1), "+d" (reg2) : : "cc");
177 *device_type = (int) (reg2 >> 24);
178 *queue_depth = (int) (reg2 & 0xff);
179 return reg1;
180}
181
182/**
1749a81d
FB
183 * ap_reset_queue(): Reset adjunct processor queue.
184 * @qid: The AP queue number
1534c382 185 *
1749a81d 186 * Returns AP queue status structure.
1534c382
MS
187 */
188static inline struct ap_queue_status ap_reset_queue(ap_qid_t qid)
189{
190 register unsigned long reg0 asm ("0") = qid | 0x01000000UL;
191 register struct ap_queue_status reg1 asm ("1");
192 register unsigned long reg2 asm ("2") = 0UL;
193
194 asm volatile(
195 ".long 0xb2af0000" /* PQAP(RAPQ) */
196 : "+d" (reg0), "=d" (reg1), "+d" (reg2) : : "cc");
197 return reg1;
198}
199
cb17a636
FB
200#ifdef CONFIG_64BIT
201/**
202 * ap_queue_interruption_control(): Enable interruption for a specific AP.
203 * @qid: The AP queue number
204 * @ind: The notification indicator byte
205 *
206 * Returns AP queue status.
207 */
208static inline struct ap_queue_status
209ap_queue_interruption_control(ap_qid_t qid, void *ind)
210{
211 register unsigned long reg0 asm ("0") = qid | 0x03000000UL;
212 register unsigned long reg1_in asm ("1") = 0x0000800000000000UL | AP_ISC;
213 register struct ap_queue_status reg1_out asm ("1");
214 register void *reg2 asm ("2") = ind;
215 asm volatile(
216 ".long 0xb2af0000" /* PQAP(RAPQ) */
217 : "+d" (reg0), "+d" (reg1_in), "=d" (reg1_out), "+d" (reg2)
218 :
219 : "cc" );
220 return reg1_out;
221}
222#endif
223
224/**
225 * ap_queue_enable_interruption(): Enable interruption on an AP.
226 * @qid: The AP queue number
227 * @ind: the notification indicator byte
228 *
229 * Enables interruption on AP queue via ap_queue_interruption_control(). Based
230 * on the return value it waits a while and tests the AP queue if interrupts
231 * have been switched on using ap_test_queue().
232 */
233static int ap_queue_enable_interruption(ap_qid_t qid, void *ind)
234{
235#ifdef CONFIG_64BIT
236 struct ap_queue_status status;
237 int t_depth, t_device_type, rc, i;
238
239 rc = -EBUSY;
240 status = ap_queue_interruption_control(qid, ind);
241
242 for (i = 0; i < AP_MAX_RESET; i++) {
243 switch (status.response_code) {
244 case AP_RESPONSE_NORMAL:
245 if (status.int_enabled)
246 return 0;
247 break;
248 case AP_RESPONSE_RESET_IN_PROGRESS:
249 case AP_RESPONSE_BUSY:
250 break;
251 case AP_RESPONSE_Q_NOT_AVAIL:
252 case AP_RESPONSE_DECONFIGURED:
253 case AP_RESPONSE_CHECKSTOPPED:
254 case AP_RESPONSE_INVALID_ADDRESS:
255 return -ENODEV;
256 case AP_RESPONSE_OTHERWISE_CHANGED:
257 if (status.int_enabled)
258 return 0;
259 break;
260 default:
261 break;
262 }
263 if (i < AP_MAX_RESET - 1) {
264 udelay(5);
265 status = ap_test_queue(qid, &t_depth, &t_device_type);
266 }
267 }
268 return rc;
269#else
270 return -EINVAL;
271#endif
272}
273
1534c382 274/**
1749a81d
FB
275 * __ap_send(): Send message to adjunct processor queue.
276 * @qid: The AP queue number
277 * @psmid: The program supplied message identifier
278 * @msg: The message text
279 * @length: The message length
1534c382 280 *
1749a81d 281 * Returns AP queue status structure.
1534c382 282 * Condition code 1 on NQAP can't happen because the L bit is 1.
1534c382
MS
283 * Condition code 2 on NQAP also means the send is incomplete,
284 * because a segment boundary was reached. The NQAP is repeated.
285 */
286static inline struct ap_queue_status
287__ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length)
288{
289 typedef struct { char _[length]; } msgblock;
290 register unsigned long reg0 asm ("0") = qid | 0x40000000UL;
291 register struct ap_queue_status reg1 asm ("1");
292 register unsigned long reg2 asm ("2") = (unsigned long) msg;
293 register unsigned long reg3 asm ("3") = (unsigned long) length;
294 register unsigned long reg4 asm ("4") = (unsigned int) (psmid >> 32);
295 register unsigned long reg5 asm ("5") = (unsigned int) psmid;
296
297 asm volatile (
298 "0: .long 0xb2ad0042\n" /* DQAP */
299 " brc 2,0b"
300 : "+d" (reg0), "=d" (reg1), "+d" (reg2), "+d" (reg3)
301 : "d" (reg4), "d" (reg5), "m" (*(msgblock *) msg)
302 : "cc" );
303 return reg1;
304}
305
306int ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length)
307{
308 struct ap_queue_status status;
309
310 status = __ap_send(qid, psmid, msg, length);
311 switch (status.response_code) {
312 case AP_RESPONSE_NORMAL:
313 return 0;
314 case AP_RESPONSE_Q_FULL:
af512ed0 315 case AP_RESPONSE_RESET_IN_PROGRESS:
1534c382
MS
316 return -EBUSY;
317 default: /* Device is gone. */
318 return -ENODEV;
319 }
320}
321EXPORT_SYMBOL(ap_send);
322
1749a81d
FB
323/**
324 * __ap_recv(): Receive message from adjunct processor queue.
325 * @qid: The AP queue number
326 * @psmid: Pointer to program supplied message identifier
327 * @msg: The message text
328 * @length: The message length
1534c382 329 *
1749a81d 330 * Returns AP queue status structure.
1534c382
MS
331 * Condition code 1 on DQAP means the receive has taken place
332 * but only partially. The response is incomplete, hence the
333 * DQAP is repeated.
1534c382
MS
334 * Condition code 2 on DQAP also means the receive is incomplete,
335 * this time because a segment boundary was reached. Again, the
336 * DQAP is repeated.
1534c382
MS
337 * Note that gpr2 is used by the DQAP instruction to keep track of
338 * any 'residual' length, in case the instruction gets interrupted.
339 * Hence it gets zeroed before the instruction.
340 */
341static inline struct ap_queue_status
342__ap_recv(ap_qid_t qid, unsigned long long *psmid, void *msg, size_t length)
343{
344 typedef struct { char _[length]; } msgblock;
345 register unsigned long reg0 asm("0") = qid | 0x80000000UL;
346 register struct ap_queue_status reg1 asm ("1");
347 register unsigned long reg2 asm("2") = 0UL;
348 register unsigned long reg4 asm("4") = (unsigned long) msg;
349 register unsigned long reg5 asm("5") = (unsigned long) length;
350 register unsigned long reg6 asm("6") = 0UL;
351 register unsigned long reg7 asm("7") = 0UL;
352
353
354 asm volatile(
355 "0: .long 0xb2ae0064\n"
356 " brc 6,0b\n"
357 : "+d" (reg0), "=d" (reg1), "+d" (reg2),
358 "+d" (reg4), "+d" (reg5), "+d" (reg6), "+d" (reg7),
359 "=m" (*(msgblock *) msg) : : "cc" );
360 *psmid = (((unsigned long long) reg6) << 32) + reg7;
361 return reg1;
362}
363
364int ap_recv(ap_qid_t qid, unsigned long long *psmid, void *msg, size_t length)
365{
366 struct ap_queue_status status;
367
368 status = __ap_recv(qid, psmid, msg, length);
369 switch (status.response_code) {
370 case AP_RESPONSE_NORMAL:
371 return 0;
372 case AP_RESPONSE_NO_PENDING_REPLY:
373 if (status.queue_empty)
374 return -ENOENT;
375 return -EBUSY;
af512ed0
RW
376 case AP_RESPONSE_RESET_IN_PROGRESS:
377 return -EBUSY;
1534c382
MS
378 default:
379 return -ENODEV;
380 }
381}
382EXPORT_SYMBOL(ap_recv);
383
384/**
1749a81d
FB
385 * ap_query_queue(): Check if an AP queue is available.
386 * @qid: The AP queue number
387 * @queue_depth: Pointer to queue depth value
388 * @device_type: Pointer to device type value
389 *
390 * The test is repeated for AP_MAX_RESET times.
1534c382
MS
391 */
392static int ap_query_queue(ap_qid_t qid, int *queue_depth, int *device_type)
393{
394 struct ap_queue_status status;
395 int t_depth, t_device_type, rc, i;
396
397 rc = -EBUSY;
398 for (i = 0; i < AP_MAX_RESET; i++) {
399 status = ap_test_queue(qid, &t_depth, &t_device_type);
400 switch (status.response_code) {
401 case AP_RESPONSE_NORMAL:
402 *queue_depth = t_depth + 1;
403 *device_type = t_device_type;
404 rc = 0;
405 break;
406 case AP_RESPONSE_Q_NOT_AVAIL:
407 rc = -ENODEV;
408 break;
409 case AP_RESPONSE_RESET_IN_PROGRESS:
410 break;
411 case AP_RESPONSE_DECONFIGURED:
412 rc = -ENODEV;
413 break;
414 case AP_RESPONSE_CHECKSTOPPED:
415 rc = -ENODEV;
416 break;
cb17a636
FB
417 case AP_RESPONSE_INVALID_ADDRESS:
418 rc = -ENODEV;
419 break;
420 case AP_RESPONSE_OTHERWISE_CHANGED:
421 break;
1534c382
MS
422 case AP_RESPONSE_BUSY:
423 break;
424 default:
425 BUG();
426 }
427 if (rc != -EBUSY)
428 break;
429 if (i < AP_MAX_RESET - 1)
430 udelay(5);
431 }
432 return rc;
433}
434
435/**
1749a81d
FB
436 * ap_init_queue(): Reset an AP queue.
437 * @qid: The AP queue number
438 *
1534c382 439 * Reset an AP queue and wait for it to become available again.
1534c382
MS
440 */
441static int ap_init_queue(ap_qid_t qid)
442{
443 struct ap_queue_status status;
444 int rc, dummy, i;
445
446 rc = -ENODEV;
447 status = ap_reset_queue(qid);
448 for (i = 0; i < AP_MAX_RESET; i++) {
449 switch (status.response_code) {
450 case AP_RESPONSE_NORMAL:
451 if (status.queue_empty)
452 rc = 0;
453 break;
454 case AP_RESPONSE_Q_NOT_AVAIL:
455 case AP_RESPONSE_DECONFIGURED:
456 case AP_RESPONSE_CHECKSTOPPED:
457 i = AP_MAX_RESET; /* return with -ENODEV */
458 break;
459 case AP_RESPONSE_RESET_IN_PROGRESS:
af512ed0 460 rc = -EBUSY;
1534c382
MS
461 case AP_RESPONSE_BUSY:
462 default:
463 break;
464 }
af512ed0 465 if (rc != -ENODEV && rc != -EBUSY)
1534c382
MS
466 break;
467 if (i < AP_MAX_RESET - 1) {
468 udelay(5);
469 status = ap_test_queue(qid, &dummy, &dummy);
470 }
471 }
cb17a636
FB
472 if (rc == 0 && ap_using_interrupts()) {
473 rc = ap_queue_enable_interruption(qid, ap_interrupt_indicator);
474 /* If interruption mode is supported by the machine,
475 * but an AP can not be enabled for interruption then
476 * the AP will be discarded. */
477 if (rc)
478 pr_err("Registering adapter interrupts for "
479 "AP %d failed\n", AP_QID_DEVICE(qid));
480 }
1534c382
MS
481 return rc;
482}
483
af512ed0 484/**
1749a81d
FB
485 * ap_increase_queue_count(): Arm request timeout.
486 * @ap_dev: Pointer to an AP device.
487 *
488 * Arm request timeout if an AP device was idle and a new request is submitted.
af512ed0
RW
489 */
490static void ap_increase_queue_count(struct ap_device *ap_dev)
491{
492 int timeout = ap_dev->drv->request_timeout;
493
494 ap_dev->queue_count++;
495 if (ap_dev->queue_count == 1) {
496 mod_timer(&ap_dev->timeout, jiffies + timeout);
497 ap_dev->reset = AP_RESET_ARMED;
498 }
499}
500
501/**
1749a81d
FB
502 * ap_decrease_queue_count(): Decrease queue count.
503 * @ap_dev: Pointer to an AP device.
504 *
505 * If AP device is still alive, re-schedule request timeout if there are still
af512ed0
RW
506 * pending requests.
507 */
508static void ap_decrease_queue_count(struct ap_device *ap_dev)
509{
510 int timeout = ap_dev->drv->request_timeout;
511
512 ap_dev->queue_count--;
513 if (ap_dev->queue_count > 0)
514 mod_timer(&ap_dev->timeout, jiffies + timeout);
515 else
1749a81d 516 /*
af512ed0
RW
517 * The timeout timer should to be disabled now - since
518 * del_timer_sync() is very expensive, we just tell via the
519 * reset flag to ignore the pending timeout timer.
520 */
521 ap_dev->reset = AP_RESET_IGNORE;
522}
523
1749a81d 524/*
1534c382
MS
525 * AP device related attributes.
526 */
527static ssize_t ap_hwtype_show(struct device *dev,
528 struct device_attribute *attr, char *buf)
529{
530 struct ap_device *ap_dev = to_ap_dev(dev);
531 return snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->device_type);
532}
1534c382 533
43c207e6 534static DEVICE_ATTR(hwtype, 0444, ap_hwtype_show, NULL);
1534c382
MS
535static ssize_t ap_depth_show(struct device *dev, struct device_attribute *attr,
536 char *buf)
537{
538 struct ap_device *ap_dev = to_ap_dev(dev);
539 return snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->queue_depth);
540}
1534c382 541
43c207e6 542static DEVICE_ATTR(depth, 0444, ap_depth_show, NULL);
1534c382
MS
543static ssize_t ap_request_count_show(struct device *dev,
544 struct device_attribute *attr,
545 char *buf)
546{
547 struct ap_device *ap_dev = to_ap_dev(dev);
548 int rc;
549
550 spin_lock_bh(&ap_dev->lock);
551 rc = snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->total_request_count);
552 spin_unlock_bh(&ap_dev->lock);
553 return rc;
554}
555
556static DEVICE_ATTR(request_count, 0444, ap_request_count_show, NULL);
557
558static ssize_t ap_modalias_show(struct device *dev,
559 struct device_attribute *attr, char *buf)
560{
561 return sprintf(buf, "ap:t%02X", to_ap_dev(dev)->device_type);
562}
563
564static DEVICE_ATTR(modalias, 0444, ap_modalias_show, NULL);
565
566static struct attribute *ap_dev_attrs[] = {
567 &dev_attr_hwtype.attr,
568 &dev_attr_depth.attr,
569 &dev_attr_request_count.attr,
570 &dev_attr_modalias.attr,
571 NULL
572};
573static struct attribute_group ap_dev_attr_group = {
574 .attrs = ap_dev_attrs
575};
576
577/**
1749a81d
FB
578 * ap_bus_match()
579 * @dev: Pointer to device
580 * @drv: Pointer to device_driver
581 *
1534c382
MS
582 * AP bus driver registration/unregistration.
583 */
584static int ap_bus_match(struct device *dev, struct device_driver *drv)
585{
586 struct ap_device *ap_dev = to_ap_dev(dev);
587 struct ap_driver *ap_drv = to_ap_drv(drv);
588 struct ap_device_id *id;
589
1749a81d 590 /*
1534c382
MS
591 * Compare device type of the device with the list of
592 * supported types of the device_driver.
593 */
594 for (id = ap_drv->ids; id->match_flags; id++) {
595 if ((id->match_flags & AP_DEVICE_ID_MATCH_DEVICE_TYPE) &&
596 (id->dev_type != ap_dev->device_type))
597 continue;
598 return 1;
599 }
600 return 0;
601}
602
603/**
1749a81d
FB
604 * ap_uevent(): Uevent function for AP devices.
605 * @dev: Pointer to device
606 * @env: Pointer to kobj_uevent_env
607 *
608 * It sets up a single environment variable DEV_TYPE which contains the
609 * hardware device type.
1534c382 610 */
7eff2e7a 611static int ap_uevent (struct device *dev, struct kobj_uevent_env *env)
1534c382
MS
612{
613 struct ap_device *ap_dev = to_ap_dev(dev);
7eff2e7a 614 int retval = 0;
1534c382
MS
615
616 if (!ap_dev)
617 return -ENODEV;
618
619 /* Set up DEV_TYPE environment variable. */
7eff2e7a 620 retval = add_uevent_var(env, "DEV_TYPE=%04X", ap_dev->device_type);
bf62456e
ER
621 if (retval)
622 return retval;
623
66a4263b 624 /* Add MODALIAS= */
7eff2e7a 625 retval = add_uevent_var(env, "MODALIAS=ap:t%02X", ap_dev->device_type);
bf62456e 626
bf62456e 627 return retval;
1534c382
MS
628}
629
772f5472
FB
630static int ap_bus_suspend(struct device *dev, pm_message_t state)
631{
632 struct ap_device *ap_dev = to_ap_dev(dev);
633 unsigned long flags;
634
635 if (!ap_suspend_flag) {
636 ap_suspend_flag = 1;
637
638 /* Disable scanning for devices, thus we do not want to scan
639 * for them after removing.
640 */
641 del_timer_sync(&ap_config_timer);
642 if (ap_work_queue != NULL) {
643 destroy_workqueue(ap_work_queue);
644 ap_work_queue = NULL;
645 }
646 tasklet_disable(&ap_tasklet);
647 }
648 /* Poll on the device until all requests are finished. */
649 do {
650 flags = 0;
95f1556c 651 spin_lock_bh(&ap_dev->lock);
772f5472 652 __ap_poll_device(ap_dev, &flags);
95f1556c 653 spin_unlock_bh(&ap_dev->lock);
772f5472
FB
654 } while ((flags & 1) || (flags & 2));
655
656 ap_device_remove(dev);
657 return 0;
658}
659
660static int ap_bus_resume(struct device *dev)
661{
662 int rc = 0;
663 struct ap_device *ap_dev = to_ap_dev(dev);
664
665 if (ap_suspend_flag) {
666 ap_suspend_flag = 0;
667 if (!ap_interrupts_available())
668 ap_interrupt_indicator = NULL;
669 ap_device_probe(dev);
670 ap_reset(ap_dev);
671 setup_timer(&ap_dev->timeout, ap_request_timeout,
672 (unsigned long) ap_dev);
673 ap_scan_bus(NULL);
674 init_timer(&ap_config_timer);
675 ap_config_timer.function = ap_config_timeout;
676 ap_config_timer.data = 0;
677 ap_config_timer.expires = jiffies + ap_config_time * HZ;
678 add_timer(&ap_config_timer);
679 ap_work_queue = create_singlethread_workqueue("kapwork");
680 if (!ap_work_queue)
681 return -ENOMEM;
682 tasklet_enable(&ap_tasklet);
683 if (!ap_using_interrupts())
684 ap_schedule_poll_timer();
685 else
686 tasklet_schedule(&ap_tasklet);
687 if (ap_thread_flag)
688 rc = ap_poll_thread_start();
689 } else {
690 ap_device_probe(dev);
691 ap_reset(ap_dev);
692 setup_timer(&ap_dev->timeout, ap_request_timeout,
693 (unsigned long) ap_dev);
694 }
695
696 return rc;
697}
698
1534c382
MS
699static struct bus_type ap_bus_type = {
700 .name = "ap",
701 .match = &ap_bus_match,
702 .uevent = &ap_uevent,
772f5472
FB
703 .suspend = ap_bus_suspend,
704 .resume = ap_bus_resume
1534c382
MS
705};
706
707static int ap_device_probe(struct device *dev)
708{
709 struct ap_device *ap_dev = to_ap_dev(dev);
710 struct ap_driver *ap_drv = to_ap_drv(dev->driver);
711 int rc;
712
713 ap_dev->drv = ap_drv;
714 rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
faa582ca 715 if (!rc) {
43c207e6 716 spin_lock_bh(&ap_device_list_lock);
faa582ca 717 list_add(&ap_dev->list, &ap_device_list);
43c207e6 718 spin_unlock_bh(&ap_device_list_lock);
faa582ca 719 }
1534c382
MS
720 return rc;
721}
722
723/**
1749a81d
FB
724 * __ap_flush_queue(): Flush requests.
725 * @ap_dev: Pointer to the AP device
726 *
1534c382 727 * Flush all requests from the request/pending queue of an AP device.
1534c382 728 */
4d284cac 729static void __ap_flush_queue(struct ap_device *ap_dev)
1534c382
MS
730{
731 struct ap_message *ap_msg, *next;
732
733 list_for_each_entry_safe(ap_msg, next, &ap_dev->pendingq, list) {
734 list_del_init(&ap_msg->list);
735 ap_dev->pendingq_count--;
736 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
737 }
738 list_for_each_entry_safe(ap_msg, next, &ap_dev->requestq, list) {
739 list_del_init(&ap_msg->list);
740 ap_dev->requestq_count--;
741 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
742 }
743}
744
745void ap_flush_queue(struct ap_device *ap_dev)
746{
747 spin_lock_bh(&ap_dev->lock);
748 __ap_flush_queue(ap_dev);
749 spin_unlock_bh(&ap_dev->lock);
750}
751EXPORT_SYMBOL(ap_flush_queue);
752
753static int ap_device_remove(struct device *dev)
754{
755 struct ap_device *ap_dev = to_ap_dev(dev);
756 struct ap_driver *ap_drv = ap_dev->drv;
757
4e56296d 758 ap_flush_queue(ap_dev);
af512ed0 759 del_timer_sync(&ap_dev->timeout);
43c207e6 760 spin_lock_bh(&ap_device_list_lock);
cf352ce0 761 list_del_init(&ap_dev->list);
43c207e6 762 spin_unlock_bh(&ap_device_list_lock);
faa582ca
RW
763 if (ap_drv->remove)
764 ap_drv->remove(ap_dev);
e675c0d2
RW
765 spin_lock_bh(&ap_dev->lock);
766 atomic_sub(ap_dev->queue_count, &ap_poll_requests);
767 spin_unlock_bh(&ap_dev->lock);
1534c382
MS
768 return 0;
769}
770
771int ap_driver_register(struct ap_driver *ap_drv, struct module *owner,
772 char *name)
773{
774 struct device_driver *drv = &ap_drv->driver;
775
776 drv->bus = &ap_bus_type;
777 drv->probe = ap_device_probe;
778 drv->remove = ap_device_remove;
779 drv->owner = owner;
780 drv->name = name;
781 return driver_register(drv);
782}
783EXPORT_SYMBOL(ap_driver_register);
784
785void ap_driver_unregister(struct ap_driver *ap_drv)
786{
787 driver_unregister(&ap_drv->driver);
788}
789EXPORT_SYMBOL(ap_driver_unregister);
790
1749a81d 791/*
1534c382
MS
792 * AP bus attributes.
793 */
794static ssize_t ap_domain_show(struct bus_type *bus, char *buf)
795{
796 return snprintf(buf, PAGE_SIZE, "%d\n", ap_domain_index);
797}
798
799static BUS_ATTR(ap_domain, 0444, ap_domain_show, NULL);
800
801static ssize_t ap_config_time_show(struct bus_type *bus, char *buf)
802{
803 return snprintf(buf, PAGE_SIZE, "%d\n", ap_config_time);
804}
805
cb17a636
FB
806static ssize_t ap_interrupts_show(struct bus_type *bus, char *buf)
807{
808 return snprintf(buf, PAGE_SIZE, "%d\n",
809 ap_using_interrupts() ? 1 : 0);
810}
811
812static BUS_ATTR(ap_interrupts, 0444, ap_interrupts_show, NULL);
813
1534c382
MS
814static ssize_t ap_config_time_store(struct bus_type *bus,
815 const char *buf, size_t count)
816{
817 int time;
818
819 if (sscanf(buf, "%d\n", &time) != 1 || time < 5 || time > 120)
820 return -EINVAL;
821 ap_config_time = time;
822 if (!timer_pending(&ap_config_timer) ||
823 !mod_timer(&ap_config_timer, jiffies + ap_config_time * HZ)) {
824 ap_config_timer.expires = jiffies + ap_config_time * HZ;
825 add_timer(&ap_config_timer);
826 }
827 return count;
828}
829
830static BUS_ATTR(config_time, 0644, ap_config_time_show, ap_config_time_store);
831
832static ssize_t ap_poll_thread_show(struct bus_type *bus, char *buf)
833{
834 return snprintf(buf, PAGE_SIZE, "%d\n", ap_poll_kthread ? 1 : 0);
835}
836
837static ssize_t ap_poll_thread_store(struct bus_type *bus,
838 const char *buf, size_t count)
839{
840 int flag, rc;
841
842 if (sscanf(buf, "%d\n", &flag) != 1)
843 return -EINVAL;
844 if (flag) {
845 rc = ap_poll_thread_start();
846 if (rc)
847 return rc;
848 }
849 else
850 ap_poll_thread_stop();
851 return count;
852}
853
854static BUS_ATTR(poll_thread, 0644, ap_poll_thread_show, ap_poll_thread_store);
855
fe137230
FB
856static ssize_t poll_timeout_show(struct bus_type *bus, char *buf)
857{
858 return snprintf(buf, PAGE_SIZE, "%llu\n", poll_timeout);
859}
860
861static ssize_t poll_timeout_store(struct bus_type *bus, const char *buf,
862 size_t count)
863{
864 unsigned long long time;
865 ktime_t hr_time;
866
867 /* 120 seconds = maximum poll interval */
cb17a636
FB
868 if (sscanf(buf, "%llu\n", &time) != 1 || time < 1 ||
869 time > 120000000000ULL)
fe137230
FB
870 return -EINVAL;
871 poll_timeout = time;
872 hr_time = ktime_set(0, poll_timeout);
873
874 if (!hrtimer_is_queued(&ap_poll_timer) ||
6c644eae
AV
875 !hrtimer_forward(&ap_poll_timer, hrtimer_get_expires(&ap_poll_timer), hr_time)) {
876 hrtimer_set_expires(&ap_poll_timer, hr_time);
877 hrtimer_start_expires(&ap_poll_timer, HRTIMER_MODE_ABS);
fe137230
FB
878 }
879 return count;
880}
881
882static BUS_ATTR(poll_timeout, 0644, poll_timeout_show, poll_timeout_store);
883
1534c382
MS
884static struct bus_attribute *const ap_bus_attrs[] = {
885 &bus_attr_ap_domain,
886 &bus_attr_config_time,
887 &bus_attr_poll_thread,
cb17a636 888 &bus_attr_ap_interrupts,
fe137230
FB
889 &bus_attr_poll_timeout,
890 NULL,
1534c382
MS
891};
892
893/**
1749a81d
FB
894 * ap_select_domain(): Select an AP domain.
895 *
896 * Pick one of the 16 AP domains.
1534c382 897 */
4d284cac 898static int ap_select_domain(void)
1534c382
MS
899{
900 int queue_depth, device_type, count, max_count, best_domain;
901 int rc, i, j;
902
1749a81d 903 /*
1534c382
MS
904 * We want to use a single domain. Either the one specified with
905 * the "domain=" parameter or the domain with the maximum number
906 * of devices.
907 */
908 if (ap_domain_index >= 0 && ap_domain_index < AP_DOMAINS)
909 /* Domain has already been selected. */
910 return 0;
911 best_domain = -1;
912 max_count = 0;
913 for (i = 0; i < AP_DOMAINS; i++) {
914 count = 0;
915 for (j = 0; j < AP_DEVICES; j++) {
916 ap_qid_t qid = AP_MKQID(j, i);
917 rc = ap_query_queue(qid, &queue_depth, &device_type);
918 if (rc)
919 continue;
920 count++;
921 }
922 if (count > max_count) {
923 max_count = count;
924 best_domain = i;
925 }
926 }
927 if (best_domain >= 0){
928 ap_domain_index = best_domain;
929 return 0;
930 }
931 return -ENODEV;
932}
933
934/**
1749a81d 935 * ap_probe_device_type(): Find the device type of an AP.
1534c382 936 * @ap_dev: pointer to the AP device.
1749a81d
FB
937 *
938 * Find the device type if query queue returned a device type of 0.
1534c382
MS
939 */
940static int ap_probe_device_type(struct ap_device *ap_dev)
941{
942 static unsigned char msg[] = {
943 0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
944 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
945 0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,
946 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
947 0x01,0x00,0x43,0x43,0x41,0x2d,0x41,0x50,
948 0x50,0x4c,0x20,0x20,0x20,0x01,0x01,0x01,
949 0x00,0x00,0x00,0x00,0x50,0x4b,0x00,0x00,
950 0x00,0x00,0x01,0x1c,0x00,0x00,0x00,0x00,
951 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
952 0x00,0x00,0x05,0xb8,0x00,0x00,0x00,0x00,
953 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
954 0x70,0x00,0x41,0x00,0x00,0x00,0x00,0x00,
955 0x00,0x00,0x54,0x32,0x01,0x00,0xa0,0x00,
956 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
957 0x00,0x00,0x00,0x00,0xb8,0x05,0x00,0x00,
958 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
959 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
960 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
961 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
962 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
963 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
964 0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,
965 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
966 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
967 0x49,0x43,0x53,0x46,0x20,0x20,0x20,0x20,
968 0x50,0x4b,0x0a,0x00,0x50,0x4b,0x43,0x53,
969 0x2d,0x31,0x2e,0x32,0x37,0x00,0x11,0x22,
970 0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,
971 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
972 0x99,0x00,0x11,0x22,0x33,0x44,0x55,0x66,
973 0x77,0x88,0x99,0x00,0x11,0x22,0x33,0x44,
974 0x55,0x66,0x77,0x88,0x99,0x00,0x11,0x22,
975 0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,
976 0x11,0x22,0x33,0x5d,0x00,0x5b,0x00,0x77,
977 0x88,0x1e,0x00,0x00,0x57,0x00,0x00,0x00,
978 0x00,0x04,0x00,0x00,0x4f,0x00,0x00,0x00,
979 0x03,0x02,0x00,0x00,0x40,0x01,0x00,0x01,
980 0xce,0x02,0x68,0x2d,0x5f,0xa9,0xde,0x0c,
981 0xf6,0xd2,0x7b,0x58,0x4b,0xf9,0x28,0x68,
982 0x3d,0xb4,0xf4,0xef,0x78,0xd5,0xbe,0x66,
983 0x63,0x42,0xef,0xf8,0xfd,0xa4,0xf8,0xb0,
984 0x8e,0x29,0xc2,0xc9,0x2e,0xd8,0x45,0xb8,
985 0x53,0x8c,0x6f,0x4e,0x72,0x8f,0x6c,0x04,
986 0x9c,0x88,0xfc,0x1e,0xc5,0x83,0x55,0x57,
987 0xf7,0xdd,0xfd,0x4f,0x11,0x36,0x95,0x5d,
988 };
989 struct ap_queue_status status;
990 unsigned long long psmid;
991 char *reply;
992 int rc, i;
993
994 reply = (void *) get_zeroed_page(GFP_KERNEL);
995 if (!reply) {
996 rc = -ENOMEM;
997 goto out;
998 }
999
1000 status = __ap_send(ap_dev->qid, 0x0102030405060708ULL,
1001 msg, sizeof(msg));
1002 if (status.response_code != AP_RESPONSE_NORMAL) {
1003 rc = -ENODEV;
1004 goto out_free;
1005 }
1006
1007 /* Wait for the test message to complete. */
1008 for (i = 0; i < 6; i++) {
1009 mdelay(300);
1010 status = __ap_recv(ap_dev->qid, &psmid, reply, 4096);
1011 if (status.response_code == AP_RESPONSE_NORMAL &&
1012 psmid == 0x0102030405060708ULL)
1013 break;
1014 }
1015 if (i < 6) {
1016 /* Got an answer. */
1017 if (reply[0] == 0x00 && reply[1] == 0x86)
1018 ap_dev->device_type = AP_DEVICE_TYPE_PCICC;
1019 else
1020 ap_dev->device_type = AP_DEVICE_TYPE_PCICA;
1021 rc = 0;
1022 } else
1023 rc = -ENODEV;
1024
1025out_free:
1026 free_page((unsigned long) reply);
1027out:
1028 return rc;
1029}
1030
cb17a636
FB
1031static void ap_interrupt_handler(void *unused1, void *unused2)
1032{
1033 tasklet_schedule(&ap_tasklet);
1034}
1035
1534c382 1036/**
1749a81d
FB
1037 * __ap_scan_bus(): Scan the AP bus.
1038 * @dev: Pointer to device
1039 * @data: Pointer to data
1040 *
1041 * Scan the AP bus for new devices.
1534c382
MS
1042 */
1043static int __ap_scan_bus(struct device *dev, void *data)
1044{
1045 return to_ap_dev(dev)->qid == (ap_qid_t)(unsigned long) data;
1046}
1047
1048static void ap_device_release(struct device *dev)
1049{
1050 struct ap_device *ap_dev = to_ap_dev(dev);
1051
1052 kfree(ap_dev);
1053}
1054
4927b3f7 1055static void ap_scan_bus(struct work_struct *unused)
1534c382
MS
1056{
1057 struct ap_device *ap_dev;
1058 struct device *dev;
1059 ap_qid_t qid;
1060 int queue_depth, device_type;
1061 int rc, i;
1062
1063 if (ap_select_domain() != 0)
1064 return;
1065 for (i = 0; i < AP_DEVICES; i++) {
1066 qid = AP_MKQID(i, ap_domain_index);
1067 dev = bus_find_device(&ap_bus_type, NULL,
1068 (void *)(unsigned long)qid,
1069 __ap_scan_bus);
f3b017d8 1070 rc = ap_query_queue(qid, &queue_depth, &device_type);
c6a48264 1071 if (dev) {
af512ed0
RW
1072 if (rc == -EBUSY) {
1073 set_current_state(TASK_UNINTERRUPTIBLE);
1074 schedule_timeout(AP_RESET_TIMEOUT);
1075 rc = ap_query_queue(qid, &queue_depth,
1076 &device_type);
1077 }
c6a48264
RW
1078 ap_dev = to_ap_dev(dev);
1079 spin_lock_bh(&ap_dev->lock);
1080 if (rc || ap_dev->unregistered) {
1081 spin_unlock_bh(&ap_dev->lock);
c6a48264 1082 device_unregister(dev);
af512ed0 1083 put_device(dev);
c6a48264 1084 continue;
af512ed0
RW
1085 }
1086 spin_unlock_bh(&ap_dev->lock);
1534c382
MS
1087 put_device(dev);
1088 continue;
1089 }
1534c382
MS
1090 if (rc)
1091 continue;
1092 rc = ap_init_queue(qid);
1093 if (rc)
1094 continue;
1095 ap_dev = kzalloc(sizeof(*ap_dev), GFP_KERNEL);
1096 if (!ap_dev)
1097 break;
1098 ap_dev->qid = qid;
1099 ap_dev->queue_depth = queue_depth;
4e56296d 1100 ap_dev->unregistered = 1;
1534c382
MS
1101 spin_lock_init(&ap_dev->lock);
1102 INIT_LIST_HEAD(&ap_dev->pendingq);
1103 INIT_LIST_HEAD(&ap_dev->requestq);
cf352ce0 1104 INIT_LIST_HEAD(&ap_dev->list);
af512ed0
RW
1105 setup_timer(&ap_dev->timeout, ap_request_timeout,
1106 (unsigned long) ap_dev);
1534c382
MS
1107 if (device_type == 0)
1108 ap_probe_device_type(ap_dev);
1109 else
1110 ap_dev->device_type = device_type;
1111
1112 ap_dev->device.bus = &ap_bus_type;
1113 ap_dev->device.parent = ap_root_device;
1bf5b285
CH
1114 dev_set_name(&ap_dev->device, "card%02x",
1115 AP_QID_DEVICE(ap_dev->qid));
1534c382
MS
1116 ap_dev->device.release = ap_device_release;
1117 rc = device_register(&ap_dev->device);
1118 if (rc) {
c6304933 1119 put_device(&ap_dev->device);
1534c382
MS
1120 continue;
1121 }
1122 /* Add device attributes. */
1123 rc = sysfs_create_group(&ap_dev->device.kobj,
1124 &ap_dev_attr_group);
4e56296d
RW
1125 if (!rc) {
1126 spin_lock_bh(&ap_dev->lock);
1127 ap_dev->unregistered = 0;
1128 spin_unlock_bh(&ap_dev->lock);
1129 }
1130 else
1534c382
MS
1131 device_unregister(&ap_dev->device);
1132 }
1133}
1134
1135static void
1136ap_config_timeout(unsigned long ptr)
1137{
1138 queue_work(ap_work_queue, &ap_config_work);
1139 ap_config_timer.expires = jiffies + ap_config_time * HZ;
1140 add_timer(&ap_config_timer);
1141}
1142
1143/**
1749a81d
FB
1144 * ap_schedule_poll_timer(): Schedule poll timer.
1145 *
1534c382
MS
1146 * Set up the timer to run the poll tasklet
1147 */
1148static inline void ap_schedule_poll_timer(void)
1149{
8d406c6d 1150 ktime_t hr_time;
772f5472 1151 if (ap_using_interrupts() || ap_suspend_flag)
cb17a636 1152 return;
fe137230 1153 if (hrtimer_is_queued(&ap_poll_timer))
1534c382 1154 return;
8d406c6d
FB
1155 if (ktime_to_ns(hrtimer_expires_remaining(&ap_poll_timer)) <= 0) {
1156 hr_time = ktime_set(0, poll_timeout);
1157 hrtimer_forward_now(&ap_poll_timer, hr_time);
1158 hrtimer_restart(&ap_poll_timer);
1159 }
1160 return;
1534c382
MS
1161}
1162
1163/**
1749a81d 1164 * ap_poll_read(): Receive pending reply messages from an AP device.
1534c382
MS
1165 * @ap_dev: pointer to the AP device
1166 * @flags: pointer to control flags, bit 2^0 is set if another poll is
1167 * required, bit 2^1 is set if the poll timer needs to get armed
1749a81d 1168 *
1534c382
MS
1169 * Returns 0 if the device is still present, -ENODEV if not.
1170 */
4d284cac 1171static int ap_poll_read(struct ap_device *ap_dev, unsigned long *flags)
1534c382
MS
1172{
1173 struct ap_queue_status status;
1174 struct ap_message *ap_msg;
1175
1176 if (ap_dev->queue_count <= 0)
1177 return 0;
1178 status = __ap_recv(ap_dev->qid, &ap_dev->reply->psmid,
1179 ap_dev->reply->message, ap_dev->reply->length);
1180 switch (status.response_code) {
1181 case AP_RESPONSE_NORMAL:
1182 atomic_dec(&ap_poll_requests);
af512ed0 1183 ap_decrease_queue_count(ap_dev);
1534c382
MS
1184 list_for_each_entry(ap_msg, &ap_dev->pendingq, list) {
1185 if (ap_msg->psmid != ap_dev->reply->psmid)
1186 continue;
1187 list_del_init(&ap_msg->list);
1188 ap_dev->pendingq_count--;
1189 ap_dev->drv->receive(ap_dev, ap_msg, ap_dev->reply);
1190 break;
1191 }
1192 if (ap_dev->queue_count > 0)
1193 *flags |= 1;
1194 break;
1195 case AP_RESPONSE_NO_PENDING_REPLY:
1196 if (status.queue_empty) {
1197 /* The card shouldn't forget requests but who knows. */
e675c0d2 1198 atomic_sub(ap_dev->queue_count, &ap_poll_requests);
1534c382
MS
1199 ap_dev->queue_count = 0;
1200 list_splice_init(&ap_dev->pendingq, &ap_dev->requestq);
1201 ap_dev->requestq_count += ap_dev->pendingq_count;
1202 ap_dev->pendingq_count = 0;
1203 } else
1204 *flags |= 2;
1205 break;
1206 default:
1207 return -ENODEV;
1208 }
1209 return 0;
1210}
1211
1212/**
1749a81d 1213 * ap_poll_write(): Send messages from the request queue to an AP device.
1534c382
MS
1214 * @ap_dev: pointer to the AP device
1215 * @flags: pointer to control flags, bit 2^0 is set if another poll is
1216 * required, bit 2^1 is set if the poll timer needs to get armed
1749a81d 1217 *
1534c382
MS
1218 * Returns 0 if the device is still present, -ENODEV if not.
1219 */
4d284cac 1220static int ap_poll_write(struct ap_device *ap_dev, unsigned long *flags)
1534c382
MS
1221{
1222 struct ap_queue_status status;
1223 struct ap_message *ap_msg;
1224
1225 if (ap_dev->requestq_count <= 0 ||
1226 ap_dev->queue_count >= ap_dev->queue_depth)
1227 return 0;
1228 /* Start the next request on the queue. */
1229 ap_msg = list_entry(ap_dev->requestq.next, struct ap_message, list);
1230 status = __ap_send(ap_dev->qid, ap_msg->psmid,
1231 ap_msg->message, ap_msg->length);
1232 switch (status.response_code) {
1233 case AP_RESPONSE_NORMAL:
1234 atomic_inc(&ap_poll_requests);
af512ed0 1235 ap_increase_queue_count(ap_dev);
1534c382
MS
1236 list_move_tail(&ap_msg->list, &ap_dev->pendingq);
1237 ap_dev->requestq_count--;
1238 ap_dev->pendingq_count++;
1239 if (ap_dev->queue_count < ap_dev->queue_depth &&
1240 ap_dev->requestq_count > 0)
1241 *flags |= 1;
1242 *flags |= 2;
1243 break;
1244 case AP_RESPONSE_Q_FULL:
af512ed0 1245 case AP_RESPONSE_RESET_IN_PROGRESS:
1534c382
MS
1246 *flags |= 2;
1247 break;
1248 case AP_RESPONSE_MESSAGE_TOO_BIG:
1249 return -EINVAL;
1250 default:
1251 return -ENODEV;
1252 }
1253 return 0;
1254}
1255
1256/**
1749a81d 1257 * ap_poll_queue(): Poll AP device for pending replies and send new messages.
1534c382
MS
1258 * @ap_dev: pointer to the bus device
1259 * @flags: pointer to control flags, bit 2^0 is set if another poll is
1260 * required, bit 2^1 is set if the poll timer needs to get armed
1749a81d
FB
1261 *
1262 * Poll AP device for pending replies and send new messages. If either
1263 * ap_poll_read or ap_poll_write returns -ENODEV unregister the device.
1534c382
MS
1264 * Returns 0.
1265 */
1266static inline int ap_poll_queue(struct ap_device *ap_dev, unsigned long *flags)
1267{
1268 int rc;
1269
1270 rc = ap_poll_read(ap_dev, flags);
1271 if (rc)
1272 return rc;
1273 return ap_poll_write(ap_dev, flags);
1274}
1275
1276/**
1749a81d 1277 * __ap_queue_message(): Queue a message to a device.
1534c382
MS
1278 * @ap_dev: pointer to the AP device
1279 * @ap_msg: the message to be queued
1749a81d
FB
1280 *
1281 * Queue a message to a device. Returns 0 if successful.
1534c382
MS
1282 */
1283static int __ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg)
1284{
1285 struct ap_queue_status status;
1286
1287 if (list_empty(&ap_dev->requestq) &&
1288 ap_dev->queue_count < ap_dev->queue_depth) {
1289 status = __ap_send(ap_dev->qid, ap_msg->psmid,
1290 ap_msg->message, ap_msg->length);
1291 switch (status.response_code) {
1292 case AP_RESPONSE_NORMAL:
1293 list_add_tail(&ap_msg->list, &ap_dev->pendingq);
1294 atomic_inc(&ap_poll_requests);
1295 ap_dev->pendingq_count++;
af512ed0 1296 ap_increase_queue_count(ap_dev);
1534c382
MS
1297 ap_dev->total_request_count++;
1298 break;
1299 case AP_RESPONSE_Q_FULL:
af512ed0 1300 case AP_RESPONSE_RESET_IN_PROGRESS:
1534c382
MS
1301 list_add_tail(&ap_msg->list, &ap_dev->requestq);
1302 ap_dev->requestq_count++;
1303 ap_dev->total_request_count++;
1304 return -EBUSY;
1305 case AP_RESPONSE_MESSAGE_TOO_BIG:
1306 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-EINVAL));
1307 return -EINVAL;
1308 default: /* Device is gone. */
1309 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
1310 return -ENODEV;
1311 }
1312 } else {
1313 list_add_tail(&ap_msg->list, &ap_dev->requestq);
1314 ap_dev->requestq_count++;
1315 ap_dev->total_request_count++;
1316 return -EBUSY;
1317 }
1318 ap_schedule_poll_timer();
1319 return 0;
1320}
1321
1322void ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg)
1323{
1324 unsigned long flags;
1325 int rc;
1326
1327 spin_lock_bh(&ap_dev->lock);
1328 if (!ap_dev->unregistered) {
1329 /* Make room on the queue by polling for finished requests. */
1330 rc = ap_poll_queue(ap_dev, &flags);
1331 if (!rc)
1332 rc = __ap_queue_message(ap_dev, ap_msg);
1333 if (!rc)
1334 wake_up(&ap_poll_wait);
4e56296d
RW
1335 if (rc == -ENODEV)
1336 ap_dev->unregistered = 1;
1534c382
MS
1337 } else {
1338 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
c6a48264 1339 rc = -ENODEV;
1534c382
MS
1340 }
1341 spin_unlock_bh(&ap_dev->lock);
1342 if (rc == -ENODEV)
1343 device_unregister(&ap_dev->device);
1344}
1345EXPORT_SYMBOL(ap_queue_message);
1346
1347/**
1749a81d
FB
1348 * ap_cancel_message(): Cancel a crypto request.
1349 * @ap_dev: The AP device that has the message queued
1350 * @ap_msg: The message that is to be removed
1351 *
1534c382 1352 * Cancel a crypto request. This is done by removing the request
1749a81d 1353 * from the device pending or request queue. Note that the
1534c382
MS
1354 * request stays on the AP queue. When it finishes the message
1355 * reply will be discarded because the psmid can't be found.
1534c382
MS
1356 */
1357void ap_cancel_message(struct ap_device *ap_dev, struct ap_message *ap_msg)
1358{
1359 struct ap_message *tmp;
1360
1361 spin_lock_bh(&ap_dev->lock);
1362 if (!list_empty(&ap_msg->list)) {
1363 list_for_each_entry(tmp, &ap_dev->pendingq, list)
1364 if (tmp->psmid == ap_msg->psmid) {
1365 ap_dev->pendingq_count--;
1366 goto found;
1367 }
1368 ap_dev->requestq_count--;
1369 found:
1370 list_del_init(&ap_msg->list);
1371 }
1372 spin_unlock_bh(&ap_dev->lock);
1373}
1374EXPORT_SYMBOL(ap_cancel_message);
1375
1376/**
1749a81d 1377 * ap_poll_timeout(): AP receive polling for finished AP requests.
fe137230 1378 * @unused: Unused pointer.
1749a81d 1379 *
fe137230 1380 * Schedules the AP tasklet using a high resolution timer.
1534c382 1381 */
fe137230 1382static enum hrtimer_restart ap_poll_timeout(struct hrtimer *unused)
1534c382
MS
1383{
1384 tasklet_schedule(&ap_tasklet);
fe137230 1385 return HRTIMER_NORESTART;
1534c382
MS
1386}
1387
af512ed0 1388/**
1749a81d
FB
1389 * ap_reset(): Reset a not responding AP device.
1390 * @ap_dev: Pointer to the AP device
1391 *
af512ed0
RW
1392 * Reset a not responding AP device and move all requests from the
1393 * pending queue to the request queue.
1394 */
1395static void ap_reset(struct ap_device *ap_dev)
1396{
1397 int rc;
1398
1399 ap_dev->reset = AP_RESET_IGNORE;
1400 atomic_sub(ap_dev->queue_count, &ap_poll_requests);
1401 ap_dev->queue_count = 0;
1402 list_splice_init(&ap_dev->pendingq, &ap_dev->requestq);
1403 ap_dev->requestq_count += ap_dev->pendingq_count;
1404 ap_dev->pendingq_count = 0;
1405 rc = ap_init_queue(ap_dev->qid);
1406 if (rc == -ENODEV)
1407 ap_dev->unregistered = 1;
1408}
1409
43c207e6 1410static int __ap_poll_device(struct ap_device *ap_dev, unsigned long *flags)
1534c382 1411{
1534c382 1412 if (!ap_dev->unregistered) {
c6a48264 1413 if (ap_poll_queue(ap_dev, flags))
4e56296d 1414 ap_dev->unregistered = 1;
af512ed0
RW
1415 if (ap_dev->reset == AP_RESET_DO)
1416 ap_reset(ap_dev);
c6a48264 1417 }
1534c382
MS
1418 return 0;
1419}
1420
1749a81d
FB
1421/**
1422 * ap_poll_all(): Poll all AP devices.
1423 * @dummy: Unused variable
1424 *
1425 * Poll all AP devices on the bus in a round robin fashion. Continue
1426 * polling until bit 2^0 of the control flags is not set. If bit 2^1
1427 * of the control flags has been set arm the poll timer.
1428 */
1534c382
MS
1429static void ap_poll_all(unsigned long dummy)
1430{
1431 unsigned long flags;
cf352ce0 1432 struct ap_device *ap_dev;
1534c382 1433
cb17a636
FB
1434 /* Reset the indicator if interrupts are used. Thus new interrupts can
1435 * be received. Doing it in the beginning of the tasklet is therefor
1436 * important that no requests on any AP get lost.
1437 */
1438 if (ap_using_interrupts())
1439 xchg((u8 *)ap_interrupt_indicator, 0);
1534c382
MS
1440 do {
1441 flags = 0;
43c207e6 1442 spin_lock(&ap_device_list_lock);
cf352ce0 1443 list_for_each_entry(ap_dev, &ap_device_list, list) {
95f1556c 1444 spin_lock(&ap_dev->lock);
43c207e6 1445 __ap_poll_device(ap_dev, &flags);
95f1556c 1446 spin_unlock(&ap_dev->lock);
cf352ce0 1447 }
43c207e6 1448 spin_unlock(&ap_device_list_lock);
1534c382
MS
1449 } while (flags & 1);
1450 if (flags & 2)
1451 ap_schedule_poll_timer();
1452}
1453
1454/**
1749a81d
FB
1455 * ap_poll_thread(): Thread that polls for finished requests.
1456 * @data: Unused pointer
1457 *
1534c382
MS
1458 * AP bus poll thread. The purpose of this thread is to poll for
1459 * finished requests in a loop if there is a "free" cpu - that is
1460 * a cpu that doesn't have anything better to do. The polling stops
1461 * as soon as there is another task or if all messages have been
1462 * delivered.
1463 */
1464static int ap_poll_thread(void *data)
1465{
1466 DECLARE_WAITQUEUE(wait, current);
1467 unsigned long flags;
1468 int requests;
cf352ce0 1469 struct ap_device *ap_dev;
1534c382 1470
d83682b3 1471 set_user_nice(current, 19);
1534c382 1472 while (1) {
772f5472
FB
1473 if (ap_suspend_flag)
1474 return 0;
1534c382
MS
1475 if (need_resched()) {
1476 schedule();
1477 continue;
1478 }
1479 add_wait_queue(&ap_poll_wait, &wait);
1480 set_current_state(TASK_INTERRUPTIBLE);
1481 if (kthread_should_stop())
1482 break;
1483 requests = atomic_read(&ap_poll_requests);
1484 if (requests <= 0)
1485 schedule();
1486 set_current_state(TASK_RUNNING);
1487 remove_wait_queue(&ap_poll_wait, &wait);
1488
1534c382 1489 flags = 0;
43c207e6 1490 spin_lock_bh(&ap_device_list_lock);
cf352ce0 1491 list_for_each_entry(ap_dev, &ap_device_list, list) {
95f1556c 1492 spin_lock(&ap_dev->lock);
43c207e6 1493 __ap_poll_device(ap_dev, &flags);
95f1556c 1494 spin_unlock(&ap_dev->lock);
cf352ce0 1495 }
43c207e6 1496 spin_unlock_bh(&ap_device_list_lock);
1534c382
MS
1497 }
1498 set_current_state(TASK_RUNNING);
1499 remove_wait_queue(&ap_poll_wait, &wait);
1500 return 0;
1501}
1502
1503static int ap_poll_thread_start(void)
1504{
1505 int rc;
1506
772f5472 1507 if (ap_using_interrupts() || ap_suspend_flag)
cb17a636 1508 return 0;
1534c382
MS
1509 mutex_lock(&ap_poll_thread_mutex);
1510 if (!ap_poll_kthread) {
1511 ap_poll_kthread = kthread_run(ap_poll_thread, NULL, "appoll");
1512 rc = IS_ERR(ap_poll_kthread) ? PTR_ERR(ap_poll_kthread) : 0;
1513 if (rc)
1514 ap_poll_kthread = NULL;
1515 }
1516 else
1517 rc = 0;
1518 mutex_unlock(&ap_poll_thread_mutex);
1519 return rc;
1520}
1521
1522static void ap_poll_thread_stop(void)
1523{
1524 mutex_lock(&ap_poll_thread_mutex);
1525 if (ap_poll_kthread) {
1526 kthread_stop(ap_poll_kthread);
1527 ap_poll_kthread = NULL;
1528 }
1529 mutex_unlock(&ap_poll_thread_mutex);
1530}
1531
af512ed0 1532/**
1749a81d
FB
1533 * ap_request_timeout(): Handling of request timeouts
1534 * @data: Holds the AP device.
1535 *
1536 * Handles request timeouts.
af512ed0
RW
1537 */
1538static void ap_request_timeout(unsigned long data)
1539{
1540 struct ap_device *ap_dev = (struct ap_device *) data;
1541
cb17a636 1542 if (ap_dev->reset == AP_RESET_ARMED) {
af512ed0 1543 ap_dev->reset = AP_RESET_DO;
cb17a636
FB
1544
1545 if (ap_using_interrupts())
1546 tasklet_schedule(&ap_tasklet);
1547 }
af512ed0
RW
1548}
1549
13e742ba
RW
1550static void ap_reset_domain(void)
1551{
1552 int i;
1553
39aa7cf6
RW
1554 if (ap_domain_index != -1)
1555 for (i = 0; i < AP_DEVICES; i++)
1556 ap_reset_queue(AP_MKQID(i, ap_domain_index));
13e742ba
RW
1557}
1558
1559static void ap_reset_all(void)
85eca850
RW
1560{
1561 int i, j;
1562
1563 for (i = 0; i < AP_DOMAINS; i++)
1564 for (j = 0; j < AP_DEVICES; j++)
1565 ap_reset_queue(AP_MKQID(j, i));
1566}
1567
1568static struct reset_call ap_reset_call = {
13e742ba 1569 .fn = ap_reset_all,
85eca850
RW
1570};
1571
1534c382 1572/**
1749a81d
FB
1573 * ap_module_init(): The module initialization code.
1574 *
1575 * Initializes the module.
1534c382
MS
1576 */
1577int __init ap_module_init(void)
1578{
1579 int rc, i;
1580
1581 if (ap_domain_index < -1 || ap_domain_index >= AP_DOMAINS) {
136f7a1c
MS
1582 pr_warning("%d is not a valid cryptographic domain\n",
1583 ap_domain_index);
1534c382
MS
1584 return -EINVAL;
1585 }
1586 if (ap_instructions_available() != 0) {
136f7a1c
MS
1587 pr_warning("The hardware system does not support "
1588 "AP instructions\n");
1534c382
MS
1589 return -ENODEV;
1590 }
cb17a636
FB
1591 if (ap_interrupts_available()) {
1592 isc_register(AP_ISC);
1593 ap_interrupt_indicator = s390_register_adapter_interrupt(
1594 &ap_interrupt_handler, NULL, AP_ISC);
1595 if (IS_ERR(ap_interrupt_indicator)) {
1596 ap_interrupt_indicator = NULL;
1597 isc_unregister(AP_ISC);
1598 }
1599 }
1600
85eca850 1601 register_reset_call(&ap_reset_call);
1534c382
MS
1602
1603 /* Create /sys/bus/ap. */
1604 rc = bus_register(&ap_bus_type);
1605 if (rc)
1606 goto out;
1607 for (i = 0; ap_bus_attrs[i]; i++) {
1608 rc = bus_create_file(&ap_bus_type, ap_bus_attrs[i]);
1609 if (rc)
1610 goto out_bus;
1611 }
1612
1613 /* Create /sys/devices/ap. */
035da16f 1614 ap_root_device = root_device_register("ap");
1534c382
MS
1615 rc = IS_ERR(ap_root_device) ? PTR_ERR(ap_root_device) : 0;
1616 if (rc)
1617 goto out_bus;
1618
1619 ap_work_queue = create_singlethread_workqueue("kapwork");
1620 if (!ap_work_queue) {
1621 rc = -ENOMEM;
1622 goto out_root;
1623 }
1624
1625 if (ap_select_domain() == 0)
1626 ap_scan_bus(NULL);
1627
1749a81d 1628 /* Setup the AP bus rescan timer. */
1534c382
MS
1629 init_timer(&ap_config_timer);
1630 ap_config_timer.function = ap_config_timeout;
1631 ap_config_timer.data = 0;
1632 ap_config_timer.expires = jiffies + ap_config_time * HZ;
1633 add_timer(&ap_config_timer);
1634
fe137230
FB
1635 /* Setup the high resultion poll timer.
1636 * If we are running under z/VM adjust polling to z/VM polling rate.
1637 */
1638 if (MACHINE_IS_VM)
1639 poll_timeout = 1500000;
1640 hrtimer_init(&ap_poll_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
1641 ap_poll_timer.function = ap_poll_timeout;
1642
1534c382
MS
1643 /* Start the low priority AP bus poll thread. */
1644 if (ap_thread_flag) {
1645 rc = ap_poll_thread_start();
1646 if (rc)
1647 goto out_work;
1648 }
1649
1650 return 0;
1651
1652out_work:
1653 del_timer_sync(&ap_config_timer);
fe137230 1654 hrtimer_cancel(&ap_poll_timer);
1534c382
MS
1655 destroy_workqueue(ap_work_queue);
1656out_root:
035da16f 1657 root_device_unregister(ap_root_device);
1534c382
MS
1658out_bus:
1659 while (i--)
1660 bus_remove_file(&ap_bus_type, ap_bus_attrs[i]);
1661 bus_unregister(&ap_bus_type);
1662out:
85eca850 1663 unregister_reset_call(&ap_reset_call);
cb17a636
FB
1664 if (ap_using_interrupts()) {
1665 s390_unregister_adapter_interrupt(ap_interrupt_indicator, AP_ISC);
1666 isc_unregister(AP_ISC);
1667 }
1534c382
MS
1668 return rc;
1669}
1670
1671static int __ap_match_all(struct device *dev, void *data)
1672{
1673 return 1;
1674}
1675
1676/**
1749a81d
FB
1677 * ap_modules_exit(): The module termination code
1678 *
1679 * Terminates the module.
1534c382
MS
1680 */
1681void ap_module_exit(void)
1682{
1683 int i;
1684 struct device *dev;
1685
13e742ba 1686 ap_reset_domain();
1534c382
MS
1687 ap_poll_thread_stop();
1688 del_timer_sync(&ap_config_timer);
fe137230 1689 hrtimer_cancel(&ap_poll_timer);
1534c382 1690 destroy_workqueue(ap_work_queue);
13e742ba 1691 tasklet_kill(&ap_tasklet);
035da16f 1692 root_device_unregister(ap_root_device);
1534c382
MS
1693 while ((dev = bus_find_device(&ap_bus_type, NULL, NULL,
1694 __ap_match_all)))
1695 {
1696 device_unregister(dev);
1697 put_device(dev);
1698 }
1699 for (i = 0; ap_bus_attrs[i]; i++)
1700 bus_remove_file(&ap_bus_type, ap_bus_attrs[i]);
1701 bus_unregister(&ap_bus_type);
85eca850 1702 unregister_reset_call(&ap_reset_call);
cb17a636
FB
1703 if (ap_using_interrupts()) {
1704 s390_unregister_adapter_interrupt(ap_interrupt_indicator, AP_ISC);
1705 isc_unregister(AP_ISC);
1706 }
1534c382
MS
1707}
1708
1709#ifndef CONFIG_ZCRYPT_MONOLITHIC
1710module_init(ap_module_init);
1711module_exit(ap_module_exit);
1712#endif