1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include <linux/types.h>
35#include <linux/kernel.h>
36#include <linux/init.h>
37#include <linux/mm.h>
38#include <linux/spinlock.h>
39#include <linux/slab.h>
40#include <linux/string.h>
41#include <linux/pci.h>
42#include <linux/reboot.h>
43#include <linux/proc_fs.h>
44#include <linux/seq_file.h>
45#include <linux/scatterlist.h>
46#include <linux/iommu-helper.h>
47
48#include <asm/byteorder.h>
49#include <asm/cache.h>
50#include <asm/uaccess.h>
51#include <asm/page.h>
52#include <asm/dma.h>
53#include <asm/io.h>
54#include <asm/hardware.h>
55#include <asm/parisc-device.h>
56
57
58
59
60
61#define MODULE_NAME "ccio"
62
63#undef DEBUG_CCIO_RES
64#undef DEBUG_CCIO_RUN
65#undef DEBUG_CCIO_INIT
66#undef DEBUG_CCIO_RUN_SG
67
68#ifdef CONFIG_PROC_FS
69
70#undef CCIO_COLLECT_STATS
71#endif
72
73#include <asm/runway.h>
74
75#ifdef DEBUG_CCIO_INIT
76#define DBG_INIT(x...) printk(x)
77#else
78#define DBG_INIT(x...)
79#endif
80
81#ifdef DEBUG_CCIO_RUN
82#define DBG_RUN(x...) printk(x)
83#else
84#define DBG_RUN(x...)
85#endif
86
87#ifdef DEBUG_CCIO_RES
88#define DBG_RES(x...) printk(x)
89#else
90#define DBG_RES(x...)
91#endif
92
93#ifdef DEBUG_CCIO_RUN_SG
94#define DBG_RUN_SG(x...) printk(x)
95#else
96#define DBG_RUN_SG(x...)
97#endif
98
99#define CCIO_INLINE inline
100#define WRITE_U32(value, addr) __raw_writel(value, addr)
101#define READ_U32(addr) __raw_readl(addr)
102
103#define U2_IOA_RUNWAY 0x580
104#define U2_BC_GSC 0x501
105#define UTURN_IOA_RUNWAY 0x581
106#define UTURN_BC_GSC 0x502
107
108#define IOA_NORMAL_MODE 0x00020080
109#define CMD_TLB_DIRECT_WRITE 35
110#define CMD_TLB_PURGE 33
111
112struct ioa_registers {
113
114 int32_t unused1[12];
115 uint32_t io_command;
116 uint32_t io_status;
117 uint32_t io_control;
118 int32_t unused2[1];
119
120
121 uint32_t io_err_resp;
122 uint32_t io_err_info;
123 uint32_t io_err_req;
124 uint32_t io_err_resp_hi;
125 uint32_t io_tlb_entry_m;
126 uint32_t io_tlb_entry_l;
127 uint32_t unused3[1];
128 uint32_t io_pdir_base;
129 uint32_t io_io_low_hv;
130 uint32_t io_io_high_hv;
131 uint32_t unused4[1];
132 uint32_t io_chain_id_mask;
133 uint32_t unused5[2];
134 uint32_t io_io_low;
135 uint32_t io_io_high;
136};
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224struct ioc {
225 struct ioa_registers __iomem *ioc_regs;
226 u8 *res_map;
227 u64 *pdir_base;
228 u32 pdir_size;
229 u32 res_hint;
230
231 u32 res_size;
232 spinlock_t res_lock;
233
234#ifdef CCIO_COLLECT_STATS
235#define CCIO_SEARCH_SAMPLE 0x100
236 unsigned long avg_search[CCIO_SEARCH_SAMPLE];
237 unsigned long avg_idx;
238 unsigned long used_pages;
239 unsigned long msingle_calls;
240 unsigned long msingle_pages;
241 unsigned long msg_calls;
242 unsigned long msg_pages;
243 unsigned long usingle_calls;
244 unsigned long usingle_pages;
245 unsigned long usg_calls;
246 unsigned long usg_pages;
247#endif
248 unsigned short cujo20_bug;
249
250
251 u32 chainid_shift;
252 struct ioc *next;
253 const char *name;
254 unsigned int hw_path;
255 struct pci_dev *fake_pci_dev;
256 struct resource mmio_region[2];
257};
258
259static struct ioc *ioc_list;
260static int ioc_count;
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277#define IOVP_SIZE PAGE_SIZE
278#define IOVP_SHIFT PAGE_SHIFT
279#define IOVP_MASK PAGE_MASK
280
281
282#define CCIO_IOVA(iovp,offset) ((iovp) | (offset))
283#define CCIO_IOVP(iova) ((iova) & IOVP_MASK)
284
285#define PDIR_INDEX(iovp) ((iovp)>>IOVP_SHIFT)
286#define MKIOVP(pdir_idx) ((long)(pdir_idx) << IOVP_SHIFT)
287#define MKIOVA(iovp,offset) (dma_addr_t)((long)iovp | (long)offset)
288
289
290
291
292
293
294#define CCIO_SEARCH_LOOP(ioc, res_idx, mask, size) \
295 for(; res_ptr < res_end; ++res_ptr) { \
296 int ret;\
297 unsigned int idx;\
298 idx = (unsigned int)((unsigned long)res_ptr - (unsigned long)ioc->res_map); \
299 ret = iommu_is_span_boundary(idx << 3, pages_needed, 0, boundary_size);\
300 if ((0 == (*res_ptr & mask)) && !ret) { \
301 *res_ptr |= mask; \
302 res_idx = idx;\
303 ioc->res_hint = res_idx + (size >> 3); \
304 goto resource_found; \
305 } \
306 }
307
308#define CCIO_FIND_FREE_MAPPING(ioa, res_idx, mask, size) \
309 u##size *res_ptr = (u##size *)&((ioc)->res_map[ioa->res_hint & ~((size >> 3) - 1)]); \
310 u##size *res_end = (u##size *)&(ioc)->res_map[ioa->res_size]; \
311 CCIO_SEARCH_LOOP(ioc, res_idx, mask, size); \
312 res_ptr = (u##size *)&(ioc)->res_map[0]; \
313 CCIO_SEARCH_LOOP(ioa, res_idx, mask, size);
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338static int
339ccio_alloc_range(struct ioc *ioc, struct device *dev, size_t size)
340{
341 unsigned int pages_needed = size >> IOVP_SHIFT;
342 unsigned int res_idx;
343 unsigned long boundary_size;
344#ifdef CCIO_COLLECT_STATS
345 unsigned long cr_start = mfctl(16);
346#endif
347
348 BUG_ON(pages_needed == 0);
349 BUG_ON((pages_needed * IOVP_SIZE) > DMA_CHUNK_SIZE);
350
351 DBG_RES("%s() size: %d pages_needed %d\n",
352 __func__, size, pages_needed);
353
354
355
356
357
358
359 boundary_size = ALIGN((unsigned long long)dma_get_seg_boundary(dev) + 1,
360 1ULL << IOVP_SHIFT) >> IOVP_SHIFT;
361
362 if (pages_needed <= 8) {
363
364
365
366
367
368#if 0
369
370
371
372
373 unsigned long mask = ~(~0UL >> pages_needed);
374 CCIO_FIND_FREE_MAPPING(ioc, res_idx, mask, 8);
375#else
376 CCIO_FIND_FREE_MAPPING(ioc, res_idx, 0xff, 8);
377#endif
378 } else if (pages_needed <= 16) {
379 CCIO_FIND_FREE_MAPPING(ioc, res_idx, 0xffff, 16);
380 } else if (pages_needed <= 32) {
381 CCIO_FIND_FREE_MAPPING(ioc, res_idx, ~(unsigned int)0, 32);
382#ifdef __LP64__
383 } else if (pages_needed <= 64) {
384 CCIO_FIND_FREE_MAPPING(ioc, res_idx, ~0UL, 64);
385#endif
386 } else {
387 panic("%s: %s() Too many pages to map. pages_needed: %u\n",
388 __FILE__, __func__, pages_needed);
389 }
390
391 panic("%s: %s() I/O MMU is out of mapping resources.\n", __FILE__,
392 __func__);
393
394resource_found:
395
396 DBG_RES("%s() res_idx %d res_hint: %d\n",
397 __func__, res_idx, ioc->res_hint);
398
399#ifdef CCIO_COLLECT_STATS
400 {
401 unsigned long cr_end = mfctl(16);
402 unsigned long tmp = cr_end - cr_start;
403
404 cr_start = (cr_end < cr_start) ? -(tmp) : (tmp);
405 }
406 ioc->avg_search[ioc->avg_idx++] = cr_start;
407 ioc->avg_idx &= CCIO_SEARCH_SAMPLE - 1;
408 ioc->used_pages += pages_needed;
409#endif
410
411
412
413 return res_idx << 3;
414}
415
416#define CCIO_FREE_MAPPINGS(ioc, res_idx, mask, size) \
417 u##size *res_ptr = (u##size *)&((ioc)->res_map[res_idx]); \
418 BUG_ON((*res_ptr & mask) != mask); \
419 *res_ptr &= ~(mask);
420
421
422
423
424
425
426
427
428
429
430static void
431ccio_free_range(struct ioc *ioc, dma_addr_t iova, unsigned long pages_mapped)
432{
433 unsigned long iovp = CCIO_IOVP(iova);
434 unsigned int res_idx = PDIR_INDEX(iovp) >> 3;
435
436 BUG_ON(pages_mapped == 0);
437 BUG_ON((pages_mapped * IOVP_SIZE) > DMA_CHUNK_SIZE);
438 BUG_ON(pages_mapped > BITS_PER_LONG);
439
440 DBG_RES("%s(): res_idx: %d pages_mapped %d\n",
441 __func__, res_idx, pages_mapped);
442
443#ifdef CCIO_COLLECT_STATS
444 ioc->used_pages -= pages_mapped;
445#endif
446
447 if(pages_mapped <= 8) {
448#if 0
449
450 unsigned long mask = ~(~0UL >> pages_mapped);
451 CCIO_FREE_MAPPINGS(ioc, res_idx, mask, 8);
452#else
453 CCIO_FREE_MAPPINGS(ioc, res_idx, 0xffUL, 8);
454#endif
455 } else if(pages_mapped <= 16) {
456 CCIO_FREE_MAPPINGS(ioc, res_idx, 0xffffUL, 16);
457 } else if(pages_mapped <= 32) {
458 CCIO_FREE_MAPPINGS(ioc, res_idx, ~(unsigned int)0, 32);
459#ifdef __LP64__
460 } else if(pages_mapped <= 64) {
461 CCIO_FREE_MAPPINGS(ioc, res_idx, ~0UL, 64);
462#endif
463 } else {
464 panic("%s:%s() Too many pages to unmap.\n", __FILE__,
465 __func__);
466 }
467}
468
469
470
471
472
473
474
475typedef unsigned long space_t;
476#define KERNEL_SPACE 0
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504#define IOPDIR_VALID 0x01UL
505#define HINT_SAFE_DMA 0x02UL
506#ifdef CONFIG_EISA
507#define HINT_STOP_MOST 0x04UL
508#else
509#define HINT_STOP_MOST 0x00UL
510#endif
511#define HINT_UDPATE_ENB 0x08UL
512#define HINT_PREFETCH 0x10UL
513
514
515
516
517
518
519
520static u32 hint_lookup[] = {
521 [PCI_DMA_BIDIRECTIONAL] = HINT_STOP_MOST | HINT_SAFE_DMA | IOPDIR_VALID,
522 [PCI_DMA_TODEVICE] = HINT_STOP_MOST | HINT_PREFETCH | IOPDIR_VALID,
523 [PCI_DMA_FROMDEVICE] = HINT_STOP_MOST | IOPDIR_VALID,
524};
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555static void CCIO_INLINE
556ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
557 unsigned long hints)
558{
559 register unsigned long pa;
560 register unsigned long ci;
561
562
563 BUG_ON(sid != KERNEL_SPACE);
564
565 mtsp(sid,1);
566
567
568
569
570
571
572 pa = virt_to_phys(vba);
573 asm volatile("depw %1,31,12,%0" : "+r" (pa) : "r" (hints));
574 ((u32 *)pdir_ptr)[1] = (u32) pa;
575
576
577
578
579
580#ifdef __LP64__
581
582
583
584
585
586 asm volatile ("extrd,u %1,15,4,%0" : "=r" (ci) : "r" (pa));
587 asm volatile ("extrd,u %1,31,16,%0" : "+r" (pa) : "r" (pa));
588 asm volatile ("depd %1,35,4,%0" : "+r" (pa) : "r" (ci));
589#else
590 pa = 0;
591#endif
592
593
594
595
596
597 asm volatile ("lci %%r0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba));
598 asm volatile ("extru %1,19,12,%0" : "+r" (ci) : "r" (ci));
599 asm volatile ("depw %1,15,12,%0" : "+r" (pa) : "r" (ci));
600
601 ((u32 *)pdir_ptr)[0] = (u32) pa;
602
603
604
605
606
607
608
609
610
611
612
613
614
615 asm volatile("fdc %%r0(%0)" : : "r" (pdir_ptr));
616 asm volatile("sync");
617}
618
619
620
621
622
623
624
625
626
627
628
629static CCIO_INLINE void
630ccio_clear_io_tlb(struct ioc *ioc, dma_addr_t iovp, size_t byte_cnt)
631{
632 u32 chain_size = 1 << ioc->chainid_shift;
633
634 iovp &= IOVP_MASK;
635 byte_cnt += chain_size;
636
637 while(byte_cnt > chain_size) {
638 WRITE_U32(CMD_TLB_PURGE | iovp, &ioc->ioc_regs->io_command);
639 iovp += chain_size;
640 byte_cnt -= chain_size;
641 }
642}
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662static CCIO_INLINE void
663ccio_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
664{
665 u32 iovp = (u32)CCIO_IOVP(iova);
666 size_t saved_byte_cnt;
667
668
669 saved_byte_cnt = byte_cnt = ALIGN(byte_cnt, IOVP_SIZE);
670
671 while(byte_cnt > 0) {
672
673 unsigned int idx = PDIR_INDEX(iovp);
674 char *pdir_ptr = (char *) &(ioc->pdir_base[idx]);
675
676 BUG_ON(idx >= (ioc->pdir_size / sizeof(u64)));
677 pdir_ptr[7] = 0;
678
679
680
681
682
683
684
685
686 asm volatile("fdc %%r0(%0)" : : "r" (pdir_ptr[7]));
687
688 iovp += IOVP_SIZE;
689 byte_cnt -= IOVP_SIZE;
690 }
691
692 asm volatile("sync");
693 ccio_clear_io_tlb(ioc, CCIO_IOVP(iova), saved_byte_cnt);
694}
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709static int
710ccio_dma_supported(struct device *dev, u64 mask)
711{
712 if(dev == NULL) {
713 printk(KERN_ERR MODULE_NAME ": EISA/ISA/et al not supported\n");
714 BUG();
715 return 0;
716 }
717
718
719 return (int)(mask == 0xffffffffUL);
720}
721
722
723
724
725
726
727
728
729
730
731static dma_addr_t
732ccio_map_single(struct device *dev, void *addr, size_t size,
733 enum dma_data_direction direction)
734{
735 int idx;
736 struct ioc *ioc;
737 unsigned long flags;
738 dma_addr_t iovp;
739 dma_addr_t offset;
740 u64 *pdir_start;
741 unsigned long hint = hint_lookup[(int)direction];
742
743 BUG_ON(!dev);
744 ioc = GET_IOC(dev);
745
746 BUG_ON(size <= 0);
747
748
749 offset = ((unsigned long) addr) & ~IOVP_MASK;
750
751
752 size = ALIGN(size + offset, IOVP_SIZE);
753 spin_lock_irqsave(&ioc->res_lock, flags);
754
755#ifdef CCIO_COLLECT_STATS
756 ioc->msingle_calls++;
757 ioc->msingle_pages += size >> IOVP_SHIFT;
758#endif
759
760 idx = ccio_alloc_range(ioc, dev, size);
761 iovp = (dma_addr_t)MKIOVP(idx);
762
763 pdir_start = &(ioc->pdir_base[idx]);
764
765 DBG_RUN("%s() 0x%p -> 0x%lx size: %0x%x\n",
766 __func__, addr, (long)iovp | offset, size);
767
768
769 if((size % L1_CACHE_BYTES) || ((unsigned long)addr % L1_CACHE_BYTES))
770 hint |= HINT_SAFE_DMA;
771
772 while(size > 0) {
773 ccio_io_pdir_entry(pdir_start, KERNEL_SPACE, (unsigned long)addr, hint);
774
775 DBG_RUN(" pdir %p %08x%08x\n",
776 pdir_start,
777 (u32) (((u32 *) pdir_start)[0]),
778 (u32) (((u32 *) pdir_start)[1]));
779 ++pdir_start;
780 addr += IOVP_SIZE;
781 size -= IOVP_SIZE;
782 }
783
784 spin_unlock_irqrestore(&ioc->res_lock, flags);
785
786
787 return CCIO_IOVA(iovp, offset);
788}
789
790
791
792
793
794
795
796
797
798
799static void
800ccio_unmap_single(struct device *dev, dma_addr_t iova, size_t size,
801 enum dma_data_direction direction)
802{
803 struct ioc *ioc;
804 unsigned long flags;
805 dma_addr_t offset = iova & ~IOVP_MASK;
806
807 BUG_ON(!dev);
808 ioc = GET_IOC(dev);
809
810 DBG_RUN("%s() iovp 0x%lx/%x\n",
811 __func__, (long)iova, size);
812
813 iova ^= offset;
814 size += offset;
815 size = ALIGN(size, IOVP_SIZE);
816
817 spin_lock_irqsave(&ioc->res_lock, flags);
818
819#ifdef CCIO_COLLECT_STATS
820 ioc->usingle_calls++;
821 ioc->usingle_pages += size >> IOVP_SHIFT;
822#endif
823
824 ccio_mark_invalid(ioc, iova, size);
825 ccio_free_range(ioc, iova, (size >> IOVP_SHIFT));
826 spin_unlock_irqrestore(&ioc->res_lock, flags);
827}
828
829
830
831
832
833
834
835
836
837static void *
838ccio_alloc_consistent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)
839{
840 void *ret;
841#if 0
842
843
844
845 if(!hwdev) {
846
847 *dma_handle = 0;
848 return 0;
849 }
850#endif
851 ret = (void *) __get_free_pages(flag, get_order(size));
852
853 if (ret) {
854 memset(ret, 0, size);
855 *dma_handle = ccio_map_single(dev, ret, size, PCI_DMA_BIDIRECTIONAL);
856 }
857
858 return ret;
859}
860
861
862
863
864
865
866
867
868
869
870static void
871ccio_free_consistent(struct device *dev, size_t size, void *cpu_addr,
872 dma_addr_t dma_handle)
873{
874 ccio_unmap_single(dev, dma_handle, size, 0);
875 free_pages((unsigned long)cpu_addr, get_order(size));
876}
877
878
879
880
881
882
883#define PIDE_FLAG 0x80000000UL
884
885#ifdef CCIO_COLLECT_STATS
886#define IOMMU_MAP_STATS
887#endif
888#include "iommu-helpers.h"
889
890
891
892
893
894
895
896
897
898
899static int
900ccio_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
901 enum dma_data_direction direction)
902{
903 struct ioc *ioc;
904 int coalesced, filled = 0;
905 unsigned long flags;
906 unsigned long hint = hint_lookup[(int)direction];
907 unsigned long prev_len = 0, current_len = 0;
908 int i;
909
910 BUG_ON(!dev);
911 ioc = GET_IOC(dev);
912
913 DBG_RUN_SG("%s() START %d entries\n", __func__, nents);
914
915
916 if (nents == 1) {
917 sg_dma_address(sglist) = ccio_map_single(dev,
918 (void *)sg_virt_addr(sglist), sglist->length,
919 direction);
920 sg_dma_len(sglist) = sglist->length;
921 return 1;
922 }
923
924 for(i = 0; i < nents; i++)
925 prev_len += sglist[i].length;
926
927 spin_lock_irqsave(&ioc->res_lock, flags);
928
929#ifdef CCIO_COLLECT_STATS
930 ioc->msg_calls++;
931#endif
932
933
934
935
936
937
938
939
940
941 coalesced = iommu_coalesce_chunks(ioc, dev, sglist, nents, ccio_alloc_range);
942
943
944
945
946
947
948
949
950
951 filled = iommu_fill_pdir(ioc, sglist, nents, hint, ccio_io_pdir_entry);
952
953 spin_unlock_irqrestore(&ioc->res_lock, flags);
954
955 BUG_ON(coalesced != filled);
956
957 DBG_RUN_SG("%s() DONE %d mappings\n", __func__, filled);
958
959 for (i = 0; i < filled; i++)
960 current_len += sg_dma_len(sglist + i);
961
962 BUG_ON(current_len != prev_len);
963
964 return filled;
965}
966
967
968
969
970
971
972
973
974
975
976static void
977ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
978 enum dma_data_direction direction)
979{
980 struct ioc *ioc;
981
982 BUG_ON(!dev);
983 ioc = GET_IOC(dev);
984
985 DBG_RUN_SG("%s() START %d entries, %08lx,%x\n",
986 __func__, nents, sg_virt_addr(sglist), sglist->length);
987
988#ifdef CCIO_COLLECT_STATS
989 ioc->usg_calls++;
990#endif
991
992 while(sg_dma_len(sglist) && nents--) {
993
994#ifdef CCIO_COLLECT_STATS
995 ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT;
996#endif
997 ccio_unmap_single(dev, sg_dma_address(sglist),
998 sg_dma_len(sglist), direction);
999 ++sglist;
1000 }
1001
1002 DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents);
1003}
1004
1005static struct hppa_dma_ops ccio_ops = {
1006 .dma_supported = ccio_dma_supported,
1007 .alloc_consistent = ccio_alloc_consistent,
1008 .alloc_noncoherent = ccio_alloc_consistent,
1009 .free_consistent = ccio_free_consistent,
1010 .map_single = ccio_map_single,
1011 .unmap_single = ccio_unmap_single,
1012 .map_sg = ccio_map_sg,
1013 .unmap_sg = ccio_unmap_sg,
1014 .dma_sync_single_for_cpu = NULL,
1015 .dma_sync_single_for_device = NULL,
1016 .dma_sync_sg_for_cpu = NULL,
1017 .dma_sync_sg_for_device = NULL,
1018};
1019
1020#ifdef CONFIG_PROC_FS
1021static int ccio_proc_info(struct seq_file *m, void *p)
1022{
1023 int len = 0;
1024 struct ioc *ioc = ioc_list;
1025
1026 while (ioc != NULL) {
1027 unsigned int total_pages = ioc->res_size << 3;
1028#ifdef CCIO_COLLECT_STATS
1029 unsigned long avg = 0, min, max;
1030 int j;
1031#endif
1032
1033 len += seq_printf(m, "%s\n", ioc->name);
1034
1035 len += seq_printf(m, "Cujo 2.0 bug : %s\n",
1036 (ioc->cujo20_bug ? "yes" : "no"));
1037
1038 len += seq_printf(m, "IO PDIR size : %d bytes (%d entries)\n",
1039 total_pages * 8, total_pages);
1040
1041#ifdef CCIO_COLLECT_STATS
1042 len += seq_printf(m, "IO PDIR entries : %ld free %ld used (%d%%)\n",
1043 total_pages - ioc->used_pages, ioc->used_pages,
1044 (int)(ioc->used_pages * 100 / total_pages));
1045#endif
1046
1047 len += seq_printf(m, "Resource bitmap : %d bytes (%d pages)\n",
1048 ioc->res_size, total_pages);
1049
1050#ifdef CCIO_COLLECT_STATS
1051 min = max = ioc->avg_search[0];
1052 for(j = 0; j < CCIO_SEARCH_SAMPLE; ++j) {
1053 avg += ioc->avg_search[j];
1054 if(ioc->avg_search[j] > max)
1055 max = ioc->avg_search[j];
1056 if(ioc->avg_search[j] < min)
1057 min = ioc->avg_search[j];
1058 }
1059 avg /= CCIO_SEARCH_SAMPLE;
1060 len += seq_printf(m, " Bitmap search : %ld/%ld/%ld (min/avg/max CPU Cycles)\n",
1061 min, avg, max);
1062
1063 len += seq_printf(m, "pci_map_single(): %8ld calls %8ld pages (avg %d/1000)\n",
1064 ioc->msingle_calls, ioc->msingle_pages,
1065 (int)((ioc->msingle_pages * 1000)/ioc->msingle_calls));
1066
1067
1068 min = ioc->usingle_calls - ioc->usg_calls;
1069 max = ioc->usingle_pages - ioc->usg_pages;
1070 len += seq_printf(m, "pci_unmap_single: %8ld calls %8ld pages (avg %d/1000)\n",
1071 min, max, (int)((max * 1000)/min));
1072
1073 len += seq_printf(m, "pci_map_sg() : %8ld calls %8ld pages (avg %d/1000)\n",
1074 ioc->msg_calls, ioc->msg_pages,
1075 (int)((ioc->msg_pages * 1000)/ioc->msg_calls));
1076
1077 len += seq_printf(m, "pci_unmap_sg() : %8ld calls %8ld pages (avg %d/1000)\n\n\n",
1078 ioc->usg_calls, ioc->usg_pages,
1079 (int)((ioc->usg_pages * 1000)/ioc->usg_calls));
1080#endif
1081
1082 ioc = ioc->next;
1083 }
1084
1085 return 0;
1086}
1087
1088static int ccio_proc_info_open(struct inode *inode, struct file *file)
1089{
1090 return single_open(file, &ccio_proc_info, NULL);
1091}
1092
1093static const struct file_operations ccio_proc_info_fops = {
1094 .owner = THIS_MODULE,
1095 .open = ccio_proc_info_open,
1096 .read = seq_read,
1097 .llseek = seq_lseek,
1098 .release = single_release,
1099};
1100
1101static int ccio_proc_bitmap_info(struct seq_file *m, void *p)
1102{
1103 int len = 0;
1104 struct ioc *ioc = ioc_list;
1105
1106 while (ioc != NULL) {
1107 u32 *res_ptr = (u32 *)ioc->res_map;
1108 int j;
1109
1110 for (j = 0; j < (ioc->res_size / sizeof(u32)); j++) {
1111 if ((j & 7) == 0)
1112 len += seq_puts(m, "\n ");
1113 len += seq_printf(m, "%08x", *res_ptr);
1114 res_ptr++;
1115 }
1116 len += seq_puts(m, "\n\n");
1117 ioc = ioc->next;
1118 break;
1119 }
1120
1121 return 0;
1122}
1123
1124static int ccio_proc_bitmap_open(struct inode *inode, struct file *file)
1125{
1126 return single_open(file, &ccio_proc_bitmap_info, NULL);
1127}
1128
1129static const struct file_operations ccio_proc_bitmap_fops = {
1130 .owner = THIS_MODULE,
1131 .open = ccio_proc_bitmap_open,
1132 .read = seq_read,
1133 .llseek = seq_lseek,
1134 .release = single_release,
1135};
1136#endif
1137
1138
1139
1140
1141
1142
1143
1144
1145static struct ioc * ccio_find_ioc(int hw_path)
1146{
1147 int i;
1148 struct ioc *ioc;
1149
1150 ioc = ioc_list;
1151 for (i = 0; i < ioc_count; i++) {
1152 if (ioc->hw_path == hw_path)
1153 return ioc;
1154
1155 ioc = ioc->next;
1156 }
1157
1158 return NULL;
1159}
1160
1161
1162
1163
1164
1165
1166
1167
1168void * ccio_get_iommu(const struct parisc_device *dev)
1169{
1170 dev = find_pa_parent_type(dev, HPHW_IOA);
1171 if (!dev)
1172 return NULL;
1173
1174 return ccio_find_ioc(dev->hw_path);
1175}
1176
1177#define CUJO_20_STEP 0x10000000
1178
1179
1180
1181
1182
1183void ccio_cujo20_fixup(struct parisc_device *cujo, u32 iovp)
1184{
1185 unsigned int idx;
1186 struct parisc_device *dev = parisc_parent(cujo);
1187 struct ioc *ioc = ccio_get_iommu(dev);
1188 u8 *res_ptr;
1189
1190 ioc->cujo20_bug = 1;
1191 res_ptr = ioc->res_map;
1192 idx = PDIR_INDEX(iovp) >> 3;
1193
1194 while (idx < ioc->res_size) {
1195 res_ptr[idx] |= 0xff;
1196 idx += PDIR_INDEX(CUJO_20_STEP) >> 3;
1197 }
1198}
1199
1200#if 0
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213static int
1214ccio_get_iotlb_size(struct parisc_device *dev)
1215{
1216 if (dev->spa_shift == 0) {
1217 panic("%s() : Can't determine I/O TLB size.\n", __func__);
1218 }
1219 return (1 << dev->spa_shift);
1220}
1221#else
1222
1223
1224#define CCIO_CHAINID_SHIFT 8
1225#define CCIO_CHAINID_MASK 0xff
1226#endif
1227
1228
1229static const struct parisc_device_id ccio_tbl[] = {
1230 { HPHW_IOA, HVERSION_REV_ANY_ID, U2_IOA_RUNWAY, 0xb },
1231 { HPHW_IOA, HVERSION_REV_ANY_ID, UTURN_IOA_RUNWAY, 0xb },
1232 { 0, }
1233};
1234
1235static int ccio_probe(struct parisc_device *dev);
1236
1237static struct parisc_driver ccio_driver = {
1238 .name = "ccio",
1239 .id_table = ccio_tbl,
1240 .probe = ccio_probe,
1241};
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251static void
1252ccio_ioc_init(struct ioc *ioc)
1253{
1254 int i;
1255 unsigned int iov_order;
1256 u32 iova_space_size;
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269 iova_space_size = (u32) (totalram_pages / count_parisc_driver(&ccio_driver));
1270
1271
1272
1273 if (iova_space_size < (1 << (20 - PAGE_SHIFT))) {
1274 iova_space_size = 1 << (20 - PAGE_SHIFT);
1275#ifdef __LP64__
1276 } else if (iova_space_size > (1 << (30 - PAGE_SHIFT))) {
1277 iova_space_size = 1 << (30 - PAGE_SHIFT);
1278#endif
1279 }
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294 iov_order = get_order(iova_space_size << PAGE_SHIFT);
1295
1296
1297 iova_space_size = 1 << (iov_order + PAGE_SHIFT);
1298
1299 ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64);
1300
1301 BUG_ON(ioc->pdir_size > 8 * 1024 * 1024);
1302
1303
1304 BUG_ON((1 << get_order(ioc->pdir_size)) != (ioc->pdir_size >> PAGE_SHIFT));
1305
1306 DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits)\n",
1307 __func__, ioc->ioc_regs,
1308 (unsigned long) totalram_pages >> (20 - PAGE_SHIFT),
1309 iova_space_size>>20,
1310 iov_order + PAGE_SHIFT);
1311
1312 ioc->pdir_base = (u64 *)__get_free_pages(GFP_KERNEL,
1313 get_order(ioc->pdir_size));
1314 if(NULL == ioc->pdir_base) {
1315 panic("%s() could not allocate I/O Page Table\n", __func__);
1316 }
1317 memset(ioc->pdir_base, 0, ioc->pdir_size);
1318
1319 BUG_ON((((unsigned long)ioc->pdir_base) & PAGE_MASK) != (unsigned long)ioc->pdir_base);
1320 DBG_INIT(" base %p\n", ioc->pdir_base);
1321
1322
1323 ioc->res_size = (ioc->pdir_size / sizeof(u64)) >> 3;
1324 DBG_INIT("%s() res_size 0x%x\n", __func__, ioc->res_size);
1325
1326 ioc->res_map = (u8 *)__get_free_pages(GFP_KERNEL,
1327 get_order(ioc->res_size));
1328 if(NULL == ioc->res_map) {
1329 panic("%s() could not allocate resource map\n", __func__);
1330 }
1331 memset(ioc->res_map, 0, ioc->res_size);
1332
1333
1334 ioc->res_hint = 16;
1335
1336
1337 spin_lock_init(&ioc->res_lock);
1338
1339
1340
1341
1342
1343 ioc->chainid_shift = get_order(iova_space_size) + PAGE_SHIFT - CCIO_CHAINID_SHIFT;
1344 DBG_INIT(" chainid_shift 0x%x\n", ioc->chainid_shift);
1345
1346
1347
1348
1349 WRITE_U32(CCIO_CHAINID_MASK << ioc->chainid_shift,
1350 &ioc->ioc_regs->io_chain_id_mask);
1351
1352 WRITE_U32(virt_to_phys(ioc->pdir_base),
1353 &ioc->ioc_regs->io_pdir_base);
1354
1355
1356
1357
1358 WRITE_U32(IOA_NORMAL_MODE, &ioc->ioc_regs->io_control);
1359
1360
1361
1362
1363 WRITE_U32(0, &ioc->ioc_regs->io_tlb_entry_m);
1364 WRITE_U32(0, &ioc->ioc_regs->io_tlb_entry_l);
1365
1366 for(i = 1 << CCIO_CHAINID_SHIFT; i ; i--) {
1367 WRITE_U32((CMD_TLB_DIRECT_WRITE | (i << ioc->chainid_shift)),
1368 &ioc->ioc_regs->io_command);
1369 }
1370}
1371
1372static void __init
1373ccio_init_resource(struct resource *res, char *name, void __iomem *ioaddr)
1374{
1375 int result;
1376
1377 res->parent = NULL;
1378 res->flags = IORESOURCE_MEM;
1379
1380
1381
1382
1383
1384 res->start = (unsigned long)((signed) READ_U32(ioaddr) << 16);
1385 res->end = (unsigned long)((signed) (READ_U32(ioaddr + 4) << 16) - 1);
1386 res->name = name;
1387
1388
1389
1390 if (res->end + 1 == res->start)
1391 return;
1392
1393
1394
1395
1396
1397
1398 result = insert_resource(&iomem_resource, res);
1399 if (result < 0) {
1400 printk(KERN_ERR "%s() failed to claim CCIO bus address space (%08lx,%08lx)\n",
1401 __func__, (unsigned long)res->start, (unsigned long)res->end);
1402 }
1403}
1404
1405static void __init ccio_init_resources(struct ioc *ioc)
1406{
1407 struct resource *res = ioc->mmio_region;
1408 char *name = kmalloc(14, GFP_KERNEL);
1409
1410 snprintf(name, 14, "GSC Bus [%d/]", ioc->hw_path);
1411
1412 ccio_init_resource(res, name, &ioc->ioc_regs->io_io_low);
1413 ccio_init_resource(res + 1, name, &ioc->ioc_regs->io_io_low_hv);
1414}
1415
1416static int new_ioc_area(struct resource *res, unsigned long size,
1417 unsigned long min, unsigned long max, unsigned long align)
1418{
1419 if (max <= min)
1420 return -EBUSY;
1421
1422 res->start = (max - size + 1) &~ (align - 1);
1423 res->end = res->start + size;
1424
1425
1426
1427
1428
1429 if (!insert_resource(&iomem_resource, res))
1430 return 0;
1431
1432 return new_ioc_area(res, size, min, max - size, align);
1433}
1434
1435static int expand_ioc_area(struct resource *res, unsigned long size,
1436 unsigned long min, unsigned long max, unsigned long align)
1437{
1438 unsigned long start, len;
1439
1440 if (!res->parent)
1441 return new_ioc_area(res, size, min, max, align);
1442
1443 start = (res->start - size) &~ (align - 1);
1444 len = res->end - start + 1;
1445 if (start >= min) {
1446 if (!adjust_resource(res, start, len))
1447 return 0;
1448 }
1449
1450 start = res->start;
1451 len = ((size + res->end + align) &~ (align - 1)) - start;
1452 if (start + len <= max) {
1453 if (!adjust_resource(res, start, len))
1454 return 0;
1455 }
1456
1457 return -EBUSY;
1458}
1459
1460
1461
1462
1463
1464
1465
1466
1467int ccio_allocate_resource(const struct parisc_device *dev,
1468 struct resource *res, unsigned long size,
1469 unsigned long min, unsigned long max, unsigned long align)
1470{
1471 struct resource *parent = &iomem_resource;
1472 struct ioc *ioc = ccio_get_iommu(dev);
1473 if (!ioc)
1474 goto out;
1475
1476 parent = ioc->mmio_region;
1477 if (parent->parent &&
1478 !allocate_resource(parent, res, size, min, max, align, NULL, NULL))
1479 return 0;
1480
1481 if ((parent + 1)->parent &&
1482 !allocate_resource(parent + 1, res, size, min, max, align,
1483 NULL, NULL))
1484 return 0;
1485
1486 if (!expand_ioc_area(parent, size, min, max, align)) {
1487 __raw_writel(((parent->start)>>16) | 0xffff0000,
1488 &ioc->ioc_regs->io_io_low);
1489 __raw_writel(((parent->end)>>16) | 0xffff0000,
1490 &ioc->ioc_regs->io_io_high);
1491 } else if (!expand_ioc_area(parent + 1, size, min, max, align)) {
1492 parent++;
1493 __raw_writel(((parent->start)>>16) | 0xffff0000,
1494 &ioc->ioc_regs->io_io_low_hv);
1495 __raw_writel(((parent->end)>>16) | 0xffff0000,
1496 &ioc->ioc_regs->io_io_high_hv);
1497 } else {
1498 return -EBUSY;
1499 }
1500
1501 out:
1502 return allocate_resource(parent, res, size, min, max, align, NULL,NULL);
1503}
1504
1505int ccio_request_resource(const struct parisc_device *dev,
1506 struct resource *res)
1507{
1508 struct resource *parent;
1509 struct ioc *ioc = ccio_get_iommu(dev);
1510
1511 if (!ioc) {
1512 parent = &iomem_resource;
1513 } else if ((ioc->mmio_region->start <= res->start) &&
1514 (res->end <= ioc->mmio_region->end)) {
1515 parent = ioc->mmio_region;
1516 } else if (((ioc->mmio_region + 1)->start <= res->start) &&
1517 (res->end <= (ioc->mmio_region + 1)->end)) {
1518 parent = ioc->mmio_region + 1;
1519 } else {
1520 return -EBUSY;
1521 }
1522
1523
1524
1525
1526
1527
1528 return insert_resource(parent, res);
1529}
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539static int __init ccio_probe(struct parisc_device *dev)
1540{
1541 int i;
1542 struct ioc *ioc, **ioc_p = &ioc_list;
1543
1544 ioc = kzalloc(sizeof(struct ioc), GFP_KERNEL);
1545 if (ioc == NULL) {
1546 printk(KERN_ERR MODULE_NAME ": memory allocation failure\n");
1547 return 1;
1548 }
1549
1550 ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn";
1551
1552 printk(KERN_INFO "Found %s at 0x%lx\n", ioc->name,
1553 (unsigned long)dev->hpa.start);
1554
1555 for (i = 0; i < ioc_count; i++) {
1556 ioc_p = &(*ioc_p)->next;
1557 }
1558 *ioc_p = ioc;
1559
1560 ioc->hw_path = dev->hw_path;
1561 ioc->ioc_regs = ioremap_nocache(dev->hpa.start, 4096);
1562 ccio_ioc_init(ioc);
1563 ccio_init_resources(ioc);
1564 hppa_dma_ops = &ccio_ops;
1565 dev->dev.platform_data = kzalloc(sizeof(struct pci_hba_data), GFP_KERNEL);
1566
1567
1568 BUG_ON(dev->dev.platform_data == NULL);
1569 HBA_DATA(dev->dev.platform_data)->iommu = ioc;
1570
1571#ifdef CONFIG_PROC_FS
1572 if (ioc_count == 0) {
1573 proc_create(MODULE_NAME, 0, proc_runway_root,
1574 &ccio_proc_info_fops);
1575 proc_create(MODULE_NAME"-bitmap", 0, proc_runway_root,
1576 &ccio_proc_bitmap_fops);
1577 }
1578#endif
1579 ioc_count++;
1580
1581 parisc_has_iommu();
1582 return 0;
1583}
1584
1585
1586
1587
1588
1589
1590void __init ccio_init(void)
1591{
1592 register_parisc_driver(&ccio_driver);
1593}
1594
1595