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