1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright (c) 2017 Google, Inc
4 *
5 * (C) Copyright 2012
6 * Pavel Herrmann <morpheus.ibis@gmail.com>
7 * Marek Vasut <marex@denx.de>
8 */
9
10#ifndef _DM_FDTADDR_H
11#define _DM_FDTADDR_H
12
13#include <fdtdec.h>
14
15struct udevice;
16
17/**
18 * devfdt_get_addr() - Get the reg property of a device
19 *
20 * @dev: Pointer to a device
21 *
22 * Return: Address, or FDT_ADDR_T_NONE if there is no such property
23 */
24fdt_addr_t devfdt_get_addr(const struct udevice *dev);
25
26/**
27 * devfdt_get_addr_ptr() - Return pointer to the address of the reg property
28 *                      of a device
29 *
30 * @dev: Pointer to a device
31 *
32 * Return: Pointer to addr, or NULL if there is no such property
33 */
34void *devfdt_get_addr_ptr(const struct udevice *dev);
35
36/**
37 * devfdt_remap_addr() - Return pointer to the memory-mapped I/O address
38 *                           of the reg property of a device
39 *
40 * @dev: Pointer to a device
41 *
42 * Return: Pointer to addr, or NULL if there is no such property
43 */
44void *devfdt_remap_addr(const struct udevice *dev);
45
46/**
47 * devfdt_remap_addr_index() - Return indexed pointer to the memory-mapped
48 *                                 I/O address of the reg property of a device
49 * @index: the 'reg' property can hold a list of <addr, size> pairs
50 *	   and @index is used to select which one is required
51 *
52 * @dev: Pointer to a device
53 *
54 * Return: Pointer to addr, or NULL if there is no such property
55 */
56void *devfdt_remap_addr_index(const struct udevice *dev, int index);
57
58/**
59 * devfdt_remap_addr_name() - Get the reg property of a device, indexed by
60 *                            name, as a memory-mapped I/O pointer
61 * @name: the 'reg' property can hold a list of <addr, size> pairs, with the
62 *	  'reg-names' property providing named-based identification. @name
63 *	  indicates the value to search for in 'reg-names'.
64 *
65 * @dev: Pointer to a device
66 *
67 * Return: Pointer to addr, or NULL if there is no such property
68 */
69void *devfdt_remap_addr_name(const struct udevice *dev, const char *name);
70
71/**
72 * devfdt_map_physmem() - Read device address from reg property of the
73 *                     device node and map the address into CPU address
74 *                     space.
75 *
76 * @dev: Pointer to device
77 * @size: size of the memory to map
78 *
79 * Return: mapped address, or NULL if the device does not have reg property.
80 */
81void *devfdt_map_physmem(const struct udevice *dev, unsigned long size);
82
83/**
84 * devfdt_get_addr_index() - Get the indexed reg property of a device
85 *
86 * @dev: Pointer to a device
87 * @index: the 'reg' property can hold a list of <addr, size> pairs
88 *	   and @index is used to select which one is required
89 *
90 * Return: Address, or FDT_ADDR_T_NONE if there is no such property
91 */
92fdt_addr_t devfdt_get_addr_index(const struct udevice *dev, int index);
93
94/**
95 * devfdt_get_addr_index_ptr() - Return indexed pointer to the address of the
96 *                               reg property of a device
97 *
98 * @dev: Pointer to a device
99 * @index: the 'reg' property can hold a list of <addr, size> pairs
100 *	   and @index is used to select which one is required
101 *
102 * Return: Pointer to addr, or NULL if there is no such property
103 */
104void *devfdt_get_addr_index_ptr(const struct udevice *dev, int index);
105
106/**
107 * devfdt_get_addr_size_index() - Get the indexed reg property of a device
108 *
109 * Returns the address and size specified in the 'reg' property of a device.
110 *
111 * @dev: Pointer to a device
112 * @index: the 'reg' property can hold a list of <addr, size> pairs
113 *	   and @index is used to select which one is required
114 * @size: Pointer to size variable - this function returns the size
115 *        specified in the 'reg' property here
116 *
117 * Return: Address, or FDT_ADDR_T_NONE if there is no such property
118 */
119fdt_addr_t devfdt_get_addr_size_index(const struct udevice *dev, int index,
120				      fdt_size_t *size);
121
122/**
123 * devfdt_get_addr_size_index_ptr() - Return indexed pointer to the address of the
124 *                                    reg property of a device
125 *
126 * @dev: Pointer to a device
127 * @index: the 'reg' property can hold a list of <addr, size> pairs
128 *	   and @index is used to select which one is required
129 * @size: Pointer to size variable - this function returns the size
130 *        specified in the 'reg' property here
131 *
132 * Return: Pointer to addr, or NULL if there is no such property
133 */
134void *devfdt_get_addr_size_index_ptr(const struct udevice *dev, int index,
135				     fdt_size_t *size);
136
137/**
138 * devfdt_get_addr_name() - Get the reg property of a device, indexed by name
139 *
140 * @dev: Pointer to a device
141 * @name: the 'reg' property can hold a list of <addr, size> pairs, with the
142 *	  'reg-names' property providing named-based identification. @name
143 *	  indicates the value to search for in 'reg-names'.
144 *
145 * Return: Address, or FDT_ADDR_T_NONE if there is no such property
146 */
147fdt_addr_t devfdt_get_addr_name(const struct udevice *dev, const char *name);
148
149/**
150 * devfdt_get_addr_name_ptr() - Get the reg property of a device as a pointer,
151 *                              indexed by name
152 *
153 * @dev: Pointer to a device
154 * @name: the 'reg' property can hold a list of <addr, size> pairs, with the
155 *	  'reg-names' property providing named-based identification. @name
156 *	  indicates the value to search for in 'reg-names'.
157 *
158 * Return: Pointer to addr, or NULL if there is no such property
159 */
160void *devfdt_get_addr_name_ptr(const struct udevice *dev, const char *name);
161
162/**
163 * devfdt_get_addr_size_name() - Get the reg property and its size for a device,
164 *				 indexed by name
165 *
166 * Returns the address and size specified in the 'reg' property of a device.
167 *
168 * @dev: Pointer to a device
169 * @name: the 'reg' property can hold a list of <addr, size> pairs, with the
170 *	  'reg-names' property providing named-based identification. @name
171 *	  indicates the value to search for in 'reg-names'.
172 * @size: Pointer to size variable - this function returns the size
173 *        specified in the 'reg' property here
174 *
175 * Return: Address, or FDT_ADDR_T_NONE if there is no such property
176 */
177fdt_addr_t devfdt_get_addr_size_name(const struct udevice *dev,
178				     const char *name, fdt_size_t *size);
179
180/**
181 * devfdt_get_addr_size_name_ptr() - Get the reg property for a device as a
182 *                                   pointer, indexed by name
183 *
184 * Returns the address and size specified in the 'reg' property of a device.
185 *
186 * @dev: Pointer to a device
187 * @name: the 'reg' property can hold a list of <addr, size> pairs, with the
188 *	  'reg-names' property providing named-based identification. @name
189 *	  indicates the value to search for in 'reg-names'.
190 * @size: Pointer to size variable - this function returns the size
191 *        specified in the 'reg' property here
192 *
193 * Return: Pointer to addr, or NULL if there is no such property
194 */
195void *devfdt_get_addr_size_name_ptr(const struct udevice *dev,
196				    const char *name, fdt_size_t *size);
197
198/**
199 * devfdt_get_addr_pci() - Read an address and handle PCI address translation
200 *
201 * @dev: Device to read from
202 * @sizep: If non-NULL, returns size of address space
203 * Return: address or FDT_ADDR_T_NONE if not found
204 */
205fdt_addr_t devfdt_get_addr_pci(const struct udevice *dev, fdt_size_t *sizep);
206
207#endif
208