@@ -779,58 +779,41 @@ static int __init cell_iommu_init_disabled(void)
779779
780780static u64 cell_iommu_get_fixed_address (struct device * dev )
781781{
782- u64 cpu_addr , size , best_size , dev_addr = OF_BAD_ADDR ;
782+ u64 best_size , dev_addr = OF_BAD_ADDR ;
783783 struct device_node * np ;
784- const u32 * ranges = NULL ;
785- int i , len , best , naddr , nsize , pna , range_size ;
784+ struct of_range_parser parser ;
785+ struct of_range range ;
786786
787787 /* We can be called for platform devices that have no of_node */
788788 np = of_node_get (dev -> of_node );
789789 if (!np )
790790 goto out ;
791791
792- while (1 ) {
793- naddr = of_n_addr_cells (np );
794- nsize = of_n_size_cells (np );
795- np = of_get_next_parent (np );
796- if (!np )
797- break ;
798-
799- ranges = of_get_property (np , "dma-ranges" , & len );
792+ while ((np = of_get_next_parent (np ))) {
793+ if (of_pci_dma_range_parser_init (& parser , np ))
794+ continue ;
800795
801- /* Ignore empty ranges, they imply no translation required */
802- if (ranges && len > 0 )
796+ if (of_range_count (& parser ))
803797 break ;
804798 }
805799
806- if (!ranges ) {
800+ if (!np ) {
807801 dev_dbg (dev , "iommu: no dma-ranges found\n" );
808802 goto out ;
809803 }
810804
811- len /= sizeof (u32 );
812-
813- pna = of_n_addr_cells (np );
814- range_size = naddr + nsize + pna ;
815-
816- /* dma-ranges format:
817- * child addr : naddr cells
818- * parent addr : pna cells
819- * size : nsize cells
820- */
821- for (i = 0 , best = -1 , best_size = 0 ; i < len ; i += range_size ) {
822- cpu_addr = of_translate_dma_address (np , ranges + i + naddr );
823- size = of_read_number (ranges + i + naddr + pna , nsize );
805+ best_size = 0 ;
806+ for_each_of_range (& parser , & range ) {
807+ if (!range .cpu_addr )
808+ continue ;
824809
825- if (cpu_addr == 0 && size > best_size ) {
826- best = i ;
827- best_size = size ;
810+ if (range . size > best_size ) {
811+ best_size = range . size ;
812+ dev_addr = range . bus_addr ;
828813 }
829814 }
830815
831- if (best >= 0 ) {
832- dev_addr = of_read_number (ranges + best , naddr );
833- } else
816+ if (!best_size )
834817 dev_dbg (dev , "iommu: no suitable range found!\n" );
835818
836819out :
0 commit comments