1
2
3
4
5
6
7
8
9
10
11
12#include <linux/module.h>
13#include <linux/moduleparam.h>
14#include <linux/mm.h>
15#include <linux/types.h>
16#include <linux/errno.h>
17#include <linux/proc_fs.h>
18#include <linux/pci.h>
19#include <linux/poll.h>
20#include <linux/dma-mapping.h>
21#include <linux/interrupt.h>
22#include <linux/spinlock.h>
23#include <linux/sched.h>
24#include <linux/slab.h>
25#include <linux/time.h>
26#include <linux/io.h>
27#include <linux/uaccess.h>
28#include <linux/byteorder/generic.h>
29#include <linux/vme.h>
30
31#include "../vme_bridge.h"
32#include "vme_tsi148.h"
33
34static int tsi148_probe(struct pci_dev *, const struct pci_device_id *);
35static void tsi148_remove(struct pci_dev *);
36
37
38
39static bool err_chk;
40static int geoid;
41
42static const char driver_name[] = "vme_tsi148";
43
44static const struct pci_device_id tsi148_ids[] = {
45 { PCI_DEVICE(PCI_VENDOR_ID_TUNDRA, PCI_DEVICE_ID_TUNDRA_TSI148) },
46 { },
47};
48
49MODULE_DEVICE_TABLE(pci, tsi148_ids);
50
51static struct pci_driver tsi148_driver = {
52 .name = driver_name,
53 .id_table = tsi148_ids,
54 .probe = tsi148_probe,
55 .remove = tsi148_remove,
56};
57
58static void reg_join(unsigned int high, unsigned int low,
59 unsigned long long *variable)
60{
61 *variable = (unsigned long long)high << 32;
62 *variable |= (unsigned long long)low;
63}
64
65static void reg_split(unsigned long long variable, unsigned int *high,
66 unsigned int *low)
67{
68 *low = (unsigned int)variable & 0xFFFFFFFF;
69 *high = (unsigned int)(variable >> 32);
70}
71
72
73
74
75static u32 tsi148_DMA_irqhandler(struct tsi148_driver *bridge,
76 int channel_mask)
77{
78 u32 serviced = 0;
79
80 if (channel_mask & TSI148_LCSR_INTS_DMA0S) {
81 wake_up(&bridge->dma_queue[0]);
82 serviced |= TSI148_LCSR_INTC_DMA0C;
83 }
84 if (channel_mask & TSI148_LCSR_INTS_DMA1S) {
85 wake_up(&bridge->dma_queue[1]);
86 serviced |= TSI148_LCSR_INTC_DMA1C;
87 }
88
89 return serviced;
90}
91
92
93
94
95static u32 tsi148_LM_irqhandler(struct tsi148_driver *bridge, u32 stat)
96{
97 int i;
98 u32 serviced = 0;
99
100 for (i = 0; i < 4; i++) {
101 if (stat & TSI148_LCSR_INTS_LMS[i]) {
102
103 bridge->lm_callback[i](bridge->lm_data[i]);
104 serviced |= TSI148_LCSR_INTC_LMC[i];
105 }
106 }
107
108 return serviced;
109}
110
111
112
113
114
115
116static u32 tsi148_MB_irqhandler(struct vme_bridge *tsi148_bridge, u32 stat)
117{
118 int i;
119 u32 val;
120 u32 serviced = 0;
121 struct tsi148_driver *bridge;
122
123 bridge = tsi148_bridge->driver_priv;
124
125 for (i = 0; i < 4; i++) {
126 if (stat & TSI148_LCSR_INTS_MBS[i]) {
127 val = ioread32be(bridge->base + TSI148_GCSR_MBOX[i]);
128 dev_err(tsi148_bridge->parent, "VME Mailbox %d received"
129 ": 0x%x\n", i, val);
130 serviced |= TSI148_LCSR_INTC_MBC[i];
131 }
132 }
133
134 return serviced;
135}
136
137
138
139
140static u32 tsi148_PERR_irqhandler(struct vme_bridge *tsi148_bridge)
141{
142 struct tsi148_driver *bridge;
143
144 bridge = tsi148_bridge->driver_priv;
145
146 dev_err(tsi148_bridge->parent, "PCI Exception at address: 0x%08x:%08x, "
147 "attributes: %08x\n",
148 ioread32be(bridge->base + TSI148_LCSR_EDPAU),
149 ioread32be(bridge->base + TSI148_LCSR_EDPAL),
150 ioread32be(bridge->base + TSI148_LCSR_EDPAT));
151
152 dev_err(tsi148_bridge->parent, "PCI-X attribute reg: %08x, PCI-X split "
153 "completion reg: %08x\n",
154 ioread32be(bridge->base + TSI148_LCSR_EDPXA),
155 ioread32be(bridge->base + TSI148_LCSR_EDPXS));
156
157 iowrite32be(TSI148_LCSR_EDPAT_EDPCL, bridge->base + TSI148_LCSR_EDPAT);
158
159 return TSI148_LCSR_INTC_PERRC;
160}
161
162
163
164
165static u32 tsi148_VERR_irqhandler(struct vme_bridge *tsi148_bridge)
166{
167 unsigned int error_addr_high, error_addr_low;
168 unsigned long long error_addr;
169 u32 error_attrib;
170 int error_am;
171 struct tsi148_driver *bridge;
172
173 bridge = tsi148_bridge->driver_priv;
174
175 error_addr_high = ioread32be(bridge->base + TSI148_LCSR_VEAU);
176 error_addr_low = ioread32be(bridge->base + TSI148_LCSR_VEAL);
177 error_attrib = ioread32be(bridge->base + TSI148_LCSR_VEAT);
178 error_am = (error_attrib & TSI148_LCSR_VEAT_AM_M) >> 8;
179
180 reg_join(error_addr_high, error_addr_low, &error_addr);
181
182
183 if (error_attrib & TSI148_LCSR_VEAT_VEOF) {
184 dev_err(tsi148_bridge->parent, "VME Bus Exception Overflow "
185 "Occurred\n");
186 }
187
188 if (err_chk)
189 vme_bus_error_handler(tsi148_bridge, error_addr, error_am);
190 else
191 dev_err(tsi148_bridge->parent,
192 "VME Bus Error at address: 0x%llx, attributes: %08x\n",
193 error_addr, error_attrib);
194
195
196 iowrite32be(TSI148_LCSR_VEAT_VESCL, bridge->base + TSI148_LCSR_VEAT);
197
198 return TSI148_LCSR_INTC_VERRC;
199}
200
201
202
203
204static u32 tsi148_IACK_irqhandler(struct tsi148_driver *bridge)
205{
206 wake_up(&bridge->iack_queue);
207
208 return TSI148_LCSR_INTC_IACKC;
209}
210
211
212
213
214static u32 tsi148_VIRQ_irqhandler(struct vme_bridge *tsi148_bridge,
215 u32 stat)
216{
217 int vec, i, serviced = 0;
218 struct tsi148_driver *bridge;
219
220 bridge = tsi148_bridge->driver_priv;
221
222 for (i = 7; i > 0; i--) {
223 if (stat & (1 << i)) {
224
225
226
227
228
229 vec = ioread8(bridge->base + TSI148_LCSR_VIACK[i] + 3);
230
231 vme_irq_handler(tsi148_bridge, i, vec);
232
233 serviced |= (1 << i);
234 }
235 }
236
237 return serviced;
238}
239
240
241
242
243
244static irqreturn_t tsi148_irqhandler(int irq, void *ptr)
245{
246 u32 stat, enable, serviced = 0;
247 struct vme_bridge *tsi148_bridge;
248 struct tsi148_driver *bridge;
249
250 tsi148_bridge = ptr;
251
252 bridge = tsi148_bridge->driver_priv;
253
254
255 enable = ioread32be(bridge->base + TSI148_LCSR_INTEO);
256 stat = ioread32be(bridge->base + TSI148_LCSR_INTS);
257
258
259 stat &= enable;
260
261 if (unlikely(!stat))
262 return IRQ_NONE;
263
264
265
266 if (stat & (TSI148_LCSR_INTS_DMA1S | TSI148_LCSR_INTS_DMA0S))
267 serviced |= tsi148_DMA_irqhandler(bridge, stat);
268
269
270 if (stat & (TSI148_LCSR_INTS_LM3S | TSI148_LCSR_INTS_LM2S |
271 TSI148_LCSR_INTS_LM1S | TSI148_LCSR_INTS_LM0S))
272 serviced |= tsi148_LM_irqhandler(bridge, stat);
273
274
275 if (stat & (TSI148_LCSR_INTS_MB3S | TSI148_LCSR_INTS_MB2S |
276 TSI148_LCSR_INTS_MB1S | TSI148_LCSR_INTS_MB0S))
277 serviced |= tsi148_MB_irqhandler(tsi148_bridge, stat);
278
279
280 if (stat & TSI148_LCSR_INTS_PERRS)
281 serviced |= tsi148_PERR_irqhandler(tsi148_bridge);
282
283
284 if (stat & TSI148_LCSR_INTS_VERRS)
285 serviced |= tsi148_VERR_irqhandler(tsi148_bridge);
286
287
288 if (stat & TSI148_LCSR_INTS_IACKS)
289 serviced |= tsi148_IACK_irqhandler(bridge);
290
291
292 if (stat & (TSI148_LCSR_INTS_IRQ7S | TSI148_LCSR_INTS_IRQ6S |
293 TSI148_LCSR_INTS_IRQ5S | TSI148_LCSR_INTS_IRQ4S |
294 TSI148_LCSR_INTS_IRQ3S | TSI148_LCSR_INTS_IRQ2S |
295 TSI148_LCSR_INTS_IRQ1S))
296 serviced |= tsi148_VIRQ_irqhandler(tsi148_bridge, stat);
297
298
299 iowrite32be(serviced, bridge->base + TSI148_LCSR_INTC);
300
301 return IRQ_HANDLED;
302}
303
304static int tsi148_irq_init(struct vme_bridge *tsi148_bridge)
305{
306 int result;
307 unsigned int tmp;
308 struct pci_dev *pdev;
309 struct tsi148_driver *bridge;
310
311 pdev = to_pci_dev(tsi148_bridge->parent);
312
313 bridge = tsi148_bridge->driver_priv;
314
315 result = request_irq(pdev->irq,
316 tsi148_irqhandler,
317 IRQF_SHARED,
318 driver_name, tsi148_bridge);
319 if (result) {
320 dev_err(tsi148_bridge->parent, "Can't get assigned pci irq "
321 "vector %02X\n", pdev->irq);
322 return result;
323 }
324
325
326 tmp = TSI148_LCSR_INTEO_DMA1EO | TSI148_LCSR_INTEO_DMA0EO |
327 TSI148_LCSR_INTEO_MB3EO | TSI148_LCSR_INTEO_MB2EO |
328 TSI148_LCSR_INTEO_MB1EO | TSI148_LCSR_INTEO_MB0EO |
329 TSI148_LCSR_INTEO_PERREO | TSI148_LCSR_INTEO_VERREO |
330 TSI148_LCSR_INTEO_IACKEO;
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359 iowrite32be(tmp, bridge->base + TSI148_LCSR_INTEO);
360 iowrite32be(tmp, bridge->base + TSI148_LCSR_INTEN);
361
362 return 0;
363}
364
365static void tsi148_irq_exit(struct vme_bridge *tsi148_bridge,
366 struct pci_dev *pdev)
367{
368 struct tsi148_driver *bridge = tsi148_bridge->driver_priv;
369
370
371 iowrite32be(0x0, bridge->base + TSI148_LCSR_INTEO);
372 iowrite32be(0x0, bridge->base + TSI148_LCSR_INTEN);
373
374
375 iowrite32be(0xFFFFFFFF, bridge->base + TSI148_LCSR_INTC);
376
377
378 free_irq(pdev->irq, tsi148_bridge);
379}
380
381
382
383
384static int tsi148_iack_received(struct tsi148_driver *bridge)
385{
386 u32 tmp;
387
388 tmp = ioread32be(bridge->base + TSI148_LCSR_VICR);
389
390 if (tmp & TSI148_LCSR_VICR_IRQS)
391 return 0;
392 else
393 return 1;
394}
395
396
397
398
399static void tsi148_irq_set(struct vme_bridge *tsi148_bridge, int level,
400 int state, int sync)
401{
402 struct pci_dev *pdev;
403 u32 tmp;
404 struct tsi148_driver *bridge;
405
406 bridge = tsi148_bridge->driver_priv;
407
408
409 if (state == 0) {
410 tmp = ioread32be(bridge->base + TSI148_LCSR_INTEN);
411 tmp &= ~TSI148_LCSR_INTEN_IRQEN[level - 1];
412 iowrite32be(tmp, bridge->base + TSI148_LCSR_INTEN);
413
414 tmp = ioread32be(bridge->base + TSI148_LCSR_INTEO);
415 tmp &= ~TSI148_LCSR_INTEO_IRQEO[level - 1];
416 iowrite32be(tmp, bridge->base + TSI148_LCSR_INTEO);
417
418 if (sync != 0) {
419 pdev = to_pci_dev(tsi148_bridge->parent);
420 synchronize_irq(pdev->irq);
421 }
422 } else {
423 tmp = ioread32be(bridge->base + TSI148_LCSR_INTEO);
424 tmp |= TSI148_LCSR_INTEO_IRQEO[level - 1];
425 iowrite32be(tmp, bridge->base + TSI148_LCSR_INTEO);
426
427 tmp = ioread32be(bridge->base + TSI148_LCSR_INTEN);
428 tmp |= TSI148_LCSR_INTEN_IRQEN[level - 1];
429 iowrite32be(tmp, bridge->base + TSI148_LCSR_INTEN);
430 }
431}
432
433
434
435
436
437static int tsi148_irq_generate(struct vme_bridge *tsi148_bridge, int level,
438 int statid)
439{
440 u32 tmp;
441 struct tsi148_driver *bridge;
442
443 bridge = tsi148_bridge->driver_priv;
444
445 mutex_lock(&bridge->vme_int);
446
447
448 tmp = ioread32be(bridge->base + TSI148_LCSR_VICR);
449
450
451 tmp = (tmp & ~TSI148_LCSR_VICR_STID_M) |
452 (statid & TSI148_LCSR_VICR_STID_M);
453 iowrite32be(tmp, bridge->base + TSI148_LCSR_VICR);
454
455
456 tmp = tmp | TSI148_LCSR_VICR_IRQL[level];
457 iowrite32be(tmp, bridge->base + TSI148_LCSR_VICR);
458
459
460 wait_event_interruptible(bridge->iack_queue,
461 tsi148_iack_received(bridge));
462
463 mutex_unlock(&bridge->vme_int);
464
465 return 0;
466}
467
468
469
470
471static int tsi148_slave_set(struct vme_slave_resource *image, int enabled,
472 unsigned long long vme_base, unsigned long long size,
473 dma_addr_t pci_base, u32 aspace, u32 cycle)
474{
475 unsigned int i, addr = 0, granularity = 0;
476 unsigned int temp_ctl = 0;
477 unsigned int vme_base_low, vme_base_high;
478 unsigned int vme_bound_low, vme_bound_high;
479 unsigned int pci_offset_low, pci_offset_high;
480 unsigned long long vme_bound, pci_offset;
481 struct vme_bridge *tsi148_bridge;
482 struct tsi148_driver *bridge;
483
484 tsi148_bridge = image->parent;
485 bridge = tsi148_bridge->driver_priv;
486
487 i = image->number;
488
489 switch (aspace) {
490 case VME_A16:
491 granularity = 0x10;
492 addr |= TSI148_LCSR_ITAT_AS_A16;
493 break;
494 case VME_A24:
495 granularity = 0x1000;
496 addr |= TSI148_LCSR_ITAT_AS_A24;
497 break;
498 case VME_A32:
499 granularity = 0x10000;
500 addr |= TSI148_LCSR_ITAT_AS_A32;
501 break;
502 case VME_A64:
503 granularity = 0x10000;
504 addr |= TSI148_LCSR_ITAT_AS_A64;
505 break;
506 default:
507 dev_err(tsi148_bridge->parent, "Invalid address space\n");
508 return -EINVAL;
509 }
510
511
512 reg_split(vme_base, &vme_base_high, &vme_base_low);
513
514
515
516
517
518 vme_bound = vme_base + size - granularity;
519 reg_split(vme_bound, &vme_bound_high, &vme_bound_low);
520 pci_offset = (unsigned long long)pci_base - vme_base;
521 reg_split(pci_offset, &pci_offset_high, &pci_offset_low);
522
523 if (vme_base_low & (granularity - 1)) {
524 dev_err(tsi148_bridge->parent, "Invalid VME base alignment\n");
525 return -EINVAL;
526 }
527 if (vme_bound_low & (granularity - 1)) {
528 dev_err(tsi148_bridge->parent, "Invalid VME bound alignment\n");
529 return -EINVAL;
530 }
531 if (pci_offset_low & (granularity - 1)) {
532 dev_err(tsi148_bridge->parent, "Invalid PCI Offset "
533 "alignment\n");
534 return -EINVAL;
535 }
536
537
538 temp_ctl = ioread32be(bridge->base + TSI148_LCSR_IT[i] +
539 TSI148_LCSR_OFFSET_ITAT);
540 temp_ctl &= ~TSI148_LCSR_ITAT_EN;
541 iowrite32be(temp_ctl, bridge->base + TSI148_LCSR_IT[i] +
542 TSI148_LCSR_OFFSET_ITAT);
543
544
545 iowrite32be(vme_base_high, bridge->base + TSI148_LCSR_IT[i] +
546 TSI148_LCSR_OFFSET_ITSAU);
547 iowrite32be(vme_base_low, bridge->base + TSI148_LCSR_IT[i] +
548 TSI148_LCSR_OFFSET_ITSAL);
549 iowrite32be(vme_bound_high, bridge->base + TSI148_LCSR_IT[i] +
550 TSI148_LCSR_OFFSET_ITEAU);
551 iowrite32be(vme_bound_low, bridge->base + TSI148_LCSR_IT[i] +
552 TSI148_LCSR_OFFSET_ITEAL);
553 iowrite32be(pci_offset_high, bridge->base + TSI148_LCSR_IT[i] +
554 TSI148_LCSR_OFFSET_ITOFU);
555 iowrite32be(pci_offset_low, bridge->base + TSI148_LCSR_IT[i] +
556 TSI148_LCSR_OFFSET_ITOFL);
557
558
559 temp_ctl &= ~TSI148_LCSR_ITAT_2eSSTM_M;
560 switch (cycle & (VME_2eSST160 | VME_2eSST267 | VME_2eSST320)) {
561 case VME_2eSST160:
562 temp_ctl |= TSI148_LCSR_ITAT_2eSSTM_160;
563 break;
564 case VME_2eSST267:
565 temp_ctl |= TSI148_LCSR_ITAT_2eSSTM_267;
566 break;
567 case VME_2eSST320:
568 temp_ctl |= TSI148_LCSR_ITAT_2eSSTM_320;
569 break;
570 }
571
572
573 temp_ctl &= ~(0x1F << 7);
574 if (cycle & VME_BLT)
575 temp_ctl |= TSI148_LCSR_ITAT_BLT;
576 if (cycle & VME_MBLT)
577 temp_ctl |= TSI148_LCSR_ITAT_MBLT;
578 if (cycle & VME_2eVME)
579 temp_ctl |= TSI148_LCSR_ITAT_2eVME;
580 if (cycle & VME_2eSST)
581 temp_ctl |= TSI148_LCSR_ITAT_2eSST;
582 if (cycle & VME_2eSSTB)
583 temp_ctl |= TSI148_LCSR_ITAT_2eSSTB;
584
585
586 temp_ctl &= ~TSI148_LCSR_ITAT_AS_M;
587 temp_ctl |= addr;
588
589 temp_ctl &= ~0xF;
590 if (cycle & VME_SUPER)
591 temp_ctl |= TSI148_LCSR_ITAT_SUPR ;
592 if (cycle & VME_USER)
593 temp_ctl |= TSI148_LCSR_ITAT_NPRIV;
594 if (cycle & VME_PROG)
595 temp_ctl |= TSI148_LCSR_ITAT_PGM;
596 if (cycle & VME_DATA)
597 temp_ctl |= TSI148_LCSR_ITAT_DATA;
598
599
600 iowrite32be(temp_ctl, bridge->base + TSI148_LCSR_IT[i] +
601 TSI148_LCSR_OFFSET_ITAT);
602
603 if (enabled)
604 temp_ctl |= TSI148_LCSR_ITAT_EN;
605
606 iowrite32be(temp_ctl, bridge->base + TSI148_LCSR_IT[i] +
607 TSI148_LCSR_OFFSET_ITAT);
608
609 return 0;
610}
611
612
613
614
615static int tsi148_slave_get(struct vme_slave_resource *image, int *enabled,
616 unsigned long long *vme_base, unsigned long long *size,
617 dma_addr_t *pci_base, u32 *aspace, u32 *cycle)
618{
619 unsigned int i, granularity = 0, ctl = 0;
620 unsigned int vme_base_low, vme_base_high;
621 unsigned int vme_bound_low, vme_bound_high;
622 unsigned int pci_offset_low, pci_offset_high;
623 unsigned long long vme_bound, pci_offset;
624 struct tsi148_driver *bridge;
625
626 bridge = image->parent->driver_priv;
627
628 i = image->number;
629
630
631 ctl = ioread32be(bridge->base + TSI148_LCSR_IT[i] +
632 TSI148_LCSR_OFFSET_ITAT);
633
634 vme_base_high = ioread32be(bridge->base + TSI148_LCSR_IT[i] +
635 TSI148_LCSR_OFFSET_ITSAU);
636 vme_base_low = ioread32be(bridge->base + TSI148_LCSR_IT[i] +
637 TSI148_LCSR_OFFSET_ITSAL);
638 vme_bound_high = ioread32be(bridge->base + TSI148_LCSR_IT[i] +
639 TSI148_LCSR_OFFSET_ITEAU);
640 vme_bound_low = ioread32be(bridge->base + TSI148_LCSR_IT[i] +
641 TSI148_LCSR_OFFSET_ITEAL);
642 pci_offset_high = ioread32be(bridge->base + TSI148_LCSR_IT[i] +
643 TSI148_LCSR_OFFSET_ITOFU);
644 pci_offset_low = ioread32be(bridge->base + TSI148_LCSR_IT[i] +
645 TSI148_LCSR_OFFSET_ITOFL);
646
647
648 reg_join(vme_base_high, vme_base_low, vme_base);
649 reg_join(vme_bound_high, vme_bound_low, &vme_bound);
650 reg_join(pci_offset_high, pci_offset_low, &pci_offset);
651
652 *pci_base = (dma_addr_t)(*vme_base + pci_offset);
653
654 *enabled = 0;
655 *aspace = 0;
656 *cycle = 0;
657
658 if (ctl & TSI148_LCSR_ITAT_EN)
659 *enabled = 1;
660
661 if ((ctl & TSI148_LCSR_ITAT_AS_M) == TSI148_LCSR_ITAT_AS_A16) {
662 granularity = 0x10;
663 *aspace |= VME_A16;
664 }
665 if ((ctl & TSI148_LCSR_ITAT_AS_M) == TSI148_LCSR_ITAT_AS_A24) {
666 granularity = 0x1000;
667 *aspace |= VME_A24;
668 }
669 if ((ctl & TSI148_LCSR_ITAT_AS_M) == TSI148_LCSR_ITAT_AS_A32) {
670 granularity = 0x10000;
671 *aspace |= VME_A32;
672 }
673 if ((ctl & TSI148_LCSR_ITAT_AS_M) == TSI148_LCSR_ITAT_AS_A64) {
674 granularity = 0x10000;
675 *aspace |= VME_A64;
676 }
677
678
679 *size = (unsigned long long)((vme_bound - *vme_base) + granularity);
680
681
682 if ((ctl & TSI148_LCSR_ITAT_2eSSTM_M) == TSI148_LCSR_ITAT_2eSSTM_160)
683 *cycle |= VME_2eSST160;
684 if ((ctl & TSI148_LCSR_ITAT_2eSSTM_M) == TSI148_LCSR_ITAT_2eSSTM_267)
685 *cycle |= VME_2eSST267;
686 if ((ctl & TSI148_LCSR_ITAT_2eSSTM_M) == TSI148_LCSR_ITAT_2eSSTM_320)
687 *cycle |= VME_2eSST320;
688
689 if (ctl & TSI148_LCSR_ITAT_BLT)
690 *cycle |= VME_BLT;
691 if (ctl & TSI148_LCSR_ITAT_MBLT)
692 *cycle |= VME_MBLT;
693 if (ctl & TSI148_LCSR_ITAT_2eVME)
694 *cycle |= VME_2eVME;
695 if (ctl & TSI148_LCSR_ITAT_2eSST)
696 *cycle |= VME_2eSST;
697 if (ctl & TSI148_LCSR_ITAT_2eSSTB)
698 *cycle |= VME_2eSSTB;
699
700 if (ctl & TSI148_LCSR_ITAT_SUPR)
701 *cycle |= VME_SUPER;
702 if (ctl & TSI148_LCSR_ITAT_NPRIV)
703 *cycle |= VME_USER;
704 if (ctl & TSI148_LCSR_ITAT_PGM)
705 *cycle |= VME_PROG;
706 if (ctl & TSI148_LCSR_ITAT_DATA)
707 *cycle |= VME_DATA;
708
709 return 0;
710}
711
712
713
714
715static int tsi148_alloc_resource(struct vme_master_resource *image,
716 unsigned long long size)
717{
718 unsigned long long existing_size;
719 int retval = 0;
720 struct pci_dev *pdev;
721 struct vme_bridge *tsi148_bridge;
722
723 tsi148_bridge = image->parent;
724
725 pdev = to_pci_dev(tsi148_bridge->parent);
726
727 existing_size = (unsigned long long)(image->bus_resource.end -
728 image->bus_resource.start);
729
730
731 if ((size != 0) && (existing_size == (size - 1)))
732 return 0;
733
734 if (existing_size != 0) {
735 iounmap(image->kern_base);
736 image->kern_base = NULL;
737 kfree(image->bus_resource.name);
738 release_resource(&image->bus_resource);
739 memset(&image->bus_resource, 0, sizeof(image->bus_resource));
740 }
741
742
743 if (size == 0)
744 return 0;
745
746 if (!image->bus_resource.name) {
747 image->bus_resource.name = kmalloc(VMENAMSIZ+3, GFP_ATOMIC);
748 if (!image->bus_resource.name) {
749 retval = -ENOMEM;
750 goto err_name;
751 }
752 }
753
754 sprintf((char *)image->bus_resource.name, "%s.%d", tsi148_bridge->name,
755 image->number);
756
757 image->bus_resource.start = 0;
758 image->bus_resource.end = (unsigned long)size;
759 image->bus_resource.flags = IORESOURCE_MEM;
760
761 retval = pci_bus_alloc_resource(pdev->bus,
762 &image->bus_resource, size, 0x10000, PCIBIOS_MIN_MEM,
763 0, NULL, NULL);
764 if (retval) {
765 dev_err(tsi148_bridge->parent, "Failed to allocate mem "
766 "resource for window %d size 0x%lx start 0x%lx\n",
767 image->number, (unsigned long)size,
768 (unsigned long)image->bus_resource.start);
769 goto err_resource;
770 }
771
772 image->kern_base = ioremap(
773 image->bus_resource.start, size);
774 if (!image->kern_base) {
775 dev_err(tsi148_bridge->parent, "Failed to remap resource\n");
776 retval = -ENOMEM;
777 goto err_remap;
778 }
779
780 return 0;
781
782err_remap:
783 release_resource(&image->bus_resource);
784err_resource:
785 kfree(image->bus_resource.name);
786 memset(&image->bus_resource, 0, sizeof(image->bus_resource));
787err_name:
788 return retval;
789}
790
791
792
793
794static void tsi148_free_resource(struct vme_master_resource *image)
795{
796 iounmap(image->kern_base);
797 image->kern_base = NULL;
798 release_resource(&image->bus_resource);
799 kfree(image->bus_resource.name);
800 memset(&image->bus_resource, 0, sizeof(image->bus_resource));
801}
802
803
804
805
806static int tsi148_master_set(struct vme_master_resource *image, int enabled,
807 unsigned long long vme_base, unsigned long long size, u32 aspace,
808 u32 cycle, u32 dwidth)
809{
810 int retval = 0;
811 unsigned int i;
812 unsigned int temp_ctl = 0;
813 unsigned int pci_base_low, pci_base_high;
814 unsigned int pci_bound_low, pci_bound_high;
815 unsigned int vme_offset_low, vme_offset_high;
816 unsigned long long pci_bound, vme_offset, pci_base;
817 struct vme_bridge *tsi148_bridge;
818 struct tsi148_driver *bridge;
819 struct pci_bus_region region;
820 struct pci_dev *pdev;
821
822 tsi148_bridge = image->parent;
823
824 bridge = tsi148_bridge->driver_priv;
825
826 pdev = to_pci_dev(tsi148_bridge->parent);
827
828
829 if (vme_base & 0xFFFF) {
830 dev_err(tsi148_bridge->parent, "Invalid VME Window "
831 "alignment\n");
832 retval = -EINVAL;
833 goto err_window;
834 }
835
836 if ((size == 0) && (enabled != 0)) {
837 dev_err(tsi148_bridge->parent, "Size must be non-zero for "
838 "enabled windows\n");
839 retval = -EINVAL;
840 goto err_window;
841 }
842
843 spin_lock(&image->lock);
844
845
846
847
848
849 retval = tsi148_alloc_resource(image, size);
850 if (retval) {
851 spin_unlock(&image->lock);
852 dev_err(tsi148_bridge->parent, "Unable to allocate memory for "
853 "resource\n");
854 goto err_res;
855 }
856
857 if (size == 0) {
858 pci_base = 0;
859 pci_bound = 0;
860 vme_offset = 0;
861 } else {
862 pcibios_resource_to_bus(pdev->bus, ®ion,
863 &image->bus_resource);
864 pci_base = region.start;
865
866
867
868
869
870 pci_bound = pci_base + (size - 0x10000);
871 vme_offset = vme_base - pci_base;
872 }
873
874
875 reg_split(pci_base, &pci_base_high, &pci_base_low);
876 reg_split(pci_bound, &pci_bound_high, &pci_bound_low);
877 reg_split(vme_offset, &vme_offset_high, &vme_offset_low);
878
879 if (pci_base_low & 0xFFFF) {
880 spin_unlock(&image->lock);
881 dev_err(tsi148_bridge->parent, "Invalid PCI base alignment\n");
882 retval = -EINVAL;
883 goto err_gran;
884 }
885 if (pci_bound_low & 0xFFFF) {
886 spin_unlock(&image->lock);
887 dev_err(tsi148_bridge->parent, "Invalid PCI bound alignment\n");
888 retval = -EINVAL;
889 goto err_gran;
890 }
891 if (vme_offset_low & 0xFFFF) {
892 spin_unlock(&image->lock);
893 dev_err(tsi148_bridge->parent, "Invalid VME Offset "
894 "alignment\n");
895 retval = -EINVAL;
896 goto err_gran;
897 }
898
899 i = image->number;
900
901
902 temp_ctl = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
903 TSI148_LCSR_OFFSET_OTAT);
904 temp_ctl &= ~TSI148_LCSR_OTAT_EN;
905 iowrite32be(temp_ctl, bridge->base + TSI148_LCSR_OT[i] +
906 TSI148_LCSR_OFFSET_OTAT);
907
908
909 temp_ctl &= ~TSI148_LCSR_OTAT_2eSSTM_M;
910 switch (cycle & (VME_2eSST160 | VME_2eSST267 | VME_2eSST320)) {
911 case VME_2eSST160:
912 temp_ctl |= TSI148_LCSR_OTAT_2eSSTM_160;
913 break;
914 case VME_2eSST267:
915 temp_ctl |= TSI148_LCSR_OTAT_2eSSTM_267;
916 break;
917 case VME_2eSST320:
918 temp_ctl |= TSI148_LCSR_OTAT_2eSSTM_320;
919 break;
920 }
921
922
923 if (cycle & VME_BLT) {
924 temp_ctl &= ~TSI148_LCSR_OTAT_TM_M;
925 temp_ctl |= TSI148_LCSR_OTAT_TM_BLT;
926 }
927 if (cycle & VME_MBLT) {
928 temp_ctl &= ~TSI148_LCSR_OTAT_TM_M;
929 temp_ctl |= TSI148_LCSR_OTAT_TM_MBLT;
930 }
931 if (cycle & VME_2eVME) {
932 temp_ctl &= ~TSI148_LCSR_OTAT_TM_M;
933 temp_ctl |= TSI148_LCSR_OTAT_TM_2eVME;
934 }
935 if (cycle & VME_2eSST) {
936 temp_ctl &= ~TSI148_LCSR_OTAT_TM_M;
937 temp_ctl |= TSI148_LCSR_OTAT_TM_2eSST;
938 }
939 if (cycle & VME_2eSSTB) {
940 dev_warn(tsi148_bridge->parent, "Currently not setting "
941 "Broadcast Select Registers\n");
942 temp_ctl &= ~TSI148_LCSR_OTAT_TM_M;
943 temp_ctl |= TSI148_LCSR_OTAT_TM_2eSSTB;
944 }
945
946
947 temp_ctl &= ~TSI148_LCSR_OTAT_DBW_M;
948 switch (dwidth) {
949 case VME_D16:
950 temp_ctl |= TSI148_LCSR_OTAT_DBW_16;
951 break;
952 case VME_D32:
953 temp_ctl |= TSI148_LCSR_OTAT_DBW_32;
954 break;
955 default:
956 spin_unlock(&image->lock);
957 dev_err(tsi148_bridge->parent, "Invalid data width\n");
958 retval = -EINVAL;
959 goto err_dwidth;
960 }
961
962
963 temp_ctl &= ~TSI148_LCSR_OTAT_AMODE_M;
964 switch (aspace) {
965 case VME_A16:
966 temp_ctl |= TSI148_LCSR_OTAT_AMODE_A16;
967 break;
968 case VME_A24:
969 temp_ctl |= TSI148_LCSR_OTAT_AMODE_A24;
970 break;
971 case VME_A32:
972 temp_ctl |= TSI148_LCSR_OTAT_AMODE_A32;
973 break;
974 case VME_A64:
975 temp_ctl |= TSI148_LCSR_OTAT_AMODE_A64;
976 break;
977 case VME_CRCSR:
978 temp_ctl |= TSI148_LCSR_OTAT_AMODE_CRCSR;
979 break;
980 case VME_USER1:
981 temp_ctl |= TSI148_LCSR_OTAT_AMODE_USER1;
982 break;
983 case VME_USER2:
984 temp_ctl |= TSI148_LCSR_OTAT_AMODE_USER2;
985 break;
986 case VME_USER3:
987 temp_ctl |= TSI148_LCSR_OTAT_AMODE_USER3;
988 break;
989 case VME_USER4:
990 temp_ctl |= TSI148_LCSR_OTAT_AMODE_USER4;
991 break;
992 default:
993 spin_unlock(&image->lock);
994 dev_err(tsi148_bridge->parent, "Invalid address space\n");
995 retval = -EINVAL;
996 goto err_aspace;
997 }
998
999 temp_ctl &= ~(3<<4);
1000 if (cycle & VME_SUPER)
1001 temp_ctl |= TSI148_LCSR_OTAT_SUP;
1002 if (cycle & VME_PROG)
1003 temp_ctl |= TSI148_LCSR_OTAT_PGM;
1004
1005
1006 iowrite32be(pci_base_high, bridge->base + TSI148_LCSR_OT[i] +
1007 TSI148_LCSR_OFFSET_OTSAU);
1008 iowrite32be(pci_base_low, bridge->base + TSI148_LCSR_OT[i] +
1009 TSI148_LCSR_OFFSET_OTSAL);
1010 iowrite32be(pci_bound_high, bridge->base + TSI148_LCSR_OT[i] +
1011 TSI148_LCSR_OFFSET_OTEAU);
1012 iowrite32be(pci_bound_low, bridge->base + TSI148_LCSR_OT[i] +
1013 TSI148_LCSR_OFFSET_OTEAL);
1014 iowrite32be(vme_offset_high, bridge->base + TSI148_LCSR_OT[i] +
1015 TSI148_LCSR_OFFSET_OTOFU);
1016 iowrite32be(vme_offset_low, bridge->base + TSI148_LCSR_OT[i] +
1017 TSI148_LCSR_OFFSET_OTOFL);
1018
1019
1020 iowrite32be(temp_ctl, bridge->base + TSI148_LCSR_OT[i] +
1021 TSI148_LCSR_OFFSET_OTAT);
1022
1023 if (enabled)
1024 temp_ctl |= TSI148_LCSR_OTAT_EN;
1025
1026 iowrite32be(temp_ctl, bridge->base + TSI148_LCSR_OT[i] +
1027 TSI148_LCSR_OFFSET_OTAT);
1028
1029 spin_unlock(&image->lock);
1030 return 0;
1031
1032err_aspace:
1033err_dwidth:
1034err_gran:
1035 tsi148_free_resource(image);
1036err_res:
1037err_window:
1038 return retval;
1039
1040}
1041
1042
1043
1044
1045
1046
1047static int __tsi148_master_get(struct vme_master_resource *image, int *enabled,
1048 unsigned long long *vme_base, unsigned long long *size, u32 *aspace,
1049 u32 *cycle, u32 *dwidth)
1050{
1051 unsigned int i, ctl;
1052 unsigned int pci_base_low, pci_base_high;
1053 unsigned int pci_bound_low, pci_bound_high;
1054 unsigned int vme_offset_low, vme_offset_high;
1055
1056 unsigned long long pci_base, pci_bound, vme_offset;
1057 struct tsi148_driver *bridge;
1058
1059 bridge = image->parent->driver_priv;
1060
1061 i = image->number;
1062
1063 ctl = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
1064 TSI148_LCSR_OFFSET_OTAT);
1065
1066 pci_base_high = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
1067 TSI148_LCSR_OFFSET_OTSAU);
1068 pci_base_low = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
1069 TSI148_LCSR_OFFSET_OTSAL);
1070 pci_bound_high = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
1071 TSI148_LCSR_OFFSET_OTEAU);
1072 pci_bound_low = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
1073 TSI148_LCSR_OFFSET_OTEAL);
1074 vme_offset_high = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
1075 TSI148_LCSR_OFFSET_OTOFU);
1076 vme_offset_low = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
1077 TSI148_LCSR_OFFSET_OTOFL);
1078
1079
1080 reg_join(pci_base_high, pci_base_low, &pci_base);
1081 reg_join(pci_bound_high, pci_bound_low, &pci_bound);
1082 reg_join(vme_offset_high, vme_offset_low, &vme_offset);
1083
1084 *vme_base = pci_base + vme_offset;
1085 *size = (unsigned long long)(pci_bound - pci_base) + 0x10000;
1086
1087 *enabled = 0;
1088 *aspace = 0;
1089 *cycle = 0;
1090 *dwidth = 0;
1091
1092 if (ctl & TSI148_LCSR_OTAT_EN)
1093 *enabled = 1;
1094
1095
1096 if ((ctl & TSI148_LCSR_OTAT_AMODE_M) == TSI148_LCSR_OTAT_AMODE_A16)
1097 *aspace |= VME_A16;
1098 if ((ctl & TSI148_LCSR_OTAT_AMODE_M) == TSI148_LCSR_OTAT_AMODE_A24)
1099 *aspace |= VME_A24;
1100 if ((ctl & TSI148_LCSR_OTAT_AMODE_M) == TSI148_LCSR_OTAT_AMODE_A32)
1101 *aspace |= VME_A32;
1102 if ((ctl & TSI148_LCSR_OTAT_AMODE_M) == TSI148_LCSR_OTAT_AMODE_A64)
1103 *aspace |= VME_A64;
1104 if ((ctl & TSI148_LCSR_OTAT_AMODE_M) == TSI148_LCSR_OTAT_AMODE_CRCSR)
1105 *aspace |= VME_CRCSR;
1106 if ((ctl & TSI148_LCSR_OTAT_AMODE_M) == TSI148_LCSR_OTAT_AMODE_USER1)
1107 *aspace |= VME_USER1;
1108 if ((ctl & TSI148_LCSR_OTAT_AMODE_M) == TSI148_LCSR_OTAT_AMODE_USER2)
1109 *aspace |= VME_USER2;
1110 if ((ctl & TSI148_LCSR_OTAT_AMODE_M) == TSI148_LCSR_OTAT_AMODE_USER3)
1111 *aspace |= VME_USER3;
1112 if ((ctl & TSI148_LCSR_OTAT_AMODE_M) == TSI148_LCSR_OTAT_AMODE_USER4)
1113 *aspace |= VME_USER4;
1114
1115
1116 if ((ctl & TSI148_LCSR_OTAT_2eSSTM_M) == TSI148_LCSR_OTAT_2eSSTM_160)
1117 *cycle |= VME_2eSST160;
1118 if ((ctl & TSI148_LCSR_OTAT_2eSSTM_M) == TSI148_LCSR_OTAT_2eSSTM_267)
1119 *cycle |= VME_2eSST267;
1120 if ((ctl & TSI148_LCSR_OTAT_2eSSTM_M) == TSI148_LCSR_OTAT_2eSSTM_320)
1121 *cycle |= VME_2eSST320;
1122
1123
1124 if ((ctl & TSI148_LCSR_OTAT_TM_M) == TSI148_LCSR_OTAT_TM_SCT)
1125 *cycle |= VME_SCT;
1126 if ((ctl & TSI148_LCSR_OTAT_TM_M) == TSI148_LCSR_OTAT_TM_BLT)
1127 *cycle |= VME_BLT;
1128 if ((ctl & TSI148_LCSR_OTAT_TM_M) == TSI148_LCSR_OTAT_TM_MBLT)
1129 *cycle |= VME_MBLT;
1130 if ((ctl & TSI148_LCSR_OTAT_TM_M) == TSI148_LCSR_OTAT_TM_2eVME)
1131 *cycle |= VME_2eVME;
1132 if ((ctl & TSI148_LCSR_OTAT_TM_M) == TSI148_LCSR_OTAT_TM_2eSST)
1133 *cycle |= VME_2eSST;
1134 if ((ctl & TSI148_LCSR_OTAT_TM_M) == TSI148_LCSR_OTAT_TM_2eSSTB)
1135 *cycle |= VME_2eSSTB;
1136
1137 if (ctl & TSI148_LCSR_OTAT_SUP)
1138 *cycle |= VME_SUPER;
1139 else
1140 *cycle |= VME_USER;
1141
1142 if (ctl & TSI148_LCSR_OTAT_PGM)
1143 *cycle |= VME_PROG;
1144 else
1145 *cycle |= VME_DATA;
1146
1147
1148 if ((ctl & TSI148_LCSR_OTAT_DBW_M) == TSI148_LCSR_OTAT_DBW_16)
1149 *dwidth = VME_D16;
1150 if ((ctl & TSI148_LCSR_OTAT_DBW_M) == TSI148_LCSR_OTAT_DBW_32)
1151 *dwidth = VME_D32;
1152
1153 return 0;
1154}
1155
1156
1157static int tsi148_master_get(struct vme_master_resource *image, int *enabled,
1158 unsigned long long *vme_base, unsigned long long *size, u32 *aspace,
1159 u32 *cycle, u32 *dwidth)
1160{
1161 int retval;
1162
1163 spin_lock(&image->lock);
1164
1165 retval = __tsi148_master_get(image, enabled, vme_base, size, aspace,
1166 cycle, dwidth);
1167
1168 spin_unlock(&image->lock);
1169
1170 return retval;
1171}
1172
1173static ssize_t tsi148_master_read(struct vme_master_resource *image, void *buf,
1174 size_t count, loff_t offset)
1175{
1176 int retval, enabled;
1177 unsigned long long vme_base, size;
1178 u32 aspace, cycle, dwidth;
1179 struct vme_error_handler *handler = NULL;
1180 struct vme_bridge *tsi148_bridge;
1181 void __iomem *addr = image->kern_base + offset;
1182 unsigned int done = 0;
1183 unsigned int count32;
1184
1185 tsi148_bridge = image->parent;
1186
1187 spin_lock(&image->lock);
1188
1189 if (err_chk) {
1190 __tsi148_master_get(image, &enabled, &vme_base, &size, &aspace,
1191 &cycle, &dwidth);
1192 handler = vme_register_error_handler(tsi148_bridge, aspace,
1193 vme_base + offset, count);
1194 if (!handler) {
1195 spin_unlock(&image->lock);
1196 return -ENOMEM;
1197 }
1198 }
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208 if ((uintptr_t)addr & 0x1) {
1209 *(u8 *)buf = ioread8(addr);
1210 done += 1;
1211 if (done == count)
1212 goto out;
1213 }
1214 if ((uintptr_t)(addr + done) & 0x2) {
1215 if ((count - done) < 2) {
1216 *(u8 *)(buf + done) = ioread8(addr + done);
1217 done += 1;
1218 goto out;
1219 } else {
1220 *(u16 *)(buf + done) = ioread16(addr + done);
1221 done += 2;
1222 }
1223 }
1224
1225 count32 = (count - done) & ~0x3;
1226 while (done < count32) {
1227 *(u32 *)(buf + done) = ioread32(addr + done);
1228 done += 4;
1229 }
1230
1231 if ((count - done) & 0x2) {
1232 *(u16 *)(buf + done) = ioread16(addr + done);
1233 done += 2;
1234 }
1235 if ((count - done) & 0x1) {
1236 *(u8 *)(buf + done) = ioread8(addr + done);
1237 done += 1;
1238 }
1239
1240out:
1241 retval = count;
1242
1243 if (err_chk) {
1244 if (handler->num_errors) {
1245 dev_err(image->parent->parent,
1246 "First VME read error detected an at address 0x%llx\n",
1247 handler->first_error);
1248 retval = handler->first_error - (vme_base + offset);
1249 }
1250 vme_unregister_error_handler(handler);
1251 }
1252
1253 spin_unlock(&image->lock);
1254
1255 return retval;
1256}
1257
1258
1259static ssize_t tsi148_master_write(struct vme_master_resource *image, void *buf,
1260 size_t count, loff_t offset)
1261{
1262 int retval = 0, enabled;
1263 unsigned long long vme_base, size;
1264 u32 aspace, cycle, dwidth;
1265 void __iomem *addr = image->kern_base + offset;
1266 unsigned int done = 0;
1267 unsigned int count32;
1268
1269 struct vme_error_handler *handler = NULL;
1270 struct vme_bridge *tsi148_bridge;
1271 struct tsi148_driver *bridge;
1272
1273 tsi148_bridge = image->parent;
1274
1275 bridge = tsi148_bridge->driver_priv;
1276
1277 spin_lock(&image->lock);
1278
1279 if (err_chk) {
1280 __tsi148_master_get(image, &enabled, &vme_base, &size, &aspace,
1281 &cycle, &dwidth);
1282 handler = vme_register_error_handler(tsi148_bridge, aspace,
1283 vme_base + offset, count);
1284 if (!handler) {
1285 spin_unlock(&image->lock);
1286 return -ENOMEM;
1287 }
1288 }
1289
1290
1291
1292
1293 if ((uintptr_t)addr & 0x1) {
1294 iowrite8(*(u8 *)buf, addr);
1295 done += 1;
1296 if (done == count)
1297 goto out;
1298 }
1299 if ((uintptr_t)(addr + done) & 0x2) {
1300 if ((count - done) < 2) {
1301 iowrite8(*(u8 *)(buf + done), addr + done);
1302 done += 1;
1303 goto out;
1304 } else {
1305 iowrite16(*(u16 *)(buf + done), addr + done);
1306 done += 2;
1307 }
1308 }
1309
1310 count32 = (count - done) & ~0x3;
1311 while (done < count32) {
1312 iowrite32(*(u32 *)(buf + done), addr + done);
1313 done += 4;
1314 }
1315
1316 if ((count - done) & 0x2) {
1317 iowrite16(*(u16 *)(buf + done), addr + done);
1318 done += 2;
1319 }
1320 if ((count - done) & 0x1) {
1321 iowrite8(*(u8 *)(buf + done), addr + done);
1322 done += 1;
1323 }
1324
1325out:
1326 retval = count;
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339 if (err_chk) {
1340 ioread16(bridge->flush_image->kern_base + 0x7F000);
1341
1342 if (handler->num_errors) {
1343 dev_warn(tsi148_bridge->parent,
1344 "First VME write error detected an at address 0x%llx\n",
1345 handler->first_error);
1346 retval = handler->first_error - (vme_base + offset);
1347 }
1348 vme_unregister_error_handler(handler);
1349 }
1350
1351 spin_unlock(&image->lock);
1352
1353 return retval;
1354}
1355
1356
1357
1358
1359
1360
1361static unsigned int tsi148_master_rmw(struct vme_master_resource *image,
1362 unsigned int mask, unsigned int compare, unsigned int swap,
1363 loff_t offset)
1364{
1365 unsigned long long pci_addr;
1366 unsigned int pci_addr_high, pci_addr_low;
1367 u32 tmp, result;
1368 int i;
1369 struct tsi148_driver *bridge;
1370
1371 bridge = image->parent->driver_priv;
1372
1373
1374 i = image->number;
1375
1376
1377 mutex_lock(&bridge->vme_rmw);
1378
1379
1380 spin_lock(&image->lock);
1381
1382 pci_addr_high = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
1383 TSI148_LCSR_OFFSET_OTSAU);
1384 pci_addr_low = ioread32be(bridge->base + TSI148_LCSR_OT[i] +
1385 TSI148_LCSR_OFFSET_OTSAL);
1386
1387 reg_join(pci_addr_high, pci_addr_low, &pci_addr);
1388 reg_split(pci_addr + offset, &pci_addr_high, &pci_addr_low);
1389
1390
1391 iowrite32be(mask, bridge->base + TSI148_LCSR_RMWEN);
1392 iowrite32be(compare, bridge->base + TSI148_LCSR_RMWC);
1393 iowrite32be(swap, bridge->base + TSI148_LCSR_RMWS);
1394 iowrite32be(pci_addr_high, bridge->base + TSI148_LCSR_RMWAU);
1395 iowrite32be(pci_addr_low, bridge->base + TSI148_LCSR_RMWAL);
1396
1397
1398 tmp = ioread32be(bridge->base + TSI148_LCSR_VMCTRL);
1399 tmp |= TSI148_LCSR_VMCTRL_RMWEN;
1400 iowrite32be(tmp, bridge->base + TSI148_LCSR_VMCTRL);
1401
1402
1403 result = ioread32be(image->kern_base + offset);
1404
1405
1406 tmp = ioread32be(bridge->base + TSI148_LCSR_VMCTRL);
1407 tmp &= ~TSI148_LCSR_VMCTRL_RMWEN;
1408 iowrite32be(tmp, bridge->base + TSI148_LCSR_VMCTRL);
1409
1410 spin_unlock(&image->lock);
1411
1412 mutex_unlock(&bridge->vme_rmw);
1413
1414 return result;
1415}
1416
1417static int tsi148_dma_set_vme_src_attributes(struct device *dev, __be32 *attr,
1418 u32 aspace, u32 cycle, u32 dwidth)
1419{
1420 u32 val;
1421
1422 val = be32_to_cpu(*attr);
1423
1424
1425 switch (cycle & (VME_2eSST160 | VME_2eSST267 | VME_2eSST320)) {
1426 case VME_2eSST160:
1427 val |= TSI148_LCSR_DSAT_2eSSTM_160;
1428 break;
1429 case VME_2eSST267:
1430 val |= TSI148_LCSR_DSAT_2eSSTM_267;
1431 break;
1432 case VME_2eSST320:
1433 val |= TSI148_LCSR_DSAT_2eSSTM_320;
1434 break;
1435 }
1436
1437
1438 if (cycle & VME_SCT)
1439 val |= TSI148_LCSR_DSAT_TM_SCT;
1440
1441 if (cycle & VME_BLT)
1442 val |= TSI148_LCSR_DSAT_TM_BLT;
1443
1444 if (cycle & VME_MBLT)
1445 val |= TSI148_LCSR_DSAT_TM_MBLT;
1446
1447 if (cycle & VME_2eVME)
1448 val |= TSI148_LCSR_DSAT_TM_2eVME;
1449
1450 if (cycle & VME_2eSST)
1451 val |= TSI148_LCSR_DSAT_TM_2eSST;
1452
1453 if (cycle & VME_2eSSTB) {
1454 dev_err(dev, "Currently not setting Broadcast Select "
1455 "Registers\n");
1456 val |= TSI148_LCSR_DSAT_TM_2eSSTB;
1457 }
1458
1459
1460 switch (dwidth) {
1461 case VME_D16:
1462 val |= TSI148_LCSR_DSAT_DBW_16;
1463 break;
1464 case VME_D32:
1465 val |= TSI148_LCSR_DSAT_DBW_32;
1466 break;
1467 default:
1468 dev_err(dev, "Invalid data width\n");
1469 return -EINVAL;
1470 }
1471
1472
1473 switch (aspace) {
1474 case VME_A16:
1475 val |= TSI148_LCSR_DSAT_AMODE_A16;
1476 break;
1477 case VME_A24:
1478 val |= TSI148_LCSR_DSAT_AMODE_A24;
1479 break;
1480 case VME_A32:
1481 val |= TSI148_LCSR_DSAT_AMODE_A32;
1482 break;
1483 case VME_A64:
1484 val |= TSI148_LCSR_DSAT_AMODE_A64;
1485 break;
1486 case VME_CRCSR:
1487 val |= TSI148_LCSR_DSAT_AMODE_CRCSR;
1488 break;
1489 case VME_USER1:
1490 val |= TSI148_LCSR_DSAT_AMODE_USER1;
1491 break;
1492 case VME_USER2:
1493 val |= TSI148_LCSR_DSAT_AMODE_USER2;
1494 break;
1495 case VME_USER3:
1496 val |= TSI148_LCSR_DSAT_AMODE_USER3;
1497 break;
1498 case VME_USER4:
1499 val |= TSI148_LCSR_DSAT_AMODE_USER4;
1500 break;
1501 default:
1502 dev_err(dev, "Invalid address space\n");
1503 return -EINVAL;
1504 }
1505
1506 if (cycle & VME_SUPER)
1507 val |= TSI148_LCSR_DSAT_SUP;
1508 if (cycle & VME_PROG)
1509 val |= TSI148_LCSR_DSAT_PGM;
1510
1511 *attr = cpu_to_be32(val);
1512
1513 return 0;
1514}
1515
1516static int tsi148_dma_set_vme_dest_attributes(struct device *dev, __be32 *attr,
1517 u32 aspace, u32 cycle, u32 dwidth)
1518{
1519 u32 val;
1520
1521 val = be32_to_cpu(*attr);
1522
1523
1524 switch (cycle & (VME_2eSST160 | VME_2eSST267 | VME_2eSST320)) {
1525 case VME_2eSST160:
1526 val |= TSI148_LCSR_DDAT_2eSSTM_160;
1527 break;
1528 case VME_2eSST267:
1529 val |= TSI148_LCSR_DDAT_2eSSTM_267;
1530 break;
1531 case VME_2eSST320:
1532 val |= TSI148_LCSR_DDAT_2eSSTM_320;
1533 break;
1534 }
1535
1536
1537 if (cycle & VME_SCT)
1538 val |= TSI148_LCSR_DDAT_TM_SCT;
1539
1540 if (cycle & VME_BLT)
1541 val |= TSI148_LCSR_DDAT_TM_BLT;
1542
1543 if (cycle & VME_MBLT)
1544 val |= TSI148_LCSR_DDAT_TM_MBLT;
1545
1546 if (cycle & VME_2eVME)
1547 val |= TSI148_LCSR_DDAT_TM_2eVME;
1548
1549 if (cycle & VME_2eSST)
1550 val |= TSI148_LCSR_DDAT_TM_2eSST;
1551
1552 if (cycle & VME_2eSSTB) {
1553 dev_err(dev, "Currently not setting Broadcast Select "
1554 "Registers\n");
1555 val |= TSI148_LCSR_DDAT_TM_2eSSTB;
1556 }
1557
1558
1559 switch (dwidth) {
1560 case VME_D16:
1561 val |= TSI148_LCSR_DDAT_DBW_16;
1562 break;
1563 case VME_D32:
1564 val |= TSI148_LCSR_DDAT_DBW_32;
1565 break;
1566 default:
1567 dev_err(dev, "Invalid data width\n");
1568 return -EINVAL;
1569 }
1570
1571
1572 switch (aspace) {
1573 case VME_A16:
1574 val |= TSI148_LCSR_DDAT_AMODE_A16;
1575 break;
1576 case VME_A24:
1577 val |= TSI148_LCSR_DDAT_AMODE_A24;
1578 break;
1579 case VME_A32:
1580 val |= TSI148_LCSR_DDAT_AMODE_A32;
1581 break;
1582 case VME_A64:
1583 val |= TSI148_LCSR_DDAT_AMODE_A64;
1584 break;
1585 case VME_CRCSR:
1586 val |= TSI148_LCSR_DDAT_AMODE_CRCSR;
1587 break;
1588 case VME_USER1:
1589 val |= TSI148_LCSR_DDAT_AMODE_USER1;
1590 break;
1591 case VME_USER2:
1592 val |= TSI148_LCSR_DDAT_AMODE_USER2;
1593 break;
1594 case VME_USER3:
1595 val |= TSI148_LCSR_DDAT_AMODE_USER3;
1596 break;
1597 case VME_USER4:
1598 val |= TSI148_LCSR_DDAT_AMODE_USER4;
1599 break;
1600 default:
1601 dev_err(dev, "Invalid address space\n");
1602 return -EINVAL;
1603 }
1604
1605 if (cycle & VME_SUPER)
1606 val |= TSI148_LCSR_DDAT_SUP;
1607 if (cycle & VME_PROG)
1608 val |= TSI148_LCSR_DDAT_PGM;
1609
1610 *attr = cpu_to_be32(val);
1611
1612 return 0;
1613}
1614
1615
1616
1617
1618
1619
1620static int tsi148_dma_list_add(struct vme_dma_list *list,
1621 struct vme_dma_attr *src, struct vme_dma_attr *dest, size_t count)
1622{
1623 struct tsi148_dma_entry *entry, *prev;
1624 u32 address_high, address_low, val;
1625 struct vme_dma_pattern *pattern_attr;
1626 struct vme_dma_pci *pci_attr;
1627 struct vme_dma_vme *vme_attr;
1628 int retval = 0;
1629 struct vme_bridge *tsi148_bridge;
1630
1631 tsi148_bridge = list->parent->parent;
1632
1633
1634 entry = kmalloc(sizeof(*entry), GFP_KERNEL);
1635 if (!entry) {
1636 retval = -ENOMEM;
1637 goto err_mem;
1638 }
1639
1640
1641 if ((unsigned long)&entry->descriptor & 0x7) {
1642 dev_err(tsi148_bridge->parent, "Descriptor not aligned to 8 "
1643 "byte boundary as required: %p\n",
1644 &entry->descriptor);
1645 retval = -EINVAL;
1646 goto err_align;
1647 }
1648
1649
1650
1651
1652 memset(&entry->descriptor, 0, sizeof(entry->descriptor));
1653
1654
1655 switch (src->type) {
1656 case VME_DMA_PATTERN:
1657 pattern_attr = src->private;
1658
1659 entry->descriptor.dsal = cpu_to_be32(pattern_attr->pattern);
1660
1661 val = TSI148_LCSR_DSAT_TYP_PAT;
1662
1663
1664 if (pattern_attr->type & VME_DMA_PATTERN_BYTE)
1665 val |= TSI148_LCSR_DSAT_PSZ;
1666
1667
1668 if ((pattern_attr->type & VME_DMA_PATTERN_INCREMENT) == 0)
1669 val |= TSI148_LCSR_DSAT_NIN;
1670 entry->descriptor.dsat = cpu_to_be32(val);
1671 break;
1672 case VME_DMA_PCI:
1673 pci_attr = src->private;
1674
1675 reg_split((unsigned long long)pci_attr->address, &address_high,
1676 &address_low);
1677 entry->descriptor.dsau = cpu_to_be32(address_high);
1678 entry->descriptor.dsal = cpu_to_be32(address_low);
1679 entry->descriptor.dsat = cpu_to_be32(TSI148_LCSR_DSAT_TYP_PCI);
1680 break;
1681 case VME_DMA_VME:
1682 vme_attr = src->private;
1683
1684 reg_split((unsigned long long)vme_attr->address, &address_high,
1685 &address_low);
1686 entry->descriptor.dsau = cpu_to_be32(address_high);
1687 entry->descriptor.dsal = cpu_to_be32(address_low);
1688 entry->descriptor.dsat = cpu_to_be32(TSI148_LCSR_DSAT_TYP_VME);
1689
1690 retval = tsi148_dma_set_vme_src_attributes(
1691 tsi148_bridge->parent, &entry->descriptor.dsat,
1692 vme_attr->aspace, vme_attr->cycle, vme_attr->dwidth);
1693 if (retval < 0)
1694 goto err_source;
1695 break;
1696 default:
1697 dev_err(tsi148_bridge->parent, "Invalid source type\n");
1698 retval = -EINVAL;
1699 goto err_source;
1700 }
1701
1702
1703 entry->descriptor.dnlau = cpu_to_be32(0);
1704 entry->descriptor.dnlal = cpu_to_be32(TSI148_LCSR_DNLAL_LLA);
1705
1706
1707 switch (dest->type) {
1708 case VME_DMA_PCI:
1709 pci_attr = dest->private;
1710
1711 reg_split((unsigned long long)pci_attr->address, &address_high,
1712 &address_low);
1713 entry->descriptor.ddau = cpu_to_be32(address_high);
1714 entry->descriptor.ddal = cpu_to_be32(address_low);
1715 entry->descriptor.ddat = cpu_to_be32(TSI148_LCSR_DDAT_TYP_PCI);
1716 break;
1717 case VME_DMA_VME:
1718 vme_attr = dest->private;
1719
1720 reg_split((unsigned long long)vme_attr->address, &address_high,
1721 &address_low);
1722 entry->descriptor.ddau = cpu_to_be32(address_high);
1723 entry->descriptor.ddal = cpu_to_be32(address_low);
1724 entry->descriptor.ddat = cpu_to_be32(TSI148_LCSR_DDAT_TYP_VME);
1725
1726 retval = tsi148_dma_set_vme_dest_attributes(
1727 tsi148_bridge->parent, &entry->descriptor.ddat,
1728 vme_attr->aspace, vme_attr->cycle, vme_attr->dwidth);
1729 if (retval < 0)
1730 goto err_dest;
1731 break;
1732 default:
1733 dev_err(tsi148_bridge->parent, "Invalid destination type\n");
1734 retval = -EINVAL;
1735 goto err_dest;
1736 }
1737
1738
1739 entry->descriptor.dcnt = cpu_to_be32((u32)count);
1740
1741
1742 list_add_tail(&entry->list, &list->entries);
1743
1744 entry->dma_handle = dma_map_single(tsi148_bridge->parent,
1745 &entry->descriptor,
1746 sizeof(entry->descriptor),
1747 DMA_TO_DEVICE);
1748 if (dma_mapping_error(tsi148_bridge->parent, entry->dma_handle)) {
1749 dev_err(tsi148_bridge->parent, "DMA mapping error\n");
1750 retval = -EINVAL;
1751 goto err_dma;
1752 }
1753
1754
1755 if (entry->list.prev != &list->entries) {
1756 reg_split((unsigned long long)entry->dma_handle, &address_high,
1757 &address_low);
1758 prev = list_entry(entry->list.prev, struct tsi148_dma_entry,
1759 list);
1760 prev->descriptor.dnlau = cpu_to_be32(address_high);
1761 prev->descriptor.dnlal = cpu_to_be32(address_low);
1762
1763 }
1764
1765 return 0;
1766
1767err_dma:
1768err_dest:
1769err_source:
1770err_align:
1771 kfree(entry);
1772err_mem:
1773 return retval;
1774}
1775
1776
1777
1778
1779static int tsi148_dma_busy(struct vme_bridge *tsi148_bridge, int channel)
1780{
1781 u32 tmp;
1782 struct tsi148_driver *bridge;
1783
1784 bridge = tsi148_bridge->driver_priv;
1785
1786 tmp = ioread32be(bridge->base + TSI148_LCSR_DMA[channel] +
1787 TSI148_LCSR_OFFSET_DSTA);
1788
1789 if (tmp & TSI148_LCSR_DSTA_BSY)
1790 return 0;
1791 else
1792 return 1;
1793
1794}
1795
1796
1797
1798
1799
1800
1801static int tsi148_dma_list_exec(struct vme_dma_list *list)
1802{
1803 struct vme_dma_resource *ctrlr;
1804 int channel, retval;
1805 struct tsi148_dma_entry *entry;
1806 u32 bus_addr_high, bus_addr_low;
1807 u32 val, dctlreg = 0;
1808 struct vme_bridge *tsi148_bridge;
1809 struct tsi148_driver *bridge;
1810
1811 ctrlr = list->parent;
1812
1813 tsi148_bridge = ctrlr->parent;
1814
1815 bridge = tsi148_bridge->driver_priv;
1816
1817 mutex_lock(&ctrlr->mtx);
1818
1819 channel = ctrlr->number;
1820
1821 if (!list_empty(&ctrlr->running)) {
1822
1823
1824
1825
1826
1827
1828 mutex_unlock(&ctrlr->mtx);
1829 return -EBUSY;
1830 } else {
1831 list_add(&list->list, &ctrlr->running);
1832 }
1833
1834
1835 entry = list_first_entry(&list->entries, struct tsi148_dma_entry,
1836 list);
1837
1838 mutex_unlock(&ctrlr->mtx);
1839
1840 reg_split(entry->dma_handle, &bus_addr_high, &bus_addr_low);
1841
1842 iowrite32be(bus_addr_high, bridge->base +
1843 TSI148_LCSR_DMA[channel] + TSI148_LCSR_OFFSET_DNLAU);
1844 iowrite32be(bus_addr_low, bridge->base +
1845 TSI148_LCSR_DMA[channel] + TSI148_LCSR_OFFSET_DNLAL);
1846
1847 dctlreg = ioread32be(bridge->base + TSI148_LCSR_DMA[channel] +
1848 TSI148_LCSR_OFFSET_DCTL);
1849
1850
1851 iowrite32be(dctlreg | TSI148_LCSR_DCTL_DGO, bridge->base +
1852 TSI148_LCSR_DMA[channel] + TSI148_LCSR_OFFSET_DCTL);
1853
1854 retval = wait_event_interruptible(bridge->dma_queue[channel],
1855 tsi148_dma_busy(ctrlr->parent, channel));
1856
1857 if (retval) {
1858 iowrite32be(dctlreg | TSI148_LCSR_DCTL_ABT, bridge->base +
1859 TSI148_LCSR_DMA[channel] + TSI148_LCSR_OFFSET_DCTL);
1860
1861 wait_event(bridge->dma_queue[channel],
1862 tsi148_dma_busy(ctrlr->parent, channel));
1863 retval = -EINTR;
1864 goto exit;
1865 }
1866
1867
1868
1869
1870
1871 val = ioread32be(bridge->base + TSI148_LCSR_DMA[channel] +
1872 TSI148_LCSR_OFFSET_DSTA);
1873
1874 if (val & TSI148_LCSR_DSTA_VBE) {
1875 dev_err(tsi148_bridge->parent, "DMA Error. DSTA=%08X\n", val);
1876 retval = -EIO;
1877 }
1878
1879exit:
1880
1881 mutex_lock(&ctrlr->mtx);
1882 list_del(&list->list);
1883 mutex_unlock(&ctrlr->mtx);
1884
1885 return retval;
1886}
1887
1888
1889
1890
1891
1892
1893static int tsi148_dma_list_empty(struct vme_dma_list *list)
1894{
1895 struct list_head *pos, *temp;
1896 struct tsi148_dma_entry *entry;
1897
1898 struct vme_bridge *tsi148_bridge = list->parent->parent;
1899
1900
1901 list_for_each_safe(pos, temp, &list->entries) {
1902 list_del(pos);
1903 entry = list_entry(pos, struct tsi148_dma_entry, list);
1904
1905 dma_unmap_single(tsi148_bridge->parent, entry->dma_handle,
1906 sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE);
1907 kfree(entry);
1908 }
1909
1910 return 0;
1911}
1912
1913
1914
1915
1916
1917
1918
1919
1920static int tsi148_lm_set(struct vme_lm_resource *lm, unsigned long long lm_base,
1921 u32 aspace, u32 cycle)
1922{
1923 u32 lm_base_high, lm_base_low, lm_ctl = 0;
1924 int i;
1925 struct vme_bridge *tsi148_bridge;
1926 struct tsi148_driver *bridge;
1927
1928 tsi148_bridge = lm->parent;
1929
1930 bridge = tsi148_bridge->driver_priv;
1931
1932 mutex_lock(&lm->mtx);
1933
1934
1935 for (i = 0; i < lm->monitors; i++) {
1936 if (bridge->lm_callback[i]) {
1937 mutex_unlock(&lm->mtx);
1938 dev_err(tsi148_bridge->parent, "Location monitor "
1939 "callback attached, can't reset\n");
1940 return -EBUSY;
1941 }
1942 }
1943
1944 switch (aspace) {
1945 case VME_A16:
1946 lm_ctl |= TSI148_LCSR_LMAT_AS_A16;
1947 break;
1948 case VME_A24:
1949 lm_ctl |= TSI148_LCSR_LMAT_AS_A24;
1950 break;
1951 case VME_A32:
1952 lm_ctl |= TSI148_LCSR_LMAT_AS_A32;
1953 break;
1954 case VME_A64:
1955 lm_ctl |= TSI148_LCSR_LMAT_AS_A64;
1956 break;
1957 default:
1958 mutex_unlock(&lm->mtx);
1959 dev_err(tsi148_bridge->parent, "Invalid address space\n");
1960 return -EINVAL;
1961 }
1962
1963 if (cycle & VME_SUPER)
1964 lm_ctl |= TSI148_LCSR_LMAT_SUPR ;
1965 if (cycle & VME_USER)
1966 lm_ctl |= TSI148_LCSR_LMAT_NPRIV;
1967 if (cycle & VME_PROG)
1968 lm_ctl |= TSI148_LCSR_LMAT_PGM;
1969 if (cycle & VME_DATA)
1970 lm_ctl |= TSI148_LCSR_LMAT_DATA;
1971
1972 reg_split(lm_base, &lm_base_high, &lm_base_low);
1973
1974 iowrite32be(lm_base_high, bridge->base + TSI148_LCSR_LMBAU);
1975 iowrite32be(lm_base_low, bridge->base + TSI148_LCSR_LMBAL);
1976 iowrite32be(lm_ctl, bridge->base + TSI148_LCSR_LMAT);
1977
1978 mutex_unlock(&lm->mtx);
1979
1980 return 0;
1981}
1982
1983
1984
1985
1986static int tsi148_lm_get(struct vme_lm_resource *lm,
1987 unsigned long long *lm_base, u32 *aspace, u32 *cycle)
1988{
1989 u32 lm_base_high, lm_base_low, lm_ctl, enabled = 0;
1990 struct tsi148_driver *bridge;
1991
1992 bridge = lm->parent->driver_priv;
1993
1994 mutex_lock(&lm->mtx);
1995
1996 lm_base_high = ioread32be(bridge->base + TSI148_LCSR_LMBAU);
1997 lm_base_low = ioread32be(bridge->base + TSI148_LCSR_LMBAL);
1998 lm_ctl = ioread32be(bridge->base + TSI148_LCSR_LMAT);
1999
2000 reg_join(lm_base_high, lm_base_low, lm_base);
2001
2002 if (lm_ctl & TSI148_LCSR_LMAT_EN)
2003 enabled = 1;
2004
2005 if ((lm_ctl & TSI148_LCSR_LMAT_AS_M) == TSI148_LCSR_LMAT_AS_A16)
2006 *aspace |= VME_A16;
2007
2008 if ((lm_ctl & TSI148_LCSR_LMAT_AS_M) == TSI148_LCSR_LMAT_AS_A24)
2009 *aspace |= VME_A24;
2010
2011 if ((lm_ctl & TSI148_LCSR_LMAT_AS_M) == TSI148_LCSR_LMAT_AS_A32)
2012 *aspace |= VME_A32;
2013
2014 if ((lm_ctl & TSI148_LCSR_LMAT_AS_M) == TSI148_LCSR_LMAT_AS_A64)
2015 *aspace |= VME_A64;
2016
2017
2018 if (lm_ctl & TSI148_LCSR_LMAT_SUPR)
2019 *cycle |= VME_SUPER;
2020 if (lm_ctl & TSI148_LCSR_LMAT_NPRIV)
2021 *cycle |= VME_USER;
2022 if (lm_ctl & TSI148_LCSR_LMAT_PGM)
2023 *cycle |= VME_PROG;
2024 if (lm_ctl & TSI148_LCSR_LMAT_DATA)
2025 *cycle |= VME_DATA;
2026
2027 mutex_unlock(&lm->mtx);
2028
2029 return enabled;
2030}
2031
2032
2033
2034
2035
2036
2037static int tsi148_lm_attach(struct vme_lm_resource *lm, int monitor,
2038 void (*callback)(void *), void *data)
2039{
2040 u32 lm_ctl, tmp;
2041 struct vme_bridge *tsi148_bridge;
2042 struct tsi148_driver *bridge;
2043
2044 tsi148_bridge = lm->parent;
2045
2046 bridge = tsi148_bridge->driver_priv;
2047
2048 mutex_lock(&lm->mtx);
2049
2050
2051 lm_ctl = ioread32be(bridge->base + TSI148_LCSR_LMAT);
2052 if ((lm_ctl & (TSI148_LCSR_LMAT_PGM | TSI148_LCSR_LMAT_DATA)) == 0) {
2053 mutex_unlock(&lm->mtx);
2054 dev_err(tsi148_bridge->parent, "Location monitor not properly "
2055 "configured\n");
2056 return -EINVAL;
2057 }
2058
2059
2060 if (bridge->lm_callback[monitor]) {
2061 mutex_unlock(&lm->mtx);
2062 dev_err(tsi148_bridge->parent, "Existing callback attached\n");
2063 return -EBUSY;
2064 }
2065
2066
2067 bridge->lm_callback[monitor] = callback;
2068 bridge->lm_data[monitor] = data;
2069
2070
2071 tmp = ioread32be(bridge->base + TSI148_LCSR_INTEN);
2072 tmp |= TSI148_LCSR_INTEN_LMEN[monitor];
2073 iowrite32be(tmp, bridge->base + TSI148_LCSR_INTEN);
2074
2075 tmp = ioread32be(bridge->base + TSI148_LCSR_INTEO);
2076 tmp |= TSI148_LCSR_INTEO_LMEO[monitor];
2077 iowrite32be(tmp, bridge->base + TSI148_LCSR_INTEO);
2078
2079
2080 if ((lm_ctl & TSI148_LCSR_LMAT_EN) == 0) {
2081 lm_ctl |= TSI148_LCSR_LMAT_EN;
2082 iowrite32be(lm_ctl, bridge->base + TSI148_LCSR_LMAT);
2083 }
2084
2085 mutex_unlock(&lm->mtx);
2086
2087 return 0;
2088}
2089
2090
2091
2092
2093static int tsi148_lm_detach(struct vme_lm_resource *lm, int monitor)
2094{
2095 u32 lm_en, tmp;
2096 struct tsi148_driver *bridge;
2097
2098 bridge = lm->parent->driver_priv;
2099
2100 mutex_lock(&lm->mtx);
2101
2102
2103 lm_en = ioread32be(bridge->base + TSI148_LCSR_INTEN);
2104 lm_en &= ~TSI148_LCSR_INTEN_LMEN[monitor];
2105 iowrite32be(lm_en, bridge->base + TSI148_LCSR_INTEN);
2106
2107 tmp = ioread32be(bridge->base + TSI148_LCSR_INTEO);
2108 tmp &= ~TSI148_LCSR_INTEO_LMEO[monitor];
2109 iowrite32be(tmp, bridge->base + TSI148_LCSR_INTEO);
2110
2111 iowrite32be(TSI148_LCSR_INTC_LMC[monitor],
2112 bridge->base + TSI148_LCSR_INTC);
2113
2114
2115 bridge->lm_callback[monitor] = NULL;
2116 bridge->lm_data[monitor] = NULL;
2117
2118
2119 if ((lm_en & (TSI148_LCSR_INTS_LM0S | TSI148_LCSR_INTS_LM1S |
2120 TSI148_LCSR_INTS_LM2S | TSI148_LCSR_INTS_LM3S)) == 0) {
2121 tmp = ioread32be(bridge->base + TSI148_LCSR_LMAT);
2122 tmp &= ~TSI148_LCSR_LMAT_EN;
2123 iowrite32be(tmp, bridge->base + TSI148_LCSR_LMAT);
2124 }
2125
2126 mutex_unlock(&lm->mtx);
2127
2128 return 0;
2129}
2130
2131
2132
2133
2134static int tsi148_slot_get(struct vme_bridge *tsi148_bridge)
2135{
2136 u32 slot = 0;
2137 struct tsi148_driver *bridge;
2138
2139 bridge = tsi148_bridge->driver_priv;
2140
2141 if (!geoid) {
2142 slot = ioread32be(bridge->base + TSI148_LCSR_VSTAT);
2143 slot = slot & TSI148_LCSR_VSTAT_GA_M;
2144 } else
2145 slot = geoid;
2146
2147 return (int)slot;
2148}
2149
2150static void *tsi148_alloc_consistent(struct device *parent, size_t size,
2151 dma_addr_t *dma)
2152{
2153 struct pci_dev *pdev;
2154
2155
2156 pdev = to_pci_dev(parent);
2157
2158 return dma_alloc_coherent(&pdev->dev, size, dma, GFP_KERNEL);
2159}
2160
2161static void tsi148_free_consistent(struct device *parent, size_t size,
2162 void *vaddr, dma_addr_t dma)
2163{
2164 struct pci_dev *pdev;
2165
2166
2167 pdev = to_pci_dev(parent);
2168
2169 dma_free_coherent(&pdev->dev, size, vaddr, dma);
2170}
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184static int tsi148_crcsr_init(struct vme_bridge *tsi148_bridge,
2185 struct pci_dev *pdev)
2186{
2187 u32 cbar, crat, vstat;
2188 u32 crcsr_bus_high, crcsr_bus_low;
2189 int retval;
2190 struct tsi148_driver *bridge;
2191
2192 bridge = tsi148_bridge->driver_priv;
2193
2194
2195 bridge->crcsr_kernel = dma_alloc_coherent(&pdev->dev,
2196 VME_CRCSR_BUF_SIZE,
2197 &bridge->crcsr_bus, GFP_KERNEL);
2198 if (!bridge->crcsr_kernel) {
2199 dev_err(tsi148_bridge->parent, "Failed to allocate memory for "
2200 "CR/CSR image\n");
2201 return -ENOMEM;
2202 }
2203
2204 reg_split(bridge->crcsr_bus, &crcsr_bus_high, &crcsr_bus_low);
2205
2206 iowrite32be(crcsr_bus_high, bridge->base + TSI148_LCSR_CROU);
2207 iowrite32be(crcsr_bus_low, bridge->base + TSI148_LCSR_CROL);
2208
2209
2210 cbar = ioread32be(bridge->base + TSI148_CBAR);
2211 cbar = (cbar & TSI148_CRCSR_CBAR_M)>>3;
2212
2213 vstat = tsi148_slot_get(tsi148_bridge);
2214
2215 if (cbar != vstat) {
2216 cbar = vstat;
2217 dev_info(tsi148_bridge->parent, "Setting CR/CSR offset\n");
2218 iowrite32be(cbar<<3, bridge->base + TSI148_CBAR);
2219 }
2220 dev_info(tsi148_bridge->parent, "CR/CSR Offset: %d\n", cbar);
2221
2222 crat = ioread32be(bridge->base + TSI148_LCSR_CRAT);
2223 if (crat & TSI148_LCSR_CRAT_EN)
2224 dev_info(tsi148_bridge->parent, "CR/CSR already enabled\n");
2225 else {
2226 dev_info(tsi148_bridge->parent, "Enabling CR/CSR space\n");
2227 iowrite32be(crat | TSI148_LCSR_CRAT_EN,
2228 bridge->base + TSI148_LCSR_CRAT);
2229 }
2230
2231
2232
2233
2234
2235 if (err_chk) {
2236 retval = tsi148_master_set(bridge->flush_image, 1,
2237 (vstat * 0x80000), 0x80000, VME_CRCSR, VME_SCT,
2238 VME_D16);
2239 if (retval)
2240 dev_err(tsi148_bridge->parent, "Configuring flush image"
2241 " failed\n");
2242 }
2243
2244 return 0;
2245
2246}
2247
2248static void tsi148_crcsr_exit(struct vme_bridge *tsi148_bridge,
2249 struct pci_dev *pdev)
2250{
2251 u32 crat;
2252 struct tsi148_driver *bridge;
2253
2254 bridge = tsi148_bridge->driver_priv;
2255
2256
2257 crat = ioread32be(bridge->base + TSI148_LCSR_CRAT);
2258 iowrite32be(crat & ~TSI148_LCSR_CRAT_EN,
2259 bridge->base + TSI148_LCSR_CRAT);
2260
2261
2262 iowrite32be(0, bridge->base + TSI148_LCSR_CROU);
2263 iowrite32be(0, bridge->base + TSI148_LCSR_CROL);
2264
2265 dma_free_coherent(&pdev->dev, VME_CRCSR_BUF_SIZE,
2266 bridge->crcsr_kernel, bridge->crcsr_bus);
2267}
2268
2269static int tsi148_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2270{
2271 int retval, i, master_num;
2272 u32 data;
2273 struct list_head *pos = NULL, *n;
2274 struct vme_bridge *tsi148_bridge;
2275 struct tsi148_driver *tsi148_device;
2276 struct vme_master_resource *master_image;
2277 struct vme_slave_resource *slave_image;
2278 struct vme_dma_resource *dma_ctrlr;
2279 struct vme_lm_resource *lm;
2280
2281
2282
2283
2284 tsi148_bridge = kzalloc(sizeof(*tsi148_bridge), GFP_KERNEL);
2285 if (!tsi148_bridge) {
2286 retval = -ENOMEM;
2287 goto err_struct;
2288 }
2289 vme_init_bridge(tsi148_bridge);
2290
2291 tsi148_device = kzalloc(sizeof(*tsi148_device), GFP_KERNEL);
2292 if (!tsi148_device) {
2293 retval = -ENOMEM;
2294 goto err_driver;
2295 }
2296
2297 tsi148_bridge->driver_priv = tsi148_device;
2298
2299
2300 retval = pci_enable_device(pdev);
2301 if (retval) {
2302 dev_err(&pdev->dev, "Unable to enable device\n");
2303 goto err_enable;
2304 }
2305
2306
2307 retval = pci_request_regions(pdev, driver_name);
2308 if (retval) {
2309 dev_err(&pdev->dev, "Unable to reserve resources\n");
2310 goto err_resource;
2311 }
2312
2313
2314 tsi148_device->base = ioremap(pci_resource_start(pdev, 0),
2315 4096);
2316 if (!tsi148_device->base) {
2317 dev_err(&pdev->dev, "Unable to remap CRG region\n");
2318 retval = -EIO;
2319 goto err_remap;
2320 }
2321
2322
2323 data = ioread32(tsi148_device->base + TSI148_PCFS_ID) & 0x0000FFFF;
2324 if (data != PCI_VENDOR_ID_TUNDRA) {
2325 dev_err(&pdev->dev, "CRG region check failed\n");
2326 retval = -EIO;
2327 goto err_test;
2328 }
2329
2330
2331 init_waitqueue_head(&tsi148_device->dma_queue[0]);
2332 init_waitqueue_head(&tsi148_device->dma_queue[1]);
2333 init_waitqueue_head(&tsi148_device->iack_queue);
2334 mutex_init(&tsi148_device->vme_int);
2335 mutex_init(&tsi148_device->vme_rmw);
2336
2337 tsi148_bridge->parent = &pdev->dev;
2338 strcpy(tsi148_bridge->name, driver_name);
2339
2340
2341 retval = tsi148_irq_init(tsi148_bridge);
2342 if (retval != 0) {
2343 dev_err(&pdev->dev, "Chip Initialization failed.\n");
2344 goto err_irq;
2345 }
2346
2347
2348
2349
2350
2351
2352 master_num = TSI148_MAX_MASTER;
2353 if (err_chk) {
2354 master_num--;
2355
2356 tsi148_device->flush_image =
2357 kmalloc(sizeof(*tsi148_device->flush_image),
2358 GFP_KERNEL);
2359 if (!tsi148_device->flush_image) {
2360 retval = -ENOMEM;
2361 goto err_master;
2362 }
2363 tsi148_device->flush_image->parent = tsi148_bridge;
2364 spin_lock_init(&tsi148_device->flush_image->lock);
2365 tsi148_device->flush_image->locked = 1;
2366 tsi148_device->flush_image->number = master_num;
2367 memset(&tsi148_device->flush_image->bus_resource, 0,
2368 sizeof(tsi148_device->flush_image->bus_resource));
2369 tsi148_device->flush_image->kern_base = NULL;
2370 }
2371
2372
2373 for (i = 0; i < master_num; i++) {
2374 master_image = kmalloc(sizeof(*master_image), GFP_KERNEL);
2375 if (!master_image) {
2376 retval = -ENOMEM;
2377 goto err_master;
2378 }
2379 master_image->parent = tsi148_bridge;
2380 spin_lock_init(&master_image->lock);
2381 master_image->locked = 0;
2382 master_image->number = i;
2383 master_image->address_attr = VME_A16 | VME_A24 | VME_A32 |
2384 VME_A64 | VME_CRCSR | VME_USER1 | VME_USER2 |
2385 VME_USER3 | VME_USER4;
2386 master_image->cycle_attr = VME_SCT | VME_BLT | VME_MBLT |
2387 VME_2eVME | VME_2eSST | VME_2eSSTB | VME_2eSST160 |
2388 VME_2eSST267 | VME_2eSST320 | VME_SUPER | VME_USER |
2389 VME_PROG | VME_DATA;
2390 master_image->width_attr = VME_D16 | VME_D32;
2391 memset(&master_image->bus_resource, 0,
2392 sizeof(master_image->bus_resource));
2393 master_image->kern_base = NULL;
2394 list_add_tail(&master_image->list,
2395 &tsi148_bridge->master_resources);
2396 }
2397
2398
2399 for (i = 0; i < TSI148_MAX_SLAVE; i++) {
2400 slave_image = kmalloc(sizeof(*slave_image), GFP_KERNEL);
2401 if (!slave_image) {
2402 retval = -ENOMEM;
2403 goto err_slave;
2404 }
2405 slave_image->parent = tsi148_bridge;
2406 mutex_init(&slave_image->mtx);
2407 slave_image->locked = 0;
2408 slave_image->number = i;
2409 slave_image->address_attr = VME_A16 | VME_A24 | VME_A32 |
2410 VME_A64;
2411 slave_image->cycle_attr = VME_SCT | VME_BLT | VME_MBLT |
2412 VME_2eVME | VME_2eSST | VME_2eSSTB | VME_2eSST160 |
2413 VME_2eSST267 | VME_2eSST320 | VME_SUPER | VME_USER |
2414 VME_PROG | VME_DATA;
2415 list_add_tail(&slave_image->list,
2416 &tsi148_bridge->slave_resources);
2417 }
2418
2419
2420 for (i = 0; i < TSI148_MAX_DMA; i++) {
2421 dma_ctrlr = kmalloc(sizeof(*dma_ctrlr), GFP_KERNEL);
2422 if (!dma_ctrlr) {
2423 retval = -ENOMEM;
2424 goto err_dma;
2425 }
2426 dma_ctrlr->parent = tsi148_bridge;
2427 mutex_init(&dma_ctrlr->mtx);
2428 dma_ctrlr->locked = 0;
2429 dma_ctrlr->number = i;
2430 dma_ctrlr->route_attr = VME_DMA_VME_TO_MEM |
2431 VME_DMA_MEM_TO_VME | VME_DMA_VME_TO_VME |
2432 VME_DMA_MEM_TO_MEM | VME_DMA_PATTERN_TO_VME |
2433 VME_DMA_PATTERN_TO_MEM;
2434 INIT_LIST_HEAD(&dma_ctrlr->pending);
2435 INIT_LIST_HEAD(&dma_ctrlr->running);
2436 list_add_tail(&dma_ctrlr->list,
2437 &tsi148_bridge->dma_resources);
2438 }
2439
2440
2441 lm = kmalloc(sizeof(*lm), GFP_KERNEL);
2442 if (!lm) {
2443 retval = -ENOMEM;
2444 goto err_lm;
2445 }
2446 lm->parent = tsi148_bridge;
2447 mutex_init(&lm->mtx);
2448 lm->locked = 0;
2449 lm->number = 1;
2450 lm->monitors = 4;
2451 list_add_tail(&lm->list, &tsi148_bridge->lm_resources);
2452
2453 tsi148_bridge->slave_get = tsi148_slave_get;
2454 tsi148_bridge->slave_set = tsi148_slave_set;
2455 tsi148_bridge->master_get = tsi148_master_get;
2456 tsi148_bridge->master_set = tsi148_master_set;
2457 tsi148_bridge->master_read = tsi148_master_read;
2458 tsi148_bridge->master_write = tsi148_master_write;
2459 tsi148_bridge->master_rmw = tsi148_master_rmw;
2460 tsi148_bridge->dma_list_add = tsi148_dma_list_add;
2461 tsi148_bridge->dma_list_exec = tsi148_dma_list_exec;
2462 tsi148_bridge->dma_list_empty = tsi148_dma_list_empty;
2463 tsi148_bridge->irq_set = tsi148_irq_set;
2464 tsi148_bridge->irq_generate = tsi148_irq_generate;
2465 tsi148_bridge->lm_set = tsi148_lm_set;
2466 tsi148_bridge->lm_get = tsi148_lm_get;
2467 tsi148_bridge->lm_attach = tsi148_lm_attach;
2468 tsi148_bridge->lm_detach = tsi148_lm_detach;
2469 tsi148_bridge->slot_get = tsi148_slot_get;
2470 tsi148_bridge->alloc_consistent = tsi148_alloc_consistent;
2471 tsi148_bridge->free_consistent = tsi148_free_consistent;
2472
2473 data = ioread32be(tsi148_device->base + TSI148_LCSR_VSTAT);
2474 dev_info(&pdev->dev, "Board is%s the VME system controller\n",
2475 (data & TSI148_LCSR_VSTAT_SCONS) ? "" : " not");
2476 if (!geoid)
2477 dev_info(&pdev->dev, "VME geographical address is %d\n",
2478 data & TSI148_LCSR_VSTAT_GA_M);
2479 else
2480 dev_info(&pdev->dev, "VME geographical address is set to %d\n",
2481 geoid);
2482
2483 dev_info(&pdev->dev, "VME Write and flush and error check is %s\n",
2484 err_chk ? "enabled" : "disabled");
2485
2486 retval = tsi148_crcsr_init(tsi148_bridge, pdev);
2487 if (retval) {
2488 dev_err(&pdev->dev, "CR/CSR configuration failed.\n");
2489 goto err_crcsr;
2490 }
2491
2492 retval = vme_register_bridge(tsi148_bridge);
2493 if (retval != 0) {
2494 dev_err(&pdev->dev, "Chip Registration failed.\n");
2495 goto err_reg;
2496 }
2497
2498 pci_set_drvdata(pdev, tsi148_bridge);
2499
2500
2501 data = ioread32be(tsi148_device->base + TSI148_LCSR_VSTAT);
2502 data &= ~TSI148_LCSR_VSTAT_BRDFL;
2503 data |= TSI148_LCSR_VSTAT_CPURST;
2504 iowrite32be(data, tsi148_device->base + TSI148_LCSR_VSTAT);
2505
2506 return 0;
2507
2508err_reg:
2509 tsi148_crcsr_exit(tsi148_bridge, pdev);
2510err_crcsr:
2511err_lm:
2512
2513 list_for_each_safe(pos, n, &tsi148_bridge->lm_resources) {
2514 lm = list_entry(pos, struct vme_lm_resource, list);
2515 list_del(pos);
2516 kfree(lm);
2517 }
2518err_dma:
2519
2520 list_for_each_safe(pos, n, &tsi148_bridge->dma_resources) {
2521 dma_ctrlr = list_entry(pos, struct vme_dma_resource, list);
2522 list_del(pos);
2523 kfree(dma_ctrlr);
2524 }
2525err_slave:
2526
2527 list_for_each_safe(pos, n, &tsi148_bridge->slave_resources) {
2528 slave_image = list_entry(pos, struct vme_slave_resource, list);
2529 list_del(pos);
2530 kfree(slave_image);
2531 }
2532err_master:
2533
2534 list_for_each_safe(pos, n, &tsi148_bridge->master_resources) {
2535 master_image = list_entry(pos, struct vme_master_resource,
2536 list);
2537 list_del(pos);
2538 kfree(master_image);
2539 }
2540
2541 tsi148_irq_exit(tsi148_bridge, pdev);
2542err_irq:
2543err_test:
2544 iounmap(tsi148_device->base);
2545err_remap:
2546 pci_release_regions(pdev);
2547err_resource:
2548 pci_disable_device(pdev);
2549err_enable:
2550 kfree(tsi148_device);
2551err_driver:
2552 kfree(tsi148_bridge);
2553err_struct:
2554 return retval;
2555
2556}
2557
2558static void tsi148_remove(struct pci_dev *pdev)
2559{
2560 struct list_head *pos = NULL;
2561 struct list_head *tmplist;
2562 struct vme_master_resource *master_image;
2563 struct vme_slave_resource *slave_image;
2564 struct vme_dma_resource *dma_ctrlr;
2565 int i;
2566 struct tsi148_driver *bridge;
2567 struct vme_bridge *tsi148_bridge = pci_get_drvdata(pdev);
2568
2569 bridge = tsi148_bridge->driver_priv;
2570
2571
2572 dev_dbg(&pdev->dev, "Driver is being unloaded.\n");
2573
2574
2575
2576
2577 for (i = 0; i < 8; i++) {
2578 iowrite32be(0, bridge->base + TSI148_LCSR_IT[i] +
2579 TSI148_LCSR_OFFSET_ITAT);
2580 iowrite32be(0, bridge->base + TSI148_LCSR_OT[i] +
2581 TSI148_LCSR_OFFSET_OTAT);
2582 }
2583
2584
2585
2586
2587 iowrite32be(0, bridge->base + TSI148_LCSR_LMAT);
2588
2589
2590
2591
2592 iowrite32be(0, bridge->base + TSI148_LCSR_CSRAT);
2593
2594
2595
2596
2597 iowrite32be(0xFFFFFFFF, bridge->base + TSI148_LCSR_EDPAT);
2598 iowrite32be(0xFFFFFFFF, bridge->base + TSI148_LCSR_VEAT);
2599 iowrite32be(0x07000700, bridge->base + TSI148_LCSR_PSTAT);
2600
2601
2602
2603
2604 if (ioread32be(bridge->base + TSI148_LCSR_VICR) & 0x800)
2605 iowrite32be(0x8000, bridge->base + TSI148_LCSR_VICR);
2606
2607
2608
2609
2610 iowrite32be(0x0, bridge->base + TSI148_LCSR_INTM1);
2611 iowrite32be(0x0, bridge->base + TSI148_LCSR_INTM2);
2612
2613 tsi148_irq_exit(tsi148_bridge, pdev);
2614
2615 vme_unregister_bridge(tsi148_bridge);
2616
2617 tsi148_crcsr_exit(tsi148_bridge, pdev);
2618
2619
2620 list_for_each_safe(pos, tmplist, &tsi148_bridge->dma_resources) {
2621 dma_ctrlr = list_entry(pos, struct vme_dma_resource, list);
2622 list_del(pos);
2623 kfree(dma_ctrlr);
2624 }
2625
2626
2627 list_for_each_safe(pos, tmplist, &tsi148_bridge->slave_resources) {
2628 slave_image = list_entry(pos, struct vme_slave_resource, list);
2629 list_del(pos);
2630 kfree(slave_image);
2631 }
2632
2633
2634 list_for_each_safe(pos, tmplist, &tsi148_bridge->master_resources) {
2635 master_image = list_entry(pos, struct vme_master_resource,
2636 list);
2637 list_del(pos);
2638 kfree(master_image);
2639 }
2640
2641 iounmap(bridge->base);
2642
2643 pci_release_regions(pdev);
2644
2645 pci_disable_device(pdev);
2646
2647 kfree(tsi148_bridge->driver_priv);
2648
2649 kfree(tsi148_bridge);
2650}
2651
2652module_pci_driver(tsi148_driver);
2653
2654MODULE_PARM_DESC(err_chk, "Check for VME errors on reads and writes");
2655module_param(err_chk, bool, 0);
2656
2657MODULE_PARM_DESC(geoid, "Override geographical addressing");
2658module_param(geoid, int, 0);
2659
2660MODULE_DESCRIPTION("VME driver for the Tundra Tempe VME bridge");
2661MODULE_LICENSE("GPL");
2662