History

of/address: Rework of_pci_range parsing for non-PCI buses

The only PCI specific part of of_pci_range_parser_one() is the handling of the 3rd address cell. Rework it to work on regular 1 and 2 cell addresses. Use defines and a union to avoid a treewide renaming of the parsing helpers and struct.

Rob Herring committed 6 years ago

Commit bc5e5221 parent c67f3df2 files · +30 −15Browse files

Unified · Split

2 files
  1. drivers/of/address.c +21 −12
  2. include/linux/of_address.h +9 −3
drivers/of/address.c+21−12
@@ -694,12 +694,12 @@ EXPORT_SYMBOL(of_get_address); · 693 unmodified lines
694694 static int parser_init(struct of_pci_range_parser *parser,
695695 struct device_node *node, const char *name)
696696 {
697− const int na = 3, ns = 2;
698697 int rlen;
699698
700699 parser->node = node;
701700 parser->pna = of_n_addr_cells(node);
702− parser->np = parser->pna + na + ns;
701+ parser->na = of_bus_n_addr_cells(node);
702+ parser->ns = of_bus_n_size_cells(node);
703703 parser->dma = !strcmp(name, "dma-ranges");
704704
705705 parser->range = of_get_property(node, name, &rlen);
@@ -724,20 +724,28 @@ int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser, · 18 unmodified lines
724724 return parser_init(parser, node, "dma-ranges");
725725 }
726726 EXPORT_SYMBOL_GPL(of_pci_dma_range_parser_init);
727+#define of_dma_range_parser_init of_pci_dma_range_parser_init
727728
728729 struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
729730 struct of_pci_range *range)
730731 {
731− const int na = 3, ns = 2;
732+ int na = parser->na;
733+ int ns = parser->ns;
734+ int np = parser->pna + na + ns;
732735
733736 if (!range)
734737 return NULL;
735738
736− if (!parser->range || parser->range + parser->np > parser->end)
739+ if (!parser->range || parser->range + np > parser->end)
737740 return NULL;
738741
739− range->flags = of_bus_pci_get_flags(parser->range);
740− range->pci_addr = of_read_number(parser->range + 1, ns);
742+ if (parser->na == 3)
743+ range->flags = of_bus_pci_get_flags(parser->range);
744+ else
745+ range->flags = 0;
746+
747+ range->pci_addr = of_read_number(parser->range, na);
748+
741749 if (parser->dma)
742750 range->cpu_addr = of_translate_dma_address(parser->node,
743751 parser->range + na);
@@ -746,15 +754,16 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, · 2 unmodified lines
746754 parser->range + na);
747755 range->size = of_read_number(parser->range + parser->pna + na, ns);
748756
749− parser->range += parser->np;
757+ parser->range += np;
750758
751759 /* Now consume following elements while they are contiguous */
752− while (parser->range + parser->np <= parser->end) {
753− u32 flags;
760+ while (parser->range + np <= parser->end) {
761+ u32 flags = 0;
754762 u64 pci_addr, cpu_addr, size;
755763
756− flags = of_bus_pci_get_flags(parser->range);
757− pci_addr = of_read_number(parser->range + 1, ns);
764+ if (parser->na == 3)
765+ flags = of_bus_pci_get_flags(parser->range);
766+ pci_addr = of_read_number(parser->range, na);
758767 if (parser->dma)
759768 cpu_addr = of_translate_dma_address(parser->node,
760769 parser->range + na);
@@ -770,7 +779,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, · 9 unmodified lines
770779 break;
771780
772781 range->size += size;
773− parser->range += parser->np;
782+ parser->range += np;
774783 }
775784
776785 return range;
include/linux/of_address.h+9−3
@@ -10,20 +10,27 @@ struct of_pci_range_parser { · 9 unmodified lines
1010 struct device_node *node;
1111 const __be32 *range;
1212 const __be32 *end;
13− int np;
13+ int na;
14+ int ns;
1415 int pna;
1516 bool dma;
1617 };
18+#define of_range_parser of_pci_range_parser
1719
1820 struct of_pci_range {
19− u64 pci_addr;
21+ union {
22+ u64 pci_addr;
23+ u64 bus_addr;
24+ };
2025 u64 cpu_addr;
2126 u64 size;
2227 u32 flags;
2328 };
29+#define of_range of_pci_range
2430
2531 #define for_each_of_pci_range(parser, range) \
2632 for (; of_pci_range_parser_one(parser, range);)
33+#define for_each_of_range for_each_of_pci_range
2734
2835 /* Translate a DMA address from device space to CPU space */
2936 extern u64 of_translate_dma_address(struct device_node *dev,
@@ -142,4 +149,3 @@ static inline int of_pci_range_to_resource(struct of_pci_range *range, · 112 unmodified lines
142149 #endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */
143150
144151 #endif /* __OF_ADDRESS_H */
145−

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t