xref: /OK3568_Linux_fs/u-boot/include/fdtdec.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Copyright (c) 2011 The Chromium OS Authors.
3  * SPDX-License-Identifier:	GPL-2.0+
4  */
5 
6 #ifndef __fdtdec_h
7 #define __fdtdec_h
8 
9 /*
10  * This file contains convenience functions for decoding useful and
11  * enlightening information from FDTs. It is intended to be used by device
12  * drivers and board-specific code within U-Boot. It aims to reduce the
13  * amount of FDT munging required within U-Boot itself, so that driver code
14  * changes to support FDT are minimized.
15  */
16 
17 #include <linux/libfdt.h>
18 #include <pci.h>
19 
20 /*
21  * A typedef for a physical address. Note that fdt data is always big
22  * endian even on a litle endian machine.
23  */
24 typedef phys_addr_t fdt_addr_t;
25 typedef phys_size_t fdt_size_t;
26 #ifdef CONFIG_PHYS_64BIT
27 #define FDT_ADDR_T_NONE (-1ULL)
28 #define fdt_addr_to_cpu(reg) be64_to_cpu(reg)
29 #define fdt_size_to_cpu(reg) be64_to_cpu(reg)
30 typedef fdt64_t fdt_val_t;
31 #else
32 #define FDT_ADDR_T_NONE (-1U)
33 #define fdt_addr_to_cpu(reg) be32_to_cpu(reg)
34 #define fdt_size_to_cpu(reg) be32_to_cpu(reg)
35 typedef fdt32_t fdt_val_t;
36 #endif
37 
38 /* Information obtained about memory from the FDT */
39 struct fdt_memory {
40 	fdt_addr_t start;
41 	fdt_addr_t end;
42 };
43 
44 #ifdef CONFIG_SPL_BUILD
45 #define SPL_BUILD	1
46 #else
47 #define SPL_BUILD	0
48 #endif
49 
50 #if CONFIG_IS_ENABLED(OF_PRIOR_STAGE)
51 extern phys_addr_t prior_stage_fdt_address;
52 #endif
53 
54 /*
55  * Information about a resource. start is the first address of the resource
56  * and end is the last address (inclusive). The length of the resource will
57  * be equal to: end - start + 1.
58  */
59 struct fdt_resource {
60 	fdt_addr_t start;
61 	fdt_addr_t end;
62 };
63 
64 enum fdt_pci_space {
65 	FDT_PCI_SPACE_CONFIG = 0,
66 	FDT_PCI_SPACE_IO = 0x01000000,
67 	FDT_PCI_SPACE_MEM32 = 0x02000000,
68 	FDT_PCI_SPACE_MEM64 = 0x03000000,
69 	FDT_PCI_SPACE_MEM32_PREF = 0x42000000,
70 	FDT_PCI_SPACE_MEM64_PREF = 0x43000000,
71 };
72 
73 #define FDT_PCI_ADDR_CELLS	3
74 #define FDT_PCI_SIZE_CELLS	2
75 #define FDT_PCI_REG_SIZE	\
76 	((FDT_PCI_ADDR_CELLS + FDT_PCI_SIZE_CELLS) * sizeof(u32))
77 
78 /*
79  * The Open Firmware spec defines PCI physical address as follows:
80  *
81  *          bits# 31 .... 24 23 .... 16 15 .... 08 07 .... 00
82  *
83  * phys.hi  cell:  npt000ss   bbbbbbbb   dddddfff   rrrrrrrr
84  * phys.mid cell:  hhhhhhhh   hhhhhhhh   hhhhhhhh   hhhhhhhh
85  * phys.lo  cell:  llllllll   llllllll   llllllll   llllllll
86  *
87  * where:
88  *
89  * n:        is 0 if the address is relocatable, 1 otherwise
90  * p:        is 1 if addressable region is prefetchable, 0 otherwise
91  * t:        is 1 if the address is aliased (for non-relocatable I/O) below 1MB
92  *           (for Memory), or below 64KB (for relocatable I/O)
93  * ss:       is the space code, denoting the address space
94  * bbbbbbbb: is the 8-bit Bus Number
95  * ddddd:    is the 5-bit Device Number
96  * fff:      is the 3-bit Function Number
97  * rrrrrrrr: is the 8-bit Register Number
98  * hhhhhhhh: is a 32-bit unsigned number
99  * llllllll: is a 32-bit unsigned number
100  */
101 struct fdt_pci_addr {
102 	u32	phys_hi;
103 	u32	phys_mid;
104 	u32	phys_lo;
105 };
106 
107 /**
108  * Compute the size of a resource.
109  *
110  * @param res	the resource to operate on
111  * @return the size of the resource
112  */
fdt_resource_size(const struct fdt_resource * res)113 static inline fdt_size_t fdt_resource_size(const struct fdt_resource *res)
114 {
115 	return res->end - res->start + 1;
116 }
117 
118 /**
119  * Compat types that we know about and for which we might have drivers.
120  * Each is named COMPAT_<dir>_<filename> where <dir> is the directory
121  * within drivers.
122  */
123 enum fdt_compat_id {
124 	COMPAT_UNKNOWN,
125 	COMPAT_NVIDIA_TEGRA20_EMC,	/* Tegra20 memory controller */
126 	COMPAT_NVIDIA_TEGRA20_EMC_TABLE, /* Tegra20 memory timing table */
127 	COMPAT_NVIDIA_TEGRA20_NAND,	/* Tegra2 NAND controller */
128 	COMPAT_NVIDIA_TEGRA124_XUSB_PADCTL,
129 					/* Tegra124 XUSB pad controller */
130 	COMPAT_NVIDIA_TEGRA210_XUSB_PADCTL,
131 					/* Tegra210 XUSB pad controller */
132 	COMPAT_SMSC_LAN9215,		/* SMSC 10/100 Ethernet LAN9215 */
133 	COMPAT_SAMSUNG_EXYNOS5_SROMC,	/* Exynos5 SROMC */
134 	COMPAT_SAMSUNG_S3C2440_I2C,	/* Exynos I2C Controller */
135 	COMPAT_SAMSUNG_EXYNOS5_SOUND,	/* Exynos Sound */
136 	COMPAT_WOLFSON_WM8994_CODEC,	/* Wolfson WM8994 Sound Codec */
137 	COMPAT_SAMSUNG_EXYNOS_USB_PHY,	/* Exynos phy controller for usb2.0 */
138 	COMPAT_SAMSUNG_EXYNOS5_USB3_PHY,/* Exynos phy controller for usb3.0 */
139 	COMPAT_SAMSUNG_EXYNOS_TMU,	/* Exynos TMU */
140 	COMPAT_SAMSUNG_EXYNOS_MIPI_DSI,	/* Exynos mipi dsi */
141 	COMPAT_SAMSUNG_EXYNOS_DWMMC,	/* Exynos DWMMC controller */
142 	COMPAT_SAMSUNG_EXYNOS_MMC,	/* Exynos MMC controller */
143 	COMPAT_MAXIM_MAX77686_PMIC,	/* MAX77686 PMIC */
144 	COMPAT_GENERIC_SPI_FLASH,	/* Generic SPI Flash chip */
145 	COMPAT_MAXIM_98095_CODEC,	/* MAX98095 Codec */
146 	COMPAT_SAMSUNG_EXYNOS5_I2C,	/* Exynos5 High Speed I2C Controller */
147 	COMPAT_SAMSUNG_EXYNOS_SYSMMU,	/* Exynos sysmmu */
148 	COMPAT_INTEL_MICROCODE,		/* Intel microcode update */
149 	COMPAT_AMS_AS3722,		/* AMS AS3722 PMIC */
150 	COMPAT_INTEL_QRK_MRC,		/* Intel Quark MRC */
151 	COMPAT_ALTERA_SOCFPGA_DWMAC,	/* SoCFPGA Ethernet controller */
152 	COMPAT_ALTERA_SOCFPGA_DWMMC,	/* SoCFPGA DWMMC controller */
153 	COMPAT_ALTERA_SOCFPGA_DWC2USB,	/* SoCFPGA DWC2 USB controller */
154 	COMPAT_INTEL_BAYTRAIL_FSP,	/* Intel Bay Trail FSP */
155 	COMPAT_INTEL_BAYTRAIL_FSP_MDP,	/* Intel FSP memory-down params */
156 	COMPAT_INTEL_IVYBRIDGE_FSP,	/* Intel Ivy Bridge FSP */
157 	COMPAT_SUNXI_NAND,		/* SUNXI NAND controller */
158 	COMPAT_ALTERA_SOCFPGA_CLK,	/* SoCFPGA Clock initialization */
159 	COMPAT_ALTERA_SOCFPGA_PINCTRL_SINGLE,	/* SoCFPGA pinctrl-single */
160 	COMPAT_ALTERA_SOCFPGA_H2F_BRG,          /* SoCFPGA hps2fpga bridge */
161 	COMPAT_ALTERA_SOCFPGA_LWH2F_BRG,        /* SoCFPGA lwhps2fpga bridge */
162 	COMPAT_ALTERA_SOCFPGA_F2H_BRG,          /* SoCFPGA fpga2hps bridge */
163 	COMPAT_ALTERA_SOCFPGA_F2SDR0,           /* SoCFPGA fpga2SDRAM0 bridge */
164 	COMPAT_ALTERA_SOCFPGA_F2SDR1,           /* SoCFPGA fpga2SDRAM1 bridge */
165 	COMPAT_ALTERA_SOCFPGA_F2SDR2,           /* SoCFPGA fpga2SDRAM2 bridge */
166 	COMPAT_ROCKCHIP_NANDC,			/* Rockchip NAND controller */
167 
168 	COMPAT_COUNT,
169 };
170 
171 #define MAX_PHANDLE_ARGS 16
172 struct fdtdec_phandle_args {
173 	int node;
174 	int args_count;
175 	uint32_t args[MAX_PHANDLE_ARGS];
176 };
177 
178 /**
179  * fdtdec_parse_phandle_with_args() - Find a node pointed by phandle in a list
180  *
181  * This function is useful to parse lists of phandles and their arguments.
182  *
183  * Example:
184  *
185  * phandle1: node1 {
186  *	#list-cells = <2>;
187  * }
188  *
189  * phandle2: node2 {
190  *	#list-cells = <1>;
191  * }
192  *
193  * node3 {
194  *	list = <&phandle1 1 2 &phandle2 3>;
195  * }
196  *
197  * To get a device_node of the `node2' node you may call this:
198  * fdtdec_parse_phandle_with_args(blob, node3, "list", "#list-cells", 0, 1,
199  *				  &args);
200  *
201  * (This function is a modified version of __of_parse_phandle_with_args() from
202  * Linux 3.18)
203  *
204  * @blob:	Pointer to device tree
205  * @src_node:	Offset of device tree node containing a list
206  * @list_name:	property name that contains a list
207  * @cells_name:	property name that specifies the phandles' arguments count,
208  *		or NULL to use @cells_count
209  * @cells_count: Cell count to use if @cells_name is NULL
210  * @index:	index of a phandle to parse out
211  * @out_args:	optional pointer to output arguments structure (will be filled)
212  * @return 0 on success (with @out_args filled out if not NULL), -ENOENT if
213  *	@list_name does not exist, a phandle was not found, @cells_name
214  *	could not be found, the arguments were truncated or there were too
215  *	many arguments.
216  *
217  */
218 int fdtdec_parse_phandle_with_args(const void *blob, int src_node,
219 				   const char *list_name,
220 				   const char *cells_name,
221 				   int cell_count, int index,
222 				   struct fdtdec_phandle_args *out_args);
223 
224 /**
225  * Find the next numbered alias for a peripheral. This is used to enumerate
226  * all the peripherals of a certain type.
227  *
228  * Do the first call with *upto = 0. Assuming /aliases/<name>0 exists then
229  * this function will return a pointer to the node the alias points to, and
230  * then update *upto to 1. Next time you call this function, the next node
231  * will be returned.
232  *
233  * All nodes returned will match the compatible ID, as it is assumed that
234  * all peripherals use the same driver.
235  *
236  * @param blob		FDT blob to use
237  * @param name		Root name of alias to search for
238  * @param id		Compatible ID to look for
239  * @return offset of next compatible node, or -FDT_ERR_NOTFOUND if no more
240  */
241 int fdtdec_next_alias(const void *blob, const char *name,
242 		enum fdt_compat_id id, int *upto);
243 
244 /**
245  * Find the compatible ID for a given node.
246  *
247  * Generally each node has at least one compatible string attached to it.
248  * This function looks through our list of known compatible strings and
249  * returns the corresponding ID which matches the compatible string.
250  *
251  * @param blob		FDT blob to use
252  * @param node		Node containing compatible string to find
253  * @return compatible ID, or COMPAT_UNKNOWN if we cannot find a match
254  */
255 enum fdt_compat_id fdtdec_lookup(const void *blob, int node);
256 
257 /**
258  * Find the next compatible node for a peripheral.
259  *
260  * Do the first call with node = 0. This function will return a pointer to
261  * the next compatible node. Next time you call this function, pass the
262  * value returned, and the next node will be provided.
263  *
264  * @param blob		FDT blob to use
265  * @param node		Start node for search
266  * @param id		Compatible ID to look for (enum fdt_compat_id)
267  * @return offset of next compatible node, or -FDT_ERR_NOTFOUND if no more
268  */
269 int fdtdec_next_compatible(const void *blob, int node,
270 		enum fdt_compat_id id);
271 
272 /**
273  * Find the next compatible subnode for a peripheral.
274  *
275  * Do the first call with node set to the parent and depth = 0. This
276  * function will return the offset of the next compatible node. Next time
277  * you call this function, pass the node value returned last time, with
278  * depth unchanged, and the next node will be provided.
279  *
280  * @param blob		FDT blob to use
281  * @param node		Start node for search
282  * @param id		Compatible ID to look for (enum fdt_compat_id)
283  * @param depthp	Current depth (set to 0 before first call)
284  * @return offset of next compatible node, or -FDT_ERR_NOTFOUND if no more
285  */
286 int fdtdec_next_compatible_subnode(const void *blob, int node,
287 		enum fdt_compat_id id, int *depthp);
288 
289 /*
290  * Look up an address property in a node and return the parsed address, and
291  * optionally the parsed size.
292  *
293  * This variant assumes a known and fixed number of cells are used to
294  * represent the address and size.
295  *
296  * You probably don't want to use this function directly except to parse
297  * non-standard properties, and never to parse the "reg" property. Instead,
298  * use one of the "auto" variants below, which automatically honor the
299  * #address-cells and #size-cells properties in the parent node.
300  *
301  * @param blob	FDT blob
302  * @param node	node to examine
303  * @param prop_name	name of property to find
304  * @param index	which address to retrieve from a list of addresses. Often 0.
305  * @param na	the number of cells used to represent an address
306  * @param ns	the number of cells used to represent a size
307  * @param sizep	a pointer to store the size into. Use NULL if not required
308  * @param translate	Indicates whether to translate the returned value
309  *			using the parent node's ranges property.
310  * @return address, if found, or FDT_ADDR_T_NONE if not
311  */
312 fdt_addr_t fdtdec_get_addr_size_fixed(const void *blob, int node,
313 		const char *prop_name, int index, int na, int ns,
314 		fdt_size_t *sizep, bool translate);
315 
316 /*
317  * Look up an address property in a node and return the parsed address, and
318  * optionally the parsed size.
319  *
320  * This variant automatically determines the number of cells used to represent
321  * the address and size by parsing the provided parent node's #address-cells
322  * and #size-cells properties.
323  *
324  * @param blob	FDT blob
325  * @param parent	parent node of @node
326  * @param node	node to examine
327  * @param prop_name	name of property to find
328  * @param index	which address to retrieve from a list of addresses. Often 0.
329  * @param sizep	a pointer to store the size into. Use NULL if not required
330  * @param translate	Indicates whether to translate the returned value
331  *			using the parent node's ranges property.
332  * @return address, if found, or FDT_ADDR_T_NONE if not
333  */
334 fdt_addr_t fdtdec_get_addr_size_auto_parent(const void *blob, int parent,
335 		int node, const char *prop_name, int index, fdt_size_t *sizep,
336 		bool translate);
337 
338 /*
339  * Look up an address property in a node and return the parsed address, and
340  * optionally the parsed size.
341  *
342  * This variant automatically determines the number of cells used to represent
343  * the address and size by parsing the parent node's #address-cells
344  * and #size-cells properties. The parent node is automatically found.
345  *
346  * The automatic parent lookup implemented by this function is slow.
347  * Consequently, fdtdec_get_addr_size_auto_parent() should be used where
348  * possible.
349  *
350  * @param blob	FDT blob
351  * @param parent	parent node of @node
352  * @param node	node to examine
353  * @param prop_name	name of property to find
354  * @param index	which address to retrieve from a list of addresses. Often 0.
355  * @param sizep	a pointer to store the size into. Use NULL if not required
356  * @param translate	Indicates whether to translate the returned value
357  *			using the parent node's ranges property.
358  * @return address, if found, or FDT_ADDR_T_NONE if not
359  */
360 fdt_addr_t fdtdec_get_addr_size_auto_noparent(const void *blob, int node,
361 		const char *prop_name, int index, fdt_size_t *sizep,
362 		bool translate);
363 
364 /*
365  * Look up an address property in a node and return the parsed address.
366  *
367  * This variant hard-codes the number of cells used to represent the address
368  * and size based on sizeof(fdt_addr_t) and sizeof(fdt_size_t). It also
369  * always returns the first address value in the property (index 0).
370  *
371  * Use of this function is not recommended due to the hard-coding of cell
372  * counts. There is no programmatic validation that these hard-coded values
373  * actually match the device tree content in any way at all. This assumption
374  * can be satisfied by manually ensuring CONFIG_PHYS_64BIT is appropriately
375  * set in the U-Boot build and exercising strict control over DT content to
376  * ensure use of matching #address-cells/#size-cells properties. However, this
377  * approach is error-prone; those familiar with DT will not expect the
378  * assumption to exist, and could easily invalidate it. If the assumption is
379  * invalidated, this function will not report the issue, and debugging will
380  * be required. Instead, use fdtdec_get_addr_size_auto_parent().
381  *
382  * @param blob	FDT blob
383  * @param node	node to examine
384  * @param prop_name	name of property to find
385  * @return address, if found, or FDT_ADDR_T_NONE if not
386  */
387 fdt_addr_t fdtdec_get_addr(const void *blob, int node,
388 		const char *prop_name);
389 
390 /*
391  * Look up an address property in a node and return the parsed address, and
392  * optionally the parsed size.
393  *
394  * This variant hard-codes the number of cells used to represent the address
395  * and size based on sizeof(fdt_addr_t) and sizeof(fdt_size_t). It also
396  * always returns the first address value in the property (index 0).
397  *
398  * Use of this function is not recommended due to the hard-coding of cell
399  * counts. There is no programmatic validation that these hard-coded values
400  * actually match the device tree content in any way at all. This assumption
401  * can be satisfied by manually ensuring CONFIG_PHYS_64BIT is appropriately
402  * set in the U-Boot build and exercising strict control over DT content to
403  * ensure use of matching #address-cells/#size-cells properties. However, this
404  * approach is error-prone; those familiar with DT will not expect the
405  * assumption to exist, and could easily invalidate it. If the assumption is
406  * invalidated, this function will not report the issue, and debugging will
407  * be required. Instead, use fdtdec_get_addr_size_auto_parent().
408  *
409  * @param blob	FDT blob
410  * @param node	node to examine
411  * @param prop_name	name of property to find
412  * @param sizep	a pointer to store the size into. Use NULL if not required
413  * @return address, if found, or FDT_ADDR_T_NONE if not
414  */
415 fdt_addr_t fdtdec_get_addr_size(const void *blob, int node,
416 		const char *prop_name, fdt_size_t *sizep);
417 
418 /**
419  * Look at an address property in a node and return the pci address which
420  * corresponds to the given type in the form of fdt_pci_addr.
421  * The property must hold one fdt_pci_addr with a lengh.
422  *
423  * @param blob		FDT blob
424  * @param node		node to examine
425  * @param type		pci address type (FDT_PCI_SPACE_xxx)
426  * @param prop_name	name of property to find
427  * @param addr		returns pci address in the form of fdt_pci_addr
428  * @return 0 if ok, -ENOENT if the property did not exist, -EINVAL if the
429  *		format of the property was invalid, -ENXIO if the requested
430  *		address type was not found
431  */
432 int fdtdec_get_pci_addr(const void *blob, int node, enum fdt_pci_space type,
433 		const char *prop_name, struct fdt_pci_addr *addr);
434 
435 /**
436  * Look at the compatible property of a device node that represents a PCI
437  * device and extract pci vendor id and device id from it.
438  *
439  * @param blob		FDT blob
440  * @param node		node to examine
441  * @param vendor	vendor id of the pci device
442  * @param device	device id of the pci device
443  * @return 0 if ok, negative on error
444  */
445 int fdtdec_get_pci_vendev(const void *blob, int node,
446 		u16 *vendor, u16 *device);
447 
448 /**
449  * Look at the pci address of a device node that represents a PCI device
450  * and return base address of the pci device's registers.
451  *
452  * @param dev		device to examine
453  * @param addr		pci address in the form of fdt_pci_addr
454  * @param bar		returns base address of the pci device's registers
455  * @return 0 if ok, negative on error
456  */
457 int fdtdec_get_pci_bar32(struct udevice *dev, struct fdt_pci_addr *addr,
458 			 u32 *bar);
459 
460 /**
461  * Look up a 32-bit integer property in a node and return it. The property
462  * must have at least 4 bytes of data. The value of the first cell is
463  * returned.
464  *
465  * @param blob	FDT blob
466  * @param node	node to examine
467  * @param prop_name	name of property to find
468  * @param default_val	default value to return if the property is not found
469  * @return integer value, if found, or default_val if not
470  */
471 s32 fdtdec_get_int(const void *blob, int node, const char *prop_name,
472 		s32 default_val);
473 
474 /**
475  * Unsigned version of fdtdec_get_int. The property must have at least
476  * 4 bytes of data. The value of the first cell is returned.
477  *
478  * @param blob	FDT blob
479  * @param node	node to examine
480  * @param prop_name	name of property to find
481  * @param default_val	default value to return if the property is not found
482  * @return unsigned integer value, if found, or default_val if not
483  */
484 unsigned int fdtdec_get_uint(const void *blob, int node, const char *prop_name,
485 			unsigned int default_val);
486 
487 /**
488  * Get a variable-sized number from a property
489  *
490  * This reads a number from one or more cells.
491  *
492  * @param ptr	Pointer to property
493  * @param cells	Number of cells containing the number
494  * @return the value in the cells
495  */
496 u64 fdtdec_get_number(const fdt32_t *ptr, unsigned int cells);
497 
498 /**
499  * Look up a 64-bit integer property in a node and return it. The property
500  * must have at least 8 bytes of data (2 cells). The first two cells are
501  * concatenated to form a 8 bytes value, where the first cell is top half and
502  * the second cell is bottom half.
503  *
504  * @param blob	FDT blob
505  * @param node	node to examine
506  * @param prop_name	name of property to find
507  * @param default_val	default value to return if the property is not found
508  * @return integer value, if found, or default_val if not
509  */
510 uint64_t fdtdec_get_uint64(const void *blob, int node, const char *prop_name,
511 		uint64_t default_val);
512 
513 /**
514  * Checks whether a node is enabled.
515  * This looks for a 'status' property. If this exists, then returns 1 if
516  * the status is 'ok' and 0 otherwise. If there is no status property,
517  * it returns 1 on the assumption that anything mentioned should be enabled
518  * by default.
519  *
520  * @param blob	FDT blob
521  * @param node	node to examine
522  * @return integer value 0 (not enabled) or 1 (enabled)
523  */
524 int fdtdec_get_is_enabled(const void *blob, int node);
525 
526 /**
527  * Make sure we have a valid fdt available to control U-Boot.
528  *
529  * If not, a message is printed to the console if the console is ready.
530  *
531  * @return 0 if all ok, -1 if not
532  */
533 int fdtdec_prepare_fdt(void);
534 
535 /**
536  * Checks that we have a valid fdt available to control U-Boot.
537 
538  * However, if not then for the moment nothing is done, since this function
539  * is called too early to panic().
540  *
541  * @returns 0
542  */
543 int fdtdec_check_fdt(void);
544 
545 /**
546  * Find the nodes for a peripheral and return a list of them in the correct
547  * order. This is used to enumerate all the peripherals of a certain type.
548  *
549  * To use this, optionally set up a /aliases node with alias properties for
550  * a peripheral. For example, for usb you could have:
551  *
552  * aliases {
553  *		usb0 = "/ehci@c5008000";
554  *		usb1 = "/ehci@c5000000";
555  * };
556  *
557  * Pass "usb" as the name to this function and will return a list of two
558  * nodes offsets: /ehci@c5008000 and ehci@c5000000.
559  *
560  * All nodes returned will match the compatible ID, as it is assumed that
561  * all peripherals use the same driver.
562  *
563  * If no alias node is found, then the node list will be returned in the
564  * order found in the fdt. If the aliases mention a node which doesn't
565  * exist, then this will be ignored. If nodes are found with no aliases,
566  * they will be added in any order.
567  *
568  * If there is a gap in the aliases, then this function return a 0 node at
569  * that position. The return value will also count these gaps.
570  *
571  * This function checks node properties and will not return nodes which are
572  * marked disabled (status = "disabled").
573  *
574  * @param blob		FDT blob to use
575  * @param name		Root name of alias to search for
576  * @param id		Compatible ID to look for
577  * @param node_list	Place to put list of found nodes
578  * @param maxcount	Maximum number of nodes to find
579  * @return number of nodes found on success, FDT_ERR_... on error
580  */
581 int fdtdec_find_aliases_for_id(const void *blob, const char *name,
582 			enum fdt_compat_id id, int *node_list, int maxcount);
583 
584 /*
585  * This function is similar to fdtdec_find_aliases_for_id() except that it
586  * adds to the node_list that is passed in. Any 0 elements are considered
587  * available for allocation - others are considered already used and are
588  * skipped.
589  *
590  * You can use this by calling fdtdec_find_aliases_for_id() with an
591  * uninitialised array, then setting the elements that are returned to -1,
592  * say, then calling this function, perhaps with a different compat id.
593  * Any elements you get back that are >0 are new nodes added by the call
594  * to this function.
595  *
596  * Note that if you have some nodes with aliases and some without, you are
597  * sailing close to the wind. The call to fdtdec_find_aliases_for_id() with
598  * one compat_id may fill in positions for which you have aliases defined
599  * for another compat_id. When you later call *this* function with the second
600  * compat_id, the alias positions may already be used. A debug warning may
601  * be generated in this case, but it is safest to define aliases for all
602  * nodes when you care about the ordering.
603  */
604 int fdtdec_add_aliases_for_id(const void *blob, const char *name,
605 			enum fdt_compat_id id, int *node_list, int maxcount);
606 
607 /**
608  * Get the alias sequence number of a node
609  *
610  * This works out whether a node is pointed to by an alias, and if so, the
611  * sequence number of that alias. Aliases are of the form <base><num> where
612  * <num> is the sequence number. For example spi2 would be sequence number
613  * 2.
614  *
615  * @param blob		Device tree blob (if NULL, then error is returned)
616  * @param base		Base name for alias (before the underscore)
617  * @param node		Node to look up
618  * @param seqp		This is set to the sequence number if one is found,
619  *			but otherwise the value is left alone
620  * @return 0 if a sequence was found, -ve if not
621  */
622 int fdtdec_get_alias_seq(const void *blob, const char *base, int node,
623 			 int *seqp);
624 
625 /**
626  * Get a property from the /chosen node
627  *
628  * @param blob		Device tree blob (if NULL, then NULL is returned)
629  * @param name		Property name to look up
630  * @return Value of property, or NULL if it does not exist
631  */
632 const char *fdtdec_get_chosen_prop(const void *blob, const char *name);
633 
634 /**
635  * Get the offset of the given /chosen node
636  *
637  * This looks up a property in /chosen containing the path to another node,
638  * then finds the offset of that node.
639  *
640  * @param blob		Device tree blob (if NULL, then error is returned)
641  * @param name		Property name, e.g. "stdout-path"
642  * @return Node offset referred to by that chosen node, or -ve FDT_ERR_...
643  */
644 int fdtdec_get_chosen_node(const void *blob, const char *name);
645 
646 /*
647  * Get the name for a compatible ID
648  *
649  * @param id		Compatible ID to look for
650  * @return compatible string for that id
651  */
652 const char *fdtdec_get_compatible(enum fdt_compat_id id);
653 
654 /* Look up a phandle and follow it to its node. Then return the offset
655  * of that node.
656  *
657  * @param blob		FDT blob
658  * @param node		node to examine
659  * @param prop_name	name of property to find
660  * @return node offset if found, -ve error code on error
661  */
662 int fdtdec_lookup_phandle(const void *blob, int node, const char *prop_name);
663 
664 /**
665  * Look up a property in a node and return its contents in an integer
666  * array of given length. The property must have at least enough data for
667  * the array (4*count bytes). It may have more, but this will be ignored.
668  *
669  * @param blob		FDT blob
670  * @param node		node to examine
671  * @param prop_name	name of property to find
672  * @param array		array to fill with data
673  * @param count		number of array elements
674  * @return 0 if ok, or -FDT_ERR_NOTFOUND if the property is not found,
675  *		or -FDT_ERR_BADLAYOUT if not enough data
676  */
677 int fdtdec_get_int_array(const void *blob, int node, const char *prop_name,
678 		u32 *array, int count);
679 
680 /**
681  * Look up a property in a node and return its contents in an integer
682  * array of given length. The property must exist but may have less data that
683  * expected (4*count bytes). It may have more, but this will be ignored.
684  *
685  * @param blob		FDT blob
686  * @param node		node to examine
687  * @param prop_name	name of property to find
688  * @param array		array to fill with data
689  * @param count		number of array elements
690  * @return number of array elements if ok, or -FDT_ERR_NOTFOUND if the
691  *		property is not found
692  */
693 int fdtdec_get_int_array_count(const void *blob, int node,
694 			       const char *prop_name, u32 *array, int count);
695 
696 /**
697  * Look up a property in a node and return a pointer to its contents as a
698  * unsigned int array of given length. The property must have at least enough
699  * data for the array ('count' cells). It may have more, but this will be
700  * ignored. The data is not copied.
701  *
702  * Note that you must access elements of the array with fdt32_to_cpu(),
703  * since the elements will be big endian even on a little endian machine.
704  *
705  * @param blob		FDT blob
706  * @param node		node to examine
707  * @param prop_name	name of property to find
708  * @param count		number of array elements
709  * @return pointer to array if found, or NULL if the property is not
710  *		found or there is not enough data
711  */
712 const u32 *fdtdec_locate_array(const void *blob, int node,
713 			       const char *prop_name, int count);
714 
715 /**
716  * Look up a boolean property in a node and return it.
717  *
718  * A boolean properly is true if present in the device tree and false if not
719  * present, regardless of its value.
720  *
721  * @param blob	FDT blob
722  * @param node	node to examine
723  * @param prop_name	name of property to find
724  * @return 1 if the properly is present; 0 if it isn't present
725  */
726 int fdtdec_get_bool(const void *blob, int node, const char *prop_name);
727 
728 /*
729  * Count child nodes of one parent node.
730  *
731  * @param blob	FDT blob
732  * @param node	parent node
733  * @return number of child node; 0 if there is not child node
734  */
735 int fdtdec_get_child_count(const void *blob, int node);
736 
737 /**
738  * Look in the FDT for a config item with the given name and return its value
739  * as a 32-bit integer. The property must have at least 4 bytes of data. The
740  * value of the first cell is returned.
741  *
742  * @param blob		FDT blob to use
743  * @param prop_name	Node property name
744  * @param default_val	default value to return if the property is not found
745  * @return integer value, if found, or default_val if not
746  */
747 int fdtdec_get_config_int(const void *blob, const char *prop_name,
748 		int default_val);
749 
750 /**
751  * Look in the FDT for a config item with the given name
752  * and return whether it exists.
753  *
754  * @param blob		FDT blob
755  * @param prop_name	property name to look up
756  * @return 1, if it exists, or 0 if not
757  */
758 int fdtdec_get_config_bool(const void *blob, const char *prop_name);
759 
760 /**
761  * Look in the FDT for a config item with the given name and return its value
762  * as a string.
763  *
764  * @param blob          FDT blob
765  * @param prop_name     property name to look up
766  * @returns property string, NULL on error.
767  */
768 char *fdtdec_get_config_string(const void *blob, const char *prop_name);
769 
770 /*
771  * Look up a property in a node and return its contents in a byte
772  * array of given length. The property must have at least enough data for
773  * the array (count bytes). It may have more, but this will be ignored.
774  *
775  * @param blob		FDT blob
776  * @param node		node to examine
777  * @param prop_name	name of property to find
778  * @param array		array to fill with data
779  * @param count		number of array elements
780  * @return 0 if ok, or -FDT_ERR_MISSING if the property is not found,
781  *		or -FDT_ERR_BADLAYOUT if not enough data
782  */
783 int fdtdec_get_byte_array(const void *blob, int node, const char *prop_name,
784 		u8 *array, int count);
785 
786 /**
787  * Look up a property in a node and return a pointer to its contents as a
788  * byte array of given length. The property must have at least enough data
789  * for the array (count bytes). It may have more, but this will be ignored.
790  * The data is not copied.
791  *
792  * @param blob		FDT blob
793  * @param node		node to examine
794  * @param prop_name	name of property to find
795  * @param count		number of array elements
796  * @return pointer to byte array if found, or NULL if the property is not
797  *		found or there is not enough data
798  */
799 const u8 *fdtdec_locate_byte_array(const void *blob, int node,
800 			     const char *prop_name, int count);
801 
802 /**
803  * Look up a property in a node which contains a memory region address and
804  * size. Then return a pointer to this address.
805  *
806  * The property must hold one address with a length. This is only tested on
807  * 32-bit machines.
808  *
809  * @param blob		FDT blob
810  * @param node		node to examine
811  * @param prop_name	name of property to find
812  * @param basep		Returns base address of region
813  * @param size		Returns size of region
814  * @return 0 if ok, -1 on error (property not found)
815  */
816 int fdtdec_decode_region(const void *blob, int node, const char *prop_name,
817 			 fdt_addr_t *basep, fdt_size_t *sizep);
818 
819 /**
820  * Obtain an indexed resource from a device property.
821  *
822  * @param fdt		FDT blob
823  * @param node		node to examine
824  * @param property	name of the property to parse
825  * @param index		index of the resource to retrieve
826  * @param res		returns the resource
827  * @return 0 if ok, negative on error
828  */
829 int fdt_get_resource(const void *fdt, int node, const char *property,
830 		     unsigned int index, struct fdt_resource *res);
831 
832 /**
833  * Obtain a named resource from a device property.
834  *
835  * Look up the index of the name in a list of strings and return the resource
836  * at that index.
837  *
838  * @param fdt		FDT blob
839  * @param node		node to examine
840  * @param property	name of the property to parse
841  * @param prop_names	name of the property containing the list of names
842  * @param name		the name of the entry to look up
843  * @param res		returns the resource
844  */
845 int fdt_get_named_resource(const void *fdt, int node, const char *property,
846 			   const char *prop_names, const char *name,
847 			   struct fdt_resource *res);
848 
849 /**
850  * Decode a named region within a memory bank of a given type.
851  *
852  * This function handles selection of a memory region. The region is
853  * specified as an offset/size within a particular type of memory.
854  *
855  * The properties used are:
856  *
857  *	<mem_type>-memory<suffix> for the name of the memory bank
858  *	<mem_type>-offset<suffix> for the offset in that bank
859  *
860  * The property value must have an offset and a size. The function checks
861  * that the region is entirely within the memory bank.5
862  *
863  * @param blob		FDT blob
864  * @param node		Node containing the properties (-1 for /config)
865  * @param mem_type	Type of memory to use, which is a name, such as
866  *			"u-boot" or "kernel".
867  * @param suffix	String to append to the memory/offset
868  *			property names
869  * @param basep		Returns base of region
870  * @param sizep		Returns size of region
871  * @return 0 if OK, -ive on error
872  */
873 int fdtdec_decode_memory_region(const void *blob, int node,
874 				const char *mem_type, const char *suffix,
875 				fdt_addr_t *basep, fdt_size_t *sizep);
876 
877 /* Display timings from linux include/video/display_timing.h */
878 enum display_flags {
879 	DISPLAY_FLAGS_HSYNC_LOW		= 1 << 0,
880 	DISPLAY_FLAGS_HSYNC_HIGH	= 1 << 1,
881 	DISPLAY_FLAGS_VSYNC_LOW		= 1 << 2,
882 	DISPLAY_FLAGS_VSYNC_HIGH	= 1 << 3,
883 
884 	/* data enable flag */
885 	DISPLAY_FLAGS_DE_LOW		= 1 << 4,
886 	DISPLAY_FLAGS_DE_HIGH		= 1 << 5,
887 	/* drive data on pos. edge */
888 	DISPLAY_FLAGS_PIXDATA_POSEDGE	= 1 << 6,
889 	/* drive data on neg. edge */
890 	DISPLAY_FLAGS_PIXDATA_NEGEDGE	= 1 << 7,
891 	DISPLAY_FLAGS_INTERLACED	= 1 << 8,
892 	DISPLAY_FLAGS_DOUBLESCAN	= 1 << 9,
893 	DISPLAY_FLAGS_DOUBLECLK		= 1 << 10,
894 };
895 
896 /*
897  * A single signal can be specified via a range of minimal and maximal values
898  * with a typical value, that lies somewhere inbetween.
899  */
900 struct timing_entry {
901 	u32 min;
902 	u32 typ;
903 	u32 max;
904 };
905 
906 /*
907  * Single "mode" entry. This describes one set of signal timings a display can
908  * have in one setting. This struct can later be converted to struct videomode
909  * (see include/video/videomode.h). As each timing_entry can be defined as a
910  * range, one struct display_timing may become multiple struct videomodes.
911  *
912  * Example: hsync active high, vsync active low
913  *
914  *				    Active Video
915  * Video  ______________________XXXXXXXXXXXXXXXXXXXXXX_____________________
916  *	  |<- sync ->|<- back ->|<----- active ----->|<- front ->|<- sync..
917  *	  |	     |	 porch  |		     |	 porch	 |
918  *
919  * HSync _|¯¯¯¯¯¯¯¯¯¯|___________________________________________|¯¯¯¯¯¯¯¯¯
920  *
921  * VSync ¯|__________|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|_________
922  */
923 struct display_timing {
924 	struct timing_entry pixelclock;
925 
926 	struct timing_entry hactive;		/* hor. active video */
927 	struct timing_entry hfront_porch;	/* hor. front porch */
928 	struct timing_entry hback_porch;	/* hor. back porch */
929 	struct timing_entry hsync_len;		/* hor. sync len */
930 
931 	struct timing_entry vactive;		/* ver. active video */
932 	struct timing_entry vfront_porch;	/* ver. front porch */
933 	struct timing_entry vback_porch;	/* ver. back porch */
934 	struct timing_entry vsync_len;		/* ver. sync len */
935 
936 	enum display_flags flags;		/* display flags */
937 	bool hdmi_monitor;			/* is hdmi monitor? */
938 };
939 
940 /**
941  * fdtdec_decode_display_timing() - decode display timings
942  *
943  * Decode display timings from the supplied 'display-timings' node.
944  * See doc/device-tree-bindings/video/display-timing.txt for binding
945  * information.
946  *
947  * @param blob		FDT blob
948  * @param node		'display-timing' node containing the timing subnodes
949  * @param index		Index number to read (0=first timing subnode)
950  * @param config	Place to put timings
951  * @return 0 if OK, -FDT_ERR_NOTFOUND if not found
952  */
953 int fdtdec_decode_display_timing(const void *blob, int node, int index,
954 				 struct display_timing *config);
955 
956 /**
957  * fdtdec_setup_memory_size() - decode and setup gd->ram_size
958  *
959  * Decode the /memory 'reg' property to determine the size of the first memory
960  * bank, populate the global data with the size of the first bank of memory.
961  *
962  * This function should be called from a boards dram_init(). This helper
963  * function allows for boards to query the device tree for DRAM size instead of
964  * hard coding the value in the case where the memory size cannot be detected
965  * automatically.
966  *
967  * @return 0 if OK, -EINVAL if the /memory node or reg property is missing or
968  * invalid
969  */
970 int fdtdec_setup_memory_size(void);
971 
972 /**
973  * fdtdec_setup_memory_banksize() - decode and populate gd->bd->bi_dram
974  *
975  * Decode the /memory 'reg' property to determine the address and size of the
976  * memory banks. Use this data to populate the global data board info with the
977  * phys address and size of memory banks.
978  *
979  * This function should be called from a boards dram_init_banksize(). This
980  * helper function allows for boards to query the device tree for memory bank
981  * information instead of hard coding the information in cases where it cannot
982  * be detected automatically.
983  *
984  * @return 0 if OK, -EINVAL if the /memory node or reg property is missing or
985  * invalid
986  */
987 int fdtdec_setup_memory_banksize(void);
988 
989 /**
990  * Set up the device tree ready for use
991  */
992 int fdtdec_setup(void);
993 
994 /**
995  * Board-specific FDT initialization. Returns the address to a device tree blob.
996  * Called when CONFIG_OF_BOARD is defined.
997  */
998 void *board_fdt_blob_setup(void);
999 
1000 #endif
1001