Re: [PATCH 2/3] soundwire: qcom: add auto enumeration support

From: Pierre-Louis Bossart
Date: Wed Mar 03 2021 - 19:11:22 EST




On 3/3/21 3:38 AM, Srinivas Kandagatla wrote:


On 02/03/2021 14:34, Pierre-Louis Bossart wrote:


+        if (!val1 && !val2)
+            break;
+
+        addr = buf2[1] | (buf2[0] << 8) | (buf1[3] << 16) |
+            ((u64)buf1[2] << 24) | ((u64)buf1[1] << 32) |
+            ((u64)buf1[0] << 40);
+
+        sdw_extract_slave_id(bus, addr, &id);
+        /* Now compare with entries */
+        list_for_each_entry_safe(slave, _s, &bus->slaves, node) {
+            if (sdw_compare_devid(slave, id) == 0) {
+                u32 status = qcom_swrm_get_n_device_status(ctrl, i);
+                if (status == SDW_SLAVE_ATTACHED) {
+                    slave->dev_num = i;
+                    mutex_lock(&bus->bus_lock);
+                    set_bit(i, bus->assigned);
+                    mutex_unlock(&bus->bus_lock);
+
+                }

And that part is strange as well. The bus->assigned bit should be set even if the Slave is not in the list provided by platform firmware. It's really tracking the state of the hardware, and it should not be influenced by what software knows to manage.

Am not 100% sure If I understand the concern here, but In normal (non auto enum) cases this bit is set by the bus code while its doing enumeration to assign a dev number from the assigned bitmap!

However in this case where auto enumeration happens it makes sense to set this here with matching dev number!

AFAIU from code, each bit in this bitmap corresponds to slave dev number!

Yes, but the point was "why do you compare with information coming from platform firmware"? if the hardware reports the presence of devices on

This is the logic that hardware IP document suggests to use to get get the correct the device number associated with the slave!


the link, why not use the information as is?

You recently added code that helps us deal with devices that are not listed in DT or ACPI tables, so why would we filter in this specific loop?

I don't think my point was understood, so let me try to explain it differently.

it's my understanding that the hardware reads the DevID registers and writes a Device Number - so that the entire enumeration sequence started by reading DevID0 and finished by a successful write to SCP_DevNum is handled in hardware.

The question is: what happens if that device is NOT described in the Device Tree data? The loop over bus->slaves will not find this device by comparing with known devID values, so the set_bit(i, bus->assigned) will not happen.