Re: [alsa-devel] [PATCH] ACPI / device_sysfs: change _ADR representation to 64 bits

From: Pierre-Louis Bossart
Date: Tue Apr 30 2019 - 14:23:51 EST




On 4/16/19 3:09 AM, Rafael J. Wysocki wrote:
On Tue, Apr 16, 2019 at 5:29 AM Vinod Koul <vkoul@xxxxxxxxxx> wrote:

On 15-04-19, 10:18, Pierre-Louis Bossart wrote:
Standards such as the MIPI DisCo for SoundWire 1.0 specification
assume the _ADR field is 64 bits.

_ADR is defined as an "Integer" represented as 64 bits since ACPI 2.0
released in 2002. The low levels already use _ADR as 64 bits, e.g. in
struct acpi_device_info.

This patch bumps the representation used for sysfs to 64 bits.

Example with a SoundWire device, the results show the complete
vendorID and linkID which were omitted before:

Before:
$ more /sys/bus/acpi/devices/device\:38/adr
0x5d070000
After:
$ more /sys/bus/acpi/devices/device\:38/adr
0x000010025d070000

This looks fine but the sysfs file is an ABI. Not sure if we can modify
the value returned this way.. Though it should not cause userspace
reading 32bits to break...

Well, IIRC using "08" instead of "016" in the format field would
preserve the existing behavior for 32-bit values, wouldn't it?

yes, but it makes the 64-bit address not aligned depending on the number of leading zeroes, see below. I get a migraine just looking at the results.

Maybe add a test to use 08 for values that are below 0xFFFFFFFF and 16 for addresses who really need the full range, typically because of an encoding?

w/ value-dependent format:
/sys/bus/acpi/devices# cat */*/adr

0x00160000
0x00140003
0x000d0000
0x000d0002
0x000d0003
0x00070000
0x00070001
0x00070002
0x00070003
0x000010025d070100
0x000110025d070100
0x000210025d070100
0x000310025d070100
0x000010025d070000
0x000110025d070000
0x000210025d070000
0x000310025d070000
0x00000000

w/ 0x08 only:

0x00160000
0x00140003
0x000d0000
0x000d0002
0x000d0003
0x00070000
0x00070001
0x00070002
0x00070003
0x10025d070100
0x110025d070100
0x210025d070100
0x310025d070100
0x10025d070000
0x110025d070000
0x210025d070000
0x310025d070000
0x00000000
0x00000000