diff mbox series

efi/apple-properties: Reinstate support for boolean properties

Message ID a4006978064f91dd42ec0554a3d2164a28ac61de.1609079197.git.lukas@wunner.de
State Superseded
Headers show
Series efi/apple-properties: Reinstate support for boolean properties | expand

Commit Message

Lukas Wunner Dec. 27, 2020, 2:30 p.m. UTC
Since commit 4466bf82821b ("efi/apple-properties: use
PROPERTY_ENTRY_U8_ARRAY_LEN"), my MacBook Pro issues a -ENODATA error
when trying to assign EFI properties to the discrete GPU:

pci 0000:01:00.0: assigning 56 device properties
pci 0000:01:00.0: error -61 assigning properties

That's because some of the properties have no value.  They're booleans
whose presence can be checked by drivers, e.g. "use-backlight-blanking".

Commit 6e98503dba64 ("efi/apple-properties: Remove redundant attribute
initialization from unmarshal_key_value_pairs()") used a trick to store
such booleans as u8 arrays (which is the data type used for all other
EFI properties on Macs):  It cleared the property_entry's "is_array"
flag, thereby denoting that the value is stored inline in the
property_entry.

Commit 4466bf82821b erroneously removed that trick.  It was probably a
little fragile to begin with.

Reinstate support for boolean properties by explicitly using the
PROPERTY_ENTRY_BOOL() initializer for properties with zero-length value.

Fixes: 4466bf82821b ("efi/apple-properties: use PROPERTY_ENTRY_U8_ARRAY_LEN")
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Cc: stable@vger.kernel.org # v5.5+
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/firmware/efi/apple-properties.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

Comments

Andy Shevchenko Dec. 28, 2020, 2:53 p.m. UTC | #1
On Sun, Dec 27, 2020 at 03:30:32PM +0100, Lukas Wunner wrote:
> Since commit 4466bf82821b ("efi/apple-properties: use

> PROPERTY_ENTRY_U8_ARRAY_LEN"), my MacBook Pro issues a -ENODATA error

> when trying to assign EFI properties to the discrete GPU:

> 

> pci 0000:01:00.0: assigning 56 device properties

> pci 0000:01:00.0: error -61 assigning properties

> 

> That's because some of the properties have no value.  They're booleans

> whose presence can be checked by drivers, e.g. "use-backlight-blanking".

> 

> Commit 6e98503dba64 ("efi/apple-properties: Remove redundant attribute

> initialization from unmarshal_key_value_pairs()") used a trick to store

> such booleans as u8 arrays (which is the data type used for all other

> EFI properties on Macs):  It cleared the property_entry's "is_array"

> flag, thereby denoting that the value is stored inline in the

> property_entry.

> 

> Commit 4466bf82821b erroneously removed that trick.  It was probably a

> little fragile to begin with.


Thanks for spotting this!
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

One nitpick below, though.

> Reinstate support for boolean properties by explicitly using the

> PROPERTY_ENTRY_BOOL() initializer for properties with zero-length value.

> 

> Fixes: 4466bf82821b ("efi/apple-properties: use PROPERTY_ENTRY_U8_ARRAY_LEN")

> Signed-off-by: Lukas Wunner <lukas@wunner.de>

> Cc: stable@vger.kernel.org # v5.5+

> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>

> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> ---

>  drivers/firmware/efi/apple-properties.c | 12 ++++++++----

>  1 file changed, 8 insertions(+), 4 deletions(-)

> 

> diff --git a/drivers/firmware/efi/apple-properties.c b/drivers/firmware/efi/apple-properties.c

> index 34f53d898acb..0f37877db641 100644

> --- a/drivers/firmware/efi/apple-properties.c

> +++ b/drivers/firmware/efi/apple-properties.c

> @@ -3,8 +3,9 @@

>   * apple-properties.c - EFI device properties on Macs

>   * Copyright (C) 2016 Lukas Wunner <lukas@wunner.de>

>   *

> - * Note, all properties are considered as u8 arrays.

> - * To get a value of any of them the caller must use device_property_read_u8_array().

> + * Properties are stored either as:

> + * booleans which can be queried with device_property_present() or

> + * u8 arrays which can be retrieved with device_property_read_u8_array().

>   */

>  

>  #define pr_fmt(fmt) "apple-properties: " fmt

> @@ -88,8 +89,11 @@ static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,

>  

>  		entry_data = ptr + key_len + sizeof(val_len);

>  		entry_len = val_len - sizeof(val_len);

> -		entry[i] = PROPERTY_ENTRY_U8_ARRAY_LEN(key, entry_data,

> -						       entry_len);

> +		if (!entry_len)

> +			entry[i] = PROPERTY_ENTRY_BOOL(key);

> +		else

> +			entry[i] = PROPERTY_ENTRY_U8_ARRAY_LEN(key, entry_data,

> +							       entry_len);


Can we use positive conditional, i.e.

		if (entry_len)
			entry[i] = PROPERTY_ENTRY_U8_ARRAY_LEN(key, entry_data,
							       entry_len);
		else
			entry[i] = PROPERTY_ENTRY_BOOL(key);
?

>  		if (dump_properties) {

>  			dev_info(dev, "property: %s\n", key);

>  			print_hex_dump(KERN_INFO, pr_fmt(), DUMP_PREFIX_OFFSET,

> -- 

> 2.29.2

> 


-- 
With Best Regards,
Andy Shevchenko
diff mbox series

Patch

diff --git a/drivers/firmware/efi/apple-properties.c b/drivers/firmware/efi/apple-properties.c
index 34f53d898acb..0f37877db641 100644
--- a/drivers/firmware/efi/apple-properties.c
+++ b/drivers/firmware/efi/apple-properties.c
@@ -3,8 +3,9 @@ 
  * apple-properties.c - EFI device properties on Macs
  * Copyright (C) 2016 Lukas Wunner <lukas@wunner.de>
  *
- * Note, all properties are considered as u8 arrays.
- * To get a value of any of them the caller must use device_property_read_u8_array().
+ * Properties are stored either as:
+ * booleans which can be queried with device_property_present() or
+ * u8 arrays which can be retrieved with device_property_read_u8_array().
  */
 
 #define pr_fmt(fmt) "apple-properties: " fmt
@@ -88,8 +89,11 @@  static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
 
 		entry_data = ptr + key_len + sizeof(val_len);
 		entry_len = val_len - sizeof(val_len);
-		entry[i] = PROPERTY_ENTRY_U8_ARRAY_LEN(key, entry_data,
-						       entry_len);
+		if (!entry_len)
+			entry[i] = PROPERTY_ENTRY_BOOL(key);
+		else
+			entry[i] = PROPERTY_ENTRY_U8_ARRAY_LEN(key, entry_data,
+							       entry_len);
 		if (dump_properties) {
 			dev_info(dev, "property: %s\n", key);
 			print_hex_dump(KERN_INFO, pr_fmt(), DUMP_PREFIX_OFFSET,