4949#define NTB_EPF_COMMAND_TIMEOUT 1000 /* 1 Sec */
5050
5151enum pci_barno {
52+ NO_BAR = -1 ,
5253 BAR_0 ,
5354 BAR_1 ,
5455 BAR_2 ,
@@ -57,16 +58,26 @@ enum pci_barno {
5758 BAR_5 ,
5859};
5960
61+ enum epf_ntb_bar {
62+ BAR_CONFIG ,
63+ BAR_PEER_SPAD ,
64+ BAR_DB ,
65+ BAR_MW1 ,
66+ BAR_MW2 ,
67+ BAR_MW3 ,
68+ BAR_MW4 ,
69+ NTB_BAR_NUM ,
70+ };
71+
72+ #define NTB_EPF_MAX_MW_COUNT (NTB_BAR_NUM - BAR_MW1)
73+
6074struct ntb_epf_dev {
6175 struct ntb_dev ntb ;
6276 struct device * dev ;
6377 /* Mutex to protect providing commands to NTB EPF */
6478 struct mutex cmd_lock ;
6579
66- enum pci_barno ctrl_reg_bar ;
67- enum pci_barno peer_spad_reg_bar ;
68- enum pci_barno db_reg_bar ;
69- enum pci_barno mw_bar ;
80+ const enum pci_barno * barno_map ;
7081
7182 unsigned int mw_count ;
7283 unsigned int spad_count ;
@@ -85,17 +96,6 @@ struct ntb_epf_dev {
8596
8697#define ntb_ndev (__ntb ) container_of(__ntb, struct ntb_epf_dev, ntb)
8798
88- struct ntb_epf_data {
89- /* BAR that contains both control region and self spad region */
90- enum pci_barno ctrl_reg_bar ;
91- /* BAR that contains peer spad region */
92- enum pci_barno peer_spad_reg_bar ;
93- /* BAR that contains Doorbell region and Memory window '1' */
94- enum pci_barno db_reg_bar ;
95- /* BAR that contains memory windows*/
96- enum pci_barno mw_bar ;
97- };
98-
9999static int ntb_epf_send_command (struct ntb_epf_dev * ndev , u32 command ,
100100 u32 argument )
101101{
@@ -144,7 +144,7 @@ static int ntb_epf_mw_to_bar(struct ntb_epf_dev *ndev, int idx)
144144 return - EINVAL ;
145145 }
146146
147- return idx + 2 ;
147+ return ndev -> barno_map [ BAR_MW1 + idx ] ;
148148}
149149
150150static int ntb_epf_mw_count (struct ntb_dev * ntb , int pidx )
@@ -413,7 +413,9 @@ static int ntb_epf_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
413413 return - EINVAL ;
414414 }
415415
416- bar = idx + ndev -> mw_bar ;
416+ bar = ntb_epf_mw_to_bar (ndev , idx );
417+ if (bar < 0 )
418+ return bar ;
417419
418420 mw_size = pci_resource_len (ntb -> pdev , bar );
419421
@@ -455,7 +457,9 @@ static int ntb_epf_peer_mw_get_addr(struct ntb_dev *ntb, int idx,
455457 if (idx == 0 )
456458 offset = readl (ndev -> ctrl_reg + NTB_EPF_MW1_OFFSET );
457459
458- bar = idx + ndev -> mw_bar ;
460+ bar = ntb_epf_mw_to_bar (ndev , idx );
461+ if (bar < 0 )
462+ return bar ;
459463
460464 if (base )
461465 * base = pci_resource_start (ndev -> ntb .pdev , bar ) + offset ;
@@ -560,6 +564,11 @@ static int ntb_epf_init_dev(struct ntb_epf_dev *ndev)
560564 ndev -> mw_count = readl (ndev -> ctrl_reg + NTB_EPF_MW_COUNT );
561565 ndev -> spad_count = readl (ndev -> ctrl_reg + NTB_EPF_SPAD_COUNT );
562566
567+ if (ndev -> mw_count > NTB_EPF_MAX_MW_COUNT ) {
568+ dev_err (dev , "Unsupported MW count: %u\n" , ndev -> mw_count );
569+ return - EINVAL ;
570+ }
571+
563572 return 0 ;
564573}
565574
@@ -596,14 +605,15 @@ static int ntb_epf_init_pci(struct ntb_epf_dev *ndev,
596605 dev_warn (& pdev -> dev , "Cannot DMA highmem\n" );
597606 }
598607
599- ndev -> ctrl_reg = pci_iomap (pdev , ndev -> ctrl_reg_bar , 0 );
608+ ndev -> ctrl_reg = pci_iomap (pdev , ndev -> barno_map [ BAR_CONFIG ] , 0 );
600609 if (!ndev -> ctrl_reg ) {
601610 ret = - EIO ;
602611 goto err_pci_regions ;
603612 }
604613
605- if (ndev -> peer_spad_reg_bar ) {
606- ndev -> peer_spad_reg = pci_iomap (pdev , ndev -> peer_spad_reg_bar , 0 );
614+ if (ndev -> barno_map [BAR_PEER_SPAD ] != ndev -> barno_map [BAR_CONFIG ]) {
615+ ndev -> peer_spad_reg = pci_iomap (pdev ,
616+ ndev -> barno_map [BAR_PEER_SPAD ], 0 );
607617 if (!ndev -> peer_spad_reg ) {
608618 ret = - EIO ;
609619 goto err_pci_regions ;
@@ -614,7 +624,7 @@ static int ntb_epf_init_pci(struct ntb_epf_dev *ndev,
614624 ndev -> peer_spad_reg = ndev -> ctrl_reg + spad_off + spad_sz ;
615625 }
616626
617- ndev -> db_reg = pci_iomap (pdev , ndev -> db_reg_bar , 0 );
627+ ndev -> db_reg = pci_iomap (pdev , ndev -> barno_map [ BAR_DB ] , 0 );
618628 if (!ndev -> db_reg ) {
619629 ret = - EIO ;
620630 goto err_pci_regions ;
@@ -659,12 +669,7 @@ static void ntb_epf_cleanup_isr(struct ntb_epf_dev *ndev)
659669static int ntb_epf_pci_probe (struct pci_dev * pdev ,
660670 const struct pci_device_id * id )
661671{
662- enum pci_barno peer_spad_reg_bar = BAR_1 ;
663- enum pci_barno ctrl_reg_bar = BAR_0 ;
664- enum pci_barno db_reg_bar = BAR_2 ;
665- enum pci_barno mw_bar = BAR_2 ;
666672 struct device * dev = & pdev -> dev ;
667- struct ntb_epf_data * data ;
668673 struct ntb_epf_dev * ndev ;
669674 int ret ;
670675
@@ -675,18 +680,10 @@ static int ntb_epf_pci_probe(struct pci_dev *pdev,
675680 if (!ndev )
676681 return - ENOMEM ;
677682
678- data = (struct ntb_epf_data * )id -> driver_data ;
679- if (data ) {
680- peer_spad_reg_bar = data -> peer_spad_reg_bar ;
681- ctrl_reg_bar = data -> ctrl_reg_bar ;
682- db_reg_bar = data -> db_reg_bar ;
683- mw_bar = data -> mw_bar ;
684- }
683+ ndev -> barno_map = (const enum pci_barno * )id -> driver_data ;
684+ if (!ndev -> barno_map )
685+ return - EINVAL ;
685686
686- ndev -> peer_spad_reg_bar = peer_spad_reg_bar ;
687- ndev -> ctrl_reg_bar = ctrl_reg_bar ;
688- ndev -> db_reg_bar = db_reg_bar ;
689- ndev -> mw_bar = mw_bar ;
690687 ndev -> dev = dev ;
691688
692689 ntb_epf_init_struct (ndev , pdev );
@@ -730,30 +727,51 @@ static void ntb_epf_pci_remove(struct pci_dev *pdev)
730727 ntb_epf_deinit_pci (ndev );
731728}
732729
733- static const struct ntb_epf_data j721e_data = {
734- .ctrl_reg_bar = BAR_0 ,
735- .peer_spad_reg_bar = BAR_1 ,
736- .db_reg_bar = BAR_2 ,
737- .mw_bar = BAR_2 ,
730+ static const enum pci_barno j721e_map [NTB_BAR_NUM ] = {
731+ [BAR_CONFIG ] = BAR_0 ,
732+ [BAR_PEER_SPAD ] = BAR_1 ,
733+ [BAR_DB ] = BAR_2 ,
734+ [BAR_MW1 ] = BAR_2 ,
735+ [BAR_MW2 ] = BAR_3 ,
736+ [BAR_MW3 ] = BAR_4 ,
737+ [BAR_MW4 ] = BAR_5
738738};
739739
740- static const struct ntb_epf_data mx8_data = {
741- .ctrl_reg_bar = BAR_0 ,
742- .peer_spad_reg_bar = BAR_0 ,
743- .db_reg_bar = BAR_2 ,
744- .mw_bar = BAR_4 ,
740+ static const enum pci_barno mx8_map [NTB_BAR_NUM ] = {
741+ [BAR_CONFIG ] = BAR_0 ,
742+ [BAR_PEER_SPAD ] = BAR_0 ,
743+ [BAR_DB ] = BAR_2 ,
744+ [BAR_MW1 ] = BAR_4 ,
745+ [BAR_MW2 ] = BAR_5 ,
746+ [BAR_MW3 ] = NO_BAR ,
747+ [BAR_MW4 ] = NO_BAR
748+ };
749+
750+ static const enum pci_barno rcar_barno [NTB_BAR_NUM ] = {
751+ [BAR_CONFIG ] = BAR_0 ,
752+ [BAR_PEER_SPAD ] = BAR_0 ,
753+ [BAR_DB ] = BAR_4 ,
754+ [BAR_MW1 ] = BAR_2 ,
755+ [BAR_MW2 ] = NO_BAR ,
756+ [BAR_MW3 ] = NO_BAR ,
757+ [BAR_MW4 ] = NO_BAR ,
745758};
746759
747760static const struct pci_device_id ntb_epf_pci_tbl [] = {
748761 {
749762 PCI_DEVICE (PCI_VENDOR_ID_TI , PCI_DEVICE_ID_TI_J721E ),
750763 .class = PCI_CLASS_MEMORY_RAM << 8 , .class_mask = 0xffff00 ,
751- .driver_data = (kernel_ulong_t )& j721e_data ,
764+ .driver_data = (kernel_ulong_t )j721e_map ,
752765 },
753766 {
754767 PCI_DEVICE (PCI_VENDOR_ID_FREESCALE , 0x0809 ),
755768 .class = PCI_CLASS_MEMORY_RAM << 8 , .class_mask = 0xffff00 ,
756- .driver_data = (kernel_ulong_t )& mx8_data ,
769+ .driver_data = (kernel_ulong_t )mx8_map ,
770+ },
771+ {
772+ PCI_DEVICE (PCI_VENDOR_ID_RENESAS , 0x0030 ),
773+ .class = PCI_CLASS_MEMORY_RAM << 8 , .class_mask = 0xffff00 ,
774+ .driver_data = (kernel_ulong_t )rcar_barno ,
757775 },
758776 { },
759777};
0 commit comments