[PATCH 3/4] i3c: mipi-i3c-hci: Use physical device pointer with DMA API
Jarkko Nikula
jarkko.nikula at linux.intel.com
Mon Aug 4 07:34:39 PDT 2025
On 8/1/25 7:03 PM, Frank Li wrote:
> On Thu, Jul 31, 2025 at 05:14:19PM +0300, Jarkko Nikula wrote:
>> @@ -194,11 +196,23 @@ static int hci_dma_init(struct i3c_hci *hci)
>> {
>> struct hci_rings_data *rings;
>> struct hci_rh_data *rh;
>> + struct device *sysdev;
>> u32 regval;
>> unsigned int i, nr_rings, xfers_sz, resps_sz;
>> unsigned int ibi_status_ring_sz, ibi_data_ring_sz;
>> int ret;
>>
>> + /*
>> + * Set pointer to a physical device that does DMA and has IOMMU setup
>> + * done for it in case of enabled IOMMU and use it with the DMA API.
>> + * Here such device is either
>> + * "mipi-i3c-hci" platform device (OF/ACPI enumeration) parent or
>> + * grandparent (PCI enumeration).
>> + */
>> + sysdev = hci->master.dev.parent;
>> + if (sysdev->parent && dev_is_pci(sysdev->parent))
>> + sysdev = sysdev->parent;
>> +
>
> I am not clear about how i3c master controller device create in your
> platform. If use DT, i3c master controller should direct refer to a iommu
>
> i3c-master at 123456 {
> ...
> iommu = <&smmu id>;
> }
>
> Is it children device of a PCIe devices?
>
The master.dev is a "virtual" device object created by
i3c_master_register() and for that there is no IOMMU link obviously.
Only this IOMMU exercise revealed we were wrongly using the master.dev
with DMA API.
For the OF/ACPI enumeration the physical device is in pdev->dev in
drivers/i3c/master/mipi-i3c-hci/core.c: i3c_hci_probe() and that is
passed to the i3c_master_register() and can be references via
hci->master.dev.parent here.
PCI code needs it's own module mipi-i3c-hci-pci.c due to each module can
have only one module_driver(), i.e. module_platform_driver() and
module_pci_driver() cannot reside in the same module.
mipi_i3c_hci_pci_probe() creates a "mipi-i3c-hci" platform device and
sets physical device pointer pci->dev as its parent. So in PCI case the
i3c_hci_probe() don't have the physical device pointer in its pdev->dev
like OF/ACPI cases have but as a parent of it.
Not very clear but that's how drivers with multiple enumeration need to
cope with.
More information about the linux-i3c
mailing list