From: Adrian Hunter <adrian.hunter@intel.com>
To: alexandre.belloni@bootlin.com
Cc: Frank.Li@nxp.com, linux-i3c@lists.infradead.org
Subject: [PATCH V3 10/11] i3c: mipi-i3c-hci-pci: Add support for Multi-Bus Instances
Date: Tue, 16 Dec 2025 18:56:41 +0200 [thread overview]
Message-ID: <20251216165642.164583-11-adrian.hunter@intel.com> (raw)
In-Reply-To: <20251216165642.164583-1-adrian.hunter@intel.com>
Add support for MIPI I3C Host Controllers with the Multi-Bus Instance
capability. These controllers can host multiple I3C buses (up to 15)
within a single hardware function (e.g., PCIe B/D/F), providing one
indepedent HCI register set and corresponding I3C bus controller logic
per bus.
Create an MFD cell for each instance and use platform_data to pass the
starting address of the instance's register set.
The MIPI I3C HCI specification defines an Extended Capability that holds
the offset of each instance register set. Parsing this information is
relatively complex, so include the offsets in driver data for now.
Driver data for additional instances beyond instance 0 will be added in a
subsequent patch.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
Changes in V3:
Make hci a parameter of mipi_i3c_hci_pci_alloc()
Adjust for doing away with dynamic devid allocation
Enhance commit message
Changes in V2:
Conversion to MFD split into separate patch
Simplify ID allocation / free
Correct use of __free()
Also define instance 0 in driver_data
.../master/mipi-i3c-hci/mipi-i3c-hci-pci.c | 36 +++++++++++++------
1 file changed, 26 insertions(+), 10 deletions(-)
diff --git a/drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c b/drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c
index 7ef17255c312..782f46989423 100644
--- a/drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c
+++ b/drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c
@@ -19,6 +19,12 @@
#include <linux/platform_device.h>
#include <linux/pm_qos.h>
+/*
+ * There can up to 15 instances, but implementations have at most 2 at this
+ * time.
+ */
+#define INST_MAX 2
+
struct mipi_i3c_hci_pci {
struct pci_dev *pci;
void __iomem *base;
@@ -30,7 +36,9 @@ struct mipi_i3c_hci_pci_info {
int (*init)(struct mipi_i3c_hci_pci *hci);
void (*exit)(struct mipi_i3c_hci_pci *hci);
const char *name;
- int id;
+ int id[INST_MAX];
+ u32 instance_offset[INST_MAX];
+ int instance_count;
};
#define INTEL_PRIV_OFFSET 0x2b0
@@ -177,14 +185,18 @@ static const struct mipi_i3c_hci_pci_info intel_1_info = {
.init = intel_i3c_init,
.exit = intel_i3c_exit,
.name = "intel-lpss-i3c",
- .id = 0,
+ .id = {0},
+ .instance_offset = {0},
+ .instance_count = 1,
};
static const struct mipi_i3c_hci_pci_info intel_2_info = {
.init = intel_i3c_init,
.exit = intel_i3c_exit,
.name = "intel-lpss-i3c",
- .id = 2,
+ .id = {2},
+ .instance_offset = {0},
+ .instance_count = 1,
};
struct mipi_i3c_hci_pci_cell_data {
@@ -192,34 +204,38 @@ struct mipi_i3c_hci_pci_cell_data {
struct resource res;
};
-static void mipi_i3c_hci_pci_setup_cell(struct mipi_i3c_hci_pci *hci,
+static void mipi_i3c_hci_pci_setup_cell(struct mipi_i3c_hci_pci *hci, int idx,
struct mipi_i3c_hci_pci_cell_data *data,
struct mfd_cell *cell)
{
- data->pdata.base_regs = hci->base;
+ data->pdata.base_regs = hci->base + hci->info->instance_offset[idx];
data->res = DEFINE_RES_IRQ(0);
cell->name = hci->info->name;
- cell->id = hci->info->id;
+ cell->id = hci->info->id[idx];
cell->platform_data = &data->pdata;
cell->pdata_size = sizeof(data->pdata);
cell->num_resources = 1;
cell->resources = &data->res;
}
+#define mipi_i3c_hci_pci_alloc(h, x) kcalloc((h)->info->instance_count, sizeof(*(x)), GFP_KERNEL)
+
static int mipi_i3c_hci_pci_add_instances(struct mipi_i3c_hci_pci *hci)
{
- struct mipi_i3c_hci_pci_cell_data *data __free(kfree) = kzalloc(sizeof(*data), GFP_KERNEL);
- struct mfd_cell *cells __free(kfree) = kzalloc(sizeof(*cells), GFP_KERNEL);
+ struct mipi_i3c_hci_pci_cell_data *data __free(kfree) = mipi_i3c_hci_pci_alloc(hci, data);
+ struct mfd_cell *cells __free(kfree) = mipi_i3c_hci_pci_alloc(hci, cells);
int irq = pci_irq_vector(hci->pci, 0);
+ int nr = hci->info->instance_count;
if (!cells || !data)
return -ENOMEM;
- mipi_i3c_hci_pci_setup_cell(hci, data, cells);
+ for (int i = 0; i < nr; i++)
+ mipi_i3c_hci_pci_setup_cell(hci, i, data + i, cells + i);
- return mfd_add_devices(&hci->pci->dev, 0, cells, 1, NULL, irq, NULL);
+ return mfd_add_devices(&hci->pci->dev, 0, cells, nr, NULL, irq, NULL);
}
static int mipi_i3c_hci_pci_probe(struct pci_dev *pci,
--
2.51.0
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
next prev parent reply other threads:[~2025-12-16 16:57 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-16 16:56 [PATCH V3 00/11] i3c: mipi-i3c-hci-pci: Define Multi-Bus Instances for Intel controllers Adrian Hunter
2025-12-16 16:56 ` [PATCH V3 01/11] i3c: mipi-i3c-hci: Remove duplicate blank lines Adrian Hunter
2025-12-16 16:56 ` [PATCH V3 02/11] i3c: mipi-i3c-hci: Stop reading Extended Capabilities if capability ID is 0 Adrian Hunter
2025-12-16 16:56 ` [PATCH V3 03/11] i3c: mipi-i3c-hci: Quieten initialization messages Adrian Hunter
2025-12-16 16:56 ` [PATCH V3 04/11] i3c: mipi-i3c-hci-pci: Do not repeatedly check for NULL driver_data Adrian Hunter
2025-12-16 16:56 ` [PATCH V3 05/11] i3c: mipi-i3c-hci-pci: Enable MSI support Adrian Hunter
2025-12-16 17:03 ` Frank Li
2025-12-16 16:56 ` [PATCH V3 06/11] i3c: mipi-i3c-hci-pci: Assign unique device names and IDs for Intel LPSS I3C Adrian Hunter
2025-12-16 17:08 ` Frank Li
2025-12-16 17:14 ` Adrian Hunter
2025-12-16 18:56 ` Adrian Hunter
2025-12-17 19:24 ` Frank Li
2025-12-16 16:56 ` [PATCH V3 07/11] i3c: mipi-i3c-hci: Allow for Multi-Bus Instances Adrian Hunter
2025-12-16 17:10 ` Frank Li
2025-12-16 16:56 ` [PATCH V3 08/11] i3c: mipi-i3c-hci-pci: Pass base regs as platform data to i3c core device Adrian Hunter
2025-12-16 17:12 ` Frank Li
2025-12-16 16:56 ` [PATCH V3 09/11] i3c: mipi-i3c-hci-pci: Convert to MFD driver Adrian Hunter
2025-12-16 16:56 ` Adrian Hunter [this message]
2025-12-16 17:16 ` [PATCH V3 10/11] i3c: mipi-i3c-hci-pci: Add support for Multi-Bus Instances Frank Li
2025-12-16 16:56 ` [PATCH V3 11/11] i3c: mipi-i3c-hci-pci: Define Multi-Bus instances for supported controllers Adrian Hunter
2025-12-16 17:18 ` Frank Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251216165642.164583-11-adrian.hunter@intel.com \
--to=adrian.hunter@intel.com \
--cc=Frank.Li@nxp.com \
--cc=alexandre.belloni@bootlin.com \
--cc=linux-i3c@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox