device_tree: qemu_fdt_getprop_cell converted to use the error API
This patch aligns the prototype with qemu_fdt_getprop. The caller can choose whether the function self-asserts on error (passing &error_fatal as Error ** argument, corresponding to the legacy behavior), or behaves differently such as simply output a message. In this later case the caller can use the new lenp parameter to interpret the error if any. Signed-off-by: Eric Auger <eric.auger@linaro.org> Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
		
							parent
							
								
									78e24f235e
								
							
						
					
					
						commit
						58e71097ce
					
				| @ -350,15 +350,22 @@ const void *qemu_fdt_getprop(void *fdt, const char *node_path, | ||||
| } | ||||
| 
 | ||||
| uint32_t qemu_fdt_getprop_cell(void *fdt, const char *node_path, | ||||
|                                const char *property) | ||||
|                                const char *property, int *lenp, Error **errp) | ||||
| { | ||||
|     int len; | ||||
|     const uint32_t *p = qemu_fdt_getprop(fdt, node_path, property, &len, | ||||
|                                          &error_fatal); | ||||
|     if (len != 4) { | ||||
|         error_report("%s: %s/%s not 4 bytes long (not a cell?)", | ||||
|                      __func__, node_path, property); | ||||
|         exit(1); | ||||
|     const uint32_t *p; | ||||
| 
 | ||||
|     if (!lenp) { | ||||
|         lenp = &len; | ||||
|     } | ||||
|     p = qemu_fdt_getprop(fdt, node_path, property, lenp, errp); | ||||
|     if (!p) { | ||||
|         return 0; | ||||
|     } else if (*lenp != 4) { | ||||
|         error_setg(errp, "%s: %s/%s not 4 bytes long (not a cell?)", | ||||
|                    __func__, node_path, property); | ||||
|         *lenp = -EINVAL; | ||||
|         return 0; | ||||
|     } | ||||
|     return be32_to_cpu(*p); | ||||
| } | ||||
|  | ||||
| @ -437,8 +437,10 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo, | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     acells = qemu_fdt_getprop_cell(fdt, "/", "#address-cells"); | ||||
|     scells = qemu_fdt_getprop_cell(fdt, "/", "#size-cells"); | ||||
|     acells = qemu_fdt_getprop_cell(fdt, "/", "#address-cells", | ||||
|                                    NULL, &error_fatal); | ||||
|     scells = qemu_fdt_getprop_cell(fdt, "/", "#size-cells", | ||||
|                                    NULL, &error_fatal); | ||||
|     if (acells == 0 || scells == 0) { | ||||
|         fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n"); | ||||
|         goto fail; | ||||
|  | ||||
| @ -478,8 +478,10 @@ static void vexpress_modify_dtb(const struct arm_boot_info *info, void *fdt) | ||||
|     uint32_t acells, scells, intc; | ||||
|     const VEDBoardInfo *daughterboard = (const VEDBoardInfo *)info; | ||||
| 
 | ||||
|     acells = qemu_fdt_getprop_cell(fdt, "/", "#address-cells"); | ||||
|     scells = qemu_fdt_getprop_cell(fdt, "/", "#size-cells"); | ||||
|     acells = qemu_fdt_getprop_cell(fdt, "/", "#address-cells", | ||||
|                                    NULL, &error_fatal); | ||||
|     scells = qemu_fdt_getprop_cell(fdt, "/", "#size-cells", | ||||
|                                    NULL, &error_fatal); | ||||
|     intc = find_int_controller(fdt); | ||||
|     if (!intc) { | ||||
|         /* Not fatal, we just won't provide virtio. This will
 | ||||
|  | ||||
| @ -67,8 +67,20 @@ int qemu_fdt_setprop_phandle(void *fdt, const char *node_path, | ||||
| const void *qemu_fdt_getprop(void *fdt, const char *node_path, | ||||
|                              const char *property, int *lenp, | ||||
|                              Error **errp); | ||||
| /**
 | ||||
|  * 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 | ||||
|  */ | ||||
| uint32_t qemu_fdt_getprop_cell(void *fdt, const char *node_path, | ||||
|                                const char *property); | ||||
|                                const char *property, int *lenp, | ||||
|                                Error **errp); | ||||
| 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); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Eric Auger
						Eric Auger