summaryrefslogtreecommitdiffstats
path: root/include/of_address.h
blob: 4e5faf6f7783f3ec472827fa343d03cba26b395d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef __OF_ADDRESS_H
#define __OF_ADDRESS_H

#include <common.h>
#include <of.h>

struct of_pci_range_parser {
	struct device_node *node;
	const __be32 *range;
	const __be32 *end;
	int np;
	int pna;
};

struct of_pci_range {
	u32 pci_space;
	u64 pci_addr;
	u64 cpu_addr;
	u64 size;
	u32 flags;
};

#define for_each_of_pci_range(parser, range) \
	for (; of_pci_range_parser_one(parser, range);)

static inline void of_pci_range_to_resource(struct of_pci_range *range,
					    struct device_node *np,
					    struct resource *res)
{
	res->flags = range->flags;
	res->start = range->cpu_addr;
	res->end = range->cpu_addr + range->size - 1;
	res->parent = NULL;
	INIT_LIST_HEAD(&res->children);
	INIT_LIST_HEAD(&res->sibling);
	res->name = np->full_name;
}

#ifndef pci_address_to_pio
static inline unsigned long pci_address_to_pio(phys_addr_t addr) { return -1; }
#endif

#ifdef CONFIG_OFTREE

extern u64 of_translate_address(struct device_node *dev,
				const __be32 *in_addr);
extern u64 of_translate_dma_address(struct device_node *dev,
				const __be32 *in_addr);
extern bool of_can_translate_address(struct device_node *dev);
extern const __be32 *of_get_address(struct device_node *dev, int index,
				u64 *size, unsigned int *flags);
extern int of_address_to_resource(struct device_node *dev, int index,
				struct resource *r);
extern struct device_node *of_find_matching_node_by_address(
	struct device_node *from, const struct of_device_id *matches,
	u64 base_address);
extern void __iomem *of_iomap(struct device_node *np, int index);

extern int of_dma_get_range(struct device_node *np, u64 *dma_addr, u64 *paddr,
			    u64 *size);

extern bool of_dma_is_coherent(struct device_node *np);

#else /* CONFIG_OFTREE */

static inline u64 of_translate_address(struct device_node *dev,
				const __be32 *in_addr)
{
	return OF_BAD_ADDR;
}

static inline u64 of_translate_dma_address(struct device_node *dev,
				const __be32 *in_addr)
{
	return OF_BAD_ADDR;
}

static inline bool of_can_translate_address(struct device_node *dev)
{
	return false;
}

static inline const __be32 *of_get_address(struct device_node *dev, int index,
				u64 *size, unsigned int *flags)
{
	return 0;
}

static inline int of_address_to_resource(struct device_node *dev, int index,
				struct resource *r)
{
	return -ENOSYS;
}

static inline struct device_node *of_find_matching_node_by_address(
	struct device_node *from, const struct of_device_id *matches,
	u64 base_address)
{
	return NULL;
}

static inline void __iomem *of_iomap(struct device_node *np, int index)
{
	return NULL;
}

static inline int of_dma_get_range(struct device_node *np, u64 *dma_addr,
				   u64 *paddr, u64 *size)
{
	return -ENOSYS;
}

static inline bool of_dma_is_coherent(struct device_node *np)
{
	return false;
}
#endif /* CONFIG_OFTREE */

#ifdef CONFIG_OF_PCI

extern int of_pci_range_parser_init(struct of_pci_range_parser *parser,
			struct device_node *node);

extern struct of_pci_range *of_pci_range_parser_one(
			struct of_pci_range_parser *parser,
			struct of_pci_range *range);

#else

static inline int of_pci_range_parser_init(struct of_pci_range_parser *parser,
			struct device_node *node)
{
	return -1;
}

static inline struct of_pci_range *of_pci_range_parser_one(
					struct of_pci_range_parser *parser,
					struct of_pci_range *range)
{
	return NULL;
}
#endif /* CONFIG_OF_PCI */

#endif /* __OF_ADDRESS_H */