@@ -574,29 +574,6 @@ static void iommu_table_setparms(struct pci_controller *phb,
574
574
575
575
struct iommu_table_ops iommu_table_lpar_multi_ops ;
576
576
577
- /*
578
- * iommu_table_setparms_lpar
579
- *
580
- * Function: On pSeries LPAR systems, return TCE table info, given a pci bus.
581
- */
582
- static void iommu_table_setparms_lpar (struct pci_controller * phb ,
583
- struct device_node * dn ,
584
- struct iommu_table * tbl ,
585
- struct iommu_table_group * table_group ,
586
- const __be32 * dma_window )
587
- {
588
- unsigned long offset , size , liobn ;
589
-
590
- of_parse_dma_window (dn , dma_window , & liobn , & offset , & size );
591
-
592
- iommu_table_setparms_common (tbl , phb -> bus -> number , liobn , offset , size , IOMMU_PAGE_SHIFT_4K , NULL ,
593
- & iommu_table_lpar_multi_ops );
594
-
595
-
596
- table_group -> tce32_start = offset ;
597
- table_group -> tce32_size = size ;
598
- }
599
-
600
577
struct iommu_table_ops iommu_table_pseries_ops = {
601
578
.set = tce_build_pSeries ,
602
579
.clear = tce_free_pSeries ,
@@ -724,44 +701,92 @@ struct iommu_table_ops iommu_table_lpar_multi_ops = {
724
701
* dynamic 64bit DMA window, walking up the device tree.
725
702
*/
726
703
static struct device_node * pci_dma_find (struct device_node * dn ,
727
- const __be32 * * dma_window )
704
+ struct dynamic_dma_window_prop * prop )
728
705
{
729
- const __be32 * dw = NULL ;
706
+ const __be32 * default_prop = NULL ;
707
+ const __be32 * ddw_prop = NULL ;
708
+ struct device_node * rdn = NULL ;
709
+ bool default_win = false, ddw_win = false;
730
710
731
711
for ( ; dn && PCI_DN (dn ); dn = dn -> parent ) {
732
- dw = of_get_property (dn , "ibm,dma-window" , NULL );
733
- if (dw ) {
734
- if (dma_window )
735
- * dma_window = dw ;
736
- return dn ;
712
+ default_prop = of_get_property (dn , "ibm,dma-window" , NULL );
713
+ if (default_prop ) {
714
+ rdn = dn ;
715
+ default_win = true;
716
+ }
717
+ ddw_prop = of_get_property (dn , DIRECT64_PROPNAME , NULL );
718
+ if (ddw_prop ) {
719
+ rdn = dn ;
720
+ ddw_win = true;
721
+ break ;
722
+ }
723
+ ddw_prop = of_get_property (dn , DMA64_PROPNAME , NULL );
724
+ if (ddw_prop ) {
725
+ rdn = dn ;
726
+ ddw_win = true;
727
+ break ;
737
728
}
738
- dw = of_get_property (dn , DIRECT64_PROPNAME , NULL );
739
- if (dw )
740
- return dn ;
741
- dw = of_get_property (dn , DMA64_PROPNAME , NULL );
742
- if (dw )
743
- return dn ;
729
+
730
+ /* At least found default window, which is the case for normal boot */
731
+ if (default_win )
732
+ break ;
744
733
}
745
734
746
- return NULL ;
735
+ /* For PCI devices there will always be a DMA window, either on the device
736
+ * or parent bus
737
+ */
738
+ WARN_ON (!(default_win | ddw_win ));
739
+
740
+ /* caller doesn't want to get DMA window property */
741
+ if (!prop )
742
+ return rdn ;
743
+
744
+ /* parse DMA window property. During normal system boot, only default
745
+ * DMA window is passed in OF. But, for kdump, a dedicated adapter might
746
+ * have both default and DDW in FDT. In this scenario, DDW takes precedence
747
+ * over default window.
748
+ */
749
+ if (ddw_win ) {
750
+ struct dynamic_dma_window_prop * p ;
751
+
752
+ p = (struct dynamic_dma_window_prop * )ddw_prop ;
753
+ prop -> liobn = p -> liobn ;
754
+ prop -> dma_base = p -> dma_base ;
755
+ prop -> tce_shift = p -> tce_shift ;
756
+ prop -> window_shift = p -> window_shift ;
757
+ } else if (default_win ) {
758
+ unsigned long offset , size , liobn ;
759
+
760
+ of_parse_dma_window (rdn , default_prop , & liobn , & offset , & size );
761
+
762
+ prop -> liobn = cpu_to_be32 ((u32 )liobn );
763
+ prop -> dma_base = cpu_to_be64 (offset );
764
+ prop -> tce_shift = cpu_to_be32 (IOMMU_PAGE_SHIFT_4K );
765
+ prop -> window_shift = cpu_to_be32 (order_base_2 (size ));
766
+ }
767
+
768
+ return rdn ;
747
769
}
748
770
749
771
static void pci_dma_bus_setup_pSeriesLP (struct pci_bus * bus )
750
772
{
751
773
struct iommu_table * tbl ;
752
774
struct device_node * dn , * pdn ;
753
775
struct pci_dn * ppci ;
754
- const __be32 * dma_window = NULL ;
776
+ struct dynamic_dma_window_prop prop ;
755
777
756
778
dn = pci_bus_to_OF_node (bus );
757
779
758
780
pr_debug ("pci_dma_bus_setup_pSeriesLP: setting up bus %pOF\n" ,
759
781
dn );
760
782
761
- pdn = pci_dma_find (dn , & dma_window );
783
+ pdn = pci_dma_find (dn , & prop );
762
784
763
- if (dma_window == NULL )
764
- pr_debug (" no ibm,dma-window property !\n" );
785
+ /* In PPC architecture, there will always be DMA window on bus or one of the
786
+ * parent bus. During reboot, there will be ibm,dma-window property to
787
+ * define DMA window. For kdump, there will at least be default window or DDW
788
+ * or both.
789
+ */
765
790
766
791
ppci = PCI_DN (pdn );
767
792
@@ -771,13 +796,24 @@ static void pci_dma_bus_setup_pSeriesLP(struct pci_bus *bus)
771
796
if (!ppci -> table_group ) {
772
797
ppci -> table_group = iommu_pseries_alloc_group (ppci -> phb -> node );
773
798
tbl = ppci -> table_group -> tables [0 ];
774
- if (dma_window ) {
775
- iommu_table_setparms_lpar (ppci -> phb , pdn , tbl ,
776
- ppci -> table_group , dma_window );
777
799
778
- if (!iommu_init_table (tbl , ppci -> phb -> node , 0 , 0 ))
779
- panic ("Failed to initialize iommu table" );
780
- }
800
+ iommu_table_setparms_common (tbl , ppci -> phb -> bus -> number ,
801
+ be32_to_cpu (prop .liobn ),
802
+ be64_to_cpu (prop .dma_base ),
803
+ 1ULL << be32_to_cpu (prop .window_shift ),
804
+ be32_to_cpu (prop .tce_shift ), NULL ,
805
+ & iommu_table_lpar_multi_ops );
806
+
807
+ /* Only for normal boot with default window. Doesn't matter even
808
+ * if we set these with DDW which is 64bit during kdump, since
809
+ * these will not be used during kdump.
810
+ */
811
+ ppci -> table_group -> tce32_start = be64_to_cpu (prop .dma_base );
812
+ ppci -> table_group -> tce32_size = 1 << be32_to_cpu (prop .window_shift );
813
+
814
+ if (!iommu_init_table (tbl , ppci -> phb -> node , 0 , 0 ))
815
+ panic ("Failed to initialize iommu table" );
816
+
781
817
iommu_register_group (ppci -> table_group ,
782
818
pci_domain_nr (bus ), 0 );
783
819
pr_debug (" created table: %p\n" , ppci -> table_group );
@@ -968,6 +1004,12 @@ static void find_existing_ddw_windows_named(const char *name)
968
1004
continue ;
969
1005
}
970
1006
1007
+ /* If at the time of system initialization, there are DDWs in OF,
1008
+ * it means this is during kexec. DDW could be direct or dynamic.
1009
+ * We will just mark DDWs as "dynamic" since this is kdump path,
1010
+ * no need to worry about perforance. ddw_list_new_entry() will
1011
+ * set window->direct = false.
1012
+ */
971
1013
window = ddw_list_new_entry (pdn , dma64 );
972
1014
if (!window ) {
973
1015
of_node_put (pdn );
@@ -1524,8 +1566,8 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev *dev)
1524
1566
{
1525
1567
struct device_node * pdn , * dn ;
1526
1568
struct iommu_table * tbl ;
1527
- const __be32 * dma_window = NULL ;
1528
1569
struct pci_dn * pci ;
1570
+ struct dynamic_dma_window_prop prop ;
1529
1571
1530
1572
pr_debug ("pci_dma_dev_setup_pSeriesLP: %s\n" , pci_name (dev ));
1531
1573
@@ -1538,7 +1580,7 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev *dev)
1538
1580
dn = pci_device_to_OF_node (dev );
1539
1581
pr_debug (" node is %pOF\n" , dn );
1540
1582
1541
- pdn = pci_dma_find (dn , & dma_window );
1583
+ pdn = pci_dma_find (dn , & prop );
1542
1584
if (!pdn || !PCI_DN (pdn )) {
1543
1585
printk (KERN_WARNING "pci_dma_dev_setup_pSeriesLP: "
1544
1586
"no DMA window found for pci dev=%s dn=%pOF\n" ,
@@ -1551,8 +1593,20 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev *dev)
1551
1593
if (!pci -> table_group ) {
1552
1594
pci -> table_group = iommu_pseries_alloc_group (pci -> phb -> node );
1553
1595
tbl = pci -> table_group -> tables [0 ];
1554
- iommu_table_setparms_lpar (pci -> phb , pdn , tbl ,
1555
- pci -> table_group , dma_window );
1596
+
1597
+ iommu_table_setparms_common (tbl , pci -> phb -> bus -> number ,
1598
+ be32_to_cpu (prop .liobn ),
1599
+ be64_to_cpu (prop .dma_base ),
1600
+ 1ULL << be32_to_cpu (prop .window_shift ),
1601
+ be32_to_cpu (prop .tce_shift ), NULL ,
1602
+ & iommu_table_lpar_multi_ops );
1603
+
1604
+ /* Only for normal boot with default window. Doesn't matter even
1605
+ * if we set these with DDW which is 64bit during kdump, since
1606
+ * these will not be used during kdump.
1607
+ */
1608
+ pci -> table_group -> tce32_start = be64_to_cpu (prop .dma_base );
1609
+ pci -> table_group -> tce32_size = 1 << be32_to_cpu (prop .window_shift );
1556
1610
1557
1611
iommu_init_table (tbl , pci -> phb -> node , 0 , 0 );
1558
1612
iommu_register_group (pci -> table_group ,
0 commit comments