@@ -532,15 +532,66 @@ static const struct of_device_id rockchip_pcie_ep_of_match[] = {
532
532
{},
533
533
};
534
534
535
+ static int rockchip_pcie_ep_init_ob_mem (struct rockchip_pcie_ep * ep )
536
+ {
537
+ struct rockchip_pcie * rockchip = & ep -> rockchip ;
538
+ struct device * dev = rockchip -> dev ;
539
+ struct pci_epc_mem_window * windows = NULL ;
540
+ int err , i ;
541
+
542
+ ep -> ob_addr = devm_kcalloc (dev , ep -> max_regions , sizeof (* ep -> ob_addr ),
543
+ GFP_KERNEL );
544
+
545
+ if (!ep -> ob_addr )
546
+ return - ENOMEM ;
547
+
548
+ windows = devm_kcalloc (dev , ep -> max_regions ,
549
+ sizeof (struct pci_epc_mem_window ), GFP_KERNEL );
550
+ if (!windows )
551
+ return - ENOMEM ;
552
+
553
+ for (i = 0 ; i < ep -> max_regions ; i ++ ) {
554
+ windows [i ].phys_base = rockchip -> mem_res -> start + (SZ_1M * i );
555
+ windows [i ].size = SZ_1M ;
556
+ windows [i ].page_size = SZ_1M ;
557
+ }
558
+ err = pci_epc_multi_mem_init (ep -> epc , windows , ep -> max_regions );
559
+ devm_kfree (dev , windows );
560
+
561
+ if (err < 0 ) {
562
+ dev_err (dev , "failed to initialize the memory space\n" );
563
+ return err ;
564
+ }
565
+
566
+ ep -> irq_cpu_addr = pci_epc_mem_alloc_addr (ep -> epc , & ep -> irq_phys_addr ,
567
+ SZ_1M );
568
+ if (!ep -> irq_cpu_addr ) {
569
+ dev_err (dev , "failed to reserve memory space for MSI\n" );
570
+ goto err_epc_mem_exit ;
571
+ }
572
+
573
+ ep -> irq_pci_addr = ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR ;
574
+
575
+ return 0 ;
576
+
577
+ err_epc_mem_exit :
578
+ pci_epc_mem_exit (ep -> epc );
579
+
580
+ return err ;
581
+ }
582
+
583
+ static void rockchip_pcie_ep_exit_ob_mem (struct rockchip_pcie_ep * ep )
584
+ {
585
+ pci_epc_mem_exit (ep -> epc );
586
+ }
587
+
535
588
static int rockchip_pcie_ep_probe (struct platform_device * pdev )
536
589
{
537
590
struct device * dev = & pdev -> dev ;
538
591
struct rockchip_pcie_ep * ep ;
539
592
struct rockchip_pcie * rockchip ;
540
593
struct pci_epc * epc ;
541
- size_t max_regions ;
542
- struct pci_epc_mem_window * windows = NULL ;
543
- int err , i ;
594
+ int err ;
544
595
u32 cfg_msi , cfg_msix_cp ;
545
596
546
597
ep = devm_kzalloc (dev , sizeof (* ep ), GFP_KERNEL );
@@ -564,10 +615,14 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)
564
615
if (err )
565
616
return err ;
566
617
567
- err = rockchip_pcie_enable_clocks ( rockchip );
618
+ err = rockchip_pcie_ep_init_ob_mem ( ep );
568
619
if (err )
569
620
return err ;
570
621
622
+ err = rockchip_pcie_enable_clocks (rockchip );
623
+ if (err )
624
+ goto err_exit_ob_mem ;
625
+
571
626
err = rockchip_pcie_init_port (rockchip );
572
627
if (err )
573
628
goto err_disable_clocks ;
@@ -576,47 +631,9 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)
576
631
rockchip_pcie_write (rockchip , PCIE_CLIENT_LINK_TRAIN_ENABLE ,
577
632
PCIE_CLIENT_CONFIG );
578
633
579
- max_regions = ep -> max_regions ;
580
- ep -> ob_addr = devm_kcalloc (dev , max_regions , sizeof (* ep -> ob_addr ),
581
- GFP_KERNEL );
582
-
583
- if (!ep -> ob_addr ) {
584
- err = - ENOMEM ;
585
- goto err_uninit_port ;
586
- }
587
-
588
634
/* Only enable function 0 by default */
589
635
rockchip_pcie_write (rockchip , BIT (0 ), PCIE_CORE_PHY_FUNC_CFG );
590
636
591
- windows = devm_kcalloc (dev , ep -> max_regions ,
592
- sizeof (struct pci_epc_mem_window ), GFP_KERNEL );
593
- if (!windows ) {
594
- err = - ENOMEM ;
595
- goto err_uninit_port ;
596
- }
597
- for (i = 0 ; i < ep -> max_regions ; i ++ ) {
598
- windows [i ].phys_base = rockchip -> mem_res -> start + (SZ_1M * i );
599
- windows [i ].size = SZ_1M ;
600
- windows [i ].page_size = SZ_1M ;
601
- }
602
- err = pci_epc_multi_mem_init (epc , windows , ep -> max_regions );
603
- devm_kfree (dev , windows );
604
-
605
- if (err < 0 ) {
606
- dev_err (dev , "failed to initialize the memory space\n" );
607
- goto err_uninit_port ;
608
- }
609
-
610
- ep -> irq_cpu_addr = pci_epc_mem_alloc_addr (epc , & ep -> irq_phys_addr ,
611
- SZ_1M );
612
- if (!ep -> irq_cpu_addr ) {
613
- dev_err (dev , "failed to reserve memory space for MSI\n" );
614
- err = - ENOMEM ;
615
- goto err_epc_mem_exit ;
616
- }
617
-
618
- ep -> irq_pci_addr = ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR ;
619
-
620
637
/*
621
638
* MSI-X is not supported but the controller still advertises the MSI-X
622
639
* capability by default, which can lead to the Root Complex side
@@ -646,10 +663,8 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)
646
663
pci_epc_init_notify (epc );
647
664
648
665
return 0 ;
649
- err_epc_mem_exit :
650
- pci_epc_mem_exit (epc );
651
- err_uninit_port :
652
- rockchip_pcie_deinit_phys (rockchip );
666
+ err_exit_ob_mem :
667
+ rockchip_pcie_ep_exit_ob_mem (ep );
653
668
err_disable_clocks :
654
669
rockchip_pcie_disable_clocks (rockchip );
655
670
return err ;
0 commit comments