@@ -64,52 +64,29 @@ static void rockchip_pcie_clear_ep_ob_atu(struct rockchip_pcie *rockchip,
6464}
6565
6666static void rockchip_pcie_prog_ep_ob_atu (struct rockchip_pcie * rockchip , u8 fn ,
67- u32 r , u32 type , u64 cpu_addr ,
68- u64 pci_addr , size_t size )
67+ u32 r , u64 cpu_addr , u64 pci_addr ,
68+ size_t size )
6969{
70- u64 sz = 1ULL << fls64 (size - 1 );
71- int num_pass_bits = ilog2 (sz );
72- u32 addr0 , addr1 , desc0 , desc1 ;
73- bool is_nor_msg = (type == AXI_WRAPPER_NOR_MSG );
70+ int num_pass_bits = fls64 (size - 1 );
71+ u32 addr0 , addr1 , desc0 ;
7472
75- /* The minimal region size is 1MB */
7673 if (num_pass_bits < 8 )
7774 num_pass_bits = 8 ;
7875
79- cpu_addr -= rockchip -> mem_res -> start ;
80- addr0 = ((is_nor_msg ? 0x10 : (num_pass_bits - 1 )) &
81- PCIE_CORE_OB_REGION_ADDR0_NUM_BITS ) |
82- (lower_32_bits (cpu_addr ) & PCIE_CORE_OB_REGION_ADDR0_LO_ADDR );
83- addr1 = upper_32_bits (is_nor_msg ? cpu_addr : pci_addr );
84- desc0 = ROCKCHIP_PCIE_AT_OB_REGION_DESC0_DEVFN (fn ) | type ;
85- desc1 = 0 ;
86-
87- if (is_nor_msg ) {
88- rockchip_pcie_write (rockchip , 0 ,
89- ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0 (r ));
90- rockchip_pcie_write (rockchip , 0 ,
91- ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1 (r ));
92- rockchip_pcie_write (rockchip , desc0 ,
93- ROCKCHIP_PCIE_AT_OB_REGION_DESC0 (r ));
94- rockchip_pcie_write (rockchip , desc1 ,
95- ROCKCHIP_PCIE_AT_OB_REGION_DESC1 (r ));
96- } else {
97- /* PCI bus address region */
98- rockchip_pcie_write (rockchip , addr0 ,
99- ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0 (r ));
100- rockchip_pcie_write (rockchip , addr1 ,
101- ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1 (r ));
102- rockchip_pcie_write (rockchip , desc0 ,
103- ROCKCHIP_PCIE_AT_OB_REGION_DESC0 (r ));
104- rockchip_pcie_write (rockchip , desc1 ,
105- ROCKCHIP_PCIE_AT_OB_REGION_DESC1 (r ));
106-
107- addr0 =
108- ((num_pass_bits - 1 ) & PCIE_CORE_OB_REGION_ADDR0_NUM_BITS ) |
109- (lower_32_bits (cpu_addr ) &
110- PCIE_CORE_OB_REGION_ADDR0_LO_ADDR );
111- addr1 = upper_32_bits (cpu_addr );
112- }
76+ addr0 = ((num_pass_bits - 1 ) & PCIE_CORE_OB_REGION_ADDR0_NUM_BITS ) |
77+ (lower_32_bits (pci_addr ) & PCIE_CORE_OB_REGION_ADDR0_LO_ADDR );
78+ addr1 = upper_32_bits (pci_addr );
79+ desc0 = ROCKCHIP_PCIE_AT_OB_REGION_DESC0_DEVFN (fn ) | AXI_WRAPPER_MEM_WRITE ;
80+
81+ /* PCI bus address region */
82+ rockchip_pcie_write (rockchip , addr0 ,
83+ ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0 (r ));
84+ rockchip_pcie_write (rockchip , addr1 ,
85+ ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1 (r ));
86+ rockchip_pcie_write (rockchip , desc0 ,
87+ ROCKCHIP_PCIE_AT_OB_REGION_DESC0 (r ));
88+ rockchip_pcie_write (rockchip , 0 ,
89+ ROCKCHIP_PCIE_AT_OB_REGION_DESC1 (r ));
11390}
11491
11592static int rockchip_pcie_ep_write_header (struct pci_epc * epc , u8 fn , u8 vfn ,
@@ -248,26 +225,20 @@ static void rockchip_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn, u8 vfn,
248225 ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR1 (fn , bar ));
249226}
250227
228+ static inline u32 rockchip_ob_region (phys_addr_t addr )
229+ {
230+ return (addr >> ilog2 (SZ_1M )) & 0x1f ;
231+ }
232+
251233static int rockchip_pcie_ep_map_addr (struct pci_epc * epc , u8 fn , u8 vfn ,
252234 phys_addr_t addr , u64 pci_addr ,
253235 size_t size )
254236{
255237 struct rockchip_pcie_ep * ep = epc_get_drvdata (epc );
256238 struct rockchip_pcie * pcie = & ep -> rockchip ;
257- u32 r ;
239+ u32 r = rockchip_ob_region ( addr ) ;
258240
259- r = find_first_zero_bit (& ep -> ob_region_map , BITS_PER_LONG );
260- /*
261- * Region 0 is reserved for configuration space and shouldn't
262- * be used elsewhere per TRM, so leave it out.
263- */
264- if (r >= ep -> max_regions - 1 ) {
265- dev_err (& epc -> dev , "no free outbound region\n" );
266- return - EINVAL ;
267- }
268-
269- rockchip_pcie_prog_ep_ob_atu (pcie , fn , r , AXI_WRAPPER_MEM_WRITE , addr ,
270- pci_addr , size );
241+ rockchip_pcie_prog_ep_ob_atu (pcie , fn , r , addr , pci_addr , size );
271242
272243 set_bit (r , & ep -> ob_region_map );
273244 ep -> ob_addr [r ] = addr ;
@@ -282,15 +253,11 @@ static void rockchip_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn, u8 vfn,
282253 struct rockchip_pcie * rockchip = & ep -> rockchip ;
283254 u32 r ;
284255
285- for (r = 0 ; r < ep -> max_regions - 1 ; r ++ )
256+ for (r = 0 ; r < ep -> max_regions ; r ++ )
286257 if (ep -> ob_addr [r ] == addr )
287258 break ;
288259
289- /*
290- * Region 0 is reserved for configuration space and shouldn't
291- * be used elsewhere per TRM, so leave it out.
292- */
293- if (r == ep -> max_regions - 1 )
260+ if (r == ep -> max_regions )
294261 return ;
295262
296263 rockchip_pcie_clear_ep_ob_atu (rockchip , r );
@@ -387,7 +354,8 @@ static int rockchip_pcie_ep_send_msi_irq(struct rockchip_pcie_ep *ep, u8 fn,
387354 struct rockchip_pcie * rockchip = & ep -> rockchip ;
388355 u16 flags , mme , data , data_mask ;
389356 u8 msi_count ;
390- u64 pci_addr , pci_addr_mask = 0xff ;
357+ u64 pci_addr ;
358+ u32 r ;
391359
392360 /* Check MSI enable bit */
393361 flags = rockchip_pcie_read (& ep -> rockchip ,
@@ -421,21 +389,20 @@ static int rockchip_pcie_ep_send_msi_irq(struct rockchip_pcie_ep *ep, u8 fn,
421389 ROCKCHIP_PCIE_EP_FUNC_BASE (fn ) +
422390 ROCKCHIP_PCIE_EP_MSI_CTRL_REG +
423391 PCI_MSI_ADDRESS_LO );
424- pci_addr &= GENMASK_ULL (63 , 2 );
425392
426393 /* Set the outbound region if needed. */
427- if (unlikely (ep -> irq_pci_addr != (pci_addr & ~ pci_addr_mask ) ||
394+ if (unlikely (ep -> irq_pci_addr != (pci_addr & PCIE_ADDR_MASK ) ||
428395 ep -> irq_pci_fn != fn )) {
429- rockchip_pcie_prog_ep_ob_atu ( rockchip , fn , ep -> max_regions - 1 ,
430- AXI_WRAPPER_MEM_WRITE ,
396+ r = rockchip_ob_region ( ep -> irq_phys_addr );
397+ rockchip_pcie_prog_ep_ob_atu ( rockchip , fn , r ,
431398 ep -> irq_phys_addr ,
432- pci_addr & ~ pci_addr_mask ,
433- pci_addr_mask + 1 );
434- ep -> irq_pci_addr = (pci_addr & ~ pci_addr_mask );
399+ pci_addr & PCIE_ADDR_MASK ,
400+ ~ PCIE_ADDR_MASK + 1 );
401+ ep -> irq_pci_addr = (pci_addr & PCIE_ADDR_MASK );
435402 ep -> irq_pci_fn = fn ;
436403 }
437404
438- writew (data , ep -> irq_cpu_addr + (pci_addr & pci_addr_mask ));
405+ writew (data , ep -> irq_cpu_addr + (pci_addr & ~ PCIE_ADDR_MASK ));
439406 return 0 ;
440407}
441408
@@ -516,6 +483,8 @@ static int rockchip_pcie_parse_ep_dt(struct rockchip_pcie *rockchip,
516483 if (err < 0 || ep -> max_regions > MAX_REGION_LIMIT )
517484 ep -> max_regions = MAX_REGION_LIMIT ;
518485
486+ ep -> ob_region_map = 0 ;
487+
519488 err = of_property_read_u8 (dev -> of_node , "max-functions" ,
520489 & ep -> epc -> max_functions );
521490 if (err < 0 )
@@ -536,7 +505,8 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)
536505 struct rockchip_pcie * rockchip ;
537506 struct pci_epc * epc ;
538507 size_t max_regions ;
539- int err ;
508+ struct pci_epc_mem_window * windows = NULL ;
509+ int err , i ;
540510
541511 ep = devm_kzalloc (dev , sizeof (* ep ), GFP_KERNEL );
542512 if (!ep )
@@ -583,15 +553,27 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)
583553 /* Only enable function 0 by default */
584554 rockchip_pcie_write (rockchip , BIT (0 ), PCIE_CORE_PHY_FUNC_CFG );
585555
586- err = pci_epc_mem_init (epc , rockchip -> mem_res -> start ,
587- resource_size (rockchip -> mem_res ), PAGE_SIZE );
556+ windows = devm_kcalloc (dev , ep -> max_regions ,
557+ sizeof (struct pci_epc_mem_window ), GFP_KERNEL );
558+ if (!windows ) {
559+ err = - ENOMEM ;
560+ goto err_uninit_port ;
561+ }
562+ for (i = 0 ; i < ep -> max_regions ; i ++ ) {
563+ windows [i ].phys_base = rockchip -> mem_res -> start + (SZ_1M * i );
564+ windows [i ].size = SZ_1M ;
565+ windows [i ].page_size = SZ_1M ;
566+ }
567+ err = pci_epc_multi_mem_init (epc , windows , ep -> max_regions );
568+ devm_kfree (dev , windows );
569+
588570 if (err < 0 ) {
589571 dev_err (dev , "failed to initialize the memory space\n" );
590572 goto err_uninit_port ;
591573 }
592574
593575 ep -> irq_cpu_addr = pci_epc_mem_alloc_addr (epc , & ep -> irq_phys_addr ,
594- SZ_128K );
576+ SZ_1M );
595577 if (!ep -> irq_cpu_addr ) {
596578 dev_err (dev , "failed to reserve memory space for MSI\n" );
597579 err = - ENOMEM ;
0 commit comments