@@ -49,6 +49,7 @@ struct of_bus {
49
49
u64 (* map )(__be32 * addr , const __be32 * range ,
50
50
int na , int ns , int pna );
51
51
int (* translate )(__be32 * addr , u64 offset , int na );
52
+ bool has_flags ;
52
53
unsigned int (* get_flags )(const __be32 * addr );
53
54
};
54
55
@@ -364,6 +365,7 @@ static struct of_bus of_busses[] = {
364
365
.count_cells = of_bus_pci_count_cells ,
365
366
.map = of_bus_pci_map ,
366
367
.translate = of_bus_pci_translate ,
368
+ .has_flags = true,
367
369
.get_flags = of_bus_pci_get_flags ,
368
370
},
369
371
#endif /* CONFIG_PCI */
@@ -375,6 +377,7 @@ static struct of_bus of_busses[] = {
375
377
.count_cells = of_bus_isa_count_cells ,
376
378
.map = of_bus_isa_map ,
377
379
.translate = of_bus_isa_translate ,
380
+ .has_flags = true,
378
381
.get_flags = of_bus_isa_get_flags ,
379
382
},
380
383
/* Default */
@@ -698,9 +701,10 @@ static int parser_init(struct of_pci_range_parser *parser,
698
701
699
702
parser -> node = node ;
700
703
parser -> pna = of_n_addr_cells (node );
701
- parser -> na = of_bus_n_addr_cells (node );
702
- parser -> ns = of_bus_n_size_cells (node );
703
704
parser -> dma = !strcmp (name , "dma-ranges" );
705
+ parser -> bus = of_match_bus (node );
706
+
707
+ parser -> bus -> count_cells (parser -> node , & parser -> na , & parser -> ns );
704
708
705
709
parser -> range = of_get_property (node , name , & rlen );
706
710
if (parser -> range == NULL )
@@ -732,19 +736,21 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
732
736
int na = parser -> na ;
733
737
int ns = parser -> ns ;
734
738
int np = parser -> pna + na + ns ;
739
+ int busflag_na = 0 ;
735
740
736
741
if (!range )
737
742
return NULL ;
738
743
739
744
if (!parser -> range || parser -> range + np > parser -> end )
740
745
return NULL ;
741
746
742
- if (parser -> na == 3 )
743
- range -> flags = of_bus_pci_get_flags (parser -> range );
744
- else
745
- range -> flags = 0 ;
747
+ range -> flags = parser -> bus -> get_flags (parser -> range );
748
+
749
+ /* A extra cell for resource flags */
750
+ if (parser -> bus -> has_flags )
751
+ busflag_na = 1 ;
746
752
747
- range -> pci_addr = of_read_number (parser -> range , na );
753
+ range -> bus_addr = of_read_number (parser -> range + busflag_na , na - busflag_na );
748
754
749
755
if (parser -> dma )
750
756
range -> cpu_addr = of_translate_dma_address (parser -> node ,
@@ -759,11 +765,10 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
759
765
/* Now consume following elements while they are contiguous */
760
766
while (parser -> range + np <= parser -> end ) {
761
767
u32 flags = 0 ;
762
- u64 pci_addr , cpu_addr , size ;
768
+ u64 bus_addr , cpu_addr , size ;
763
769
764
- if (parser -> na == 3 )
765
- flags = of_bus_pci_get_flags (parser -> range );
766
- pci_addr = of_read_number (parser -> range , na );
770
+ flags = parser -> bus -> get_flags (parser -> range );
771
+ bus_addr = of_read_number (parser -> range + busflag_na , na - busflag_na );
767
772
if (parser -> dma )
768
773
cpu_addr = of_translate_dma_address (parser -> node ,
769
774
parser -> range + na );
@@ -774,7 +779,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
774
779
775
780
if (flags != range -> flags )
776
781
break ;
777
- if (pci_addr != range -> pci_addr + range -> size ||
782
+ if (bus_addr != range -> bus_addr + range -> size ||
778
783
cpu_addr != range -> cpu_addr + range -> size )
779
784
break ;
780
785
0 commit comments