| 
									
										
										
										
											2008-12-16 10:43:48 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Header with function prototypes to help device tree manipulation using | 
					
						
							|  |  |  |  * libfdt. It also provides functions to read entries from device tree proc | 
					
						
							|  |  |  |  * interface. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright 2008 IBM Corporation. | 
					
						
							|  |  |  |  * Authors: Jerone Young <jyoung5@us.ibm.com> | 
					
						
							|  |  |  |  *          Hollis Blanchard <hollisb@us.ibm.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This work is licensed under the GNU GPL license version 2 or later. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-29 13:47:03 +02:00
										 |  |  | #ifndef DEVICE_TREE_H
 | 
					
						
							|  |  |  | #define DEVICE_TREE_H
 | 
					
						
							| 
									
										
										
										
											2008-12-16 10:43:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-17 15:33:54 +02:00
										 |  |  | void *create_device_tree(int *sizep); | 
					
						
							| 
									
										
										
										
											2009-04-10 16:23:59 +00:00
										 |  |  | void *load_device_tree(const char *filename_path, int *sizep); | 
					
						
							| 
									
										
										
										
											2016-02-19 09:42:29 -07:00
										 |  |  | #ifdef CONFIG_LINUX
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * load_device_tree_from_sysfs: reads the device tree information in the | 
					
						
							|  |  |  |  * /proc/device-tree directory and return the corresponding binary blob | 
					
						
							|  |  |  |  * buffer pointer. Asserts in case of error. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void *load_device_tree_from_sysfs(void); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-12-16 10:43:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-19 09:42:30 -07:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * qemu_fdt_node_path: return the paths of nodes matching a given | 
					
						
							|  |  |  |  * name and compat string | 
					
						
							|  |  |  |  * @fdt: pointer to the dt blob | 
					
						
							|  |  |  |  * @name: node name | 
					
						
							|  |  |  |  * @compat: compatibility string | 
					
						
							|  |  |  |  * @errp: handle to an error object | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * returns a newly allocated NULL-terminated array of node paths. | 
					
						
							|  |  |  |  * Use g_strfreev() to free it. If one or more nodes were found, the | 
					
						
							|  |  |  |  * array contains the path of each node and the last element equals to | 
					
						
							|  |  |  |  * NULL. If there is no error but no matching node was found, the | 
					
						
							|  |  |  |  * returned array contains a single element equal to NULL. If an error | 
					
						
							|  |  |  |  * was encountered when parsing the blob, the function returns NULL | 
					
						
							| 
									
										
										
										
											2020-04-23 14:11:11 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @name may be NULL to wildcard names and only match compatibility | 
					
						
							|  |  |  |  * strings. | 
					
						
							| 
									
										
										
										
											2016-02-19 09:42:30 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-04-23 14:11:12 +02:00
										 |  |  | char **qemu_fdt_node_path(void *fdt, const char *name, const char *compat, | 
					
						
							| 
									
										
										
										
											2016-02-19 09:42:30 -07:00
										 |  |  |                           Error **errp); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-29 15:11:01 +01:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * qemu_fdt_node_unit_path: return the paths of nodes matching a given | 
					
						
							|  |  |  |  * node-name, ie. node-name and node-name@unit-address | 
					
						
							|  |  |  |  * @fdt: pointer to the dt blob | 
					
						
							|  |  |  |  * @name: node name | 
					
						
							|  |  |  |  * @errp: handle to an error object | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * returns a newly allocated NULL-terminated array of node paths. | 
					
						
							|  |  |  |  * Use g_strfreev() to free it. If one or more nodes were found, the | 
					
						
							|  |  |  |  * array contains the path of each node and the last element equals to | 
					
						
							|  |  |  |  * NULL. If there is no error but no matching node was found, the | 
					
						
							|  |  |  |  * returned array contains a single element equal to NULL. If an error | 
					
						
							|  |  |  |  * was encountered when parsing the blob, the function returns NULL | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | char **qemu_fdt_node_unit_path(void *fdt, const char *name, Error **errp); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | int qemu_fdt_setprop(void *fdt, const char *node_path, | 
					
						
							| 
									
										
										
										
											2013-11-11 18:15:21 +10:00
										 |  |  |                      const char *property, const void *val, int size); | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | int qemu_fdt_setprop_cell(void *fdt, const char *node_path, | 
					
						
							|  |  |  |                           const char *property, uint32_t val); | 
					
						
							|  |  |  | int qemu_fdt_setprop_u64(void *fdt, const char *node_path, | 
					
						
							|  |  |  |                          const char *property, uint64_t val); | 
					
						
							|  |  |  | int qemu_fdt_setprop_string(void *fdt, const char *node_path, | 
					
						
							|  |  |  |                             const char *property, const char *string); | 
					
						
							| 
									
										
										
										
											2021-03-03 17:36:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * qemu_fdt_setprop_string_array: set a string array property | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @fdt: pointer to the dt blob | 
					
						
							|  |  |  |  * @name: node name | 
					
						
							|  |  |  |  * @prop: property array | 
					
						
							|  |  |  |  * @array: pointer to an array of string pointers | 
					
						
							|  |  |  |  * @len: length of array | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * assigns a string array to a property. This function converts and | 
					
						
							|  |  |  |  * array of strings to a sequential string with \0 separators before | 
					
						
							|  |  |  |  * setting the property. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | int qemu_fdt_setprop_string_array(void *fdt, const char *node_path, | 
					
						
							|  |  |  |                                   const char *prop, char **array, int len); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | int qemu_fdt_setprop_phandle(void *fdt, const char *node_path, | 
					
						
							|  |  |  |                              const char *property, | 
					
						
							|  |  |  |                              const char *target_node_path); | 
					
						
							| 
									
										
										
										
											2016-02-19 09:42:30 -07:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * qemu_fdt_getprop: retrieve the value of a given property | 
					
						
							|  |  |  |  * @fdt: pointer to the device tree blob | 
					
						
							|  |  |  |  * @node_path: node path | 
					
						
							|  |  |  |  * @property: name of the property to find | 
					
						
							|  |  |  |  * @lenp: fdt error if any or length of the property on success | 
					
						
							|  |  |  |  * @errp: handle to an error object | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * returns a pointer to the property on success and NULL on failure | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | const void *qemu_fdt_getprop(void *fdt, const char *node_path, | 
					
						
							| 
									
										
										
										
											2016-02-19 09:42:30 -07:00
										 |  |  |                              const char *property, int *lenp, | 
					
						
							|  |  |  |                              Error **errp); | 
					
						
							| 
									
										
										
										
											2016-02-19 09:42:30 -07:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * qemu_fdt_getprop_cell: retrieve the value of a given 4 byte property | 
					
						
							|  |  |  |  * @fdt: pointer to the device tree blob | 
					
						
							|  |  |  |  * @node_path: node path | 
					
						
							|  |  |  |  * @property: name of the property to find | 
					
						
							|  |  |  |  * @lenp: fdt error if any or -EINVAL if the property size is different from | 
					
						
							|  |  |  |  *        4 bytes, or 4 (expected length of the property) upon success. | 
					
						
							|  |  |  |  * @errp: handle to an error object | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * returns the property value on success | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | uint32_t qemu_fdt_getprop_cell(void *fdt, const char *node_path, | 
					
						
							| 
									
										
										
										
											2016-02-19 09:42:30 -07:00
										 |  |  |                                const char *property, int *lenp, | 
					
						
							|  |  |  |                                Error **errp); | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | uint32_t qemu_fdt_get_phandle(void *fdt, const char *path); | 
					
						
							|  |  |  | uint32_t qemu_fdt_alloc_phandle(void *fdt); | 
					
						
							|  |  |  | int qemu_fdt_nop_node(void *fdt, const char *node_path); | 
					
						
							|  |  |  | int qemu_fdt_add_subnode(void *fdt, const char *name); | 
					
						
							| 
									
										
										
										
											2021-10-20 22:21:19 +08:00
										 |  |  | int qemu_fdt_add_path(void *fdt, const char *path); | 
					
						
							| 
									
										
										
										
											2008-12-16 10:43:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | #define qemu_fdt_setprop_cells(fdt, node_path, property, ...)                 \
 | 
					
						
							| 
									
										
										
										
											2012-05-17 12:47:57 +02:00
										 |  |  |     do {                                                                      \ | 
					
						
							|  |  |  |         uint32_t qdt_tmp[] = { __VA_ARGS__ };                                 \ | 
					
						
							| 
									
										
										
										
											2023-09-04 18:12:32 +02:00
										 |  |  |         for (unsigned i_ = 0; i_ < ARRAY_SIZE(qdt_tmp); i_++) {               \ | 
					
						
							|  |  |  |             qdt_tmp[i_] = cpu_to_be32(qdt_tmp[i_]);                           \ | 
					
						
							| 
									
										
										
										
											2012-05-17 12:47:57 +02:00
										 |  |  |         }                                                                     \ | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  |         qemu_fdt_setprop(fdt, node_path, property, qdt_tmp,                   \ | 
					
						
							|  |  |  |                          sizeof(qdt_tmp));                                    \ | 
					
						
							| 
									
										
										
										
											2012-05-17 12:47:57 +02:00
										 |  |  |     } while (0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | void qemu_fdt_dumpdtb(void *fdt, int size); | 
					
						
							| 
									
										
										
										
											2022-09-26 14:38:40 -03:00
										 |  |  | void hmp_dumpdtb(Monitor *mon, const QDict *qdict); | 
					
						
							| 
									
										
										
										
											2012-09-23 08:37:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-16 13:25:05 +01:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  |  * qemu_fdt_setprop_sized_cells_from_array: | 
					
						
							| 
									
										
										
										
											2013-07-16 13:25:05 +01:00
										 |  |  |  * @fdt: device tree blob | 
					
						
							|  |  |  |  * @node_path: node to set property on | 
					
						
							|  |  |  |  * @property: property to set | 
					
						
							|  |  |  |  * @numvalues: number of values | 
					
						
							|  |  |  |  * @values: array of number-of-cells, value pairs | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Set the specified property on the specified node in the device tree | 
					
						
							|  |  |  |  * to be an array of cells. The values of the cells are specified via | 
					
						
							|  |  |  |  * the values list, which alternates between "number of cells used by | 
					
						
							|  |  |  |  * this value" and "value". | 
					
						
							|  |  |  |  * number-of-cells must be either 1 or 2 (other values will result in | 
					
						
							|  |  |  |  * an error being returned). If a value is too large to fit in the | 
					
						
							|  |  |  |  * number of cells specified for it, an error is returned. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This function is useful because device tree nodes often have cell arrays | 
					
						
							|  |  |  |  * which are either lists of addresses or lists of address,size tuples, but | 
					
						
							|  |  |  |  * the number of cells used for each element vary depending on the | 
					
						
							|  |  |  |  * #address-cells and #size-cells properties of their parent node. | 
					
						
							|  |  |  |  * If you know all your cell elements are one cell wide you can use the | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  |  * simpler qemu_fdt_setprop_cells(). If you're not setting up the | 
					
						
							|  |  |  |  * array programmatically, qemu_fdt_setprop_sized_cells may be more | 
					
						
							| 
									
										
										
										
											2013-07-16 13:25:05 +01:00
										 |  |  |  * convenient. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Return value: 0 on success, <0 on error. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | int qemu_fdt_setprop_sized_cells_from_array(void *fdt, | 
					
						
							|  |  |  |                                             const char *node_path, | 
					
						
							|  |  |  |                                             const char *property, | 
					
						
							|  |  |  |                                             int numvalues, | 
					
						
							|  |  |  |                                             uint64_t *values); | 
					
						
							| 
									
										
										
										
											2013-07-16 13:25:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  |  * qemu_fdt_setprop_sized_cells: | 
					
						
							| 
									
										
										
										
											2013-07-16 13:25:05 +01:00
										 |  |  |  * @fdt: device tree blob | 
					
						
							|  |  |  |  * @node_path: node to set property on | 
					
						
							|  |  |  |  * @property: property to set | 
					
						
							|  |  |  |  * @...: list of number-of-cells, value pairs | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Set the specified property on the specified node in the device tree | 
					
						
							|  |  |  |  * to be an array of cells. The values of the cells are specified via | 
					
						
							|  |  |  |  * the variable arguments, which alternates between "number of cells | 
					
						
							|  |  |  |  * used by this value" and "value". | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This is a convenience wrapper for the function | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  |  * qemu_fdt_setprop_sized_cells_from_array(). | 
					
						
							| 
									
										
										
										
											2013-07-16 13:25:05 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Return value: 0 on success, <0 on error. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-11-11 18:14:41 +10:00
										 |  |  | #define qemu_fdt_setprop_sized_cells(fdt, node_path, property, ...)       \
 | 
					
						
							|  |  |  |     ({                                                                    \ | 
					
						
							|  |  |  |         uint64_t qdt_tmp[] = { __VA_ARGS__ };                             \ | 
					
						
							|  |  |  |         qemu_fdt_setprop_sized_cells_from_array(fdt, node_path,           \ | 
					
						
							|  |  |  |                                                 property,                 \ | 
					
						
							|  |  |  |                                                 ARRAY_SIZE(qdt_tmp) / 2,  \ | 
					
						
							|  |  |  |                                                 qdt_tmp);                 \ | 
					
						
							| 
									
										
										
										
											2013-07-16 13:25:05 +01:00
										 |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-25 02:43:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * qemu_fdt_randomize_seeds: | 
					
						
							|  |  |  |  * @fdt: device tree blob | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Re-randomize all "rng-seed" properties with new seeds. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void qemu_fdt_randomize_seeds(void *fdt); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-13 05:46:08 +00:00
										 |  |  | #define FDT_PCI_RANGE_RELOCATABLE          0x80000000
 | 
					
						
							|  |  |  | #define FDT_PCI_RANGE_PREFETCHABLE         0x40000000
 | 
					
						
							|  |  |  | #define FDT_PCI_RANGE_ALIASED              0x20000000
 | 
					
						
							|  |  |  | #define FDT_PCI_RANGE_TYPE_MASK            0x03000000
 | 
					
						
							|  |  |  | #define FDT_PCI_RANGE_MMIO_64BIT           0x03000000
 | 
					
						
							|  |  |  | #define FDT_PCI_RANGE_MMIO                 0x02000000
 | 
					
						
							|  |  |  | #define FDT_PCI_RANGE_IOPORT               0x01000000
 | 
					
						
							|  |  |  | #define FDT_PCI_RANGE_CONFIG               0x00000000
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-29 13:47:03 +02:00
										 |  |  | #endif /* DEVICE_TREE_H */
 |