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
35
36
37#include <linux/delay.h>
38#include <linux/io.h>
39#include <linux/module.h>
40#include <linux/slab.h>
41
42#include <linux/pci-epc.h>
43#include <linux/pci-epf.h>
44
45static struct workqueue_struct *kpcintb_workqueue;
46
47#define COMMAND_CONFIGURE_DOORBELL 1
48#define COMMAND_TEARDOWN_DOORBELL 2
49#define COMMAND_CONFIGURE_MW 3
50#define COMMAND_TEARDOWN_MW 4
51#define COMMAND_LINK_UP 5
52#define COMMAND_LINK_DOWN 6
53
54#define COMMAND_STATUS_OK 1
55#define COMMAND_STATUS_ERROR 2
56
57#define LINK_STATUS_UP BIT(0)
58
59#define SPAD_COUNT 64
60#define DB_COUNT 4
61#define NTB_MW_OFFSET 2
62#define DB_COUNT_MASK GENMASK(15, 0)
63#define MSIX_ENABLE BIT(16)
64#define MAX_DB_COUNT 32
65#define MAX_MW 4
66
67enum epf_ntb_bar {
68 BAR_CONFIG,
69 BAR_PEER_SPAD,
70 BAR_DB_MW1,
71 BAR_MW2,
72 BAR_MW3,
73 BAR_MW4,
74};
75
76struct epf_ntb {
77 u32 num_mws;
78 u32 db_count;
79 u32 spad_count;
80 struct pci_epf *epf;
81 u64 mws_size[MAX_MW];
82 struct config_group group;
83 struct epf_ntb_epc *epc[2];
84};
85
86#define to_epf_ntb(epf_group) container_of((epf_group), struct epf_ntb, group)
87
88struct epf_ntb_epc {
89 u8 func_no;
90 u8 vfunc_no;
91 bool linkup;
92 bool is_msix;
93 int msix_bar;
94 u32 spad_size;
95 struct pci_epc *epc;
96 struct epf_ntb *epf_ntb;
97 void __iomem *mw_addr[6];
98 size_t msix_table_offset;
99 struct epf_ntb_ctrl *reg;
100 struct pci_epf_bar *epf_bar;
101 enum pci_barno epf_ntb_bar[6];
102 struct delayed_work cmd_handler;
103 enum pci_epc_interface_type type;
104 const struct pci_epc_features *epc_features;
105};
106
107struct epf_ntb_ctrl {
108 u32 command;
109 u32 argument;
110 u16 command_status;
111 u16 link_status;
112 u32 topology;
113 u64 addr;
114 u64 size;
115 u32 num_mws;
116 u32 mw1_offset;
117 u32 spad_offset;
118 u32 spad_count;
119 u32 db_entry_size;
120 u32 db_data[MAX_DB_COUNT];
121 u32 db_offset[MAX_DB_COUNT];
122} __packed;
123
124static struct pci_epf_header epf_ntb_header = {
125 .vendorid = PCI_ANY_ID,
126 .deviceid = PCI_ANY_ID,
127 .baseclass_code = PCI_BASE_CLASS_MEMORY,
128 .interrupt_pin = PCI_INTERRUPT_INTA,
129};
130
131
132
133
134
135
136
137
138
139
140static int epf_ntb_link_up(struct epf_ntb *ntb, bool link_up)
141{
142 enum pci_epc_interface_type type;
143 enum pci_epc_irq_type irq_type;
144 struct epf_ntb_epc *ntb_epc;
145 struct epf_ntb_ctrl *ctrl;
146 struct pci_epc *epc;
147 u8 func_no, vfunc_no;
148 bool is_msix;
149 int ret;
150
151 for (type = PRIMARY_INTERFACE; type <= SECONDARY_INTERFACE; type++) {
152 ntb_epc = ntb->epc[type];
153 epc = ntb_epc->epc;
154 func_no = ntb_epc->func_no;
155 vfunc_no = ntb_epc->vfunc_no;
156 is_msix = ntb_epc->is_msix;
157 ctrl = ntb_epc->reg;
158 if (link_up)
159 ctrl->link_status |= LINK_STATUS_UP;
160 else
161 ctrl->link_status &= ~LINK_STATUS_UP;
162 irq_type = is_msix ? PCI_EPC_IRQ_MSIX : PCI_EPC_IRQ_MSI;
163 ret = pci_epc_raise_irq(epc, func_no, vfunc_no, irq_type, 1);
164 if (ret) {
165 dev_err(&epc->dev,
166 "%s intf: Failed to raise Link Up IRQ\n",
167 pci_epc_interface_string(type));
168 return ret;
169 }
170 }
171
172 return 0;
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
224
225
226
227
228
229
230
231
232
233
234
235static int epf_ntb_configure_mw(struct epf_ntb *ntb,
236 enum pci_epc_interface_type type, u32 mw)
237{
238 struct epf_ntb_epc *peer_ntb_epc, *ntb_epc;
239 struct pci_epf_bar *peer_epf_bar;
240 enum pci_barno peer_barno;
241 struct epf_ntb_ctrl *ctrl;
242 phys_addr_t phys_addr;
243 u8 func_no, vfunc_no;
244 struct pci_epc *epc;
245 u64 addr, size;
246 int ret = 0;
247
248 ntb_epc = ntb->epc[type];
249 epc = ntb_epc->epc;
250
251 peer_ntb_epc = ntb->epc[!type];
252 peer_barno = peer_ntb_epc->epf_ntb_bar[mw + NTB_MW_OFFSET];
253 peer_epf_bar = &peer_ntb_epc->epf_bar[peer_barno];
254
255 phys_addr = peer_epf_bar->phys_addr;
256 ctrl = ntb_epc->reg;
257 addr = ctrl->addr;
258 size = ctrl->size;
259 if (mw + NTB_MW_OFFSET == BAR_DB_MW1)
260 phys_addr += ctrl->mw1_offset;
261
262 if (size > ntb->mws_size[mw]) {
263 dev_err(&epc->dev,
264 "%s intf: MW: %d Req Sz:%llxx > Supported Sz:%llx\n",
265 pci_epc_interface_string(type), mw, size,
266 ntb->mws_size[mw]);
267 ret = -EINVAL;
268 goto err_invalid_size;
269 }
270
271 func_no = ntb_epc->func_no;
272 vfunc_no = ntb_epc->vfunc_no;
273
274 ret = pci_epc_map_addr(epc, func_no, vfunc_no, phys_addr, addr, size);
275 if (ret)
276 dev_err(&epc->dev,
277 "%s intf: Failed to map memory window %d address\n",
278 pci_epc_interface_string(type), mw);
279
280err_invalid_size:
281
282 return ret;
283}
284
285
286
287
288
289
290
291
292
293
294static void epf_ntb_teardown_mw(struct epf_ntb *ntb,
295 enum pci_epc_interface_type type, u32 mw)
296{
297 struct epf_ntb_epc *peer_ntb_epc, *ntb_epc;
298 struct pci_epf_bar *peer_epf_bar;
299 enum pci_barno peer_barno;
300 struct epf_ntb_ctrl *ctrl;
301 phys_addr_t phys_addr;
302 u8 func_no, vfunc_no;
303 struct pci_epc *epc;
304
305 ntb_epc = ntb->epc[type];
306 epc = ntb_epc->epc;
307
308 peer_ntb_epc = ntb->epc[!type];
309 peer_barno = peer_ntb_epc->epf_ntb_bar[mw + NTB_MW_OFFSET];
310 peer_epf_bar = &peer_ntb_epc->epf_bar[peer_barno];
311
312 phys_addr = peer_epf_bar->phys_addr;
313 ctrl = ntb_epc->reg;
314 if (mw + NTB_MW_OFFSET == BAR_DB_MW1)
315 phys_addr += ctrl->mw1_offset;
316 func_no = ntb_epc->func_no;
317 vfunc_no = ntb_epc->vfunc_no;
318
319 pci_epc_unmap_addr(epc, func_no, vfunc_no, phys_addr);
320}
321
322
323
324
325
326
327
328
329
330
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
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383static int epf_ntb_configure_msi(struct epf_ntb *ntb,
384 enum pci_epc_interface_type type, u16 db_count)
385{
386 struct epf_ntb_epc *peer_ntb_epc, *ntb_epc;
387 u32 db_entry_size, db_data, db_offset;
388 struct pci_epf_bar *peer_epf_bar;
389 struct epf_ntb_ctrl *peer_ctrl;
390 enum pci_barno peer_barno;
391 phys_addr_t phys_addr;
392 u8 func_no, vfunc_no;
393 struct pci_epc *epc;
394 int ret, i;
395
396 ntb_epc = ntb->epc[type];
397 epc = ntb_epc->epc;
398
399 peer_ntb_epc = ntb->epc[!type];
400 peer_barno = peer_ntb_epc->epf_ntb_bar[BAR_DB_MW1];
401 peer_epf_bar = &peer_ntb_epc->epf_bar[peer_barno];
402 peer_ctrl = peer_ntb_epc->reg;
403 db_entry_size = peer_ctrl->db_entry_size;
404
405 phys_addr = peer_epf_bar->phys_addr;
406 func_no = ntb_epc->func_no;
407 vfunc_no = ntb_epc->vfunc_no;
408
409 ret = pci_epc_map_msi_irq(epc, func_no, vfunc_no, phys_addr, db_count,
410 db_entry_size, &db_data, &db_offset);
411 if (ret) {
412 dev_err(&epc->dev, "%s intf: Failed to map MSI IRQ\n",
413 pci_epc_interface_string(type));
414 return ret;
415 }
416
417 for (i = 0; i < db_count; i++) {
418 peer_ctrl->db_data[i] = db_data | i;
419 peer_ctrl->db_offset[i] = db_offset;
420 }
421
422 return 0;
423}
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487static int epf_ntb_configure_msix(struct epf_ntb *ntb,
488 enum pci_epc_interface_type type,
489 u16 db_count)
490{
491 const struct pci_epc_features *epc_features;
492 struct epf_ntb_epc *peer_ntb_epc, *ntb_epc;
493 struct pci_epf_bar *peer_epf_bar, *epf_bar;
494 struct pci_epf_msix_tbl *msix_tbl;
495 struct epf_ntb_ctrl *peer_ctrl;
496 u32 db_entry_size, msg_data;
497 enum pci_barno peer_barno;
498 phys_addr_t phys_addr;
499 u8 func_no, vfunc_no;
500 struct pci_epc *epc;
501 size_t align;
502 u64 msg_addr;
503 int ret, i;
504
505 ntb_epc = ntb->epc[type];
506 epc = ntb_epc->epc;
507
508 epf_bar = &ntb_epc->epf_bar[ntb_epc->msix_bar];
509 msix_tbl = epf_bar->addr + ntb_epc->msix_table_offset;
510
511 peer_ntb_epc = ntb->epc[!type];
512 peer_barno = peer_ntb_epc->epf_ntb_bar[BAR_DB_MW1];
513 peer_epf_bar = &peer_ntb_epc->epf_bar[peer_barno];
514 phys_addr = peer_epf_bar->phys_addr;
515 peer_ctrl = peer_ntb_epc->reg;
516 epc_features = ntb_epc->epc_features;
517 align = epc_features->align;
518
519 func_no = ntb_epc->func_no;
520 vfunc_no = ntb_epc->vfunc_no;
521 db_entry_size = peer_ctrl->db_entry_size;
522
523 for (i = 0; i < db_count; i++) {
524 msg_addr = ALIGN_DOWN(msix_tbl[i].msg_addr, align);
525 msg_data = msix_tbl[i].msg_data;
526 ret = pci_epc_map_addr(epc, func_no, vfunc_no, phys_addr, msg_addr,
527 db_entry_size);
528 if (ret) {
529 dev_err(&epc->dev,
530 "%s intf: Failed to configure MSI-X IRQ\n",
531 pci_epc_interface_string(type));
532 return ret;
533 }
534 phys_addr = phys_addr + db_entry_size;
535 peer_ctrl->db_data[i] = msg_data;
536 peer_ctrl->db_offset[i] = msix_tbl[i].msg_addr & (align - 1);
537 }
538 ntb_epc->is_msix = true;
539
540 return 0;
541}
542
543
544
545
546
547
548
549
550
551
552
553
554static int epf_ntb_configure_db(struct epf_ntb *ntb,
555 enum pci_epc_interface_type type,
556 u16 db_count, bool msix)
557{
558 struct epf_ntb_epc *ntb_epc;
559 struct pci_epc *epc;
560 int ret;
561
562 if (db_count > MAX_DB_COUNT)
563 return -EINVAL;
564
565 ntb_epc = ntb->epc[type];
566 epc = ntb_epc->epc;
567
568 if (msix)
569 ret = epf_ntb_configure_msix(ntb, type, db_count);
570 else
571 ret = epf_ntb_configure_msi(ntb, type, db_count);
572
573 if (ret)
574 dev_err(&epc->dev, "%s intf: Failed to configure DB\n",
575 pci_epc_interface_string(type));
576
577 return ret;
578}
579
580
581
582
583
584
585
586
587
588static void
589epf_ntb_teardown_db(struct epf_ntb *ntb, enum pci_epc_interface_type type)
590{
591 struct epf_ntb_epc *peer_ntb_epc, *ntb_epc;
592 struct pci_epf_bar *peer_epf_bar;
593 enum pci_barno peer_barno;
594 phys_addr_t phys_addr;
595 u8 func_no, vfunc_no;
596 struct pci_epc *epc;
597
598 ntb_epc = ntb->epc[type];
599 epc = ntb_epc->epc;
600
601 peer_ntb_epc = ntb->epc[!type];
602 peer_barno = peer_ntb_epc->epf_ntb_bar[BAR_DB_MW1];
603 peer_epf_bar = &peer_ntb_epc->epf_bar[peer_barno];
604 phys_addr = peer_epf_bar->phys_addr;
605 func_no = ntb_epc->func_no;
606 vfunc_no = ntb_epc->vfunc_no;
607
608 pci_epc_unmap_addr(epc, func_no, vfunc_no, phys_addr);
609}
610
611
612
613
614
615
616
617
618
619
620static void epf_ntb_cmd_handler(struct work_struct *work)
621{
622 enum pci_epc_interface_type type;
623 struct epf_ntb_epc *ntb_epc;
624 struct epf_ntb_ctrl *ctrl;
625 u32 command, argument;
626 struct epf_ntb *ntb;
627 struct device *dev;
628 u16 db_count;
629 bool is_msix;
630 int ret;
631
632 ntb_epc = container_of(work, struct epf_ntb_epc, cmd_handler.work);
633 ctrl = ntb_epc->reg;
634 command = ctrl->command;
635 if (!command)
636 goto reset_handler;
637 argument = ctrl->argument;
638
639 ctrl->command = 0;
640 ctrl->argument = 0;
641
642 ctrl = ntb_epc->reg;
643 type = ntb_epc->type;
644 ntb = ntb_epc->epf_ntb;
645 dev = &ntb->epf->dev;
646
647 switch (command) {
648 case COMMAND_CONFIGURE_DOORBELL:
649 db_count = argument & DB_COUNT_MASK;
650 is_msix = argument & MSIX_ENABLE;
651 ret = epf_ntb_configure_db(ntb, type, db_count, is_msix);
652 if (ret < 0)
653 ctrl->command_status = COMMAND_STATUS_ERROR;
654 else
655 ctrl->command_status = COMMAND_STATUS_OK;
656 break;
657 case COMMAND_TEARDOWN_DOORBELL:
658 epf_ntb_teardown_db(ntb, type);
659 ctrl->command_status = COMMAND_STATUS_OK;
660 break;
661 case COMMAND_CONFIGURE_MW:
662 ret = epf_ntb_configure_mw(ntb, type, argument);
663 if (ret < 0)
664 ctrl->command_status = COMMAND_STATUS_ERROR;
665 else
666 ctrl->command_status = COMMAND_STATUS_OK;
667 break;
668 case COMMAND_TEARDOWN_MW:
669 epf_ntb_teardown_mw(ntb, type, argument);
670 ctrl->command_status = COMMAND_STATUS_OK;
671 break;
672 case COMMAND_LINK_UP:
673 ntb_epc->linkup = true;
674 if (ntb->epc[PRIMARY_INTERFACE]->linkup &&
675 ntb->epc[SECONDARY_INTERFACE]->linkup) {
676 ret = epf_ntb_link_up(ntb, true);
677 if (ret < 0)
678 ctrl->command_status = COMMAND_STATUS_ERROR;
679 else
680 ctrl->command_status = COMMAND_STATUS_OK;
681 goto reset_handler;
682 }
683 ctrl->command_status = COMMAND_STATUS_OK;
684 break;
685 case COMMAND_LINK_DOWN:
686 ntb_epc->linkup = false;
687 ret = epf_ntb_link_up(ntb, false);
688 if (ret < 0)
689 ctrl->command_status = COMMAND_STATUS_ERROR;
690 else
691 ctrl->command_status = COMMAND_STATUS_OK;
692 break;
693 default:
694 dev_err(dev, "%s intf UNKNOWN command: %d\n",
695 pci_epc_interface_string(type), command);
696 break;
697 }
698
699reset_handler:
700 queue_delayed_work(kpcintb_workqueue, &ntb_epc->cmd_handler,
701 msecs_to_jiffies(5));
702}
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734static void epf_ntb_peer_spad_bar_clear(struct epf_ntb_epc *ntb_epc)
735{
736 struct pci_epf_bar *epf_bar;
737 enum pci_barno barno;
738 u8 func_no, vfunc_no;
739 struct pci_epc *epc;
740
741 epc = ntb_epc->epc;
742 func_no = ntb_epc->func_no;
743 vfunc_no = ntb_epc->vfunc_no;
744 barno = ntb_epc->epf_ntb_bar[BAR_PEER_SPAD];
745 epf_bar = &ntb_epc->epf_bar[barno];
746 pci_epc_clear_bar(epc, func_no, vfunc_no, epf_bar);
747}
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779static int epf_ntb_peer_spad_bar_set(struct epf_ntb *ntb,
780 enum pci_epc_interface_type type)
781{
782 struct epf_ntb_epc *peer_ntb_epc, *ntb_epc;
783 struct pci_epf_bar *peer_epf_bar, *epf_bar;
784 enum pci_barno peer_barno, barno;
785 u32 peer_spad_offset;
786 u8 func_no, vfunc_no;
787 struct pci_epc *epc;
788 struct device *dev;
789 int ret;
790
791 dev = &ntb->epf->dev;
792
793 peer_ntb_epc = ntb->epc[!type];
794 peer_barno = peer_ntb_epc->epf_ntb_bar[BAR_CONFIG];
795 peer_epf_bar = &peer_ntb_epc->epf_bar[peer_barno];
796
797 ntb_epc = ntb->epc[type];
798 barno = ntb_epc->epf_ntb_bar[BAR_PEER_SPAD];
799 epf_bar = &ntb_epc->epf_bar[barno];
800 func_no = ntb_epc->func_no;
801 vfunc_no = ntb_epc->vfunc_no;
802 epc = ntb_epc->epc;
803
804 peer_spad_offset = peer_ntb_epc->reg->spad_offset;
805 epf_bar->phys_addr = peer_epf_bar->phys_addr + peer_spad_offset;
806 epf_bar->size = peer_ntb_epc->spad_size;
807 epf_bar->barno = barno;
808 epf_bar->flags = PCI_BASE_ADDRESS_MEM_TYPE_32;
809
810 ret = pci_epc_set_bar(epc, func_no, vfunc_no, epf_bar);
811 if (ret) {
812 dev_err(dev, "%s intf: peer SPAD BAR set failed\n",
813 pci_epc_interface_string(type));
814 return ret;
815 }
816
817 return 0;
818}
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850static void epf_ntb_config_sspad_bar_clear(struct epf_ntb_epc *ntb_epc)
851{
852 struct pci_epf_bar *epf_bar;
853 enum pci_barno barno;
854 u8 func_no, vfunc_no;
855 struct pci_epc *epc;
856
857 epc = ntb_epc->epc;
858 func_no = ntb_epc->func_no;
859 vfunc_no = ntb_epc->vfunc_no;
860 barno = ntb_epc->epf_ntb_bar[BAR_CONFIG];
861 epf_bar = &ntb_epc->epf_bar[barno];
862 pci_epc_clear_bar(epc, func_no, vfunc_no, epf_bar);
863}
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895static int epf_ntb_config_sspad_bar_set(struct epf_ntb_epc *ntb_epc)
896{
897 struct pci_epf_bar *epf_bar;
898 enum pci_barno barno;
899 u8 func_no, vfunc_no;
900 struct epf_ntb *ntb;
901 struct pci_epc *epc;
902 struct device *dev;
903 int ret;
904
905 ntb = ntb_epc->epf_ntb;
906 dev = &ntb->epf->dev;
907
908 epc = ntb_epc->epc;
909 func_no = ntb_epc->func_no;
910 vfunc_no = ntb_epc->vfunc_no;
911 barno = ntb_epc->epf_ntb_bar[BAR_CONFIG];
912 epf_bar = &ntb_epc->epf_bar[barno];
913
914 ret = pci_epc_set_bar(epc, func_no, vfunc_no, epf_bar);
915 if (ret) {
916 dev_err(dev, "%s inft: Config/Status/SPAD BAR set failed\n",
917 pci_epc_interface_string(ntb_epc->type));
918 return ret;
919 }
920
921 return 0;
922}
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948static void epf_ntb_config_spad_bar_free(struct epf_ntb *ntb)
949{
950 enum pci_epc_interface_type type;
951 struct epf_ntb_epc *ntb_epc;
952 enum pci_barno barno;
953 struct pci_epf *epf;
954
955 epf = ntb->epf;
956 for (type = PRIMARY_INTERFACE; type <= SECONDARY_INTERFACE; type++) {
957 ntb_epc = ntb->epc[type];
958 barno = ntb_epc->epf_ntb_bar[BAR_CONFIG];
959 if (ntb_epc->reg)
960 pci_epf_free_space(epf, ntb_epc->reg, barno, type);
961 }
962}
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993static int epf_ntb_config_spad_bar_alloc(struct epf_ntb *ntb,
994 enum pci_epc_interface_type type)
995{
996 const struct pci_epc_features *peer_epc_features, *epc_features;
997 struct epf_ntb_epc *peer_ntb_epc, *ntb_epc;
998 size_t msix_table_size, pba_size, align;
999 enum pci_barno peer_barno, barno;
1000 struct epf_ntb_ctrl *ctrl;
1001 u32 spad_size, ctrl_size;
1002 u64 size, peer_size;
1003 struct pci_epf *epf;
1004 struct device *dev;
1005 bool msix_capable;
1006 u32 spad_count;
1007 void *base;
1008
1009 epf = ntb->epf;
1010 dev = &epf->dev;
1011 ntb_epc = ntb->epc[type];
1012
1013 epc_features = ntb_epc->epc_features;
1014 barno = ntb_epc->epf_ntb_bar[BAR_CONFIG];
1015 size = epc_features->bar_fixed_size[barno];
1016 align = epc_features->align;
1017
1018 peer_ntb_epc = ntb->epc[!type];
1019 peer_epc_features = peer_ntb_epc->epc_features;
1020 peer_barno = ntb_epc->epf_ntb_bar[BAR_PEER_SPAD];
1021 peer_size = peer_epc_features->bar_fixed_size[peer_barno];
1022
1023
1024 if ((!IS_ALIGNED(size, align)))
1025 return -EINVAL;
1026
1027 spad_count = ntb->spad_count;
1028
1029 ctrl_size = sizeof(struct epf_ntb_ctrl);
1030 spad_size = spad_count * 4;
1031
1032 msix_capable = epc_features->msix_capable;
1033 if (msix_capable) {
1034 msix_table_size = PCI_MSIX_ENTRY_SIZE * ntb->db_count;
1035 ctrl_size = ALIGN(ctrl_size, 8);
1036 ntb_epc->msix_table_offset = ctrl_size;
1037 ntb_epc->msix_bar = barno;
1038
1039 pba_size = ALIGN(DIV_ROUND_UP(ntb->db_count, 8), 8);
1040 ctrl_size = ctrl_size + msix_table_size + pba_size;
1041 }
1042
1043 if (!align) {
1044 ctrl_size = roundup_pow_of_two(ctrl_size);
1045 spad_size = roundup_pow_of_two(spad_size);
1046 } else {
1047 ctrl_size = ALIGN(ctrl_size, align);
1048 spad_size = ALIGN(spad_size, align);
1049 }
1050
1051 if (peer_size) {
1052 if (peer_size < spad_size)
1053 spad_count = peer_size / 4;
1054 spad_size = peer_size;
1055 }
1056
1057
1058
1059
1060
1061
1062 if (spad_size > ctrl_size)
1063 ctrl_size = spad_size;
1064
1065 if (!size)
1066 size = ctrl_size + spad_size;
1067 else if (size < ctrl_size + spad_size)
1068 return -EINVAL;
1069
1070 base = pci_epf_alloc_space(epf, size, barno, align, type);
1071 if (!base) {
1072 dev_err(dev, "%s intf: Config/Status/SPAD alloc region fail\n",
1073 pci_epc_interface_string(type));
1074 return -ENOMEM;
1075 }
1076
1077 ntb_epc->reg = base;
1078
1079 ctrl = ntb_epc->reg;
1080 ctrl->spad_offset = ctrl_size;
1081 ctrl->spad_count = spad_count;
1082 ctrl->num_mws = ntb->num_mws;
1083 ctrl->db_entry_size = align ? align : 4;
1084 ntb_epc->spad_size = spad_size;
1085
1086 return 0;
1087}
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097static int epf_ntb_config_spad_bar_alloc_interface(struct epf_ntb *ntb)
1098{
1099 enum pci_epc_interface_type type;
1100 struct device *dev;
1101 int ret;
1102
1103 dev = &ntb->epf->dev;
1104
1105 for (type = PRIMARY_INTERFACE; type <= SECONDARY_INTERFACE; type++) {
1106 ret = epf_ntb_config_spad_bar_alloc(ntb, type);
1107 if (ret) {
1108 dev_err(dev, "%s intf: Config/SPAD BAR alloc failed\n",
1109 pci_epc_interface_string(type));
1110 return ret;
1111 }
1112 }
1113
1114 return 0;
1115}
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158static void epf_ntb_free_peer_mem(struct epf_ntb_epc *ntb_epc)
1159{
1160 struct pci_epf_bar *epf_bar;
1161 void __iomem *mw_addr;
1162 phys_addr_t phys_addr;
1163 enum epf_ntb_bar bar;
1164 enum pci_barno barno;
1165 struct pci_epc *epc;
1166 size_t size;
1167
1168 epc = ntb_epc->epc;
1169
1170 for (bar = BAR_DB_MW1; bar < BAR_MW4; bar++) {
1171 barno = ntb_epc->epf_ntb_bar[bar];
1172 mw_addr = ntb_epc->mw_addr[barno];
1173 epf_bar = &ntb_epc->epf_bar[barno];
1174 phys_addr = epf_bar->phys_addr;
1175 size = epf_bar->size;
1176 if (mw_addr) {
1177 pci_epc_mem_free_addr(epc, phys_addr, mw_addr, size);
1178 ntb_epc->mw_addr[barno] = NULL;
1179 }
1180 }
1181}
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223static void epf_ntb_db_mw_bar_clear(struct epf_ntb_epc *ntb_epc)
1224{
1225 struct pci_epf_bar *epf_bar;
1226 enum epf_ntb_bar bar;
1227 enum pci_barno barno;
1228 u8 func_no, vfunc_no;
1229 struct pci_epc *epc;
1230
1231 epc = ntb_epc->epc;
1232
1233 func_no = ntb_epc->func_no;
1234 vfunc_no = ntb_epc->vfunc_no;
1235
1236 for (bar = BAR_DB_MW1; bar < BAR_MW4; bar++) {
1237 barno = ntb_epc->epf_ntb_bar[bar];
1238 epf_bar = &ntb_epc->epf_bar[barno];
1239 pci_epc_clear_bar(epc, func_no, vfunc_no, epf_bar);
1240 }
1241}
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252static void epf_ntb_db_mw_bar_cleanup(struct epf_ntb *ntb,
1253 enum pci_epc_interface_type type)
1254{
1255 struct epf_ntb_epc *peer_ntb_epc, *ntb_epc;
1256
1257 ntb_epc = ntb->epc[type];
1258 peer_ntb_epc = ntb->epc[!type];
1259
1260 epf_ntb_db_mw_bar_clear(ntb_epc);
1261 epf_ntb_free_peer_mem(peer_ntb_epc);
1262}
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272static int epf_ntb_configure_interrupt(struct epf_ntb *ntb,
1273 enum pci_epc_interface_type type)
1274{
1275 const struct pci_epc_features *epc_features;
1276 bool msix_capable, msi_capable;
1277 struct epf_ntb_epc *ntb_epc;
1278 u8 func_no, vfunc_no;
1279 struct pci_epc *epc;
1280 struct device *dev;
1281 u32 db_count;
1282 int ret;
1283
1284 ntb_epc = ntb->epc[type];
1285 dev = &ntb->epf->dev;
1286
1287 epc_features = ntb_epc->epc_features;
1288 msix_capable = epc_features->msix_capable;
1289 msi_capable = epc_features->msi_capable;
1290
1291 if (!(msix_capable || msi_capable)) {
1292 dev_err(dev, "MSI or MSI-X is required for doorbell\n");
1293 return -EINVAL;
1294 }
1295
1296 func_no = ntb_epc->func_no;
1297 vfunc_no = ntb_epc->vfunc_no;
1298
1299 db_count = ntb->db_count;
1300 if (db_count > MAX_DB_COUNT) {
1301 dev_err(dev, "DB count cannot be more than %d\n", MAX_DB_COUNT);
1302 return -EINVAL;
1303 }
1304
1305 ntb->db_count = db_count;
1306 epc = ntb_epc->epc;
1307
1308 if (msi_capable) {
1309 ret = pci_epc_set_msi(epc, func_no, vfunc_no, db_count);
1310 if (ret) {
1311 dev_err(dev, "%s intf: MSI configuration failed\n",
1312 pci_epc_interface_string(type));
1313 return ret;
1314 }
1315 }
1316
1317 if (msix_capable) {
1318 ret = pci_epc_set_msix(epc, func_no, vfunc_no, db_count,
1319 ntb_epc->msix_bar,
1320 ntb_epc->msix_table_offset);
1321 if (ret) {
1322 dev_err(dev, "MSI configuration failed\n");
1323 return ret;
1324 }
1325 }
1326
1327 return 0;
1328}
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376static int epf_ntb_alloc_peer_mem(struct device *dev,
1377 struct epf_ntb_epc *ntb_epc,
1378 enum epf_ntb_bar bar,
1379 struct epf_ntb_epc *peer_ntb_epc,
1380 size_t size)
1381{
1382 const struct pci_epc_features *epc_features;
1383 struct pci_epf_bar *epf_bar;
1384 struct pci_epc *peer_epc;
1385 phys_addr_t phys_addr;
1386 void __iomem *mw_addr;
1387 enum pci_barno barno;
1388 size_t align;
1389
1390 epc_features = ntb_epc->epc_features;
1391 align = epc_features->align;
1392
1393 if (size < 128)
1394 size = 128;
1395
1396 if (align)
1397 size = ALIGN(size, align);
1398 else
1399 size = roundup_pow_of_two(size);
1400
1401 peer_epc = peer_ntb_epc->epc;
1402 mw_addr = pci_epc_mem_alloc_addr(peer_epc, &phys_addr, size);
1403 if (!mw_addr) {
1404 dev_err(dev, "%s intf: Failed to allocate OB address\n",
1405 pci_epc_interface_string(peer_ntb_epc->type));
1406 return -ENOMEM;
1407 }
1408
1409 barno = ntb_epc->epf_ntb_bar[bar];
1410 epf_bar = &ntb_epc->epf_bar[barno];
1411 ntb_epc->mw_addr[barno] = mw_addr;
1412
1413 epf_bar->phys_addr = phys_addr;
1414 epf_bar->size = size;
1415 epf_bar->barno = barno;
1416 epf_bar->flags = PCI_BASE_ADDRESS_MEM_TYPE_32;
1417
1418 return 0;
1419}
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429static int epf_ntb_db_mw_bar_init(struct epf_ntb *ntb,
1430 enum pci_epc_interface_type type)
1431{
1432 const struct pci_epc_features *epc_features;
1433 struct epf_ntb_epc *peer_ntb_epc, *ntb_epc;
1434 struct pci_epf_bar *epf_bar;
1435 struct epf_ntb_ctrl *ctrl;
1436 u32 num_mws, db_count;
1437 enum epf_ntb_bar bar;
1438 enum pci_barno barno;
1439 u8 func_no, vfunc_no;
1440 struct pci_epc *epc;
1441 struct device *dev;
1442 size_t align;
1443 int ret, i;
1444 u64 size;
1445
1446 ntb_epc = ntb->epc[type];
1447 peer_ntb_epc = ntb->epc[!type];
1448
1449 dev = &ntb->epf->dev;
1450 epc_features = ntb_epc->epc_features;
1451 align = epc_features->align;
1452 func_no = ntb_epc->func_no;
1453 vfunc_no = ntb_epc->vfunc_no;
1454 epc = ntb_epc->epc;
1455 num_mws = ntb->num_mws;
1456 db_count = ntb->db_count;
1457
1458 for (bar = BAR_DB_MW1, i = 0; i < num_mws; bar++, i++) {
1459 if (bar == BAR_DB_MW1) {
1460 align = align ? align : 4;
1461 size = db_count * align;
1462 size = ALIGN(size, ntb->mws_size[i]);
1463 ctrl = ntb_epc->reg;
1464 ctrl->mw1_offset = size;
1465 size += ntb->mws_size[i];
1466 } else {
1467 size = ntb->mws_size[i];
1468 }
1469
1470 ret = epf_ntb_alloc_peer_mem(dev, ntb_epc, bar,
1471 peer_ntb_epc, size);
1472 if (ret) {
1473 dev_err(dev, "%s intf: DoorBell mem alloc failed\n",
1474 pci_epc_interface_string(type));
1475 goto err_alloc_peer_mem;
1476 }
1477
1478 barno = ntb_epc->epf_ntb_bar[bar];
1479 epf_bar = &ntb_epc->epf_bar[barno];
1480
1481 ret = pci_epc_set_bar(epc, func_no, vfunc_no, epf_bar);
1482 if (ret) {
1483 dev_err(dev, "%s intf: DoorBell BAR set failed\n",
1484 pci_epc_interface_string(type));
1485 goto err_alloc_peer_mem;
1486 }
1487 }
1488
1489 return 0;
1490
1491err_alloc_peer_mem:
1492 epf_ntb_db_mw_bar_cleanup(ntb, type);
1493
1494 return ret;
1495}
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505static void epf_ntb_epc_destroy_interface(struct epf_ntb *ntb,
1506 enum pci_epc_interface_type type)
1507{
1508 struct epf_ntb_epc *ntb_epc;
1509 struct pci_epc *epc;
1510 struct pci_epf *epf;
1511
1512 if (type < 0)
1513 return;
1514
1515 epf = ntb->epf;
1516 ntb_epc = ntb->epc[type];
1517 if (!ntb_epc)
1518 return;
1519 epc = ntb_epc->epc;
1520 pci_epc_remove_epf(epc, epf, type);
1521 pci_epc_put(epc);
1522}
1523
1524
1525
1526
1527
1528
1529
1530static void epf_ntb_epc_destroy(struct epf_ntb *ntb)
1531{
1532 enum pci_epc_interface_type type;
1533
1534 for (type = PRIMARY_INTERFACE; type <= SECONDARY_INTERFACE; type++)
1535 epf_ntb_epc_destroy_interface(ntb, type);
1536}
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546static int epf_ntb_epc_create_interface(struct epf_ntb *ntb,
1547 struct pci_epc *epc,
1548 enum pci_epc_interface_type type)
1549{
1550 const struct pci_epc_features *epc_features;
1551 struct pci_epf_bar *epf_bar;
1552 struct epf_ntb_epc *ntb_epc;
1553 u8 func_no, vfunc_no;
1554 struct pci_epf *epf;
1555 struct device *dev;
1556
1557 dev = &ntb->epf->dev;
1558
1559 ntb_epc = devm_kzalloc(dev, sizeof(*ntb_epc), GFP_KERNEL);
1560 if (!ntb_epc)
1561 return -ENOMEM;
1562
1563 epf = ntb->epf;
1564 vfunc_no = epf->vfunc_no;
1565 if (type == PRIMARY_INTERFACE) {
1566 func_no = epf->func_no;
1567 epf_bar = epf->bar;
1568 } else {
1569 func_no = epf->sec_epc_func_no;
1570 epf_bar = epf->sec_epc_bar;
1571 }
1572
1573 ntb_epc->linkup = false;
1574 ntb_epc->epc = epc;
1575 ntb_epc->func_no = func_no;
1576 ntb_epc->vfunc_no = vfunc_no;
1577 ntb_epc->type = type;
1578 ntb_epc->epf_bar = epf_bar;
1579 ntb_epc->epf_ntb = ntb;
1580
1581 epc_features = pci_epc_get_features(epc, func_no, vfunc_no);
1582 if (!epc_features)
1583 return -EINVAL;
1584 ntb_epc->epc_features = epc_features;
1585
1586 ntb->epc[type] = ntb_epc;
1587
1588 return 0;
1589}
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600static int epf_ntb_epc_create(struct epf_ntb *ntb)
1601{
1602 struct pci_epf *epf;
1603 struct device *dev;
1604 int ret;
1605
1606 epf = ntb->epf;
1607 dev = &epf->dev;
1608
1609 ret = epf_ntb_epc_create_interface(ntb, epf->epc, PRIMARY_INTERFACE);
1610 if (ret) {
1611 dev_err(dev, "PRIMARY intf: Fail to create NTB EPC\n");
1612 return ret;
1613 }
1614
1615 ret = epf_ntb_epc_create_interface(ntb, epf->sec_epc,
1616 SECONDARY_INTERFACE);
1617 if (ret) {
1618 dev_err(dev, "SECONDARY intf: Fail to create NTB EPC\n");
1619 goto err_epc_create;
1620 }
1621
1622 return 0;
1623
1624err_epc_create:
1625 epf_ntb_epc_destroy_interface(ntb, PRIMARY_INTERFACE);
1626
1627 return ret;
1628}
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639static int epf_ntb_init_epc_bar_interface(struct epf_ntb *ntb,
1640 enum pci_epc_interface_type type)
1641{
1642 const struct pci_epc_features *epc_features;
1643 struct epf_ntb_epc *ntb_epc;
1644 enum pci_barno barno;
1645 enum epf_ntb_bar bar;
1646 struct device *dev;
1647 u32 num_mws;
1648 int i;
1649
1650 barno = BAR_0;
1651 ntb_epc = ntb->epc[type];
1652 num_mws = ntb->num_mws;
1653 dev = &ntb->epf->dev;
1654 epc_features = ntb_epc->epc_features;
1655
1656
1657 for (bar = BAR_CONFIG; bar <= BAR_DB_MW1; bar++, barno++) {
1658 barno = pci_epc_get_next_free_bar(epc_features, barno);
1659 if (barno < 0) {
1660 dev_err(dev, "%s intf: Fail to get NTB function BAR\n",
1661 pci_epc_interface_string(type));
1662 return barno;
1663 }
1664 ntb_epc->epf_ntb_bar[bar] = barno;
1665 }
1666
1667
1668 for (bar = BAR_MW2, i = 1; i < num_mws; bar++, barno++, i++) {
1669 barno = pci_epc_get_next_free_bar(epc_features, barno);
1670 if (barno < 0) {
1671 ntb->num_mws = i;
1672 dev_dbg(dev, "BAR not available for > MW%d\n", i + 1);
1673 }
1674 ntb_epc->epf_ntb_bar[bar] = barno;
1675 }
1676
1677 return 0;
1678}
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689static int epf_ntb_init_epc_bar(struct epf_ntb *ntb)
1690{
1691 enum pci_epc_interface_type type;
1692 struct device *dev;
1693 int ret;
1694
1695 dev = &ntb->epf->dev;
1696 for (type = PRIMARY_INTERFACE; type <= SECONDARY_INTERFACE; type++) {
1697 ret = epf_ntb_init_epc_bar_interface(ntb, type);
1698 if (ret) {
1699 dev_err(dev, "Fail to init EPC bar for %s interface\n",
1700 pci_epc_interface_string(type));
1701 return ret;
1702 }
1703 }
1704
1705 return 0;
1706}
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717static int epf_ntb_epc_init_interface(struct epf_ntb *ntb,
1718 enum pci_epc_interface_type type)
1719{
1720 struct epf_ntb_epc *ntb_epc;
1721 u8 func_no, vfunc_no;
1722 struct pci_epc *epc;
1723 struct pci_epf *epf;
1724 struct device *dev;
1725 int ret;
1726
1727 ntb_epc = ntb->epc[type];
1728 epf = ntb->epf;
1729 dev = &epf->dev;
1730 epc = ntb_epc->epc;
1731 func_no = ntb_epc->func_no;
1732 vfunc_no = ntb_epc->vfunc_no;
1733
1734 ret = epf_ntb_config_sspad_bar_set(ntb->epc[type]);
1735 if (ret) {
1736 dev_err(dev, "%s intf: Config/self SPAD BAR init failed\n",
1737 pci_epc_interface_string(type));
1738 return ret;
1739 }
1740
1741 ret = epf_ntb_peer_spad_bar_set(ntb, type);
1742 if (ret) {
1743 dev_err(dev, "%s intf: Peer SPAD BAR init failed\n",
1744 pci_epc_interface_string(type));
1745 goto err_peer_spad_bar_init;
1746 }
1747
1748 ret = epf_ntb_configure_interrupt(ntb, type);
1749 if (ret) {
1750 dev_err(dev, "%s intf: Interrupt configuration failed\n",
1751 pci_epc_interface_string(type));
1752 goto err_peer_spad_bar_init;
1753 }
1754
1755 ret = epf_ntb_db_mw_bar_init(ntb, type);
1756 if (ret) {
1757 dev_err(dev, "%s intf: DB/MW BAR init failed\n",
1758 pci_epc_interface_string(type));
1759 goto err_db_mw_bar_init;
1760 }
1761
1762 if (vfunc_no <= 1) {
1763 ret = pci_epc_write_header(epc, func_no, vfunc_no, epf->header);
1764 if (ret) {
1765 dev_err(dev, "%s intf: Configuration header write failed\n",
1766 pci_epc_interface_string(type));
1767 goto err_write_header;
1768 }
1769 }
1770
1771 INIT_DELAYED_WORK(&ntb->epc[type]->cmd_handler, epf_ntb_cmd_handler);
1772 queue_work(kpcintb_workqueue, &ntb->epc[type]->cmd_handler.work);
1773
1774 return 0;
1775
1776err_write_header:
1777 epf_ntb_db_mw_bar_cleanup(ntb, type);
1778
1779err_db_mw_bar_init:
1780 epf_ntb_peer_spad_bar_clear(ntb->epc[type]);
1781
1782err_peer_spad_bar_init:
1783 epf_ntb_config_sspad_bar_clear(ntb->epc[type]);
1784
1785 return ret;
1786}
1787
1788
1789
1790
1791
1792
1793
1794
1795static void epf_ntb_epc_cleanup_interface(struct epf_ntb *ntb,
1796 enum pci_epc_interface_type type)
1797{
1798 struct epf_ntb_epc *ntb_epc;
1799
1800 if (type < 0)
1801 return;
1802
1803 ntb_epc = ntb->epc[type];
1804 cancel_delayed_work(&ntb_epc->cmd_handler);
1805 epf_ntb_db_mw_bar_cleanup(ntb, type);
1806 epf_ntb_peer_spad_bar_clear(ntb_epc);
1807 epf_ntb_config_sspad_bar_clear(ntb_epc);
1808}
1809
1810
1811
1812
1813
1814
1815
1816static void epf_ntb_epc_cleanup(struct epf_ntb *ntb)
1817{
1818 enum pci_epc_interface_type type;
1819
1820 for (type = PRIMARY_INTERFACE; type <= SECONDARY_INTERFACE; type++)
1821 epf_ntb_epc_cleanup_interface(ntb, type);
1822}
1823
1824
1825
1826
1827
1828
1829
1830
1831static int epf_ntb_epc_init(struct epf_ntb *ntb)
1832{
1833 enum pci_epc_interface_type type;
1834 struct device *dev;
1835 int ret;
1836
1837 dev = &ntb->epf->dev;
1838
1839 for (type = PRIMARY_INTERFACE; type <= SECONDARY_INTERFACE; type++) {
1840 ret = epf_ntb_epc_init_interface(ntb, type);
1841 if (ret) {
1842 dev_err(dev, "%s intf: Failed to initialize\n",
1843 pci_epc_interface_string(type));
1844 goto err_init_type;
1845 }
1846 }
1847
1848 return 0;
1849
1850err_init_type:
1851 epf_ntb_epc_cleanup_interface(ntb, type - 1);
1852
1853 return ret;
1854}
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865static int epf_ntb_bind(struct pci_epf *epf)
1866{
1867 struct epf_ntb *ntb = epf_get_drvdata(epf);
1868 struct device *dev = &epf->dev;
1869 int ret;
1870
1871 if (!epf->epc) {
1872 dev_dbg(dev, "PRIMARY EPC interface not yet bound\n");
1873 return 0;
1874 }
1875
1876 if (!epf->sec_epc) {
1877 dev_dbg(dev, "SECONDARY EPC interface not yet bound\n");
1878 return 0;
1879 }
1880
1881 ret = epf_ntb_epc_create(ntb);
1882 if (ret) {
1883 dev_err(dev, "Failed to create NTB EPC\n");
1884 return ret;
1885 }
1886
1887 ret = epf_ntb_init_epc_bar(ntb);
1888 if (ret) {
1889 dev_err(dev, "Failed to create NTB EPC\n");
1890 goto err_bar_init;
1891 }
1892
1893 ret = epf_ntb_config_spad_bar_alloc_interface(ntb);
1894 if (ret) {
1895 dev_err(dev, "Failed to allocate BAR memory\n");
1896 goto err_bar_alloc;
1897 }
1898
1899 ret = epf_ntb_epc_init(ntb);
1900 if (ret) {
1901 dev_err(dev, "Failed to initialize EPC\n");
1902 goto err_bar_alloc;
1903 }
1904
1905 epf_set_drvdata(epf, ntb);
1906
1907 return 0;
1908
1909err_bar_alloc:
1910 epf_ntb_config_spad_bar_free(ntb);
1911
1912err_bar_init:
1913 epf_ntb_epc_destroy(ntb);
1914
1915 return ret;
1916}
1917
1918
1919
1920
1921
1922
1923
1924static void epf_ntb_unbind(struct pci_epf *epf)
1925{
1926 struct epf_ntb *ntb = epf_get_drvdata(epf);
1927
1928 epf_ntb_epc_cleanup(ntb);
1929 epf_ntb_config_spad_bar_free(ntb);
1930 epf_ntb_epc_destroy(ntb);
1931}
1932
1933#define EPF_NTB_R(_name) \
1934static ssize_t epf_ntb_##_name##_show(struct config_item *item, \
1935 char *page) \
1936{ \
1937 struct config_group *group = to_config_group(item); \
1938 struct epf_ntb *ntb = to_epf_ntb(group); \
1939 \
1940 return sysfs_emit(page, "%d\n", ntb->_name); \
1941}
1942
1943#define EPF_NTB_W(_name) \
1944static ssize_t epf_ntb_##_name##_store(struct config_item *item, \
1945 const char *page, size_t len) \
1946{ \
1947 struct config_group *group = to_config_group(item); \
1948 struct epf_ntb *ntb = to_epf_ntb(group); \
1949 u32 val; \
1950 \
1951 if (kstrtou32(page, 0, &val) < 0) \
1952 return -EINVAL; \
1953 \
1954 ntb->_name = val; \
1955 \
1956 return len; \
1957}
1958
1959#define EPF_NTB_MW_R(_name) \
1960static ssize_t epf_ntb_##_name##_show(struct config_item *item, \
1961 char *page) \
1962{ \
1963 struct config_group *group = to_config_group(item); \
1964 struct epf_ntb *ntb = to_epf_ntb(group); \
1965 int win_no; \
1966 \
1967 sscanf(#_name, "mw%d", &win_no); \
1968 \
1969 return sysfs_emit(page, "%lld\n", ntb->mws_size[win_no - 1]); \
1970}
1971
1972#define EPF_NTB_MW_W(_name) \
1973static ssize_t epf_ntb_##_name##_store(struct config_item *item, \
1974 const char *page, size_t len) \
1975{ \
1976 struct config_group *group = to_config_group(item); \
1977 struct epf_ntb *ntb = to_epf_ntb(group); \
1978 struct device *dev = &ntb->epf->dev; \
1979 int win_no; \
1980 u64 val; \
1981 \
1982 if (kstrtou64(page, 0, &val) < 0) \
1983 return -EINVAL; \
1984 \
1985 if (sscanf(#_name, "mw%d", &win_no) != 1) \
1986 return -EINVAL; \
1987 \
1988 if (ntb->num_mws < win_no) { \
1989 dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
1990 return -EINVAL; \
1991 } \
1992 \
1993 ntb->mws_size[win_no - 1] = val; \
1994 \
1995 return len; \
1996}
1997
1998static ssize_t epf_ntb_num_mws_store(struct config_item *item,
1999 const char *page, size_t len)
2000{
2001 struct config_group *group = to_config_group(item);
2002 struct epf_ntb *ntb = to_epf_ntb(group);
2003 u32 val;
2004
2005 if (kstrtou32(page, 0, &val) < 0)
2006 return -EINVAL;
2007
2008 if (val > MAX_MW)
2009 return -EINVAL;
2010
2011 ntb->num_mws = val;
2012
2013 return len;
2014}
2015
2016EPF_NTB_R(spad_count)
2017EPF_NTB_W(spad_count)
2018EPF_NTB_R(db_count)
2019EPF_NTB_W(db_count)
2020EPF_NTB_R(num_mws)
2021EPF_NTB_MW_R(mw1)
2022EPF_NTB_MW_W(mw1)
2023EPF_NTB_MW_R(mw2)
2024EPF_NTB_MW_W(mw2)
2025EPF_NTB_MW_R(mw3)
2026EPF_NTB_MW_W(mw3)
2027EPF_NTB_MW_R(mw4)
2028EPF_NTB_MW_W(mw4)
2029
2030CONFIGFS_ATTR(epf_ntb_, spad_count);
2031CONFIGFS_ATTR(epf_ntb_, db_count);
2032CONFIGFS_ATTR(epf_ntb_, num_mws);
2033CONFIGFS_ATTR(epf_ntb_, mw1);
2034CONFIGFS_ATTR(epf_ntb_, mw2);
2035CONFIGFS_ATTR(epf_ntb_, mw3);
2036CONFIGFS_ATTR(epf_ntb_, mw4);
2037
2038static struct configfs_attribute *epf_ntb_attrs[] = {
2039 &epf_ntb_attr_spad_count,
2040 &epf_ntb_attr_db_count,
2041 &epf_ntb_attr_num_mws,
2042 &epf_ntb_attr_mw1,
2043 &epf_ntb_attr_mw2,
2044 &epf_ntb_attr_mw3,
2045 &epf_ntb_attr_mw4,
2046 NULL,
2047};
2048
2049static const struct config_item_type ntb_group_type = {
2050 .ct_attrs = epf_ntb_attrs,
2051 .ct_owner = THIS_MODULE,
2052};
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063static struct config_group *epf_ntb_add_cfs(struct pci_epf *epf,
2064 struct config_group *group)
2065{
2066 struct epf_ntb *ntb = epf_get_drvdata(epf);
2067 struct config_group *ntb_group = &ntb->group;
2068 struct device *dev = &epf->dev;
2069
2070 config_group_init_type_name(ntb_group, dev_name(dev), &ntb_group_type);
2071
2072 return ntb_group;
2073}
2074
2075
2076
2077
2078
2079
2080
2081
2082static int epf_ntb_probe(struct pci_epf *epf)
2083{
2084 struct epf_ntb *ntb;
2085 struct device *dev;
2086
2087 dev = &epf->dev;
2088
2089 ntb = devm_kzalloc(dev, sizeof(*ntb), GFP_KERNEL);
2090 if (!ntb)
2091 return -ENOMEM;
2092
2093 epf->header = &epf_ntb_header;
2094 ntb->epf = epf;
2095 epf_set_drvdata(epf, ntb);
2096
2097 return 0;
2098}
2099
2100static struct pci_epf_ops epf_ntb_ops = {
2101 .bind = epf_ntb_bind,
2102 .unbind = epf_ntb_unbind,
2103 .add_cfs = epf_ntb_add_cfs,
2104};
2105
2106static const struct pci_epf_device_id epf_ntb_ids[] = {
2107 {
2108 .name = "pci_epf_ntb",
2109 },
2110 {},
2111};
2112
2113static struct pci_epf_driver epf_ntb_driver = {
2114 .driver.name = "pci_epf_ntb",
2115 .probe = epf_ntb_probe,
2116 .id_table = epf_ntb_ids,
2117 .ops = &epf_ntb_ops,
2118 .owner = THIS_MODULE,
2119};
2120
2121static int __init epf_ntb_init(void)
2122{
2123 int ret;
2124
2125 kpcintb_workqueue = alloc_workqueue("kpcintb", WQ_MEM_RECLAIM |
2126 WQ_HIGHPRI, 0);
2127 ret = pci_epf_register_driver(&epf_ntb_driver);
2128 if (ret) {
2129 destroy_workqueue(kpcintb_workqueue);
2130 pr_err("Failed to register pci epf ntb driver --> %d\n", ret);
2131 return ret;
2132 }
2133
2134 return 0;
2135}
2136module_init(epf_ntb_init);
2137
2138static void __exit epf_ntb_exit(void)
2139{
2140 pci_epf_unregister_driver(&epf_ntb_driver);
2141 destroy_workqueue(kpcintb_workqueue);
2142}
2143module_exit(epf_ntb_exit);
2144
2145MODULE_DESCRIPTION("PCI EPF NTB DRIVER");
2146MODULE_AUTHOR("Kishon Vijay Abraham I <kishon@ti.com>");
2147MODULE_LICENSE("GPL v2");
2148