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
694static int parser_init(struct of_pci_range_parser *parser,694static int parser_init(struct of_pci_range_parser *parser,
695 struct device_node *node, const char *name)695 struct device_node *node, const char *name)
696{696{
697 const int na = 3, ns = 2;
698 int rlen;697 int rlen;
699 698
700 parser->node = node;699 parser->node = node;
701 parser->pna = of_n_addr_cells(node);700 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);
703 parser->dma = !strcmp(name, "dma-ranges");703 parser->dma = !strcmp(name, "dma-ranges");
704 704
705 parser->range = of_get_property(node, name, &rlen);705 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
724 return parser_init(parser, node, "dma-ranges");724 return parser_init(parser, node, "dma-ranges");
725}725}
726EXPORT_SYMBOL_GPL(of_pci_dma_range_parser_init);726EXPORT_SYMBOL_GPL(of_pci_dma_range_parser_init);
727#define of_dma_range_parser_init of_pci_dma_range_parser_init
727 728
728struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,729struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
729 struct of_pci_range *range)730 struct of_pci_range *range)
730{731{
731 const int na = 3, ns = 2;732 int na = parser->na;
733 int ns = parser->ns;
734 int np = parser->pna + na + ns;
732 735
733 if (!range)736 if (!range)
734 return NULL;737 return NULL;
735 738
736 if (!parser->range || parser->range + parser->np > parser->end)739 if (!parser->range || parser->range + np > parser->end)
737 return NULL;740 return NULL;
738 741
739 range->flags = of_bus_pci_get_flags(parser->range);742 if (parser->na == 3)
740 range->pci_addr = of_read_number(parser->range + 1, ns);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
741 if (parser->dma)749 if (parser->dma)
742 range->cpu_addr = of_translate_dma_address(parser->node,750 range->cpu_addr = of_translate_dma_address(parser->node,
743 parser->range + na);751 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
746 parser->range + na);754 parser->range + na);
747 range->size = of_read_number(parser->range + parser->pna + na, ns);755 range->size = of_read_number(parser->range + parser->pna + na, ns);
748 756
749 parser->range += parser->np;757 parser->range += np;
750 758
751 /* Now consume following elements while they are contiguous */759 /* Now consume following elements while they are contiguous */
752 while (parser->range + parser->np <= parser->end) {760 while (parser->range + np <= parser->end) {
753 u32 flags;761 u32 flags = 0;
754 u64 pci_addr, cpu_addr, size;762 u64 pci_addr, cpu_addr, size;
755 763
756 flags = of_bus_pci_get_flags(parser->range);764 if (parser->na == 3)
757 pci_addr = of_read_number(parser->range + 1, ns);765 flags = of_bus_pci_get_flags(parser->range);
766 pci_addr = of_read_number(parser->range, na);
758 if (parser->dma)767 if (parser->dma)
759 cpu_addr = of_translate_dma_address(parser->node,768 cpu_addr = of_translate_dma_address(parser->node,
760 parser->range + na);769 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
770 break;779 break;
771 780
772 range->size += size;781 range->size += size;
773 parser->range += parser->np;782 parser->range += np;
774 }783 }
775 784
776 return range;785 return range;
include/linux/of_address.h+9−3
@@ -10,20 +10,27 @@ struct of_pci_range_parser { · 9 unmodified lines
10 struct device_node *node;10 struct device_node *node;
11 const __be32 *range;11 const __be32 *range;
12 const __be32 *end;12 const __be32 *end;
13 int np;13 int na;
14 int ns;
14 int pna;15 int pna;
15 bool dma;16 bool dma;
16};17};
18#define of_range_parser of_pci_range_parser
17 19
18struct of_pci_range {20struct of_pci_range {
19 u64 pci_addr;21 union {
22 u64 pci_addr;
23 u64 bus_addr;
24 };
20 u64 cpu_addr;25 u64 cpu_addr;
21 u64 size;26 u64 size;
22 u32 flags;27 u32 flags;
23};28};
29#define of_range of_pci_range
24 30
25#define for_each_of_pci_range(parser, range) \31#define for_each_of_pci_range(parser, range) \
26 for (; of_pci_range_parser_one(parser, range);)32 for (; of_pci_range_parser_one(parser, range);)
33#define for_each_of_range for_each_of_pci_range
27 34
28/* Translate a DMA address from device space to CPU space */35/* Translate a DMA address from device space to CPU space */
29extern u64 of_translate_dma_address(struct device_node *dev,36extern 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
142#endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */149#endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */
143 150
144#endif /* __OF_ADDRESS_H */151#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