blob: e4dc947e74e9fc2402a70e438c6e649bb0853ad6 [file] [log] [blame]
Martin Schwidefsky1534c382006-09-20 15:58:25 +02001/*
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>
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
26#include <linux/module.h>
27#include <linux/init.h>
28#include <linux/delay.h>
29#include <linux/err.h>
30#include <linux/interrupt.h>
31#include <linux/workqueue.h>
32#include <linux/notifier.h>
33#include <linux/kthread.h>
34#include <linux/mutex.h>
35#include <asm/s390_rdev.h>
36
37#include "ap_bus.h"
38
39/* Some prototypes. */
Al Viro4927b3f2006-12-06 19:18:20 +000040static void ap_scan_bus(struct work_struct *);
Martin Schwidefsky1534c382006-09-20 15:58:25 +020041static void ap_poll_all(unsigned long);
42static void ap_poll_timeout(unsigned long);
43static int ap_poll_thread_start(void);
44static void ap_poll_thread_stop(void);
45
46/**
47 * Module description.
48 */
49MODULE_AUTHOR("IBM Corporation");
50MODULE_DESCRIPTION("Adjunct Processor Bus driver, "
51 "Copyright 2006 IBM Corporation");
52MODULE_LICENSE("GPL");
53
54/**
55 * Module parameter
56 */
57int ap_domain_index = -1; /* Adjunct Processor Domain Index */
58module_param_named(domain, ap_domain_index, int, 0000);
59MODULE_PARM_DESC(domain, "domain index for ap devices");
60EXPORT_SYMBOL(ap_domain_index);
61
62static int ap_thread_flag = 1;
63module_param_named(poll_thread, ap_thread_flag, int, 0000);
64MODULE_PARM_DESC(poll_thread, "Turn on/off poll thread, default is 1 (on).");
65
66static struct device *ap_root_device = NULL;
67
68/**
69 * Workqueue & timer for bus rescan.
70 */
71static struct workqueue_struct *ap_work_queue;
72static struct timer_list ap_config_timer;
73static int ap_config_time = AP_CONFIG_TIME;
Al Viro4927b3f2006-12-06 19:18:20 +000074static DECLARE_WORK(ap_config_work, ap_scan_bus);
Martin Schwidefsky1534c382006-09-20 15:58:25 +020075
76/**
77 * Tasklet & timer for AP request polling.
78 */
79static struct timer_list ap_poll_timer = TIMER_INITIALIZER(ap_poll_timeout,0,0);
80static DECLARE_TASKLET(ap_tasklet, ap_poll_all, 0);
81static atomic_t ap_poll_requests = ATOMIC_INIT(0);
82static DECLARE_WAIT_QUEUE_HEAD(ap_poll_wait);
83static struct task_struct *ap_poll_kthread = NULL;
84static DEFINE_MUTEX(ap_poll_thread_mutex);
85
86/**
87 * Test if ap instructions are available.
88 *
89 * Returns 0 if the ap instructions are installed.
90 */
91static inline int ap_instructions_available(void)
92{
93 register unsigned long reg0 asm ("0") = AP_MKQID(0,0);
94 register unsigned long reg1 asm ("1") = -ENODEV;
95 register unsigned long reg2 asm ("2") = 0UL;
96
97 asm volatile(
98 " .long 0xb2af0000\n" /* PQAP(TAPQ) */
99 "0: la %1,0\n"
100 "1:\n"
101 EX_TABLE(0b, 1b)
102 : "+d" (reg0), "+d" (reg1), "+d" (reg2) : : "cc" );
103 return reg1;
104}
105
106/**
107 * Test adjunct processor queue.
108 * @qid: the ap queue number
109 * @queue_depth: pointer to queue depth value
110 * @device_type: pointer to device type value
111 *
112 * Returns ap queue status structure.
113 */
114static inline struct ap_queue_status
115ap_test_queue(ap_qid_t qid, int *queue_depth, int *device_type)
116{
117 register unsigned long reg0 asm ("0") = qid;
118 register struct ap_queue_status reg1 asm ("1");
119 register unsigned long reg2 asm ("2") = 0UL;
120
121 asm volatile(".long 0xb2af0000" /* PQAP(TAPQ) */
122 : "+d" (reg0), "=d" (reg1), "+d" (reg2) : : "cc");
123 *device_type = (int) (reg2 >> 24);
124 *queue_depth = (int) (reg2 & 0xff);
125 return reg1;
126}
127
128/**
129 * Reset adjunct processor queue.
130 * @qid: the ap queue number
131 *
132 * Returns ap queue status structure.
133 */
134static inline struct ap_queue_status ap_reset_queue(ap_qid_t qid)
135{
136 register unsigned long reg0 asm ("0") = qid | 0x01000000UL;
137 register struct ap_queue_status reg1 asm ("1");
138 register unsigned long reg2 asm ("2") = 0UL;
139
140 asm volatile(
141 ".long 0xb2af0000" /* PQAP(RAPQ) */
142 : "+d" (reg0), "=d" (reg1), "+d" (reg2) : : "cc");
143 return reg1;
144}
145
146/**
147 * Send message to adjunct processor queue.
148 * @qid: the ap queue number
149 * @psmid: the program supplied message identifier
150 * @msg: the message text
151 * @length: the message length
152 *
153 * Returns ap queue status structure.
154 *
155 * Condition code 1 on NQAP can't happen because the L bit is 1.
156 *
157 * Condition code 2 on NQAP also means the send is incomplete,
158 * because a segment boundary was reached. The NQAP is repeated.
159 */
160static inline struct ap_queue_status
161__ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length)
162{
163 typedef struct { char _[length]; } msgblock;
164 register unsigned long reg0 asm ("0") = qid | 0x40000000UL;
165 register struct ap_queue_status reg1 asm ("1");
166 register unsigned long reg2 asm ("2") = (unsigned long) msg;
167 register unsigned long reg3 asm ("3") = (unsigned long) length;
168 register unsigned long reg4 asm ("4") = (unsigned int) (psmid >> 32);
169 register unsigned long reg5 asm ("5") = (unsigned int) psmid;
170
171 asm volatile (
172 "0: .long 0xb2ad0042\n" /* DQAP */
173 " brc 2,0b"
174 : "+d" (reg0), "=d" (reg1), "+d" (reg2), "+d" (reg3)
175 : "d" (reg4), "d" (reg5), "m" (*(msgblock *) msg)
176 : "cc" );
177 return reg1;
178}
179
180int ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length)
181{
182 struct ap_queue_status status;
183
184 status = __ap_send(qid, psmid, msg, length);
185 switch (status.response_code) {
186 case AP_RESPONSE_NORMAL:
187 return 0;
188 case AP_RESPONSE_Q_FULL:
189 return -EBUSY;
190 default: /* Device is gone. */
191 return -ENODEV;
192 }
193}
194EXPORT_SYMBOL(ap_send);
195
196/*
197 * Receive message from adjunct processor queue.
198 * @qid: the ap queue number
199 * @psmid: pointer to program supplied message identifier
200 * @msg: the message text
201 * @length: the message length
202 *
203 * Returns ap queue status structure.
204 *
205 * Condition code 1 on DQAP means the receive has taken place
206 * but only partially. The response is incomplete, hence the
207 * DQAP is repeated.
208 *
209 * Condition code 2 on DQAP also means the receive is incomplete,
210 * this time because a segment boundary was reached. Again, the
211 * DQAP is repeated.
212 *
213 * Note that gpr2 is used by the DQAP instruction to keep track of
214 * any 'residual' length, in case the instruction gets interrupted.
215 * Hence it gets zeroed before the instruction.
216 */
217static inline struct ap_queue_status
218__ap_recv(ap_qid_t qid, unsigned long long *psmid, void *msg, size_t length)
219{
220 typedef struct { char _[length]; } msgblock;
221 register unsigned long reg0 asm("0") = qid | 0x80000000UL;
222 register struct ap_queue_status reg1 asm ("1");
223 register unsigned long reg2 asm("2") = 0UL;
224 register unsigned long reg4 asm("4") = (unsigned long) msg;
225 register unsigned long reg5 asm("5") = (unsigned long) length;
226 register unsigned long reg6 asm("6") = 0UL;
227 register unsigned long reg7 asm("7") = 0UL;
228
229
230 asm volatile(
231 "0: .long 0xb2ae0064\n"
232 " brc 6,0b\n"
233 : "+d" (reg0), "=d" (reg1), "+d" (reg2),
234 "+d" (reg4), "+d" (reg5), "+d" (reg6), "+d" (reg7),
235 "=m" (*(msgblock *) msg) : : "cc" );
236 *psmid = (((unsigned long long) reg6) << 32) + reg7;
237 return reg1;
238}
239
240int ap_recv(ap_qid_t qid, unsigned long long *psmid, void *msg, size_t length)
241{
242 struct ap_queue_status status;
243
244 status = __ap_recv(qid, psmid, msg, length);
245 switch (status.response_code) {
246 case AP_RESPONSE_NORMAL:
247 return 0;
248 case AP_RESPONSE_NO_PENDING_REPLY:
249 if (status.queue_empty)
250 return -ENOENT;
251 return -EBUSY;
252 default:
253 return -ENODEV;
254 }
255}
256EXPORT_SYMBOL(ap_recv);
257
258/**
259 * Check if an AP queue is available. The test is repeated for
260 * AP_MAX_RESET times.
261 * @qid: the ap queue number
262 * @queue_depth: pointer to queue depth value
263 * @device_type: pointer to device type value
264 */
265static int ap_query_queue(ap_qid_t qid, int *queue_depth, int *device_type)
266{
267 struct ap_queue_status status;
268 int t_depth, t_device_type, rc, i;
269
270 rc = -EBUSY;
271 for (i = 0; i < AP_MAX_RESET; i++) {
272 status = ap_test_queue(qid, &t_depth, &t_device_type);
273 switch (status.response_code) {
274 case AP_RESPONSE_NORMAL:
275 *queue_depth = t_depth + 1;
276 *device_type = t_device_type;
277 rc = 0;
278 break;
279 case AP_RESPONSE_Q_NOT_AVAIL:
280 rc = -ENODEV;
281 break;
282 case AP_RESPONSE_RESET_IN_PROGRESS:
283 break;
284 case AP_RESPONSE_DECONFIGURED:
285 rc = -ENODEV;
286 break;
287 case AP_RESPONSE_CHECKSTOPPED:
288 rc = -ENODEV;
289 break;
290 case AP_RESPONSE_BUSY:
291 break;
292 default:
293 BUG();
294 }
295 if (rc != -EBUSY)
296 break;
297 if (i < AP_MAX_RESET - 1)
298 udelay(5);
299 }
300 return rc;
301}
302
303/**
304 * Reset an AP queue and wait for it to become available again.
305 * @qid: the ap queue number
306 */
307static int ap_init_queue(ap_qid_t qid)
308{
309 struct ap_queue_status status;
310 int rc, dummy, i;
311
312 rc = -ENODEV;
313 status = ap_reset_queue(qid);
314 for (i = 0; i < AP_MAX_RESET; i++) {
315 switch (status.response_code) {
316 case AP_RESPONSE_NORMAL:
317 if (status.queue_empty)
318 rc = 0;
319 break;
320 case AP_RESPONSE_Q_NOT_AVAIL:
321 case AP_RESPONSE_DECONFIGURED:
322 case AP_RESPONSE_CHECKSTOPPED:
323 i = AP_MAX_RESET; /* return with -ENODEV */
324 break;
325 case AP_RESPONSE_RESET_IN_PROGRESS:
326 case AP_RESPONSE_BUSY:
327 default:
328 break;
329 }
330 if (rc != -ENODEV)
331 break;
332 if (i < AP_MAX_RESET - 1) {
333 udelay(5);
334 status = ap_test_queue(qid, &dummy, &dummy);
335 }
336 }
337 return rc;
338}
339
340/**
341 * AP device related attributes.
342 */
343static ssize_t ap_hwtype_show(struct device *dev,
344 struct device_attribute *attr, char *buf)
345{
346 struct ap_device *ap_dev = to_ap_dev(dev);
347 return snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->device_type);
348}
349static DEVICE_ATTR(hwtype, 0444, ap_hwtype_show, NULL);
350
351static ssize_t ap_depth_show(struct device *dev, struct device_attribute *attr,
352 char *buf)
353{
354 struct ap_device *ap_dev = to_ap_dev(dev);
355 return snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->queue_depth);
356}
357static DEVICE_ATTR(depth, 0444, ap_depth_show, NULL);
358
359static ssize_t ap_request_count_show(struct device *dev,
360 struct device_attribute *attr,
361 char *buf)
362{
363 struct ap_device *ap_dev = to_ap_dev(dev);
364 int rc;
365
366 spin_lock_bh(&ap_dev->lock);
367 rc = snprintf(buf, PAGE_SIZE, "%d\n", ap_dev->total_request_count);
368 spin_unlock_bh(&ap_dev->lock);
369 return rc;
370}
371
372static DEVICE_ATTR(request_count, 0444, ap_request_count_show, NULL);
373
374static ssize_t ap_modalias_show(struct device *dev,
375 struct device_attribute *attr, char *buf)
376{
377 return sprintf(buf, "ap:t%02X", to_ap_dev(dev)->device_type);
378}
379
380static DEVICE_ATTR(modalias, 0444, ap_modalias_show, NULL);
381
382static struct attribute *ap_dev_attrs[] = {
383 &dev_attr_hwtype.attr,
384 &dev_attr_depth.attr,
385 &dev_attr_request_count.attr,
386 &dev_attr_modalias.attr,
387 NULL
388};
389static struct attribute_group ap_dev_attr_group = {
390 .attrs = ap_dev_attrs
391};
392
393/**
394 * AP bus driver registration/unregistration.
395 */
396static int ap_bus_match(struct device *dev, struct device_driver *drv)
397{
398 struct ap_device *ap_dev = to_ap_dev(dev);
399 struct ap_driver *ap_drv = to_ap_drv(drv);
400 struct ap_device_id *id;
401
402 /**
403 * Compare device type of the device with the list of
404 * supported types of the device_driver.
405 */
406 for (id = ap_drv->ids; id->match_flags; id++) {
407 if ((id->match_flags & AP_DEVICE_ID_MATCH_DEVICE_TYPE) &&
408 (id->dev_type != ap_dev->device_type))
409 continue;
410 return 1;
411 }
412 return 0;
413}
414
415/**
416 * uevent function for AP devices. It sets up a single environment
417 * variable DEV_TYPE which contains the hardware device type.
418 */
419static int ap_uevent (struct device *dev, char **envp, int num_envp,
420 char *buffer, int buffer_size)
421{
422 struct ap_device *ap_dev = to_ap_dev(dev);
423 int length;
424
425 if (!ap_dev)
426 return -ENODEV;
427
428 /* Set up DEV_TYPE environment variable. */
429 envp[0] = buffer;
430 length = scnprintf(buffer, buffer_size, "DEV_TYPE=%04X",
431 ap_dev->device_type);
432 if (buffer_size - length <= 0)
433 return -ENOMEM;
Cornelia Huck66a4263b2006-12-04 15:40:10 +0100434 buffer += length;
435 buffer_size -= length;
436 /* Add MODALIAS= */
437 envp[1] = buffer;
438 length = scnprintf(buffer, buffer_size, "MODALIAS=ap:t%02X",
439 ap_dev->device_type);
440 if (buffer_size - length <= 0)
441 return -ENOMEM;
442 envp[2] = NULL;
Martin Schwidefsky1534c382006-09-20 15:58:25 +0200443 return 0;
444}
445
446static struct bus_type ap_bus_type = {
447 .name = "ap",
448 .match = &ap_bus_match,
449 .uevent = &ap_uevent,
450};
451
452static int ap_device_probe(struct device *dev)
453{
454 struct ap_device *ap_dev = to_ap_dev(dev);
455 struct ap_driver *ap_drv = to_ap_drv(dev->driver);
456 int rc;
457
458 ap_dev->drv = ap_drv;
459 rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
Martin Schwidefsky1534c382006-09-20 15:58:25 +0200460 return rc;
461}
462
463/**
464 * Flush all requests from the request/pending queue of an AP device.
465 * @ap_dev: pointer to the AP device.
466 */
467static inline void __ap_flush_queue(struct ap_device *ap_dev)
468{
469 struct ap_message *ap_msg, *next;
470
471 list_for_each_entry_safe(ap_msg, next, &ap_dev->pendingq, list) {
472 list_del_init(&ap_msg->list);
473 ap_dev->pendingq_count--;
474 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
475 }
476 list_for_each_entry_safe(ap_msg, next, &ap_dev->requestq, list) {
477 list_del_init(&ap_msg->list);
478 ap_dev->requestq_count--;
479 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
480 }
481}
482
483void ap_flush_queue(struct ap_device *ap_dev)
484{
485 spin_lock_bh(&ap_dev->lock);
486 __ap_flush_queue(ap_dev);
487 spin_unlock_bh(&ap_dev->lock);
488}
489EXPORT_SYMBOL(ap_flush_queue);
490
491static int ap_device_remove(struct device *dev)
492{
493 struct ap_device *ap_dev = to_ap_dev(dev);
494 struct ap_driver *ap_drv = ap_dev->drv;
495
Ralph Wuerthner4e562962006-10-04 20:02:05 +0200496 ap_flush_queue(ap_dev);
Martin Schwidefsky1534c382006-09-20 15:58:25 +0200497 if (ap_drv->remove)
498 ap_drv->remove(ap_dev);
499 return 0;
500}
501
502int ap_driver_register(struct ap_driver *ap_drv, struct module *owner,
503 char *name)
504{
505 struct device_driver *drv = &ap_drv->driver;
506
507 drv->bus = &ap_bus_type;
508 drv->probe = ap_device_probe;
509 drv->remove = ap_device_remove;
510 drv->owner = owner;
511 drv->name = name;
512 return driver_register(drv);
513}
514EXPORT_SYMBOL(ap_driver_register);
515
516void ap_driver_unregister(struct ap_driver *ap_drv)
517{
518 driver_unregister(&ap_drv->driver);
519}
520EXPORT_SYMBOL(ap_driver_unregister);
521
522/**
523 * AP bus attributes.
524 */
525static ssize_t ap_domain_show(struct bus_type *bus, char *buf)
526{
527 return snprintf(buf, PAGE_SIZE, "%d\n", ap_domain_index);
528}
529
530static BUS_ATTR(ap_domain, 0444, ap_domain_show, NULL);
531
532static ssize_t ap_config_time_show(struct bus_type *bus, char *buf)
533{
534 return snprintf(buf, PAGE_SIZE, "%d\n", ap_config_time);
535}
536
537static ssize_t ap_config_time_store(struct bus_type *bus,
538 const char *buf, size_t count)
539{
540 int time;
541
542 if (sscanf(buf, "%d\n", &time) != 1 || time < 5 || time > 120)
543 return -EINVAL;
544 ap_config_time = time;
545 if (!timer_pending(&ap_config_timer) ||
546 !mod_timer(&ap_config_timer, jiffies + ap_config_time * HZ)) {
547 ap_config_timer.expires = jiffies + ap_config_time * HZ;
548 add_timer(&ap_config_timer);
549 }
550 return count;
551}
552
553static BUS_ATTR(config_time, 0644, ap_config_time_show, ap_config_time_store);
554
555static ssize_t ap_poll_thread_show(struct bus_type *bus, char *buf)
556{
557 return snprintf(buf, PAGE_SIZE, "%d\n", ap_poll_kthread ? 1 : 0);
558}
559
560static ssize_t ap_poll_thread_store(struct bus_type *bus,
561 const char *buf, size_t count)
562{
563 int flag, rc;
564
565 if (sscanf(buf, "%d\n", &flag) != 1)
566 return -EINVAL;
567 if (flag) {
568 rc = ap_poll_thread_start();
569 if (rc)
570 return rc;
571 }
572 else
573 ap_poll_thread_stop();
574 return count;
575}
576
577static BUS_ATTR(poll_thread, 0644, ap_poll_thread_show, ap_poll_thread_store);
578
579static struct bus_attribute *const ap_bus_attrs[] = {
580 &bus_attr_ap_domain,
581 &bus_attr_config_time,
582 &bus_attr_poll_thread,
583 NULL
584};
585
586/**
587 * Pick one of the 16 ap domains.
588 */
589static inline int ap_select_domain(void)
590{
591 int queue_depth, device_type, count, max_count, best_domain;
592 int rc, i, j;
593
594 /**
595 * We want to use a single domain. Either the one specified with
596 * the "domain=" parameter or the domain with the maximum number
597 * of devices.
598 */
599 if (ap_domain_index >= 0 && ap_domain_index < AP_DOMAINS)
600 /* Domain has already been selected. */
601 return 0;
602 best_domain = -1;
603 max_count = 0;
604 for (i = 0; i < AP_DOMAINS; i++) {
605 count = 0;
606 for (j = 0; j < AP_DEVICES; j++) {
607 ap_qid_t qid = AP_MKQID(j, i);
608 rc = ap_query_queue(qid, &queue_depth, &device_type);
609 if (rc)
610 continue;
611 count++;
612 }
613 if (count > max_count) {
614 max_count = count;
615 best_domain = i;
616 }
617 }
618 if (best_domain >= 0){
619 ap_domain_index = best_domain;
620 return 0;
621 }
622 return -ENODEV;
623}
624
625/**
626 * Find the device type if query queue returned a device type of 0.
627 * @ap_dev: pointer to the AP device.
628 */
629static int ap_probe_device_type(struct ap_device *ap_dev)
630{
631 static unsigned char msg[] = {
632 0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
633 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
634 0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,
635 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
636 0x01,0x00,0x43,0x43,0x41,0x2d,0x41,0x50,
637 0x50,0x4c,0x20,0x20,0x20,0x01,0x01,0x01,
638 0x00,0x00,0x00,0x00,0x50,0x4b,0x00,0x00,
639 0x00,0x00,0x01,0x1c,0x00,0x00,0x00,0x00,
640 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
641 0x00,0x00,0x05,0xb8,0x00,0x00,0x00,0x00,
642 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
643 0x70,0x00,0x41,0x00,0x00,0x00,0x00,0x00,
644 0x00,0x00,0x54,0x32,0x01,0x00,0xa0,0x00,
645 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
646 0x00,0x00,0x00,0x00,0xb8,0x05,0x00,0x00,
647 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
648 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
649 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
650 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
651 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
652 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
653 0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,
654 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
655 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
656 0x49,0x43,0x53,0x46,0x20,0x20,0x20,0x20,
657 0x50,0x4b,0x0a,0x00,0x50,0x4b,0x43,0x53,
658 0x2d,0x31,0x2e,0x32,0x37,0x00,0x11,0x22,
659 0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,
660 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
661 0x99,0x00,0x11,0x22,0x33,0x44,0x55,0x66,
662 0x77,0x88,0x99,0x00,0x11,0x22,0x33,0x44,
663 0x55,0x66,0x77,0x88,0x99,0x00,0x11,0x22,
664 0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,
665 0x11,0x22,0x33,0x5d,0x00,0x5b,0x00,0x77,
666 0x88,0x1e,0x00,0x00,0x57,0x00,0x00,0x00,
667 0x00,0x04,0x00,0x00,0x4f,0x00,0x00,0x00,
668 0x03,0x02,0x00,0x00,0x40,0x01,0x00,0x01,
669 0xce,0x02,0x68,0x2d,0x5f,0xa9,0xde,0x0c,
670 0xf6,0xd2,0x7b,0x58,0x4b,0xf9,0x28,0x68,
671 0x3d,0xb4,0xf4,0xef,0x78,0xd5,0xbe,0x66,
672 0x63,0x42,0xef,0xf8,0xfd,0xa4,0xf8,0xb0,
673 0x8e,0x29,0xc2,0xc9,0x2e,0xd8,0x45,0xb8,
674 0x53,0x8c,0x6f,0x4e,0x72,0x8f,0x6c,0x04,
675 0x9c,0x88,0xfc,0x1e,0xc5,0x83,0x55,0x57,
676 0xf7,0xdd,0xfd,0x4f,0x11,0x36,0x95,0x5d,
677 };
678 struct ap_queue_status status;
679 unsigned long long psmid;
680 char *reply;
681 int rc, i;
682
683 reply = (void *) get_zeroed_page(GFP_KERNEL);
684 if (!reply) {
685 rc = -ENOMEM;
686 goto out;
687 }
688
689 status = __ap_send(ap_dev->qid, 0x0102030405060708ULL,
690 msg, sizeof(msg));
691 if (status.response_code != AP_RESPONSE_NORMAL) {
692 rc = -ENODEV;
693 goto out_free;
694 }
695
696 /* Wait for the test message to complete. */
697 for (i = 0; i < 6; i++) {
698 mdelay(300);
699 status = __ap_recv(ap_dev->qid, &psmid, reply, 4096);
700 if (status.response_code == AP_RESPONSE_NORMAL &&
701 psmid == 0x0102030405060708ULL)
702 break;
703 }
704 if (i < 6) {
705 /* Got an answer. */
706 if (reply[0] == 0x00 && reply[1] == 0x86)
707 ap_dev->device_type = AP_DEVICE_TYPE_PCICC;
708 else
709 ap_dev->device_type = AP_DEVICE_TYPE_PCICA;
710 rc = 0;
711 } else
712 rc = -ENODEV;
713
714out_free:
715 free_page((unsigned long) reply);
716out:
717 return rc;
718}
719
720/**
721 * Scan the ap bus for new devices.
722 */
723static int __ap_scan_bus(struct device *dev, void *data)
724{
725 return to_ap_dev(dev)->qid == (ap_qid_t)(unsigned long) data;
726}
727
728static void ap_device_release(struct device *dev)
729{
730 struct ap_device *ap_dev = to_ap_dev(dev);
731
732 kfree(ap_dev);
733}
734
Al Viro4927b3f2006-12-06 19:18:20 +0000735static void ap_scan_bus(struct work_struct *unused)
Martin Schwidefsky1534c382006-09-20 15:58:25 +0200736{
737 struct ap_device *ap_dev;
738 struct device *dev;
739 ap_qid_t qid;
740 int queue_depth, device_type;
741 int rc, i;
742
743 if (ap_select_domain() != 0)
744 return;
745 for (i = 0; i < AP_DEVICES; i++) {
746 qid = AP_MKQID(i, ap_domain_index);
747 dev = bus_find_device(&ap_bus_type, NULL,
748 (void *)(unsigned long)qid,
749 __ap_scan_bus);
Ralph Wuerthnerf3b017d2006-10-27 12:39:26 +0200750 rc = ap_query_queue(qid, &queue_depth, &device_type);
751 if (dev && rc) {
752 put_device(dev);
753 device_unregister(dev);
754 continue;
755 }
Martin Schwidefsky1534c382006-09-20 15:58:25 +0200756 if (dev) {
757 put_device(dev);
758 continue;
759 }
Martin Schwidefsky1534c382006-09-20 15:58:25 +0200760 if (rc)
761 continue;
762 rc = ap_init_queue(qid);
763 if (rc)
764 continue;
765 ap_dev = kzalloc(sizeof(*ap_dev), GFP_KERNEL);
766 if (!ap_dev)
767 break;
768 ap_dev->qid = qid;
769 ap_dev->queue_depth = queue_depth;
Ralph Wuerthner4e562962006-10-04 20:02:05 +0200770 ap_dev->unregistered = 1;
Martin Schwidefsky1534c382006-09-20 15:58:25 +0200771 spin_lock_init(&ap_dev->lock);
772 INIT_LIST_HEAD(&ap_dev->pendingq);
773 INIT_LIST_HEAD(&ap_dev->requestq);
774 if (device_type == 0)
775 ap_probe_device_type(ap_dev);
776 else
777 ap_dev->device_type = device_type;
778
779 ap_dev->device.bus = &ap_bus_type;
780 ap_dev->device.parent = ap_root_device;
781 snprintf(ap_dev->device.bus_id, BUS_ID_SIZE, "card%02x",
782 AP_QID_DEVICE(ap_dev->qid));
783 ap_dev->device.release = ap_device_release;
784 rc = device_register(&ap_dev->device);
785 if (rc) {
786 kfree(ap_dev);
787 continue;
788 }
789 /* Add device attributes. */
790 rc = sysfs_create_group(&ap_dev->device.kobj,
791 &ap_dev_attr_group);
Ralph Wuerthner4e562962006-10-04 20:02:05 +0200792 if (!rc) {
793 spin_lock_bh(&ap_dev->lock);
794 ap_dev->unregistered = 0;
795 spin_unlock_bh(&ap_dev->lock);
796 }
797 else
Martin Schwidefsky1534c382006-09-20 15:58:25 +0200798 device_unregister(&ap_dev->device);
799 }
800}
801
802static void
803ap_config_timeout(unsigned long ptr)
804{
805 queue_work(ap_work_queue, &ap_config_work);
806 ap_config_timer.expires = jiffies + ap_config_time * HZ;
807 add_timer(&ap_config_timer);
808}
809
810/**
811 * Set up the timer to run the poll tasklet
812 */
813static inline void ap_schedule_poll_timer(void)
814{
815 if (timer_pending(&ap_poll_timer))
816 return;
817 mod_timer(&ap_poll_timer, jiffies + AP_POLL_TIME);
818}
819
820/**
821 * Receive pending reply messages from an AP device.
822 * @ap_dev: pointer to the AP device
823 * @flags: pointer to control flags, bit 2^0 is set if another poll is
824 * required, bit 2^1 is set if the poll timer needs to get armed
825 * Returns 0 if the device is still present, -ENODEV if not.
826 */
827static inline int ap_poll_read(struct ap_device *ap_dev, unsigned long *flags)
828{
829 struct ap_queue_status status;
830 struct ap_message *ap_msg;
831
832 if (ap_dev->queue_count <= 0)
833 return 0;
834 status = __ap_recv(ap_dev->qid, &ap_dev->reply->psmid,
835 ap_dev->reply->message, ap_dev->reply->length);
836 switch (status.response_code) {
837 case AP_RESPONSE_NORMAL:
838 atomic_dec(&ap_poll_requests);
839 ap_dev->queue_count--;
840 list_for_each_entry(ap_msg, &ap_dev->pendingq, list) {
841 if (ap_msg->psmid != ap_dev->reply->psmid)
842 continue;
843 list_del_init(&ap_msg->list);
844 ap_dev->pendingq_count--;
845 ap_dev->drv->receive(ap_dev, ap_msg, ap_dev->reply);
846 break;
847 }
848 if (ap_dev->queue_count > 0)
849 *flags |= 1;
850 break;
851 case AP_RESPONSE_NO_PENDING_REPLY:
852 if (status.queue_empty) {
853 /* The card shouldn't forget requests but who knows. */
854 ap_dev->queue_count = 0;
855 list_splice_init(&ap_dev->pendingq, &ap_dev->requestq);
856 ap_dev->requestq_count += ap_dev->pendingq_count;
857 ap_dev->pendingq_count = 0;
858 } else
859 *flags |= 2;
860 break;
861 default:
862 return -ENODEV;
863 }
864 return 0;
865}
866
867/**
868 * Send messages from the request queue to an AP device.
869 * @ap_dev: pointer to the AP device
870 * @flags: pointer to control flags, bit 2^0 is set if another poll is
871 * required, bit 2^1 is set if the poll timer needs to get armed
872 * Returns 0 if the device is still present, -ENODEV if not.
873 */
874static inline int ap_poll_write(struct ap_device *ap_dev, unsigned long *flags)
875{
876 struct ap_queue_status status;
877 struct ap_message *ap_msg;
878
879 if (ap_dev->requestq_count <= 0 ||
880 ap_dev->queue_count >= ap_dev->queue_depth)
881 return 0;
882 /* Start the next request on the queue. */
883 ap_msg = list_entry(ap_dev->requestq.next, struct ap_message, list);
884 status = __ap_send(ap_dev->qid, ap_msg->psmid,
885 ap_msg->message, ap_msg->length);
886 switch (status.response_code) {
887 case AP_RESPONSE_NORMAL:
888 atomic_inc(&ap_poll_requests);
889 ap_dev->queue_count++;
890 list_move_tail(&ap_msg->list, &ap_dev->pendingq);
891 ap_dev->requestq_count--;
892 ap_dev->pendingq_count++;
893 if (ap_dev->queue_count < ap_dev->queue_depth &&
894 ap_dev->requestq_count > 0)
895 *flags |= 1;
896 *flags |= 2;
897 break;
898 case AP_RESPONSE_Q_FULL:
899 *flags |= 2;
900 break;
901 case AP_RESPONSE_MESSAGE_TOO_BIG:
902 return -EINVAL;
903 default:
904 return -ENODEV;
905 }
906 return 0;
907}
908
909/**
910 * Poll AP device for pending replies and send new messages. If either
911 * ap_poll_read or ap_poll_write returns -ENODEV unregister the device.
912 * @ap_dev: pointer to the bus device
913 * @flags: pointer to control flags, bit 2^0 is set if another poll is
914 * required, bit 2^1 is set if the poll timer needs to get armed
915 * Returns 0.
916 */
917static inline int ap_poll_queue(struct ap_device *ap_dev, unsigned long *flags)
918{
919 int rc;
920
921 rc = ap_poll_read(ap_dev, flags);
922 if (rc)
923 return rc;
924 return ap_poll_write(ap_dev, flags);
925}
926
927/**
928 * Queue a message to a device.
929 * @ap_dev: pointer to the AP device
930 * @ap_msg: the message to be queued
931 */
932static int __ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg)
933{
934 struct ap_queue_status status;
935
936 if (list_empty(&ap_dev->requestq) &&
937 ap_dev->queue_count < ap_dev->queue_depth) {
938 status = __ap_send(ap_dev->qid, ap_msg->psmid,
939 ap_msg->message, ap_msg->length);
940 switch (status.response_code) {
941 case AP_RESPONSE_NORMAL:
942 list_add_tail(&ap_msg->list, &ap_dev->pendingq);
943 atomic_inc(&ap_poll_requests);
944 ap_dev->pendingq_count++;
945 ap_dev->queue_count++;
946 ap_dev->total_request_count++;
947 break;
948 case AP_RESPONSE_Q_FULL:
949 list_add_tail(&ap_msg->list, &ap_dev->requestq);
950 ap_dev->requestq_count++;
951 ap_dev->total_request_count++;
952 return -EBUSY;
953 case AP_RESPONSE_MESSAGE_TOO_BIG:
954 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-EINVAL));
955 return -EINVAL;
956 default: /* Device is gone. */
957 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
958 return -ENODEV;
959 }
960 } else {
961 list_add_tail(&ap_msg->list, &ap_dev->requestq);
962 ap_dev->requestq_count++;
963 ap_dev->total_request_count++;
964 return -EBUSY;
965 }
966 ap_schedule_poll_timer();
967 return 0;
968}
969
970void ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg)
971{
972 unsigned long flags;
973 int rc;
974
975 spin_lock_bh(&ap_dev->lock);
976 if (!ap_dev->unregistered) {
977 /* Make room on the queue by polling for finished requests. */
978 rc = ap_poll_queue(ap_dev, &flags);
979 if (!rc)
980 rc = __ap_queue_message(ap_dev, ap_msg);
981 if (!rc)
982 wake_up(&ap_poll_wait);
Ralph Wuerthner4e562962006-10-04 20:02:05 +0200983 if (rc == -ENODEV)
984 ap_dev->unregistered = 1;
Martin Schwidefsky1534c382006-09-20 15:58:25 +0200985 } else {
986 ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
987 rc = 0;
988 }
989 spin_unlock_bh(&ap_dev->lock);
990 if (rc == -ENODEV)
991 device_unregister(&ap_dev->device);
992}
993EXPORT_SYMBOL(ap_queue_message);
994
995/**
996 * Cancel a crypto request. This is done by removing the request
997 * from the devive pendingq or requestq queue. Note that the
998 * request stays on the AP queue. When it finishes the message
999 * reply will be discarded because the psmid can't be found.
1000 * @ap_dev: AP device that has the message queued
1001 * @ap_msg: the message that is to be removed
1002 */
1003void ap_cancel_message(struct ap_device *ap_dev, struct ap_message *ap_msg)
1004{
1005 struct ap_message *tmp;
1006
1007 spin_lock_bh(&ap_dev->lock);
1008 if (!list_empty(&ap_msg->list)) {
1009 list_for_each_entry(tmp, &ap_dev->pendingq, list)
1010 if (tmp->psmid == ap_msg->psmid) {
1011 ap_dev->pendingq_count--;
1012 goto found;
1013 }
1014 ap_dev->requestq_count--;
1015 found:
1016 list_del_init(&ap_msg->list);
1017 }
1018 spin_unlock_bh(&ap_dev->lock);
1019}
1020EXPORT_SYMBOL(ap_cancel_message);
1021
1022/**
1023 * AP receive polling for finished AP requests
1024 */
1025static void ap_poll_timeout(unsigned long unused)
1026{
1027 tasklet_schedule(&ap_tasklet);
1028}
1029
1030/**
1031 * Poll all AP devices on the bus in a round robin fashion. Continue
1032 * polling until bit 2^0 of the control flags is not set. If bit 2^1
1033 * of the control flags has been set arm the poll timer.
1034 */
1035static int __ap_poll_all(struct device *dev, void *data)
1036{
1037 struct ap_device *ap_dev = to_ap_dev(dev);
1038 int rc;
1039
1040 spin_lock(&ap_dev->lock);
1041 if (!ap_dev->unregistered) {
1042 rc = ap_poll_queue(to_ap_dev(dev), (unsigned long *) data);
Ralph Wuerthner4e562962006-10-04 20:02:05 +02001043 if (rc)
1044 ap_dev->unregistered = 1;
Martin Schwidefsky1534c382006-09-20 15:58:25 +02001045 } else
1046 rc = 0;
1047 spin_unlock(&ap_dev->lock);
1048 if (rc)
1049 device_unregister(&ap_dev->device);
1050 return 0;
1051}
1052
1053static void ap_poll_all(unsigned long dummy)
1054{
1055 unsigned long flags;
1056
1057 do {
1058 flags = 0;
1059 bus_for_each_dev(&ap_bus_type, NULL, &flags, __ap_poll_all);
1060 } while (flags & 1);
1061 if (flags & 2)
1062 ap_schedule_poll_timer();
1063}
1064
1065/**
1066 * AP bus poll thread. The purpose of this thread is to poll for
1067 * finished requests in a loop if there is a "free" cpu - that is
1068 * a cpu that doesn't have anything better to do. The polling stops
1069 * as soon as there is another task or if all messages have been
1070 * delivered.
1071 */
1072static int ap_poll_thread(void *data)
1073{
1074 DECLARE_WAITQUEUE(wait, current);
1075 unsigned long flags;
1076 int requests;
1077
Christian Borntraegerd83682b2006-10-06 16:38:22 +02001078 set_user_nice(current, 19);
Martin Schwidefsky1534c382006-09-20 15:58:25 +02001079 while (1) {
1080 if (need_resched()) {
1081 schedule();
1082 continue;
1083 }
1084 add_wait_queue(&ap_poll_wait, &wait);
1085 set_current_state(TASK_INTERRUPTIBLE);
1086 if (kthread_should_stop())
1087 break;
1088 requests = atomic_read(&ap_poll_requests);
1089 if (requests <= 0)
1090 schedule();
1091 set_current_state(TASK_RUNNING);
1092 remove_wait_queue(&ap_poll_wait, &wait);
1093
1094 local_bh_disable();
1095 flags = 0;
1096 bus_for_each_dev(&ap_bus_type, NULL, &flags, __ap_poll_all);
1097 local_bh_enable();
1098 }
1099 set_current_state(TASK_RUNNING);
1100 remove_wait_queue(&ap_poll_wait, &wait);
1101 return 0;
1102}
1103
1104static int ap_poll_thread_start(void)
1105{
1106 int rc;
1107
1108 mutex_lock(&ap_poll_thread_mutex);
1109 if (!ap_poll_kthread) {
1110 ap_poll_kthread = kthread_run(ap_poll_thread, NULL, "appoll");
1111 rc = IS_ERR(ap_poll_kthread) ? PTR_ERR(ap_poll_kthread) : 0;
1112 if (rc)
1113 ap_poll_kthread = NULL;
1114 }
1115 else
1116 rc = 0;
1117 mutex_unlock(&ap_poll_thread_mutex);
1118 return rc;
1119}
1120
1121static void ap_poll_thread_stop(void)
1122{
1123 mutex_lock(&ap_poll_thread_mutex);
1124 if (ap_poll_kthread) {
1125 kthread_stop(ap_poll_kthread);
1126 ap_poll_kthread = NULL;
1127 }
1128 mutex_unlock(&ap_poll_thread_mutex);
1129}
1130
1131/**
1132 * The module initialization code.
1133 */
1134int __init ap_module_init(void)
1135{
1136 int rc, i;
1137
1138 if (ap_domain_index < -1 || ap_domain_index >= AP_DOMAINS) {
1139 printk(KERN_WARNING "Invalid param: domain = %d. "
1140 " Not loading.\n", ap_domain_index);
1141 return -EINVAL;
1142 }
1143 if (ap_instructions_available() != 0) {
1144 printk(KERN_WARNING "AP instructions not installed.\n");
1145 return -ENODEV;
1146 }
1147
1148 /* Create /sys/bus/ap. */
1149 rc = bus_register(&ap_bus_type);
1150 if (rc)
1151 goto out;
1152 for (i = 0; ap_bus_attrs[i]; i++) {
1153 rc = bus_create_file(&ap_bus_type, ap_bus_attrs[i]);
1154 if (rc)
1155 goto out_bus;
1156 }
1157
1158 /* Create /sys/devices/ap. */
1159 ap_root_device = s390_root_dev_register("ap");
1160 rc = IS_ERR(ap_root_device) ? PTR_ERR(ap_root_device) : 0;
1161 if (rc)
1162 goto out_bus;
1163
1164 ap_work_queue = create_singlethread_workqueue("kapwork");
1165 if (!ap_work_queue) {
1166 rc = -ENOMEM;
1167 goto out_root;
1168 }
1169
1170 if (ap_select_domain() == 0)
1171 ap_scan_bus(NULL);
1172
1173 /* Setup the ap bus rescan timer. */
1174 init_timer(&ap_config_timer);
1175 ap_config_timer.function = ap_config_timeout;
1176 ap_config_timer.data = 0;
1177 ap_config_timer.expires = jiffies + ap_config_time * HZ;
1178 add_timer(&ap_config_timer);
1179
1180 /* Start the low priority AP bus poll thread. */
1181 if (ap_thread_flag) {
1182 rc = ap_poll_thread_start();
1183 if (rc)
1184 goto out_work;
1185 }
1186
1187 return 0;
1188
1189out_work:
1190 del_timer_sync(&ap_config_timer);
1191 del_timer_sync(&ap_poll_timer);
1192 destroy_workqueue(ap_work_queue);
1193out_root:
1194 s390_root_dev_unregister(ap_root_device);
1195out_bus:
1196 while (i--)
1197 bus_remove_file(&ap_bus_type, ap_bus_attrs[i]);
1198 bus_unregister(&ap_bus_type);
1199out:
1200 return rc;
1201}
1202
1203static int __ap_match_all(struct device *dev, void *data)
1204{
1205 return 1;
1206}
1207
1208/**
1209 * The module termination code
1210 */
1211void ap_module_exit(void)
1212{
1213 int i;
1214 struct device *dev;
1215
1216 ap_poll_thread_stop();
1217 del_timer_sync(&ap_config_timer);
1218 del_timer_sync(&ap_poll_timer);
1219 destroy_workqueue(ap_work_queue);
1220 s390_root_dev_unregister(ap_root_device);
1221 while ((dev = bus_find_device(&ap_bus_type, NULL, NULL,
1222 __ap_match_all)))
1223 {
1224 device_unregister(dev);
1225 put_device(dev);
1226 }
1227 for (i = 0; ap_bus_attrs[i]; i++)
1228 bus_remove_file(&ap_bus_type, ap_bus_attrs[i]);
1229 bus_unregister(&ap_bus_type);
1230}
1231
1232#ifndef CONFIG_ZCRYPT_MONOLITHIC
1233module_init(ap_module_init);
1234module_exit(ap_module_exit);
1235#endif