@@ -574,29 +574,6 @@ static void iommu_table_setparms(struct pci_controller *phb,
574574
575575struct iommu_table_ops iommu_table_lpar_multi_ops ;
576576
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-
600577struct iommu_table_ops iommu_table_pseries_ops = {
601578 .set = tce_build_pSeries ,
602579 .clear = tce_free_pSeries ,
@@ -724,44 +701,92 @@ struct iommu_table_ops iommu_table_lpar_multi_ops = {
724701 * dynamic 64bit DMA window, walking up the device tree.
725702 */
726703static struct device_node * pci_dma_find (struct device_node * dn ,
727- const __be32 * * dma_window )
704+ struct dynamic_dma_window_prop * prop )
728705{
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;
730710
731711 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 ;
737728 }
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 ;
744733 }
745734
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 ;
747769}
748770
749771static void pci_dma_bus_setup_pSeriesLP (struct pci_bus * bus )
750772{
751773 struct iommu_table * tbl ;
752774 struct device_node * dn , * pdn ;
753775 struct pci_dn * ppci ;
754- const __be32 * dma_window = NULL ;
776+ struct dynamic_dma_window_prop prop ;
755777
756778 dn = pci_bus_to_OF_node (bus );
757779
758780 pr_debug ("pci_dma_bus_setup_pSeriesLP: setting up bus %pOF\n" ,
759781 dn );
760782
761- pdn = pci_dma_find (dn , & dma_window );
783+ pdn = pci_dma_find (dn , & prop );
762784
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+ */
765790
766791 ppci = PCI_DN (pdn );
767792
@@ -771,13 +796,24 @@ static void pci_dma_bus_setup_pSeriesLP(struct pci_bus *bus)
771796 if (!ppci -> table_group ) {
772797 ppci -> table_group = iommu_pseries_alloc_group (ppci -> phb -> node );
773798 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 );
777799
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+
781817 iommu_register_group (ppci -> table_group ,
782818 pci_domain_nr (bus ), 0 );
783819 pr_debug (" created table: %p\n" , ppci -> table_group );
@@ -968,6 +1004,12 @@ static void find_existing_ddw_windows_named(const char *name)
9681004 continue ;
9691005 }
9701006
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+ */
9711013 window = ddw_list_new_entry (pdn , dma64 );
9721014 if (!window ) {
9731015 of_node_put (pdn );
@@ -1524,8 +1566,8 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev *dev)
15241566{
15251567 struct device_node * pdn , * dn ;
15261568 struct iommu_table * tbl ;
1527- const __be32 * dma_window = NULL ;
15281569 struct pci_dn * pci ;
1570+ struct dynamic_dma_window_prop prop ;
15291571
15301572 pr_debug ("pci_dma_dev_setup_pSeriesLP: %s\n" , pci_name (dev ));
15311573
@@ -1538,7 +1580,7 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev *dev)
15381580 dn = pci_device_to_OF_node (dev );
15391581 pr_debug (" node is %pOF\n" , dn );
15401582
1541- pdn = pci_dma_find (dn , & dma_window );
1583+ pdn = pci_dma_find (dn , & prop );
15421584 if (!pdn || !PCI_DN (pdn )) {
15431585 printk (KERN_WARNING "pci_dma_dev_setup_pSeriesLP: "
15441586 "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)
15511593 if (!pci -> table_group ) {
15521594 pci -> table_group = iommu_pseries_alloc_group (pci -> phb -> node );
15531595 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 );
15561610
15571611 iommu_init_table (tbl , pci -> phb -> node , 0 , 0 );
15581612 iommu_register_group (pci -> table_group ,
0 commit comments