xref: /linux/drivers/acpi/property.c (revision 3bdab16c55f57a24245c97d707241dd9b48d1a91)
1 /*
2  * ACPI device specific properties support.
3  *
4  * Copyright (C) 2014, Intel Corporation
5  * All rights reserved.
6  *
7  * Authors: Mika Westerberg <mika.westerberg@linux.intel.com>
8  *          Darren Hart <dvhart@linux.intel.com>
9  *          Rafael J. Wysocki <rafael.j.wysocki@intel.com>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  */
15 
16 #include <linux/acpi.h>
17 #include <linux/device.h>
18 #include <linux/export.h>
19 
20 #include "internal.h"
21 
22 static int acpi_data_get_property_array(const struct acpi_device_data *data,
23 					const char *name,
24 					acpi_object_type type,
25 					const union acpi_object **obj);
26 
27 /*
28  * The GUIDs here are made equivalent to each other in order to avoid extra
29  * complexity in the properties handling code, with the caveat that the
30  * kernel will accept certain combinations of GUID and properties that are
31  * not defined without a warning. For instance if any of the properties
32  * from different GUID appear in a property list of another, it will be
33  * accepted by the kernel. Firmware validation tools should catch these.
34  */
35 static const guid_t prp_guids[] = {
36 	/* ACPI _DSD device properties GUID: daffd814-6eba-4d8c-8a91-bc9bbf4aa301 */
37 	GUID_INIT(0xdaffd814, 0x6eba, 0x4d8c,
38 		  0x8a, 0x91, 0xbc, 0x9b, 0xbf, 0x4a, 0xa3, 0x01),
39 	/* Hotplug in D3 GUID: 6211e2c0-58a3-4af3-90e1-927a4e0c55a4 */
40 	GUID_INIT(0x6211e2c0, 0x58a3, 0x4af3,
41 		  0x90, 0xe1, 0x92, 0x7a, 0x4e, 0x0c, 0x55, 0xa4),
42 	/* External facing port GUID: efcc06cc-73ac-4bc3-bff0-76143807c389 */
43 	GUID_INIT(0xefcc06cc, 0x73ac, 0x4bc3,
44 		  0xbf, 0xf0, 0x76, 0x14, 0x38, 0x07, 0xc3, 0x89),
45 };
46 
47 /* ACPI _DSD data subnodes GUID: dbb8e3e6-5886-4ba6-8795-1319f52a966b */
48 static const guid_t ads_guid =
49 	GUID_INIT(0xdbb8e3e6, 0x5886, 0x4ba6,
50 		  0x87, 0x95, 0x13, 0x19, 0xf5, 0x2a, 0x96, 0x6b);
51 
52 static bool acpi_enumerate_nondev_subnodes(acpi_handle scope,
53 					   const union acpi_object *desc,
54 					   struct acpi_device_data *data,
55 					   struct fwnode_handle *parent);
56 static bool acpi_extract_properties(const union acpi_object *desc,
57 				    struct acpi_device_data *data);
58 
59 static bool acpi_nondev_subnode_extract(const union acpi_object *desc,
60 					acpi_handle handle,
61 					const union acpi_object *link,
62 					struct list_head *list,
63 					struct fwnode_handle *parent)
64 {
65 	struct acpi_data_node *dn;
66 	bool result;
67 
68 	dn = kzalloc(sizeof(*dn), GFP_KERNEL);
69 	if (!dn)
70 		return false;
71 
72 	dn->name = link->package.elements[0].string.pointer;
73 	dn->fwnode.ops = &acpi_data_fwnode_ops;
74 	dn->parent = parent;
75 	INIT_LIST_HEAD(&dn->data.properties);
76 	INIT_LIST_HEAD(&dn->data.subnodes);
77 
78 	result = acpi_extract_properties(desc, &dn->data);
79 
80 	if (handle) {
81 		acpi_handle scope;
82 		acpi_status status;
83 
84 		/*
85 		 * The scope for the subnode object lookup is the one of the
86 		 * namespace node (device) containing the object that has
87 		 * returned the package.  That is, it's the scope of that
88 		 * object's parent.
89 		 */
90 		status = acpi_get_parent(handle, &scope);
91 		if (ACPI_SUCCESS(status)
92 		    && acpi_enumerate_nondev_subnodes(scope, desc, &dn->data,
93 						      &dn->fwnode))
94 			result = true;
95 	} else if (acpi_enumerate_nondev_subnodes(NULL, desc, &dn->data,
96 						  &dn->fwnode)) {
97 		result = true;
98 	}
99 
100 	if (result) {
101 		dn->handle = handle;
102 		dn->data.pointer = desc;
103 		list_add_tail(&dn->sibling, list);
104 		return true;
105 	}
106 
107 	kfree(dn);
108 	acpi_handle_debug(handle, "Invalid properties/subnodes data, skipping\n");
109 	return false;
110 }
111 
112 static bool acpi_nondev_subnode_data_ok(acpi_handle handle,
113 					const union acpi_object *link,
114 					struct list_head *list,
115 					struct fwnode_handle *parent)
116 {
117 	struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER };
118 	acpi_status status;
119 
120 	status = acpi_evaluate_object_typed(handle, NULL, NULL, &buf,
121 					    ACPI_TYPE_PACKAGE);
122 	if (ACPI_FAILURE(status))
123 		return false;
124 
125 	if (acpi_nondev_subnode_extract(buf.pointer, handle, link, list,
126 					parent))
127 		return true;
128 
129 	ACPI_FREE(buf.pointer);
130 	return false;
131 }
132 
133 static bool acpi_nondev_subnode_ok(acpi_handle scope,
134 				   const union acpi_object *link,
135 				   struct list_head *list,
136 				   struct fwnode_handle *parent)
137 {
138 	acpi_handle handle;
139 	acpi_status status;
140 
141 	if (!scope)
142 		return false;
143 
144 	status = acpi_get_handle(scope, link->package.elements[1].string.pointer,
145 				 &handle);
146 	if (ACPI_FAILURE(status))
147 		return false;
148 
149 	return acpi_nondev_subnode_data_ok(handle, link, list, parent);
150 }
151 
152 static int acpi_add_nondev_subnodes(acpi_handle scope,
153 				    const union acpi_object *links,
154 				    struct list_head *list,
155 				    struct fwnode_handle *parent)
156 {
157 	bool ret = false;
158 	int i;
159 
160 	for (i = 0; i < links->package.count; i++) {
161 		const union acpi_object *link, *desc;
162 		acpi_handle handle;
163 		bool result;
164 
165 		link = &links->package.elements[i];
166 		/* Only two elements allowed. */
167 		if (link->package.count != 2)
168 			continue;
169 
170 		/* The first one must be a string. */
171 		if (link->package.elements[0].type != ACPI_TYPE_STRING)
172 			continue;
173 
174 		/* The second one may be a string, a reference or a package. */
175 		switch (link->package.elements[1].type) {
176 		case ACPI_TYPE_STRING:
177 			result = acpi_nondev_subnode_ok(scope, link, list,
178 							 parent);
179 			break;
180 		case ACPI_TYPE_LOCAL_REFERENCE:
181 			handle = link->package.elements[1].reference.handle;
182 			result = acpi_nondev_subnode_data_ok(handle, link, list,
183 							     parent);
184 			break;
185 		case ACPI_TYPE_PACKAGE:
186 			desc = &link->package.elements[1];
187 			result = acpi_nondev_subnode_extract(desc, NULL, link,
188 							     list, parent);
189 			break;
190 		default:
191 			result = false;
192 			break;
193 		}
194 		ret = ret || result;
195 	}
196 
197 	return ret;
198 }
199 
200 static bool acpi_enumerate_nondev_subnodes(acpi_handle scope,
201 					   const union acpi_object *desc,
202 					   struct acpi_device_data *data,
203 					   struct fwnode_handle *parent)
204 {
205 	int i;
206 
207 	/* Look for the ACPI data subnodes GUID. */
208 	for (i = 0; i < desc->package.count; i += 2) {
209 		const union acpi_object *guid, *links;
210 
211 		guid = &desc->package.elements[i];
212 		links = &desc->package.elements[i + 1];
213 
214 		/*
215 		 * The first element must be a GUID and the second one must be
216 		 * a package.
217 		 */
218 		if (guid->type != ACPI_TYPE_BUFFER ||
219 		    guid->buffer.length != 16 ||
220 		    links->type != ACPI_TYPE_PACKAGE)
221 			break;
222 
223 		if (!guid_equal((guid_t *)guid->buffer.pointer, &ads_guid))
224 			continue;
225 
226 		return acpi_add_nondev_subnodes(scope, links, &data->subnodes,
227 						parent);
228 	}
229 
230 	return false;
231 }
232 
233 static bool acpi_property_value_ok(const union acpi_object *value)
234 {
235 	int j;
236 
237 	/*
238 	 * The value must be an integer, a string, a reference, or a package
239 	 * whose every element must be an integer, a string, or a reference.
240 	 */
241 	switch (value->type) {
242 	case ACPI_TYPE_INTEGER:
243 	case ACPI_TYPE_STRING:
244 	case ACPI_TYPE_LOCAL_REFERENCE:
245 		return true;
246 
247 	case ACPI_TYPE_PACKAGE:
248 		for (j = 0; j < value->package.count; j++)
249 			switch (value->package.elements[j].type) {
250 			case ACPI_TYPE_INTEGER:
251 			case ACPI_TYPE_STRING:
252 			case ACPI_TYPE_LOCAL_REFERENCE:
253 				continue;
254 
255 			default:
256 				return false;
257 			}
258 
259 		return true;
260 	}
261 	return false;
262 }
263 
264 static bool acpi_properties_format_valid(const union acpi_object *properties)
265 {
266 	int i;
267 
268 	for (i = 0; i < properties->package.count; i++) {
269 		const union acpi_object *property;
270 
271 		property = &properties->package.elements[i];
272 		/*
273 		 * Only two elements allowed, the first one must be a string and
274 		 * the second one has to satisfy certain conditions.
275 		 */
276 		if (property->package.count != 2
277 		    || property->package.elements[0].type != ACPI_TYPE_STRING
278 		    || !acpi_property_value_ok(&property->package.elements[1]))
279 			return false;
280 	}
281 	return true;
282 }
283 
284 static void acpi_init_of_compatible(struct acpi_device *adev)
285 {
286 	const union acpi_object *of_compatible;
287 	int ret;
288 
289 	ret = acpi_data_get_property_array(&adev->data, "compatible",
290 					   ACPI_TYPE_STRING, &of_compatible);
291 	if (ret) {
292 		ret = acpi_dev_get_property(adev, "compatible",
293 					    ACPI_TYPE_STRING, &of_compatible);
294 		if (ret) {
295 			if (adev->parent
296 			    && adev->parent->flags.of_compatible_ok)
297 				goto out;
298 
299 			return;
300 		}
301 	}
302 	adev->data.of_compatible = of_compatible;
303 
304  out:
305 	adev->flags.of_compatible_ok = 1;
306 }
307 
308 static bool acpi_is_property_guid(const guid_t *guid)
309 {
310 	int i;
311 
312 	for (i = 0; i < ARRAY_SIZE(prp_guids); i++) {
313 		if (guid_equal(guid, &prp_guids[i]))
314 			return true;
315 	}
316 
317 	return false;
318 }
319 
320 struct acpi_device_properties *
321 acpi_data_add_props(struct acpi_device_data *data, const guid_t *guid,
322 		    const union acpi_object *properties)
323 {
324 	struct acpi_device_properties *props;
325 
326 	props = kzalloc(sizeof(*props), GFP_KERNEL);
327 	if (props) {
328 		INIT_LIST_HEAD(&props->list);
329 		props->guid = guid;
330 		props->properties = properties;
331 		list_add_tail(&props->list, &data->properties);
332 	}
333 
334 	return props;
335 }
336 
337 static bool acpi_extract_properties(const union acpi_object *desc,
338 				    struct acpi_device_data *data)
339 {
340 	int i;
341 
342 	if (desc->package.count % 2)
343 		return false;
344 
345 	/* Look for the device properties GUID. */
346 	for (i = 0; i < desc->package.count; i += 2) {
347 		const union acpi_object *guid, *properties;
348 
349 		guid = &desc->package.elements[i];
350 		properties = &desc->package.elements[i + 1];
351 
352 		/*
353 		 * The first element must be a GUID and the second one must be
354 		 * a package.
355 		 */
356 		if (guid->type != ACPI_TYPE_BUFFER ||
357 		    guid->buffer.length != 16 ||
358 		    properties->type != ACPI_TYPE_PACKAGE)
359 			break;
360 
361 		if (!acpi_is_property_guid((guid_t *)guid->buffer.pointer))
362 			continue;
363 
364 		/*
365 		 * We found the matching GUID. Now validate the format of the
366 		 * package immediately following it.
367 		 */
368 		if (!acpi_properties_format_valid(properties))
369 			continue;
370 
371 		acpi_data_add_props(data, (const guid_t *)guid->buffer.pointer,
372 				    properties);
373 	}
374 
375 	return !list_empty(&data->properties);
376 }
377 
378 void acpi_init_properties(struct acpi_device *adev)
379 {
380 	struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER };
381 	struct acpi_hardware_id *hwid;
382 	acpi_status status;
383 	bool acpi_of = false;
384 
385 	INIT_LIST_HEAD(&adev->data.properties);
386 	INIT_LIST_HEAD(&adev->data.subnodes);
387 
388 	if (!adev->handle)
389 		return;
390 
391 	/*
392 	 * Check if ACPI_DT_NAMESPACE_HID is present and inthat case we fill in
393 	 * Device Tree compatible properties for this device.
394 	 */
395 	list_for_each_entry(hwid, &adev->pnp.ids, list) {
396 		if (!strcmp(hwid->id, ACPI_DT_NAMESPACE_HID)) {
397 			acpi_of = true;
398 			break;
399 		}
400 	}
401 
402 	status = acpi_evaluate_object_typed(adev->handle, "_DSD", NULL, &buf,
403 					    ACPI_TYPE_PACKAGE);
404 	if (ACPI_FAILURE(status))
405 		goto out;
406 
407 	if (acpi_extract_properties(buf.pointer, &adev->data)) {
408 		adev->data.pointer = buf.pointer;
409 		if (acpi_of)
410 			acpi_init_of_compatible(adev);
411 	}
412 	if (acpi_enumerate_nondev_subnodes(adev->handle, buf.pointer,
413 					&adev->data, acpi_fwnode_handle(adev)))
414 		adev->data.pointer = buf.pointer;
415 
416 	if (!adev->data.pointer) {
417 		acpi_handle_debug(adev->handle, "Invalid _DSD data, skipping\n");
418 		ACPI_FREE(buf.pointer);
419 	}
420 
421  out:
422 	if (acpi_of && !adev->flags.of_compatible_ok)
423 		acpi_handle_info(adev->handle,
424 			 ACPI_DT_NAMESPACE_HID " requires 'compatible' property\n");
425 
426 	if (!adev->data.pointer)
427 		acpi_extract_apple_properties(adev);
428 }
429 
430 static void acpi_destroy_nondev_subnodes(struct list_head *list)
431 {
432 	struct acpi_data_node *dn, *next;
433 
434 	if (list_empty(list))
435 		return;
436 
437 	list_for_each_entry_safe_reverse(dn, next, list, sibling) {
438 		acpi_destroy_nondev_subnodes(&dn->data.subnodes);
439 		wait_for_completion(&dn->kobj_done);
440 		list_del(&dn->sibling);
441 		ACPI_FREE((void *)dn->data.pointer);
442 		kfree(dn);
443 	}
444 }
445 
446 void acpi_free_properties(struct acpi_device *adev)
447 {
448 	struct acpi_device_properties *props, *tmp;
449 
450 	acpi_destroy_nondev_subnodes(&adev->data.subnodes);
451 	ACPI_FREE((void *)adev->data.pointer);
452 	adev->data.of_compatible = NULL;
453 	adev->data.pointer = NULL;
454 	list_for_each_entry_safe(props, tmp, &adev->data.properties, list) {
455 		list_del(&props->list);
456 		kfree(props);
457 	}
458 }
459 
460 /**
461  * acpi_data_get_property - return an ACPI property with given name
462  * @data: ACPI device deta object to get the property from
463  * @name: Name of the property
464  * @type: Expected property type
465  * @obj: Location to store the property value (if not %NULL)
466  *
467  * Look up a property with @name and store a pointer to the resulting ACPI
468  * object at the location pointed to by @obj if found.
469  *
470  * Callers must not attempt to free the returned objects.  These objects will be
471  * freed by the ACPI core automatically during the removal of @data.
472  *
473  * Return: %0 if property with @name has been found (success),
474  *         %-EINVAL if the arguments are invalid,
475  *         %-EINVAL if the property doesn't exist,
476  *         %-EPROTO if the property value type doesn't match @type.
477  */
478 static int acpi_data_get_property(const struct acpi_device_data *data,
479 				  const char *name, acpi_object_type type,
480 				  const union acpi_object **obj)
481 {
482 	const struct acpi_device_properties *props;
483 
484 	if (!data || !name)
485 		return -EINVAL;
486 
487 	if (!data->pointer || list_empty(&data->properties))
488 		return -EINVAL;
489 
490 	list_for_each_entry(props, &data->properties, list) {
491 		const union acpi_object *properties;
492 		unsigned int i;
493 
494 		properties = props->properties;
495 		for (i = 0; i < properties->package.count; i++) {
496 			const union acpi_object *propname, *propvalue;
497 			const union acpi_object *property;
498 
499 			property = &properties->package.elements[i];
500 
501 			propname = &property->package.elements[0];
502 			propvalue = &property->package.elements[1];
503 
504 			if (!strcmp(name, propname->string.pointer)) {
505 				if (type != ACPI_TYPE_ANY &&
506 				    propvalue->type != type)
507 					return -EPROTO;
508 				if (obj)
509 					*obj = propvalue;
510 
511 				return 0;
512 			}
513 		}
514 	}
515 	return -EINVAL;
516 }
517 
518 /**
519  * acpi_dev_get_property - return an ACPI property with given name.
520  * @adev: ACPI device to get the property from.
521  * @name: Name of the property.
522  * @type: Expected property type.
523  * @obj: Location to store the property value (if not %NULL).
524  */
525 int acpi_dev_get_property(const struct acpi_device *adev, const char *name,
526 			  acpi_object_type type, const union acpi_object **obj)
527 {
528 	return adev ? acpi_data_get_property(&adev->data, name, type, obj) : -EINVAL;
529 }
530 EXPORT_SYMBOL_GPL(acpi_dev_get_property);
531 
532 static const struct acpi_device_data *
533 acpi_device_data_of_node(const struct fwnode_handle *fwnode)
534 {
535 	if (is_acpi_device_node(fwnode)) {
536 		const struct acpi_device *adev = to_acpi_device_node(fwnode);
537 		return &adev->data;
538 	} else if (is_acpi_data_node(fwnode)) {
539 		const struct acpi_data_node *dn = to_acpi_data_node(fwnode);
540 		return &dn->data;
541 	}
542 	return NULL;
543 }
544 
545 /**
546  * acpi_node_prop_get - return an ACPI property with given name.
547  * @fwnode: Firmware node to get the property from.
548  * @propname: Name of the property.
549  * @valptr: Location to store a pointer to the property value (if not %NULL).
550  */
551 int acpi_node_prop_get(const struct fwnode_handle *fwnode,
552 		       const char *propname, void **valptr)
553 {
554 	return acpi_data_get_property(acpi_device_data_of_node(fwnode),
555 				      propname, ACPI_TYPE_ANY,
556 				      (const union acpi_object **)valptr);
557 }
558 
559 /**
560  * acpi_data_get_property_array - return an ACPI array property with given name
561  * @adev: ACPI data object to get the property from
562  * @name: Name of the property
563  * @type: Expected type of array elements
564  * @obj: Location to store a pointer to the property value (if not NULL)
565  *
566  * Look up an array property with @name and store a pointer to the resulting
567  * ACPI object at the location pointed to by @obj if found.
568  *
569  * Callers must not attempt to free the returned objects.  Those objects will be
570  * freed by the ACPI core automatically during the removal of @data.
571  *
572  * Return: %0 if array property (package) with @name has been found (success),
573  *         %-EINVAL if the arguments are invalid,
574  *         %-EINVAL if the property doesn't exist,
575  *         %-EPROTO if the property is not a package or the type of its elements
576  *           doesn't match @type.
577  */
578 static int acpi_data_get_property_array(const struct acpi_device_data *data,
579 					const char *name,
580 					acpi_object_type type,
581 					const union acpi_object **obj)
582 {
583 	const union acpi_object *prop;
584 	int ret, i;
585 
586 	ret = acpi_data_get_property(data, name, ACPI_TYPE_PACKAGE, &prop);
587 	if (ret)
588 		return ret;
589 
590 	if (type != ACPI_TYPE_ANY) {
591 		/* Check that all elements are of correct type. */
592 		for (i = 0; i < prop->package.count; i++)
593 			if (prop->package.elements[i].type != type)
594 				return -EPROTO;
595 	}
596 	if (obj)
597 		*obj = prop;
598 
599 	return 0;
600 }
601 
602 static struct fwnode_handle *
603 acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
604 				 const char *childname)
605 {
606 	struct fwnode_handle *child;
607 
608 	/*
609 	 * Find first matching named child node of this fwnode.
610 	 * For ACPI this will be a data only sub-node.
611 	 */
612 	fwnode_for_each_child_node(fwnode, child)
613 		if (acpi_data_node_match(child, childname))
614 			return child;
615 
616 	return NULL;
617 }
618 
619 /**
620  * __acpi_node_get_property_reference - returns handle to the referenced object
621  * @fwnode: Firmware node to get the property from
622  * @propname: Name of the property
623  * @index: Index of the reference to return
624  * @num_args: Maximum number of arguments after each reference
625  * @args: Location to store the returned reference with optional arguments
626  *
627  * Find property with @name, verifify that it is a package containing at least
628  * one object reference and if so, store the ACPI device object pointer to the
629  * target object in @args->adev.  If the reference includes arguments, store
630  * them in the @args->args[] array.
631  *
632  * If there's more than one reference in the property value package, @index is
633  * used to select the one to return.
634  *
635  * It is possible to leave holes in the property value set like in the
636  * example below:
637  *
638  * Package () {
639  *     "cs-gpios",
640  *     Package () {
641  *        ^GPIO, 19, 0, 0,
642  *        ^GPIO, 20, 0, 0,
643  *        0,
644  *        ^GPIO, 21, 0, 0,
645  *     }
646  * }
647  *
648  * Calling this function with index %2 or index %3 return %-ENOENT. If the
649  * property does not contain any more values %-ENOENT is returned. The NULL
650  * entry must be single integer and preferably contain value %0.
651  *
652  * Return: %0 on success, negative error code on failure.
653  */
654 int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
655 	const char *propname, size_t index, size_t num_args,
656 	struct fwnode_reference_args *args)
657 {
658 	const union acpi_object *element, *end;
659 	const union acpi_object *obj;
660 	const struct acpi_device_data *data;
661 	struct acpi_device *device;
662 	int ret, idx = 0;
663 
664 	data = acpi_device_data_of_node(fwnode);
665 	if (!data)
666 		return -ENOENT;
667 
668 	ret = acpi_data_get_property(data, propname, ACPI_TYPE_ANY, &obj);
669 	if (ret)
670 		return ret == -EINVAL ? -ENOENT : -EINVAL;
671 
672 	/*
673 	 * The simplest case is when the value is a single reference.  Just
674 	 * return that reference then.
675 	 */
676 	if (obj->type == ACPI_TYPE_LOCAL_REFERENCE) {
677 		if (index)
678 			return -EINVAL;
679 
680 		ret = acpi_bus_get_device(obj->reference.handle, &device);
681 		if (ret)
682 			return ret == -ENODEV ? -EINVAL : ret;
683 
684 		args->fwnode = acpi_fwnode_handle(device);
685 		args->nargs = 0;
686 		return 0;
687 	}
688 
689 	/*
690 	 * If it is not a single reference, then it is a package of
691 	 * references followed by number of ints as follows:
692 	 *
693 	 *  Package () { REF, INT, REF, INT, INT }
694 	 *
695 	 * The index argument is then used to determine which reference
696 	 * the caller wants (along with the arguments).
697 	 */
698 	if (obj->type != ACPI_TYPE_PACKAGE)
699 		return -EINVAL;
700 	if (index >= obj->package.count)
701 		return -ENOENT;
702 
703 	element = obj->package.elements;
704 	end = element + obj->package.count;
705 
706 	while (element < end) {
707 		u32 nargs, i;
708 
709 		if (element->type == ACPI_TYPE_LOCAL_REFERENCE) {
710 			struct fwnode_handle *ref_fwnode;
711 
712 			ret = acpi_bus_get_device(element->reference.handle,
713 						  &device);
714 			if (ret)
715 				return -EINVAL;
716 
717 			nargs = 0;
718 			element++;
719 
720 			/*
721 			 * Find the referred data extension node under the
722 			 * referred device node.
723 			 */
724 			for (ref_fwnode = acpi_fwnode_handle(device);
725 			     element < end && element->type == ACPI_TYPE_STRING;
726 			     element++) {
727 				ref_fwnode = acpi_fwnode_get_named_child_node(
728 					ref_fwnode, element->string.pointer);
729 				if (!ref_fwnode)
730 					return -EINVAL;
731 			}
732 
733 			/* assume following integer elements are all args */
734 			for (i = 0; element + i < end && i < num_args; i++) {
735 				int type = element[i].type;
736 
737 				if (type == ACPI_TYPE_INTEGER)
738 					nargs++;
739 				else if (type == ACPI_TYPE_LOCAL_REFERENCE)
740 					break;
741 				else
742 					return -EINVAL;
743 			}
744 
745 			if (nargs > NR_FWNODE_REFERENCE_ARGS)
746 				return -EINVAL;
747 
748 			if (idx == index) {
749 				args->fwnode = ref_fwnode;
750 				args->nargs = nargs;
751 				for (i = 0; i < nargs; i++)
752 					args->args[i] = element[i].integer.value;
753 
754 				return 0;
755 			}
756 
757 			element += nargs;
758 		} else if (element->type == ACPI_TYPE_INTEGER) {
759 			if (idx == index)
760 				return -ENOENT;
761 			element++;
762 		} else {
763 			return -EINVAL;
764 		}
765 
766 		idx++;
767 	}
768 
769 	return -ENOENT;
770 }
771 EXPORT_SYMBOL_GPL(__acpi_node_get_property_reference);
772 
773 static int acpi_data_prop_read_single(const struct acpi_device_data *data,
774 				      const char *propname,
775 				      enum dev_prop_type proptype, void *val)
776 {
777 	const union acpi_object *obj;
778 	int ret;
779 
780 	if (!val)
781 		return -EINVAL;
782 
783 	if (proptype >= DEV_PROP_U8 && proptype <= DEV_PROP_U64) {
784 		ret = acpi_data_get_property(data, propname, ACPI_TYPE_INTEGER, &obj);
785 		if (ret)
786 			return ret;
787 
788 		switch (proptype) {
789 		case DEV_PROP_U8:
790 			if (obj->integer.value > U8_MAX)
791 				return -EOVERFLOW;
792 			*(u8 *)val = obj->integer.value;
793 			break;
794 		case DEV_PROP_U16:
795 			if (obj->integer.value > U16_MAX)
796 				return -EOVERFLOW;
797 			*(u16 *)val = obj->integer.value;
798 			break;
799 		case DEV_PROP_U32:
800 			if (obj->integer.value > U32_MAX)
801 				return -EOVERFLOW;
802 			*(u32 *)val = obj->integer.value;
803 			break;
804 		default:
805 			*(u64 *)val = obj->integer.value;
806 			break;
807 		}
808 	} else if (proptype == DEV_PROP_STRING) {
809 		ret = acpi_data_get_property(data, propname, ACPI_TYPE_STRING, &obj);
810 		if (ret)
811 			return ret;
812 
813 		*(char **)val = obj->string.pointer;
814 
815 		return 1;
816 	} else {
817 		ret = -EINVAL;
818 	}
819 	return ret;
820 }
821 
822 int acpi_dev_prop_read_single(struct acpi_device *adev, const char *propname,
823 			      enum dev_prop_type proptype, void *val)
824 {
825 	int ret;
826 
827 	if (!adev)
828 		return -EINVAL;
829 
830 	ret = acpi_data_prop_read_single(&adev->data, propname, proptype, val);
831 	if (ret < 0 || proptype != ACPI_TYPE_STRING)
832 		return ret;
833 	return 0;
834 }
835 
836 static int acpi_copy_property_array_u8(const union acpi_object *items, u8 *val,
837 				       size_t nval)
838 {
839 	int i;
840 
841 	for (i = 0; i < nval; i++) {
842 		if (items[i].type != ACPI_TYPE_INTEGER)
843 			return -EPROTO;
844 		if (items[i].integer.value > U8_MAX)
845 			return -EOVERFLOW;
846 
847 		val[i] = items[i].integer.value;
848 	}
849 	return 0;
850 }
851 
852 static int acpi_copy_property_array_u16(const union acpi_object *items,
853 					u16 *val, size_t nval)
854 {
855 	int i;
856 
857 	for (i = 0; i < nval; i++) {
858 		if (items[i].type != ACPI_TYPE_INTEGER)
859 			return -EPROTO;
860 		if (items[i].integer.value > U16_MAX)
861 			return -EOVERFLOW;
862 
863 		val[i] = items[i].integer.value;
864 	}
865 	return 0;
866 }
867 
868 static int acpi_copy_property_array_u32(const union acpi_object *items,
869 					u32 *val, size_t nval)
870 {
871 	int i;
872 
873 	for (i = 0; i < nval; i++) {
874 		if (items[i].type != ACPI_TYPE_INTEGER)
875 			return -EPROTO;
876 		if (items[i].integer.value > U32_MAX)
877 			return -EOVERFLOW;
878 
879 		val[i] = items[i].integer.value;
880 	}
881 	return 0;
882 }
883 
884 static int acpi_copy_property_array_u64(const union acpi_object *items,
885 					u64 *val, size_t nval)
886 {
887 	int i;
888 
889 	for (i = 0; i < nval; i++) {
890 		if (items[i].type != ACPI_TYPE_INTEGER)
891 			return -EPROTO;
892 
893 		val[i] = items[i].integer.value;
894 	}
895 	return 0;
896 }
897 
898 static int acpi_copy_property_array_string(const union acpi_object *items,
899 					   char **val, size_t nval)
900 {
901 	int i;
902 
903 	for (i = 0; i < nval; i++) {
904 		if (items[i].type != ACPI_TYPE_STRING)
905 			return -EPROTO;
906 
907 		val[i] = items[i].string.pointer;
908 	}
909 	return nval;
910 }
911 
912 static int acpi_data_prop_read(const struct acpi_device_data *data,
913 			       const char *propname,
914 			       enum dev_prop_type proptype,
915 			       void *val, size_t nval)
916 {
917 	const union acpi_object *obj;
918 	const union acpi_object *items;
919 	int ret;
920 
921 	if (val && nval == 1) {
922 		ret = acpi_data_prop_read_single(data, propname, proptype, val);
923 		if (ret >= 0)
924 			return ret;
925 	}
926 
927 	ret = acpi_data_get_property_array(data, propname, ACPI_TYPE_ANY, &obj);
928 	if (ret)
929 		return ret;
930 
931 	if (!val)
932 		return obj->package.count;
933 
934 	if (proptype != DEV_PROP_STRING && nval > obj->package.count)
935 		return -EOVERFLOW;
936 	else if (nval <= 0)
937 		return -EINVAL;
938 
939 	items = obj->package.elements;
940 
941 	switch (proptype) {
942 	case DEV_PROP_U8:
943 		ret = acpi_copy_property_array_u8(items, (u8 *)val, nval);
944 		break;
945 	case DEV_PROP_U16:
946 		ret = acpi_copy_property_array_u16(items, (u16 *)val, nval);
947 		break;
948 	case DEV_PROP_U32:
949 		ret = acpi_copy_property_array_u32(items, (u32 *)val, nval);
950 		break;
951 	case DEV_PROP_U64:
952 		ret = acpi_copy_property_array_u64(items, (u64 *)val, nval);
953 		break;
954 	case DEV_PROP_STRING:
955 		ret = acpi_copy_property_array_string(
956 			items, (char **)val,
957 			min_t(u32, nval, obj->package.count));
958 		break;
959 	default:
960 		ret = -EINVAL;
961 		break;
962 	}
963 	return ret;
964 }
965 
966 int acpi_dev_prop_read(const struct acpi_device *adev, const char *propname,
967 		       enum dev_prop_type proptype, void *val, size_t nval)
968 {
969 	return adev ? acpi_data_prop_read(&adev->data, propname, proptype, val, nval) : -EINVAL;
970 }
971 
972 /**
973  * acpi_node_prop_read - retrieve the value of an ACPI property with given name.
974  * @fwnode: Firmware node to get the property from.
975  * @propname: Name of the property.
976  * @proptype: Expected property type.
977  * @val: Location to store the property value (if not %NULL).
978  * @nval: Size of the array pointed to by @val.
979  *
980  * If @val is %NULL, return the number of array elements comprising the value
981  * of the property.  Otherwise, read at most @nval values to the array at the
982  * location pointed to by @val.
983  */
984 int acpi_node_prop_read(const struct fwnode_handle *fwnode,
985 			const char *propname, enum dev_prop_type proptype,
986 			void *val, size_t nval)
987 {
988 	return acpi_data_prop_read(acpi_device_data_of_node(fwnode),
989 				   propname, proptype, val, nval);
990 }
991 
992 /**
993  * acpi_get_next_subnode - Return the next child node handle for a fwnode
994  * @fwnode: Firmware node to find the next child node for.
995  * @child: Handle to one of the device's child nodes or a null handle.
996  */
997 struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
998 					    struct fwnode_handle *child)
999 {
1000 	const struct acpi_device *adev = to_acpi_device_node(fwnode);
1001 	const struct list_head *head;
1002 	struct list_head *next;
1003 
1004 	if (!child || is_acpi_device_node(child)) {
1005 		struct acpi_device *child_adev;
1006 
1007 		if (adev)
1008 			head = &adev->children;
1009 		else
1010 			goto nondev;
1011 
1012 		if (list_empty(head))
1013 			goto nondev;
1014 
1015 		if (child) {
1016 			adev = to_acpi_device_node(child);
1017 			next = adev->node.next;
1018 			if (next == head) {
1019 				child = NULL;
1020 				goto nondev;
1021 			}
1022 			child_adev = list_entry(next, struct acpi_device, node);
1023 		} else {
1024 			child_adev = list_first_entry(head, struct acpi_device,
1025 						      node);
1026 		}
1027 		return acpi_fwnode_handle(child_adev);
1028 	}
1029 
1030  nondev:
1031 	if (!child || is_acpi_data_node(child)) {
1032 		const struct acpi_data_node *data = to_acpi_data_node(fwnode);
1033 		struct acpi_data_node *dn;
1034 
1035 		/*
1036 		 * We can have a combination of device and data nodes, e.g. with
1037 		 * hierarchical _DSD properties. Make sure the adev pointer is
1038 		 * restored before going through data nodes, otherwise we will
1039 		 * be looking for data_nodes below the last device found instead
1040 		 * of the common fwnode shared by device_nodes and data_nodes.
1041 		 */
1042 		adev = to_acpi_device_node(fwnode);
1043 		if (adev)
1044 			head = &adev->data.subnodes;
1045 		else if (data)
1046 			head = &data->data.subnodes;
1047 		else
1048 			return NULL;
1049 
1050 		if (list_empty(head))
1051 			return NULL;
1052 
1053 		if (child) {
1054 			dn = to_acpi_data_node(child);
1055 			next = dn->sibling.next;
1056 			if (next == head)
1057 				return NULL;
1058 
1059 			dn = list_entry(next, struct acpi_data_node, sibling);
1060 		} else {
1061 			dn = list_first_entry(head, struct acpi_data_node, sibling);
1062 		}
1063 		return &dn->fwnode;
1064 	}
1065 	return NULL;
1066 }
1067 
1068 /**
1069  * acpi_node_get_parent - Return parent fwnode of this fwnode
1070  * @fwnode: Firmware node whose parent to get
1071  *
1072  * Returns parent node of an ACPI device or data firmware node or %NULL if
1073  * not available.
1074  */
1075 struct fwnode_handle *acpi_node_get_parent(const struct fwnode_handle *fwnode)
1076 {
1077 	if (is_acpi_data_node(fwnode)) {
1078 		/* All data nodes have parent pointer so just return that */
1079 		return to_acpi_data_node(fwnode)->parent;
1080 	} else if (is_acpi_device_node(fwnode)) {
1081 		acpi_handle handle, parent_handle;
1082 
1083 		handle = to_acpi_device_node(fwnode)->handle;
1084 		if (ACPI_SUCCESS(acpi_get_parent(handle, &parent_handle))) {
1085 			struct acpi_device *adev;
1086 
1087 			if (!acpi_bus_get_device(parent_handle, &adev))
1088 				return acpi_fwnode_handle(adev);
1089 		}
1090 	}
1091 
1092 	return NULL;
1093 }
1094 
1095 /*
1096  * Return true if the node is an ACPI graph node. Called on either ports
1097  * or endpoints.
1098  */
1099 static bool is_acpi_graph_node(struct fwnode_handle *fwnode,
1100 			       const char *str)
1101 {
1102 	unsigned int len = strlen(str);
1103 	const char *name;
1104 
1105 	if (!len || !is_acpi_data_node(fwnode))
1106 		return false;
1107 
1108 	name = to_acpi_data_node(fwnode)->name;
1109 
1110 	return (fwnode_property_present(fwnode, "reg") &&
1111 		!strncmp(name, str, len) && name[len] == '@') ||
1112 		fwnode_property_present(fwnode, str);
1113 }
1114 
1115 /**
1116  * acpi_graph_get_next_endpoint - Get next endpoint ACPI firmware node
1117  * @fwnode: Pointer to the parent firmware node
1118  * @prev: Previous endpoint node or %NULL to get the first
1119  *
1120  * Looks up next endpoint ACPI firmware node below a given @fwnode. Returns
1121  * %NULL if there is no next endpoint or in case of error. In case of success
1122  * the next endpoint is returned.
1123  */
1124 static struct fwnode_handle *acpi_graph_get_next_endpoint(
1125 	const struct fwnode_handle *fwnode, struct fwnode_handle *prev)
1126 {
1127 	struct fwnode_handle *port = NULL;
1128 	struct fwnode_handle *endpoint;
1129 
1130 	if (!prev) {
1131 		do {
1132 			port = fwnode_get_next_child_node(fwnode, port);
1133 			/*
1134 			 * The names of the port nodes begin with "port@"
1135 			 * followed by the number of the port node and they also
1136 			 * have a "reg" property that also has the number of the
1137 			 * port node. For compatibility reasons a node is also
1138 			 * recognised as a port node from the "port" property.
1139 			 */
1140 			if (is_acpi_graph_node(port, "port"))
1141 				break;
1142 		} while (port);
1143 	} else {
1144 		port = fwnode_get_parent(prev);
1145 	}
1146 
1147 	if (!port)
1148 		return NULL;
1149 
1150 	endpoint = fwnode_get_next_child_node(port, prev);
1151 	while (!endpoint) {
1152 		port = fwnode_get_next_child_node(fwnode, port);
1153 		if (!port)
1154 			break;
1155 		if (is_acpi_graph_node(port, "port"))
1156 			endpoint = fwnode_get_next_child_node(port, NULL);
1157 	}
1158 
1159 	/*
1160 	 * The names of the endpoint nodes begin with "endpoint@" followed by
1161 	 * the number of the endpoint node and they also have a "reg" property
1162 	 * that also has the number of the endpoint node. For compatibility
1163 	 * reasons a node is also recognised as an endpoint node from the
1164 	 * "endpoint" property.
1165 	 */
1166 	if (!is_acpi_graph_node(endpoint, "endpoint"))
1167 		return NULL;
1168 
1169 	return endpoint;
1170 }
1171 
1172 /**
1173  * acpi_graph_get_child_prop_value - Return a child with a given property value
1174  * @fwnode: device fwnode
1175  * @prop_name: The name of the property to look for
1176  * @val: the desired property value
1177  *
1178  * Return the port node corresponding to a given port number. Returns
1179  * the child node on success, NULL otherwise.
1180  */
1181 static struct fwnode_handle *acpi_graph_get_child_prop_value(
1182 	const struct fwnode_handle *fwnode, const char *prop_name,
1183 	unsigned int val)
1184 {
1185 	struct fwnode_handle *child;
1186 
1187 	fwnode_for_each_child_node(fwnode, child) {
1188 		u32 nr;
1189 
1190 		if (fwnode_property_read_u32(child, prop_name, &nr))
1191 			continue;
1192 
1193 		if (val == nr)
1194 			return child;
1195 	}
1196 
1197 	return NULL;
1198 }
1199 
1200 
1201 /**
1202  * acpi_graph_get_remote_enpoint - Parses and returns remote end of an endpoint
1203  * @fwnode: Endpoint firmware node pointing to a remote device
1204  * @endpoint: Firmware node of remote endpoint is filled here if not %NULL
1205  *
1206  * Returns the remote endpoint corresponding to @__fwnode. NULL on error.
1207  */
1208 static struct fwnode_handle *
1209 acpi_graph_get_remote_endpoint(const struct fwnode_handle *__fwnode)
1210 {
1211 	struct fwnode_handle *fwnode;
1212 	unsigned int port_nr, endpoint_nr;
1213 	struct fwnode_reference_args args;
1214 	int ret;
1215 
1216 	memset(&args, 0, sizeof(args));
1217 	ret = acpi_node_get_property_reference(__fwnode, "remote-endpoint", 0,
1218 					       &args);
1219 	if (ret)
1220 		return NULL;
1221 
1222 	/* Direct endpoint reference? */
1223 	if (!is_acpi_device_node(args.fwnode))
1224 		return args.nargs ? NULL : args.fwnode;
1225 
1226 	/*
1227 	 * Always require two arguments with the reference: port and
1228 	 * endpoint indices.
1229 	 */
1230 	if (args.nargs != 2)
1231 		return NULL;
1232 
1233 	fwnode = args.fwnode;
1234 	port_nr = args.args[0];
1235 	endpoint_nr = args.args[1];
1236 
1237 	fwnode = acpi_graph_get_child_prop_value(fwnode, "port", port_nr);
1238 
1239 	return acpi_graph_get_child_prop_value(fwnode, "endpoint", endpoint_nr);
1240 }
1241 
1242 static bool acpi_fwnode_device_is_available(const struct fwnode_handle *fwnode)
1243 {
1244 	if (!is_acpi_device_node(fwnode))
1245 		return false;
1246 
1247 	return acpi_device_is_present(to_acpi_device_node(fwnode));
1248 }
1249 
1250 static bool acpi_fwnode_property_present(const struct fwnode_handle *fwnode,
1251 					 const char *propname)
1252 {
1253 	return !acpi_node_prop_get(fwnode, propname, NULL);
1254 }
1255 
1256 static int
1257 acpi_fwnode_property_read_int_array(const struct fwnode_handle *fwnode,
1258 				    const char *propname,
1259 				    unsigned int elem_size, void *val,
1260 				    size_t nval)
1261 {
1262 	enum dev_prop_type type;
1263 
1264 	switch (elem_size) {
1265 	case sizeof(u8):
1266 		type = DEV_PROP_U8;
1267 		break;
1268 	case sizeof(u16):
1269 		type = DEV_PROP_U16;
1270 		break;
1271 	case sizeof(u32):
1272 		type = DEV_PROP_U32;
1273 		break;
1274 	case sizeof(u64):
1275 		type = DEV_PROP_U64;
1276 		break;
1277 	default:
1278 		return -ENXIO;
1279 	}
1280 
1281 	return acpi_node_prop_read(fwnode, propname, type, val, nval);
1282 }
1283 
1284 static int
1285 acpi_fwnode_property_read_string_array(const struct fwnode_handle *fwnode,
1286 				       const char *propname, const char **val,
1287 				       size_t nval)
1288 {
1289 	return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
1290 				   val, nval);
1291 }
1292 
1293 static int
1294 acpi_fwnode_get_reference_args(const struct fwnode_handle *fwnode,
1295 			       const char *prop, const char *nargs_prop,
1296 			       unsigned int args_count, unsigned int index,
1297 			       struct fwnode_reference_args *args)
1298 {
1299 	return __acpi_node_get_property_reference(fwnode, prop, index,
1300 						  args_count, args);
1301 }
1302 
1303 static struct fwnode_handle *
1304 acpi_fwnode_get_parent(struct fwnode_handle *fwnode)
1305 {
1306 	return acpi_node_get_parent(fwnode);
1307 }
1308 
1309 static int acpi_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
1310 					    struct fwnode_endpoint *endpoint)
1311 {
1312 	struct fwnode_handle *port_fwnode = fwnode_get_parent(fwnode);
1313 
1314 	endpoint->local_fwnode = fwnode;
1315 
1316 	if (fwnode_property_read_u32(port_fwnode, "reg", &endpoint->port))
1317 		fwnode_property_read_u32(port_fwnode, "port", &endpoint->port);
1318 	if (fwnode_property_read_u32(fwnode, "reg", &endpoint->id))
1319 		fwnode_property_read_u32(fwnode, "endpoint", &endpoint->id);
1320 
1321 	return 0;
1322 }
1323 
1324 static const void *
1325 acpi_fwnode_device_get_match_data(const struct fwnode_handle *fwnode,
1326 				  const struct device *dev)
1327 {
1328 	return acpi_device_get_match_data(dev);
1329 }
1330 
1331 #define DECLARE_ACPI_FWNODE_OPS(ops) \
1332 	const struct fwnode_operations ops = {				\
1333 		.device_is_available = acpi_fwnode_device_is_available, \
1334 		.device_get_match_data = acpi_fwnode_device_get_match_data, \
1335 		.property_present = acpi_fwnode_property_present,	\
1336 		.property_read_int_array =				\
1337 			acpi_fwnode_property_read_int_array,		\
1338 		.property_read_string_array =				\
1339 			acpi_fwnode_property_read_string_array,		\
1340 		.get_parent = acpi_node_get_parent,			\
1341 		.get_next_child_node = acpi_get_next_subnode,		\
1342 		.get_named_child_node = acpi_fwnode_get_named_child_node, \
1343 		.get_reference_args = acpi_fwnode_get_reference_args,	\
1344 		.graph_get_next_endpoint =				\
1345 			acpi_graph_get_next_endpoint,			\
1346 		.graph_get_remote_endpoint =				\
1347 			acpi_graph_get_remote_endpoint,			\
1348 		.graph_get_port_parent = acpi_fwnode_get_parent,	\
1349 		.graph_parse_endpoint = acpi_fwnode_graph_parse_endpoint, \
1350 	};								\
1351 	EXPORT_SYMBOL_GPL(ops)
1352 
1353 DECLARE_ACPI_FWNODE_OPS(acpi_device_fwnode_ops);
1354 DECLARE_ACPI_FWNODE_OPS(acpi_data_fwnode_ops);
1355 const struct fwnode_operations acpi_static_fwnode_ops;
1356 
1357 bool is_acpi_device_node(const struct fwnode_handle *fwnode)
1358 {
1359 	return !IS_ERR_OR_NULL(fwnode) &&
1360 		fwnode->ops == &acpi_device_fwnode_ops;
1361 }
1362 EXPORT_SYMBOL(is_acpi_device_node);
1363 
1364 bool is_acpi_data_node(const struct fwnode_handle *fwnode)
1365 {
1366 	return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &acpi_data_fwnode_ops;
1367 }
1368 EXPORT_SYMBOL(is_acpi_data_node);
1369