drm/amdgpu: add uvd enc vm functions (v2)
[muen/linux.git] / drivers / ps3 / ps3-vuart.c
1 /*
2  *  PS3 virtual uart
3  *
4  *  Copyright (C) 2006 Sony Computer Entertainment Inc.
5  *  Copyright 2006 Sony Corp.
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; version 2 of the License.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include <linux/kernel.h>
22 #include <linux/slab.h>
23 #include <linux/module.h>
24 #include <linux/interrupt.h>
25 #include <linux/workqueue.h>
26 #include <linux/bitops.h>
27 #include <asm/ps3.h>
28
29 #include <asm/firmware.h>
30 #include <asm/lv1call.h>
31
32 #include "vuart.h"
33
34 MODULE_AUTHOR("Sony Corporation");
35 MODULE_LICENSE("GPL v2");
36 MODULE_DESCRIPTION("PS3 vuart");
37
38 /**
39  * vuart - An inter-partition data link service.
40  *  port 0: PS3 AV Settings.
41  *  port 2: PS3 System Manager.
42  *
43  * The vuart provides a bi-directional byte stream data link between logical
44  * partitions.  Its primary role is as a communications link between the guest
45  * OS and the system policy module.  The current HV does not support any
46  * connections other than those listed.
47  */
48
49 enum {PORT_COUNT = 3,};
50
51 enum vuart_param {
52         PARAM_TX_TRIGGER = 0,
53         PARAM_RX_TRIGGER = 1,
54         PARAM_INTERRUPT_MASK = 2,
55         PARAM_RX_BUF_SIZE = 3, /* read only */
56         PARAM_RX_BYTES = 4, /* read only */
57         PARAM_TX_BUF_SIZE = 5, /* read only */
58         PARAM_TX_BYTES = 6, /* read only */
59         PARAM_INTERRUPT_STATUS = 7, /* read only */
60 };
61
62 enum vuart_interrupt_bit {
63         INTERRUPT_BIT_TX = 0,
64         INTERRUPT_BIT_RX = 1,
65         INTERRUPT_BIT_DISCONNECT = 2,
66 };
67
68 enum vuart_interrupt_mask {
69         INTERRUPT_MASK_TX = 1,
70         INTERRUPT_MASK_RX = 2,
71         INTERRUPT_MASK_DISCONNECT = 4,
72 };
73
74 /**
75  * struct ps3_vuart_port_priv - private vuart device data.
76  */
77
78 struct ps3_vuart_port_priv {
79         u64 interrupt_mask;
80
81         struct {
82                 spinlock_t lock;
83                 struct list_head head;
84         } tx_list;
85         struct {
86                 struct ps3_vuart_work work;
87                 unsigned long bytes_held;
88                 spinlock_t lock;
89                 struct list_head head;
90         } rx_list;
91         struct ps3_vuart_stats stats;
92 };
93
94 static struct ps3_vuart_port_priv *to_port_priv(
95         struct ps3_system_bus_device *dev)
96 {
97         BUG_ON(!dev);
98         BUG_ON(!dev->driver_priv);
99         return (struct ps3_vuart_port_priv *)dev->driver_priv;
100 }
101
102 /**
103  * struct ports_bmp - bitmap indicating ports needing service.
104  *
105  * A 256 bit read only bitmap indicating ports needing service.  Do not write
106  * to these bits.  Must not cross a page boundary.
107  */
108
109 struct ports_bmp {
110         u64 status;
111         u64 unused[3];
112 } __attribute__((aligned(32)));
113
114 #define dump_ports_bmp(_b) _dump_ports_bmp(_b, __func__, __LINE__)
115 static void __maybe_unused _dump_ports_bmp(
116         const struct ports_bmp *bmp, const char *func, int line)
117 {
118         pr_debug("%s:%d: ports_bmp: %016llxh\n", func, line, bmp->status);
119 }
120
121 #define dump_port_params(_b) _dump_port_params(_b, __func__, __LINE__)
122 static void __maybe_unused _dump_port_params(unsigned int port_number,
123         const char *func, int line)
124 {
125 #if defined(DEBUG)
126         static const char *strings[] = {
127                 "tx_trigger      ",
128                 "rx_trigger      ",
129                 "interrupt_mask  ",
130                 "rx_buf_size     ",
131                 "rx_bytes        ",
132                 "tx_buf_size     ",
133                 "tx_bytes        ",
134                 "interrupt_status",
135         };
136         int result;
137         unsigned int i;
138         u64 value;
139
140         for (i = 0; i < ARRAY_SIZE(strings); i++) {
141                 result = lv1_get_virtual_uart_param(port_number, i, &value);
142
143                 if (result) {
144                         pr_debug("%s:%d: port_%u: %s failed: %s\n", func, line,
145                                 port_number, strings[i], ps3_result(result));
146                         continue;
147                 }
148                 pr_debug("%s:%d: port_%u: %s = %lxh\n",
149                         func, line, port_number, strings[i], value);
150         }
151 #endif
152 }
153
154 int ps3_vuart_get_triggers(struct ps3_system_bus_device *dev,
155         struct vuart_triggers *trig)
156 {
157         int result;
158         u64 size;
159         u64 val;
160         u64 tx;
161
162         result = lv1_get_virtual_uart_param(dev->port_number,
163                 PARAM_TX_TRIGGER, &tx);
164         trig->tx = tx;
165
166         if (result) {
167                 dev_dbg(&dev->core, "%s:%d: tx_trigger failed: %s\n",
168                         __func__, __LINE__, ps3_result(result));
169                 return result;
170         }
171
172         result = lv1_get_virtual_uart_param(dev->port_number,
173                 PARAM_RX_BUF_SIZE, &size);
174
175         if (result) {
176                 dev_dbg(&dev->core, "%s:%d: tx_buf_size failed: %s\n",
177                         __func__, __LINE__, ps3_result(result));
178                 return result;
179         }
180
181         result = lv1_get_virtual_uart_param(dev->port_number,
182                 PARAM_RX_TRIGGER, &val);
183
184         if (result) {
185                 dev_dbg(&dev->core, "%s:%d: rx_trigger failed: %s\n",
186                         __func__, __LINE__, ps3_result(result));
187                 return result;
188         }
189
190         trig->rx = size - val;
191
192         dev_dbg(&dev->core, "%s:%d: tx %lxh, rx %lxh\n", __func__, __LINE__,
193                 trig->tx, trig->rx);
194
195         return result;
196 }
197
198 int ps3_vuart_set_triggers(struct ps3_system_bus_device *dev, unsigned int tx,
199         unsigned int rx)
200 {
201         int result;
202         u64 size;
203
204         result = lv1_set_virtual_uart_param(dev->port_number,
205                 PARAM_TX_TRIGGER, tx);
206
207         if (result) {
208                 dev_dbg(&dev->core, "%s:%d: tx_trigger failed: %s\n",
209                         __func__, __LINE__, ps3_result(result));
210                 return result;
211         }
212
213         result = lv1_get_virtual_uart_param(dev->port_number,
214                 PARAM_RX_BUF_SIZE, &size);
215
216         if (result) {
217                 dev_dbg(&dev->core, "%s:%d: tx_buf_size failed: %s\n",
218                         __func__, __LINE__, ps3_result(result));
219                 return result;
220         }
221
222         result = lv1_set_virtual_uart_param(dev->port_number,
223                 PARAM_RX_TRIGGER, size - rx);
224
225         if (result) {
226                 dev_dbg(&dev->core, "%s:%d: rx_trigger failed: %s\n",
227                         __func__, __LINE__, ps3_result(result));
228                 return result;
229         }
230
231         dev_dbg(&dev->core, "%s:%d: tx %xh, rx %xh\n", __func__, __LINE__,
232                 tx, rx);
233
234         return result;
235 }
236
237 static int ps3_vuart_get_rx_bytes_waiting(struct ps3_system_bus_device *dev,
238         u64 *bytes_waiting)
239 {
240         int result;
241
242         result = lv1_get_virtual_uart_param(dev->port_number,
243                 PARAM_RX_BYTES, bytes_waiting);
244
245         if (result)
246                 dev_dbg(&dev->core, "%s:%d: rx_bytes failed: %s\n",
247                         __func__, __LINE__, ps3_result(result));
248
249         dev_dbg(&dev->core, "%s:%d: %llxh\n", __func__, __LINE__,
250                 *bytes_waiting);
251         return result;
252 }
253
254 /**
255  * ps3_vuart_set_interrupt_mask - Enable/disable the port interrupt sources.
256  * @dev: The struct ps3_system_bus_device instance.
257  * @bmp: Logical OR of enum vuart_interrupt_mask values. A zero bit disables.
258  */
259
260 static int ps3_vuart_set_interrupt_mask(struct ps3_system_bus_device *dev,
261         unsigned long mask)
262 {
263         int result;
264         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
265
266         dev_dbg(&dev->core, "%s:%d: %lxh\n", __func__, __LINE__, mask);
267
268         priv->interrupt_mask = mask;
269
270         result = lv1_set_virtual_uart_param(dev->port_number,
271                 PARAM_INTERRUPT_MASK, priv->interrupt_mask);
272
273         if (result)
274                 dev_dbg(&dev->core, "%s:%d: interrupt_mask failed: %s\n",
275                         __func__, __LINE__, ps3_result(result));
276
277         return result;
278 }
279
280 static int ps3_vuart_get_interrupt_status(struct ps3_system_bus_device *dev,
281         unsigned long *status)
282 {
283         int result;
284         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
285         u64 tmp;
286
287         result = lv1_get_virtual_uart_param(dev->port_number,
288                 PARAM_INTERRUPT_STATUS, &tmp);
289
290         if (result)
291                 dev_dbg(&dev->core, "%s:%d: interrupt_status failed: %s\n",
292                         __func__, __LINE__, ps3_result(result));
293
294         *status = tmp & priv->interrupt_mask;
295
296         dev_dbg(&dev->core, "%s:%d: m %llxh, s %llxh, m&s %lxh\n",
297                 __func__, __LINE__, priv->interrupt_mask, tmp, *status);
298
299         return result;
300 }
301
302 int ps3_vuart_enable_interrupt_tx(struct ps3_system_bus_device *dev)
303 {
304         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
305
306         return (priv->interrupt_mask & INTERRUPT_MASK_TX) ? 0
307                 : ps3_vuart_set_interrupt_mask(dev, priv->interrupt_mask
308                 | INTERRUPT_MASK_TX);
309 }
310
311 int ps3_vuart_enable_interrupt_rx(struct ps3_system_bus_device *dev)
312 {
313         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
314
315         return (priv->interrupt_mask & INTERRUPT_MASK_RX) ? 0
316                 : ps3_vuart_set_interrupt_mask(dev, priv->interrupt_mask
317                 | INTERRUPT_MASK_RX);
318 }
319
320 int ps3_vuart_enable_interrupt_disconnect(struct ps3_system_bus_device *dev)
321 {
322         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
323
324         return (priv->interrupt_mask & INTERRUPT_MASK_DISCONNECT) ? 0
325                 : ps3_vuart_set_interrupt_mask(dev, priv->interrupt_mask
326                 | INTERRUPT_MASK_DISCONNECT);
327 }
328
329 int ps3_vuart_disable_interrupt_tx(struct ps3_system_bus_device *dev)
330 {
331         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
332
333         return (priv->interrupt_mask & INTERRUPT_MASK_TX)
334                 ? ps3_vuart_set_interrupt_mask(dev, priv->interrupt_mask
335                 & ~INTERRUPT_MASK_TX) : 0;
336 }
337
338 int ps3_vuart_disable_interrupt_rx(struct ps3_system_bus_device *dev)
339 {
340         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
341
342         return (priv->interrupt_mask & INTERRUPT_MASK_RX)
343                 ? ps3_vuart_set_interrupt_mask(dev, priv->interrupt_mask
344                 & ~INTERRUPT_MASK_RX) : 0;
345 }
346
347 int ps3_vuart_disable_interrupt_disconnect(struct ps3_system_bus_device *dev)
348 {
349         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
350
351         return (priv->interrupt_mask & INTERRUPT_MASK_DISCONNECT)
352                 ? ps3_vuart_set_interrupt_mask(dev, priv->interrupt_mask
353                 & ~INTERRUPT_MASK_DISCONNECT) : 0;
354 }
355
356 /**
357  * ps3_vuart_raw_write - Low level write helper.
358  * @dev: The struct ps3_system_bus_device instance.
359  *
360  * Do not call ps3_vuart_raw_write directly, use ps3_vuart_write.
361  */
362
363 static int ps3_vuart_raw_write(struct ps3_system_bus_device *dev,
364         const void *buf, unsigned int bytes, u64 *bytes_written)
365 {
366         int result;
367         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
368
369         result = lv1_write_virtual_uart(dev->port_number,
370                 ps3_mm_phys_to_lpar(__pa(buf)), bytes, bytes_written);
371
372         if (result) {
373                 dev_dbg(&dev->core, "%s:%d: lv1_write_virtual_uart failed: "
374                         "%s\n", __func__, __LINE__, ps3_result(result));
375                 return result;
376         }
377
378         priv->stats.bytes_written += *bytes_written;
379
380         dev_dbg(&dev->core, "%s:%d: wrote %llxh/%xh=>%lxh\n", __func__, __LINE__,
381                 *bytes_written, bytes, priv->stats.bytes_written);
382
383         return result;
384 }
385
386 /**
387  * ps3_vuart_raw_read - Low level read helper.
388  * @dev: The struct ps3_system_bus_device instance.
389  *
390  * Do not call ps3_vuart_raw_read directly, use ps3_vuart_read.
391  */
392
393 static int ps3_vuart_raw_read(struct ps3_system_bus_device *dev, void *buf,
394         unsigned int bytes, u64 *bytes_read)
395 {
396         int result;
397         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
398
399         dev_dbg(&dev->core, "%s:%d: %xh\n", __func__, __LINE__, bytes);
400
401         result = lv1_read_virtual_uart(dev->port_number,
402                 ps3_mm_phys_to_lpar(__pa(buf)), bytes, bytes_read);
403
404         if (result) {
405                 dev_dbg(&dev->core, "%s:%d: lv1_read_virtual_uart failed: %s\n",
406                         __func__, __LINE__, ps3_result(result));
407                 return result;
408         }
409
410         priv->stats.bytes_read += *bytes_read;
411
412         dev_dbg(&dev->core, "%s:%d: read %llxh/%xh=>%lxh\n", __func__, __LINE__,
413                 *bytes_read, bytes, priv->stats.bytes_read);
414
415         return result;
416 }
417
418 /**
419  * ps3_vuart_clear_rx_bytes - Discard bytes received.
420  * @dev: The struct ps3_system_bus_device instance.
421  * @bytes: Max byte count to discard, zero = all pending.
422  *
423  * Used to clear pending rx interrupt source.  Will not block.
424  */
425
426 void ps3_vuart_clear_rx_bytes(struct ps3_system_bus_device *dev,
427         unsigned int bytes)
428 {
429         int result;
430         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
431         u64 bytes_waiting;
432         void *tmp;
433
434         result = ps3_vuart_get_rx_bytes_waiting(dev, &bytes_waiting);
435
436         BUG_ON(result);
437
438         bytes = bytes ? min(bytes, (unsigned int)bytes_waiting) : bytes_waiting;
439
440         dev_dbg(&dev->core, "%s:%d: %u\n", __func__, __LINE__, bytes);
441
442         if (!bytes)
443                 return;
444
445         /* Add some extra space for recently arrived data. */
446
447         bytes += 128;
448
449         tmp = kmalloc(bytes, GFP_KERNEL);
450
451         if (!tmp)
452                 return;
453
454         ps3_vuart_raw_read(dev, tmp, bytes, &bytes_waiting);
455
456         kfree(tmp);
457
458         /* Don't include these bytes in the stats. */
459
460         priv->stats.bytes_read -= bytes_waiting;
461 }
462 EXPORT_SYMBOL_GPL(ps3_vuart_clear_rx_bytes);
463
464 /**
465  * struct list_buffer - An element for a port device fifo buffer list.
466  */
467
468 struct list_buffer {
469         struct list_head link;
470         const unsigned char *head;
471         const unsigned char *tail;
472         unsigned long dbg_number;
473         unsigned char data[];
474 };
475
476 /**
477  * ps3_vuart_write - the entry point for writing data to a port
478  * @dev: The struct ps3_system_bus_device instance.
479  *
480  * If the port is idle on entry as much of the incoming data is written to
481  * the port as the port will accept.  Otherwise a list buffer is created
482  * and any remaning incoming data is copied to that buffer.  The buffer is
483  * then enqueued for transmision via the transmit interrupt.
484  */
485
486 int ps3_vuart_write(struct ps3_system_bus_device *dev, const void *buf,
487         unsigned int bytes)
488 {
489         static unsigned long dbg_number;
490         int result;
491         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
492         unsigned long flags;
493         struct list_buffer *lb;
494
495         dev_dbg(&dev->core, "%s:%d: %u(%xh) bytes\n", __func__, __LINE__,
496                 bytes, bytes);
497
498         spin_lock_irqsave(&priv->tx_list.lock, flags);
499
500         if (list_empty(&priv->tx_list.head)) {
501                 u64 bytes_written;
502
503                 result = ps3_vuart_raw_write(dev, buf, bytes, &bytes_written);
504
505                 spin_unlock_irqrestore(&priv->tx_list.lock, flags);
506
507                 if (result) {
508                         dev_dbg(&dev->core,
509                                 "%s:%d: ps3_vuart_raw_write failed\n",
510                                 __func__, __LINE__);
511                         return result;
512                 }
513
514                 if (bytes_written == bytes) {
515                         dev_dbg(&dev->core, "%s:%d: wrote %xh bytes\n",
516                                 __func__, __LINE__, bytes);
517                         return 0;
518                 }
519
520                 bytes -= bytes_written;
521                 buf += bytes_written;
522         } else
523                 spin_unlock_irqrestore(&priv->tx_list.lock, flags);
524
525         lb = kmalloc(sizeof(struct list_buffer) + bytes, GFP_KERNEL);
526
527         if (!lb)
528                 return -ENOMEM;
529
530         memcpy(lb->data, buf, bytes);
531         lb->head = lb->data;
532         lb->tail = lb->data + bytes;
533         lb->dbg_number = ++dbg_number;
534
535         spin_lock_irqsave(&priv->tx_list.lock, flags);
536         list_add_tail(&lb->link, &priv->tx_list.head);
537         ps3_vuart_enable_interrupt_tx(dev);
538         spin_unlock_irqrestore(&priv->tx_list.lock, flags);
539
540         dev_dbg(&dev->core, "%s:%d: queued buf_%lu, %xh bytes\n",
541                 __func__, __LINE__, lb->dbg_number, bytes);
542
543         return 0;
544 }
545 EXPORT_SYMBOL_GPL(ps3_vuart_write);
546
547 /**
548  * ps3_vuart_queue_rx_bytes - Queue waiting bytes into the buffer list.
549  * @dev: The struct ps3_system_bus_device instance.
550  * @bytes_queued: Number of bytes queued to the buffer list.
551  *
552  * Must be called with priv->rx_list.lock held.
553  */
554
555 static int ps3_vuart_queue_rx_bytes(struct ps3_system_bus_device *dev,
556         u64 *bytes_queued)
557 {
558         static unsigned long dbg_number;
559         int result;
560         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
561         struct list_buffer *lb;
562         u64 bytes;
563
564         *bytes_queued = 0;
565
566         result = ps3_vuart_get_rx_bytes_waiting(dev, &bytes);
567         BUG_ON(result);
568
569         if (result)
570                 return -EIO;
571
572         if (!bytes)
573                 return 0;
574
575         /* Add some extra space for recently arrived data. */
576
577         bytes += 128;
578
579         lb = kmalloc(sizeof(struct list_buffer) + bytes, GFP_ATOMIC);
580
581         if (!lb)
582                 return -ENOMEM;
583
584         ps3_vuart_raw_read(dev, lb->data, bytes, &bytes);
585
586         lb->head = lb->data;
587         lb->tail = lb->data + bytes;
588         lb->dbg_number = ++dbg_number;
589
590         list_add_tail(&lb->link, &priv->rx_list.head);
591         priv->rx_list.bytes_held += bytes;
592
593         dev_dbg(&dev->core, "%s:%d: buf_%lu: queued %llxh bytes\n",
594                 __func__, __LINE__, lb->dbg_number, bytes);
595
596         *bytes_queued = bytes;
597
598         return 0;
599 }
600
601 /**
602  * ps3_vuart_read - The entry point for reading data from a port.
603  *
604  * Queue data waiting at the port, and if enough bytes to satisfy the request
605  * are held in the buffer list those bytes are dequeued and copied to the
606  * caller's buffer.  Emptied list buffers are retiered.  If the request cannot
607  * be statified by bytes held in the list buffers -EAGAIN is returned.
608  */
609
610 int ps3_vuart_read(struct ps3_system_bus_device *dev, void *buf,
611         unsigned int bytes)
612 {
613         int result;
614         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
615         unsigned long flags;
616         struct list_buffer *lb, *n;
617         unsigned long bytes_read;
618
619         dev_dbg(&dev->core, "%s:%d: %u(%xh) bytes\n", __func__, __LINE__,
620                 bytes, bytes);
621
622         spin_lock_irqsave(&priv->rx_list.lock, flags);
623
624         /* Queue rx bytes here for polled reads. */
625
626         while (priv->rx_list.bytes_held < bytes) {
627                 u64 tmp;
628
629                 result = ps3_vuart_queue_rx_bytes(dev, &tmp);
630                 if (result || !tmp) {
631                         dev_dbg(&dev->core, "%s:%d: starved for %lxh bytes\n",
632                                 __func__, __LINE__,
633                                 bytes - priv->rx_list.bytes_held);
634                         spin_unlock_irqrestore(&priv->rx_list.lock, flags);
635                         return -EAGAIN;
636                 }
637         }
638
639         list_for_each_entry_safe(lb, n, &priv->rx_list.head, link) {
640                 bytes_read = min((unsigned int)(lb->tail - lb->head), bytes);
641
642                 memcpy(buf, lb->head, bytes_read);
643                 buf += bytes_read;
644                 bytes -= bytes_read;
645                 priv->rx_list.bytes_held -= bytes_read;
646
647                 if (bytes_read < lb->tail - lb->head) {
648                         lb->head += bytes_read;
649                         dev_dbg(&dev->core, "%s:%d: buf_%lu: dequeued %lxh "
650                                 "bytes\n", __func__, __LINE__, lb->dbg_number,
651                                 bytes_read);
652                         spin_unlock_irqrestore(&priv->rx_list.lock, flags);
653                         return 0;
654                 }
655
656                 dev_dbg(&dev->core, "%s:%d: buf_%lu: free, dequeued %lxh "
657                         "bytes\n", __func__, __LINE__, lb->dbg_number,
658                         bytes_read);
659
660                 list_del(&lb->link);
661                 kfree(lb);
662         }
663
664         spin_unlock_irqrestore(&priv->rx_list.lock, flags);
665         return 0;
666 }
667 EXPORT_SYMBOL_GPL(ps3_vuart_read);
668
669 /**
670  * ps3_vuart_work - Asynchronous read handler.
671  */
672
673 static void ps3_vuart_work(struct work_struct *work)
674 {
675         struct ps3_system_bus_device *dev =
676                 ps3_vuart_work_to_system_bus_dev(work);
677         struct ps3_vuart_port_driver *drv =
678                 ps3_system_bus_dev_to_vuart_drv(dev);
679
680         BUG_ON(!drv);
681         drv->work(dev);
682 }
683
684 int ps3_vuart_read_async(struct ps3_system_bus_device *dev, unsigned int bytes)
685 {
686         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
687         unsigned long flags;
688
689         if (priv->rx_list.work.trigger) {
690                 dev_dbg(&dev->core, "%s:%d: warning, multiple calls\n",
691                         __func__, __LINE__);
692                 return -EAGAIN;
693         }
694
695         BUG_ON(!bytes);
696
697         spin_lock_irqsave(&priv->rx_list.lock, flags);
698         if (priv->rx_list.bytes_held >= bytes) {
699                 dev_dbg(&dev->core, "%s:%d: schedule_work %xh bytes\n",
700                         __func__, __LINE__, bytes);
701                 schedule_work(&priv->rx_list.work.work);
702                 spin_unlock_irqrestore(&priv->rx_list.lock, flags);
703                 return 0;
704         }
705
706         priv->rx_list.work.trigger = bytes;
707         spin_unlock_irqrestore(&priv->rx_list.lock, flags);
708
709         dev_dbg(&dev->core, "%s:%d: waiting for %u(%xh) bytes\n", __func__,
710                 __LINE__, bytes, bytes);
711
712         return 0;
713 }
714 EXPORT_SYMBOL_GPL(ps3_vuart_read_async);
715
716 void ps3_vuart_cancel_async(struct ps3_system_bus_device *dev)
717 {
718         to_port_priv(dev)->rx_list.work.trigger = 0;
719 }
720 EXPORT_SYMBOL_GPL(ps3_vuart_cancel_async);
721
722 /**
723  * ps3_vuart_handle_interrupt_tx - third stage transmit interrupt handler
724  *
725  * Services the transmit interrupt for the port.  Writes as much data from the
726  * buffer list as the port will accept.  Retires any emptied list buffers and
727  * adjusts the final list buffer state for a partial write.
728  */
729
730 static int ps3_vuart_handle_interrupt_tx(struct ps3_system_bus_device *dev)
731 {
732         int result = 0;
733         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
734         unsigned long flags;
735         struct list_buffer *lb, *n;
736         unsigned long bytes_total = 0;
737
738         dev_dbg(&dev->core, "%s:%d\n", __func__, __LINE__);
739
740         spin_lock_irqsave(&priv->tx_list.lock, flags);
741
742         list_for_each_entry_safe(lb, n, &priv->tx_list.head, link) {
743
744                 u64 bytes_written;
745
746                 result = ps3_vuart_raw_write(dev, lb->head, lb->tail - lb->head,
747                         &bytes_written);
748
749                 if (result) {
750                         dev_dbg(&dev->core,
751                                 "%s:%d: ps3_vuart_raw_write failed\n",
752                                 __func__, __LINE__);
753                         break;
754                 }
755
756                 bytes_total += bytes_written;
757
758                 if (bytes_written < lb->tail - lb->head) {
759                         lb->head += bytes_written;
760                         dev_dbg(&dev->core,
761                                 "%s:%d cleared buf_%lu, %llxh bytes\n",
762                                 __func__, __LINE__, lb->dbg_number,
763                                 bytes_written);
764                         goto port_full;
765                 }
766
767                 dev_dbg(&dev->core, "%s:%d free buf_%lu\n", __func__, __LINE__,
768                         lb->dbg_number);
769
770                 list_del(&lb->link);
771                 kfree(lb);
772         }
773
774         ps3_vuart_disable_interrupt_tx(dev);
775 port_full:
776         spin_unlock_irqrestore(&priv->tx_list.lock, flags);
777         dev_dbg(&dev->core, "%s:%d wrote %lxh bytes total\n",
778                 __func__, __LINE__, bytes_total);
779         return result;
780 }
781
782 /**
783  * ps3_vuart_handle_interrupt_rx - third stage receive interrupt handler
784  *
785  * Services the receive interrupt for the port.  Creates a list buffer and
786  * copies all waiting port data to that buffer and enqueues the buffer in the
787  * buffer list.  Buffer list data is dequeued via ps3_vuart_read.
788  */
789
790 static int ps3_vuart_handle_interrupt_rx(struct ps3_system_bus_device *dev)
791 {
792         int result;
793         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
794         unsigned long flags;
795         u64 bytes;
796
797         dev_dbg(&dev->core, "%s:%d\n", __func__, __LINE__);
798
799         spin_lock_irqsave(&priv->rx_list.lock, flags);
800         result = ps3_vuart_queue_rx_bytes(dev, &bytes);
801
802         if (result) {
803                 spin_unlock_irqrestore(&priv->rx_list.lock, flags);
804                 return result;
805         }
806
807         if (priv->rx_list.work.trigger && priv->rx_list.bytes_held
808                 >= priv->rx_list.work.trigger) {
809                 dev_dbg(&dev->core, "%s:%d: schedule_work %lxh bytes\n",
810                         __func__, __LINE__, priv->rx_list.work.trigger);
811                 priv->rx_list.work.trigger = 0;
812                 schedule_work(&priv->rx_list.work.work);
813         }
814
815         spin_unlock_irqrestore(&priv->rx_list.lock, flags);
816         return result;
817 }
818
819 static int ps3_vuart_handle_interrupt_disconnect(
820         struct ps3_system_bus_device *dev)
821 {
822         dev_dbg(&dev->core, "%s:%d\n", __func__, __LINE__);
823         BUG_ON("no support");
824         return -1;
825 }
826
827 /**
828  * ps3_vuart_handle_port_interrupt - second stage interrupt handler
829  *
830  * Services any pending interrupt types for the port.  Passes control to the
831  * third stage type specific interrupt handler.  Returns control to the first
832  * stage handler after one iteration.
833  */
834
835 static int ps3_vuart_handle_port_interrupt(struct ps3_system_bus_device *dev)
836 {
837         int result;
838         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
839         unsigned long status;
840
841         result = ps3_vuart_get_interrupt_status(dev, &status);
842
843         if (result)
844                 return result;
845
846         dev_dbg(&dev->core, "%s:%d: status: %lxh\n", __func__, __LINE__,
847                 status);
848
849         if (status & INTERRUPT_MASK_DISCONNECT) {
850                 priv->stats.disconnect_interrupts++;
851                 result = ps3_vuart_handle_interrupt_disconnect(dev);
852                 if (result)
853                         ps3_vuart_disable_interrupt_disconnect(dev);
854         }
855
856         if (status & INTERRUPT_MASK_TX) {
857                 priv->stats.tx_interrupts++;
858                 result = ps3_vuart_handle_interrupt_tx(dev);
859                 if (result)
860                         ps3_vuart_disable_interrupt_tx(dev);
861         }
862
863         if (status & INTERRUPT_MASK_RX) {
864                 priv->stats.rx_interrupts++;
865                 result = ps3_vuart_handle_interrupt_rx(dev);
866                 if (result)
867                         ps3_vuart_disable_interrupt_rx(dev);
868         }
869
870         return 0;
871 }
872
873 struct vuart_bus_priv {
874         struct ports_bmp *bmp;
875         unsigned int virq;
876         struct mutex probe_mutex;
877         int use_count;
878         struct ps3_system_bus_device *devices[PORT_COUNT];
879 } static vuart_bus_priv;
880
881 /**
882  * ps3_vuart_irq_handler - first stage interrupt handler
883  *
884  * Loops finding any interrupting port and its associated instance data.
885  * Passes control to the second stage port specific interrupt handler.  Loops
886  * until all outstanding interrupts are serviced.
887  */
888
889 static irqreturn_t ps3_vuart_irq_handler(int irq, void *_private)
890 {
891         struct vuart_bus_priv *bus_priv = _private;
892
893         BUG_ON(!bus_priv);
894
895         while (1) {
896                 unsigned int port;
897
898                 dump_ports_bmp(bus_priv->bmp);
899
900                 port = (BITS_PER_LONG - 1) - __ilog2(bus_priv->bmp->status);
901
902                 if (port == BITS_PER_LONG)
903                         break;
904
905                 BUG_ON(port >= PORT_COUNT);
906                 BUG_ON(!bus_priv->devices[port]);
907
908                 ps3_vuart_handle_port_interrupt(bus_priv->devices[port]);
909         }
910
911         return IRQ_HANDLED;
912 }
913
914 static int ps3_vuart_bus_interrupt_get(void)
915 {
916         int result;
917
918         pr_debug(" -> %s:%d\n", __func__, __LINE__);
919
920         vuart_bus_priv.use_count++;
921
922         BUG_ON(vuart_bus_priv.use_count > 2);
923
924         if (vuart_bus_priv.use_count != 1)
925                 return 0;
926
927         BUG_ON(vuart_bus_priv.bmp);
928
929         vuart_bus_priv.bmp = kzalloc(sizeof(struct ports_bmp), GFP_KERNEL);
930
931         if (!vuart_bus_priv.bmp) {
932                 pr_debug("%s:%d: kzalloc failed.\n", __func__, __LINE__);
933                 result = -ENOMEM;
934                 goto fail_bmp_malloc;
935         }
936
937         result = ps3_vuart_irq_setup(PS3_BINDING_CPU_ANY, vuart_bus_priv.bmp,
938                 &vuart_bus_priv.virq);
939
940         if (result) {
941                 pr_debug("%s:%d: ps3_vuart_irq_setup failed (%d)\n",
942                         __func__, __LINE__, result);
943                 result = -EPERM;
944                 goto fail_alloc_irq;
945         }
946
947         result = request_irq(vuart_bus_priv.virq, ps3_vuart_irq_handler,
948                 0, "vuart", &vuart_bus_priv);
949
950         if (result) {
951                 pr_debug("%s:%d: request_irq failed (%d)\n",
952                         __func__, __LINE__, result);
953                 goto fail_request_irq;
954         }
955
956         pr_debug(" <- %s:%d: ok\n", __func__, __LINE__);
957         return result;
958
959 fail_request_irq:
960         ps3_vuart_irq_destroy(vuart_bus_priv.virq);
961         vuart_bus_priv.virq = 0;
962 fail_alloc_irq:
963         kfree(vuart_bus_priv.bmp);
964         vuart_bus_priv.bmp = NULL;
965 fail_bmp_malloc:
966         vuart_bus_priv.use_count--;
967         pr_debug(" <- %s:%d: failed\n", __func__, __LINE__);
968         return result;
969 }
970
971 static int ps3_vuart_bus_interrupt_put(void)
972 {
973         pr_debug(" -> %s:%d\n", __func__, __LINE__);
974
975         vuart_bus_priv.use_count--;
976
977         BUG_ON(vuart_bus_priv.use_count < 0);
978
979         if (vuart_bus_priv.use_count != 0)
980                 return 0;
981
982         free_irq(vuart_bus_priv.virq, &vuart_bus_priv);
983
984         ps3_vuart_irq_destroy(vuart_bus_priv.virq);
985         vuart_bus_priv.virq = 0;
986
987         kfree(vuart_bus_priv.bmp);
988         vuart_bus_priv.bmp = NULL;
989
990         pr_debug(" <- %s:%d\n", __func__, __LINE__);
991         return 0;
992 }
993
994 static int ps3_vuart_probe(struct ps3_system_bus_device *dev)
995 {
996         int result;
997         struct ps3_vuart_port_driver *drv;
998         struct ps3_vuart_port_priv *priv = NULL;
999
1000         dev_dbg(&dev->core, "%s:%d\n", __func__, __LINE__);
1001
1002         drv = ps3_system_bus_dev_to_vuart_drv(dev);
1003         BUG_ON(!drv);
1004
1005         dev_dbg(&dev->core, "%s:%d: (%s)\n", __func__, __LINE__,
1006                 drv->core.core.name);
1007
1008         if (dev->port_number >= PORT_COUNT) {
1009                 BUG();
1010                 return -EINVAL;
1011         }
1012
1013         mutex_lock(&vuart_bus_priv.probe_mutex);
1014
1015         result = ps3_vuart_bus_interrupt_get();
1016
1017         if (result)
1018                 goto fail_setup_interrupt;
1019
1020         if (vuart_bus_priv.devices[dev->port_number]) {
1021                 dev_dbg(&dev->core, "%s:%d: port busy (%d)\n", __func__,
1022                         __LINE__, dev->port_number);
1023                 result = -EBUSY;
1024                 goto fail_busy;
1025         }
1026
1027         vuart_bus_priv.devices[dev->port_number] = dev;
1028
1029         /* Setup dev->driver_priv. */
1030
1031         dev->driver_priv = kzalloc(sizeof(struct ps3_vuart_port_priv),
1032                 GFP_KERNEL);
1033
1034         if (!dev->driver_priv) {
1035                 result = -ENOMEM;
1036                 goto fail_dev_malloc;
1037         }
1038
1039         priv = to_port_priv(dev);
1040
1041         INIT_LIST_HEAD(&priv->tx_list.head);
1042         spin_lock_init(&priv->tx_list.lock);
1043
1044         INIT_LIST_HEAD(&priv->rx_list.head);
1045         spin_lock_init(&priv->rx_list.lock);
1046
1047         INIT_WORK(&priv->rx_list.work.work, ps3_vuart_work);
1048         priv->rx_list.work.trigger = 0;
1049         priv->rx_list.work.dev = dev;
1050
1051         /* clear stale pending interrupts */
1052
1053         ps3_vuart_clear_rx_bytes(dev, 0);
1054
1055         ps3_vuart_set_interrupt_mask(dev, INTERRUPT_MASK_RX);
1056
1057         ps3_vuart_set_triggers(dev, 1, 1);
1058
1059         if (drv->probe)
1060                 result = drv->probe(dev);
1061         else {
1062                 result = 0;
1063                 dev_info(&dev->core, "%s:%d: no probe method\n", __func__,
1064                         __LINE__);
1065         }
1066
1067         if (result) {
1068                 dev_dbg(&dev->core, "%s:%d: drv->probe failed\n",
1069                         __func__, __LINE__);
1070                 goto fail_probe;
1071         }
1072
1073         mutex_unlock(&vuart_bus_priv.probe_mutex);
1074
1075         return result;
1076
1077 fail_probe:
1078         ps3_vuart_set_interrupt_mask(dev, 0);
1079         kfree(dev->driver_priv);
1080         dev->driver_priv = NULL;
1081 fail_dev_malloc:
1082         vuart_bus_priv.devices[dev->port_number] = NULL;
1083 fail_busy:
1084         ps3_vuart_bus_interrupt_put();
1085 fail_setup_interrupt:
1086         mutex_unlock(&vuart_bus_priv.probe_mutex);
1087         dev_dbg(&dev->core, "%s:%d: failed\n", __func__, __LINE__);
1088         return result;
1089 }
1090
1091 /**
1092  * ps3_vuart_cleanup - common cleanup helper.
1093  * @dev: The struct ps3_system_bus_device instance.
1094  *
1095  * Cleans interrupts and HV resources.  Must be called with
1096  * vuart_bus_priv.probe_mutex held.  Used by ps3_vuart_remove and
1097  * ps3_vuart_shutdown.  After this call, polled reading will still work.
1098  */
1099
1100 static int ps3_vuart_cleanup(struct ps3_system_bus_device *dev)
1101 {
1102         dev_dbg(&dev->core, "%s:%d\n", __func__, __LINE__);
1103
1104         ps3_vuart_cancel_async(dev);
1105         ps3_vuart_set_interrupt_mask(dev, 0);
1106         ps3_vuart_bus_interrupt_put();
1107         return 0;
1108 }
1109
1110 /**
1111  * ps3_vuart_remove - Completely clean the device instance.
1112  * @dev: The struct ps3_system_bus_device instance.
1113  *
1114  * Cleans all memory, interrupts and HV resources.  After this call the
1115  * device can no longer be used.
1116  */
1117
1118 static int ps3_vuart_remove(struct ps3_system_bus_device *dev)
1119 {
1120         struct ps3_vuart_port_priv *priv = to_port_priv(dev);
1121         struct ps3_vuart_port_driver *drv;
1122
1123         BUG_ON(!dev);
1124
1125         mutex_lock(&vuart_bus_priv.probe_mutex);
1126
1127         dev_dbg(&dev->core, " -> %s:%d: match_id %d\n", __func__, __LINE__,
1128                 dev->match_id);
1129
1130         if (!dev->core.driver) {
1131                 dev_dbg(&dev->core, "%s:%d: no driver bound\n", __func__,
1132                         __LINE__);
1133                 mutex_unlock(&vuart_bus_priv.probe_mutex);
1134                 return 0;
1135         }
1136
1137         drv = ps3_system_bus_dev_to_vuart_drv(dev);
1138
1139         BUG_ON(!drv);
1140
1141         if (drv->remove) {
1142                 drv->remove(dev);
1143         } else {
1144                 dev_dbg(&dev->core, "%s:%d: no remove method\n", __func__,
1145                 __LINE__);
1146                 BUG();
1147         }
1148
1149         ps3_vuart_cleanup(dev);
1150
1151         vuart_bus_priv.devices[dev->port_number] = NULL;
1152         kfree(priv);
1153         priv = NULL;
1154
1155         dev_dbg(&dev->core, " <- %s:%d\n", __func__, __LINE__);
1156         mutex_unlock(&vuart_bus_priv.probe_mutex);
1157         return 0;
1158 }
1159
1160 /**
1161  * ps3_vuart_shutdown - Cleans interrupts and HV resources.
1162  * @dev: The struct ps3_system_bus_device instance.
1163  *
1164  * Cleans interrupts and HV resources.  After this call the
1165  * device can still be used in polling mode.  This behavior required
1166  * by sys-manager to be able to complete the device power operation
1167  * sequence.
1168  */
1169
1170 static int ps3_vuart_shutdown(struct ps3_system_bus_device *dev)
1171 {
1172         struct ps3_vuart_port_driver *drv;
1173
1174         BUG_ON(!dev);
1175
1176         mutex_lock(&vuart_bus_priv.probe_mutex);
1177
1178         dev_dbg(&dev->core, " -> %s:%d: match_id %d\n", __func__, __LINE__,
1179                 dev->match_id);
1180
1181         if (!dev->core.driver) {
1182                 dev_dbg(&dev->core, "%s:%d: no driver bound\n", __func__,
1183                         __LINE__);
1184                 mutex_unlock(&vuart_bus_priv.probe_mutex);
1185                 return 0;
1186         }
1187
1188         drv = ps3_system_bus_dev_to_vuart_drv(dev);
1189
1190         BUG_ON(!drv);
1191
1192         if (drv->shutdown)
1193                 drv->shutdown(dev);
1194         else if (drv->remove) {
1195                 dev_dbg(&dev->core, "%s:%d: no shutdown, calling remove\n",
1196                         __func__, __LINE__);
1197                 drv->remove(dev);
1198         } else {
1199                 dev_dbg(&dev->core, "%s:%d: no shutdown method\n", __func__,
1200                         __LINE__);
1201                 BUG();
1202         }
1203
1204         ps3_vuart_cleanup(dev);
1205
1206         dev_dbg(&dev->core, " <- %s:%d\n", __func__, __LINE__);
1207
1208         mutex_unlock(&vuart_bus_priv.probe_mutex);
1209         return 0;
1210 }
1211
1212 static int __init ps3_vuart_bus_init(void)
1213 {
1214         pr_debug("%s:%d:\n", __func__, __LINE__);
1215
1216         if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
1217                 return -ENODEV;
1218
1219         mutex_init(&vuart_bus_priv.probe_mutex);
1220
1221         return 0;
1222 }
1223
1224 static void __exit ps3_vuart_bus_exit(void)
1225 {
1226         pr_debug("%s:%d:\n", __func__, __LINE__);
1227 }
1228
1229 core_initcall(ps3_vuart_bus_init);
1230 module_exit(ps3_vuart_bus_exit);
1231
1232 /**
1233  * ps3_vuart_port_driver_register - Add a vuart port device driver.
1234  */
1235
1236 int ps3_vuart_port_driver_register(struct ps3_vuart_port_driver *drv)
1237 {
1238         int result;
1239
1240         pr_debug("%s:%d: (%s)\n", __func__, __LINE__, drv->core.core.name);
1241
1242         BUG_ON(!drv->core.match_id);
1243         BUG_ON(!drv->core.core.name);
1244
1245         drv->core.probe = ps3_vuart_probe;
1246         drv->core.remove = ps3_vuart_remove;
1247         drv->core.shutdown = ps3_vuart_shutdown;
1248
1249         result = ps3_system_bus_driver_register(&drv->core);
1250         return result;
1251 }
1252 EXPORT_SYMBOL_GPL(ps3_vuart_port_driver_register);
1253
1254 /**
1255  * ps3_vuart_port_driver_unregister - Remove a vuart port device driver.
1256  */
1257
1258 void ps3_vuart_port_driver_unregister(struct ps3_vuart_port_driver *drv)
1259 {
1260         pr_debug("%s:%d: (%s)\n", __func__, __LINE__, drv->core.core.name);
1261         ps3_system_bus_driver_unregister(&drv->core);
1262 }
1263 EXPORT_SYMBOL_GPL(ps3_vuart_port_driver_unregister);