Re: [PATCH v7 05/12] i3c: master: Add support for devices without PID

Akhil R <[email protected]> Thu, 30 Jul 2026 08:57:55 +0000
Newsgroups org.infradead.lists.linux-i3c,dev.linux.lists.sashiko-reviews,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-hwmon
Message-ID <[email protected]>
On Tue, 28 Jul 2026 07:20:40 +0000, Sashiko AI review <[email protected]> wrote:
> commit 978db33da88aedc2a14abd69fdc128b5e3961e92
> Author: Akhil R <[email protected]>
>
> i3c: master: Add support for devices without PID
>
> Devices using SETAASA for address assignment are not required to have
> a 48-bit PID according to the I3C specification. Allow such devices to
> register and use the static address where PID was required.
>
> > diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> > index 87749a739e62d..488177d95e484 100644
> > --- a/drivers/i3c/master.c
> > +++ b/drivers/i3c/master.c
>
> [ ... ]
>
> [Severity: High]
> This is a pre-existing issue, but does device_register() failure in this
> function leave a dangling pointer that causes a use-after-free later?
>
> When put_device() frees desc->dev->dev, desc->dev is not set to NULL.
> Later, if the master is unregistered, i3c_master_unregister_i3c_devs()
> iterates through the list and dereferences this dangling pointer.
>
> Could desc->dev be set to NULL after put_device() to prevent this?
> [ ... ]
>
> > @@ -2401,8 +2410,18 @@ static void i3c_master_attach_boardinfo(struct i3c_dev_desc *i3cdev)
> >  	list_for_each_entry(i3cboardinfo, &master->boardinfo.i3c, node) {
> > -		if (i3cdev->info.pid != i3cboardinfo->pid)
> > -			continue;
> > +		if (i3cboardinfo->pid) {
> > +			if (i3cdev->info.pid != i3cboardinfo->pid)
> > +				continue;
> > +		} else {
> > +			if (!i3cboardinfo->static_addr ||
> > +			    i3cdev->info.static_addr != i3cboardinfo->static_addr)
> > +				continue;
> > +		}
>
> [Severity: High]
> Will this fallback matching logic fail for SETAASA devices discovered
> dynamically?
>
> If a SETAASA device without a PID in the Device Tree loses its dynamic
> address and asserts a Hot-Join, the master will execute Dynamic Address
> Assignment (DAA).
>
> During DAA, __i3c_master_add_i3c_dev_locked() allocates a new device
> descriptor and initializes newdev's static_addr to 0, because the static
> address cannot be retrieved via CCCs.
>
> When i3c_master_attach_boardinfo(newdev) is then called,
> i3cdev->info.static_addr will be 0. Would this cause the condition
> i3cdev->info.static_addr != i3cboardinfo->static_addr to always evaluate
> to true, skipping the boardinfo assignment and preventing the driver from
> binding?

A device without a PID cannot be discovered through DAA, so this should not
happen. Per the MIPI I3C specification, a Target that supports ENTDAA shall
have a 48-bit Provisioned ID (Section 5.1.4.1.1), which it transmits during
the procedure, and Hot-Join is only compatible with ENTDAA - "Targets that
do not support ENTDAA shall not use Hot-Join" (Section 5.1.5). A device
that supports both SETAASA and ENTDAA does have a PID and is expected
to describe it in DT/ACPI, in which case the PID match applies.

> >  		i3cdev->boardinfo = i3cboardinfo;
> >  		i3cdev->info.static_addr = i3cboardinfo->static_addr;
> > @@ -2416,8 +2435,12 @@ i3c_master_search_i3c_dev_duplicate(struct i3c_dev_desc *refdev)
> > +	if (!refdev->info.pid)
> > +		return NULL;
> > +
> >  	i3c_bus_for_each_i3cdev(&master->bus, i3cdev) {
> > -		if (i3cdev != refdev && i3cdev->info.pid == refdev->info.pid)
> > +		if (i3cdev != refdev && i3cdev->info.pid &&
> > +		    i3cdev->info.pid == refdev->info.pid)
> >  			return i3cdev;
> >  	}
>
> [Severity: High]
> Does this logic lead to duplicate device creation for SETAASA devices that
> participate in Dynamic Address Assignment?
>
> If a SETAASA device is defined in the DT without a PID, it is initially
> added to the master's bus list with pid = 0. If the device later asserts a
> Hot-Join, the master executes DAA, discovers the device, and retrieves its
> true physical PID.
>
> Since the existing device has pid = 0, the check here for i3cdev->info.pid
> and i3cdev->info.pid == refdev->info.pid will fail to match the newly
> discovered PID to the existing device. Will this cause the master to add
> the newly discovered device instead of detaching and updating the existing
> one, resulting in duplicate devices on the bus?

This also needs a device without a PID to take part in ENTDAA, which the
specification does not allow, as above. A device that already has a Dynamic
Address assigned through SETAASA does not participate in ENTDAA either
(Section 5.1.4.2).

The !pid checks are intentional in this patch. Devices without a PID have
pid == 0 and would otherwise match each other, and one of them would be
freed as a duplicate. Devices that do have a PID are matched as before.

Best Regards,
Akhil

-- 
linux-i3c mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-i3c