Skip to content

Commit

Permalink
of_address: Add bus type match for pci ranges parser
Browse files Browse the repository at this point in the history
So the parser can be used to parse range property of ISA bus.

As they're all using PCI-like method of range property, there is no need
start a new parser.

Signed-off-by: Jiaxun Yang <[email protected]>
Reviewed-by: Rob Herring <[email protected]>
Signed-off-by: Thomas Bogendoerfer <[email protected]>
  • Loading branch information
FlyGoat authored and tsbogend committed Jul 28, 2020
1 parent aa35a5e commit 2f96593
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 12 deletions.
29 changes: 17 additions & 12 deletions drivers/of/address.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ struct of_bus {
u64 (*map)(__be32 *addr, const __be32 *range,
int na, int ns, int pna);
int (*translate)(__be32 *addr, u64 offset, int na);
bool has_flags;
unsigned int (*get_flags)(const __be32 *addr);
};

Expand Down Expand Up @@ -364,6 +365,7 @@ static struct of_bus of_busses[] = {
.count_cells = of_bus_pci_count_cells,
.map = of_bus_pci_map,
.translate = of_bus_pci_translate,
.has_flags = true,
.get_flags = of_bus_pci_get_flags,
},
#endif /* CONFIG_PCI */
Expand All @@ -375,6 +377,7 @@ static struct of_bus of_busses[] = {
.count_cells = of_bus_isa_count_cells,
.map = of_bus_isa_map,
.translate = of_bus_isa_translate,
.has_flags = true,
.get_flags = of_bus_isa_get_flags,
},
/* Default */
Expand Down Expand Up @@ -698,9 +701,10 @@ static int parser_init(struct of_pci_range_parser *parser,

parser->node = node;
parser->pna = of_n_addr_cells(node);
parser->na = of_bus_n_addr_cells(node);
parser->ns = of_bus_n_size_cells(node);
parser->dma = !strcmp(name, "dma-ranges");
parser->bus = of_match_bus(node);

parser->bus->count_cells(parser->node, &parser->na, &parser->ns);

parser->range = of_get_property(node, name, &rlen);
if (parser->range == NULL)
Expand Down Expand Up @@ -732,19 +736,21 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
int na = parser->na;
int ns = parser->ns;
int np = parser->pna + na + ns;
int busflag_na = 0;

if (!range)
return NULL;

if (!parser->range || parser->range + np > parser->end)
return NULL;

if (parser->na == 3)
range->flags = of_bus_pci_get_flags(parser->range);
else
range->flags = 0;
range->flags = parser->bus->get_flags(parser->range);

/* A extra cell for resource flags */
if (parser->bus->has_flags)
busflag_na = 1;

range->pci_addr = of_read_number(parser->range, na);
range->bus_addr = of_read_number(parser->range + busflag_na, na - busflag_na);

if (parser->dma)
range->cpu_addr = of_translate_dma_address(parser->node,
Expand All @@ -759,11 +765,10 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
/* Now consume following elements while they are contiguous */
while (parser->range + np <= parser->end) {
u32 flags = 0;
u64 pci_addr, cpu_addr, size;
u64 bus_addr, cpu_addr, size;

if (parser->na == 3)
flags = of_bus_pci_get_flags(parser->range);
pci_addr = of_read_number(parser->range, na);
flags = parser->bus->get_flags(parser->range);
bus_addr = of_read_number(parser->range + busflag_na, na - busflag_na);
if (parser->dma)
cpu_addr = of_translate_dma_address(parser->node,
parser->range + na);
Expand All @@ -774,7 +779,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,

if (flags != range->flags)
break;
if (pci_addr != range->pci_addr + range->size ||
if (bus_addr != range->bus_addr + range->size ||
cpu_addr != range->cpu_addr + range->size)
break;

Expand Down
4 changes: 4 additions & 0 deletions include/linux/of_address.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@
#include <linux/of.h>
#include <linux/io.h>

struct of_bus;

struct of_pci_range_parser {
struct device_node *node;
struct of_bus *bus;
const __be32 *range;
const __be32 *end;
int na;
Expand Down Expand Up @@ -119,6 +122,7 @@ static inline void __iomem *of_iomap(struct device_node *device, int index)
return NULL;
}
#endif
#define of_range_parser_init of_pci_range_parser_init

#if defined(CONFIG_OF_ADDRESS) && defined(CONFIG_PCI)
extern const __be32 *of_get_pci_address(struct device_node *dev, int bar_no,
Expand Down

0 comments on commit 2f96593

Please sign in to comment.