Skip to content

Commit

Permalink
i3c: mipi-i3c-hci: Add a quirk to set PIO mode
Browse files Browse the repository at this point in the history
The AMD HCI controller currently only supports PIO mode but exposes DMA
rings to the OS, which leads to the controller being configured in DMA
mode. To address this, add a quirk to avoid configuring the controller in
DMA mode and default to PIO mode.

Additionally, introduce a generic quirk infrastructure to the mipi-i3c-hci
driver to facilitate seamless future quirk additions.

Reviewed-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Co-developed-by: Krishnamoorthi M <krishnamoorthi.m@amd.com>
Signed-off-by: Krishnamoorthi M <krishnamoorthi.m@amd.com>
Co-developed-by: Guruvendra Punugupati <Guruvendra.Punugupati@amd.com>
Signed-off-by: Guruvendra Punugupati <Guruvendra.Punugupati@amd.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Link: https://lore.kernel.org/r/20240829091713.736217-4-Shyam-sundar.S-k@amd.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
  • Loading branch information
Shyam Sundar S K authored and Alexandre Belloni committed Sep 5, 2024
1 parent 039b236 commit 0140893
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
8 changes: 7 additions & 1 deletion drivers/i3c/master/mipi-i3c-hci/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,10 @@ static int i3c_hci_init(struct i3c_hci *hci)
mode_selector = hci->version_major > 1 ||
(hci->version_major == 1 && hci->version_minor > 0);

/* Quirk for HCI_QUIRK_PIO_MODE on AMD platforms */
if (hci->quirks & HCI_QUIRK_PIO_MODE)
hci->RHS_regs = NULL;

/* Try activating DMA operations first */
if (hci->RHS_regs) {
reg_clear(HC_CONTROL, HC_CONTROL_PIO_MODE);
Expand Down Expand Up @@ -806,6 +810,8 @@ static int i3c_hci_probe(struct platform_device *pdev)
/* temporary for dev_printk's, to be replaced in i3c_master_register */
hci->master.dev.init_name = dev_name(&pdev->dev);

hci->quirks = (unsigned long)device_get_match_data(&pdev->dev);

ret = i3c_hci_init(hci);
if (ret)
return ret;
Expand Down Expand Up @@ -838,7 +844,7 @@ static const __maybe_unused struct of_device_id i3c_hci_of_match[] = {
MODULE_DEVICE_TABLE(of, i3c_hci_of_match);

static const struct acpi_device_id i3c_hci_acpi_match[] = {
{ "AMDI5017" },
{ "AMDI5017", HCI_QUIRK_PIO_MODE },
{}
};
MODULE_DEVICE_TABLE(acpi, i3c_hci_acpi_match);
Expand Down
1 change: 1 addition & 0 deletions drivers/i3c/master/mipi-i3c-hci/hci.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ struct i3c_hci_dev_data {

/* list of quirks */
#define HCI_QUIRK_RAW_CCC BIT(1) /* CCC framing must be explicit */
#define HCI_QUIRK_PIO_MODE BIT(2) /* Set PIO mode for AMD platforms */


/* global functions */
Expand Down

0 comments on commit 0140893

Please sign in to comment.