From: Bjorn Helgaas <helgaas@kernel.org>
To: Thippeswamy Havalige <thippeswamy.havalige@amd.com>
Cc: bhelgaas@google.com, lpieralisi@kernel.org, kw@linux.com,
manivannan.sadhasivam@linaro.org, robh@kernel.org,
krzk+dt@kernel.org, conor+dt@kernel.org,
linux-pci@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, jingoohan1@gmail.com,
michal.simek@amd.com, bharat.kumar.gogada@amd.com
Subject: Re: [PATCH v8 3/3] PCI: amd-mdb: Add AMD MDB Root Port driver
Date: Mon, 3 Feb 2025 12:28:22 -0600 [thread overview]
Message-ID: <20250203182822.GA793389@bhelgaas> (raw)
In-Reply-To: <20250129113029.64841-4-thippeswamy.havalige@amd.com>
On Wed, Jan 29, 2025 at 05:00:29PM +0530, Thippeswamy Havalige wrote:
> Add support for AMD MDB (Multimedia DMA Bridge) IP core as Root Port.
> +#define AMD_MDB_TLP_IR_STATUS_MISC 0x4C0
> +#define AMD_MDB_TLP_IR_MASK_MISC 0x4C4
> +#define AMD_MDB_TLP_IR_ENABLE_MISC 0x4C8
> +
> +#define AMD_MDB_PCIE_IDRN_SHIFT 16
Remove this _SHIFT #define and use something like this instead:
#define AMD_MDB_PCIE_INTX_BIT(x) FIELD_PREP(AMD_MDB_TLP_PCIE_INTX_MASK, BIT(x))
I don't know what exactly the right name for that is; it looks like
maybe these bits apply to all the above registers
(AMD_MDB_TLP_IR_STATUS_MISC, AMD_MDB_TLP_IR_MASK_MISC,
AMD_MDB_TLP_IR_ENABLE_MISC)
> +#define AMD_MDB_PCIE_INTR_INTA_ASSERT 16
> +#define AMD_MDB_PCIE_INTR_INTB_ASSERT 18
> +#define AMD_MDB_PCIE_INTR_INTC_ASSERT 20
> +#define AMD_MDB_PCIE_INTR_INTD_ASSERT 22
It's kind of weird that these skip the odd-numbered bits, since
dw_pcie_rp_intx_flow(), amd_mdb_mask_intx_irq(),
amd_mdb_unmask_intx_irq() only use bits 19:16. Something seems wrong
and needs either a fix or a comment about why this is the way it is.
> +#define IMR(x) BIT(AMD_MDB_PCIE_INTR_ ##x)
> +#define AMD_MDB_PCIE_IMR_ALL_MASK \
> + ( \
> + IMR(CMPL_TIMEOUT) | \
> + IMR(INTA_ASSERT) | \
> + IMR(INTB_ASSERT) | \
> + IMR(INTC_ASSERT) | \
> + IMR(INTD_ASSERT) | \
> + IMR(PM_PME_RCVD) | \
> + IMR(PME_TO_ACK_RCVD) | \
> + IMR(MISC_CORRECTABLE) | \
> + IMR(NONFATAL) | \
> + IMR(FATAL) \
> + )
> +
> +#define AMD_MDB_TLP_PCIE_INTX_MASK GENMASK(23, 16)
I would drop AMD_MDB_PCIE_INTR_INTA_ASSERT, etc, and just use
AMD_MDB_TLP_PCIE_INTX_MASK in the AMD_MDB_PCIE_IMR_ALL_MASK
definition.
If there are really eight bits of INTx-related things here for the
four INTx interrupts, I think you should make two #defines to separate
them out.
> +static void amd_mdb_mask_intx_irq(struct irq_data *data)
> +{
> + struct amd_mdb_pcie *pcie = irq_data_get_irq_chip_data(data);
> + struct dw_pcie *pci = &pcie->pci;
> + struct dw_pcie_rp *port = &pci->pp;
> + unsigned long flags;
> + u32 mask, val;
> +
> + mask = BIT(data->hwirq + AMD_MDB_PCIE_IDRN_SHIFT);
> +
> + raw_spin_lock_irqsave(&port->lock, flags);
> + val = pcie_read(pcie, AMD_MDB_TLP_IR_MASK_MISC);
val &= ~AMD_MDB_PCIE_INTX_BIT(data->hwirq);
pcie_write(pcie, val, AMD_MDB_TLP_IR_ENABLE_MISC);
> + pcie_write(pcie, (val & (~mask)), AMD_MDB_TLP_IR_ENABLE_MISC);
> + raw_spin_unlock_irqrestore(&port->lock, flags);
> +}
> +
> +static void amd_mdb_unmask_intx_irq(struct irq_data *data)
> +{
> + struct amd_mdb_pcie *pcie = irq_data_get_irq_chip_data(data);
> + struct dw_pcie *pci = &pcie->pci;
> + struct dw_pcie_rp *port = &pci->pp;
> + unsigned long flags;
> + u32 mask;
> + u32 val;
> +
> + mask = BIT(data->hwirq + AMD_MDB_PCIE_IDRN_SHIFT);
> +
> + raw_spin_lock_irqsave(&port->lock, flags);
> + val = pcie_read(pcie, AMD_MDB_TLP_IR_MASK_MISC);
val |= AMD_MDB_PCIE_INTX_BIT(data->hwirq);
> + pcie_write(pcie, (val | mask), AMD_MDB_TLP_IR_ENABLE_MISC);
> + raw_spin_unlock_irqrestore(&port->lock, flags);
> +}
> +
> +static struct irq_chip amd_mdb_intx_irq_chip = {
> + .name = "AMD MDB INTx",
> + .irq_mask = amd_mdb_mask_intx_irq,
> + .irq_unmask = amd_mdb_unmask_intx_irq,
Prefer
.irq_mask = amd_mdb_intx_irq_mask,
.irq_unmask = amd_mdb_intx_irq_unmask,
so the function names match the grep pattern of the function pointers
(".*_irq_mask").
> +static struct irq_chip amd_mdb_event_irq_chip = {
> + .name = "AMD MDB RC-Event",
> + .irq_mask = amd_mdb_mask_event_irq,
> + .irq_unmask = amd_mdb_unmask_event_irq,
Same function name comment.
> +static irqreturn_t dw_pcie_rp_intx_flow(int irq, void *args)
> +{
> + struct amd_mdb_pcie *pcie = args;
> + unsigned long val;
> + int i;
> +
> + val = FIELD_GET(AMD_MDB_TLP_PCIE_INTX_MASK,
> + pcie_read(pcie, AMD_MDB_TLP_IR_STATUS_MISC));
> +
> + for_each_set_bit(i, &val, 4)
for_each_set_bit(..., PCI_NUM_INTX)
> + generic_handle_domain_irq(pcie->intx_domain, i);
> +
> + return IRQ_HANDLED;
> +}
> +
> +static irqreturn_t amd_mdb_pcie_intr_handler(int irq, void *args)
> +{
> + struct amd_mdb_pcie *pcie = args;
> + struct device *dev;
> + struct irq_data *d;
> +
> + dev = pcie->pci.dev;
> +
> + d = irq_domain_get_irq_data(pcie->mdb_domain, irq);
> + if (intr_cause[d->hwirq].str)
> + dev_warn(dev, "%s\n", intr_cause[d->hwirq].str);
> + else
> + dev_warn_once(dev, "Unknown IRQ %ld\n", d->hwirq);
What's the point of an interrupt handler that only logs it?
> + return IRQ_HANDLED;
> +}
> +static int amd_mdb_add_pcie_port(struct amd_mdb_pcie *pcie,
> + struct platform_device *pdev)
> +{
> + struct dw_pcie *pci = &pcie->pci;
> + struct dw_pcie_rp *pp = &pci->pp;
> + struct device *dev = &pdev->dev;
> + int ret;
> +
> + pcie->slcr = devm_platform_ioremap_resource_byname(pdev, "slcr");
> + if (IS_ERR(pcie->slcr))
> + return PTR_ERR(pcie->slcr);
> +
> + ret = amd_mdb_pcie_init_irq_domains(pcie, pdev);
> + if (ret)
> + return ret;
> +
> + amd_mdb_pcie_init_port(pcie);
amd_mdb_pcie_init_port() doesn't initialize anything other than
disabling/clearing/enabling interrupts. Seems like it could be
squashed into amd_mdb_setup_irq() or called from there so it's
obvious that it's interrupt-related.
> + ret = amd_mdb_setup_irq(pcie, pdev);
> + if (ret) {
> + dev_err(dev, "Failed to set up interrupts\n");
> + goto out;
> + }
> +
> + pp->ops = &amd_mdb_pcie_host_ops;
> +
> + ret = dw_pcie_host_init(pp);
> + if (ret) {
> + dev_err(dev, "Failed to initialize host\n");
> + goto out;
> + }
> +
> + return 0;
> +
> +out:
> + amd_mdb_pcie_free_irq_domains(pcie);
> + return ret;
> +}
next prev parent reply other threads:[~2025-02-03 18:28 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-29 11:30 [PATCH v8 0/3] Add support for AMD MDB IP as Root Port Thippeswamy Havalige
2025-01-29 11:30 ` [PATCH v8 1/3] dt-bindings: PCI: dwc: Add AMD Versal2 mdb slcr support Thippeswamy Havalige
2025-01-29 11:30 ` [PATCH v8 2/3] dt-bindings: PCI: amd-mdb: Add AMD Versal2 MDB PCIe Root Port Bridge Thippeswamy Havalige
2025-01-29 11:30 ` [PATCH v8 3/3] PCI: amd-mdb: Add AMD MDB Root Port driver Thippeswamy Havalige
2025-02-03 6:23 ` Havalige, Thippeswamy
2025-02-03 17:41 ` Manivannan Sadhasivam
2025-02-03 18:28 ` Bjorn Helgaas [this message]
2025-02-04 9:37 ` Havalige, Thippeswamy
2025-02-04 22:11 ` Bjorn Helgaas
2025-02-05 11:37 ` Havalige, Thippeswamy
2025-02-05 11:53 ` Havalige, Thippeswamy
2025-02-05 14:20 ` Bjorn Helgaas
2025-02-07 16:45 ` Havalige, Thippeswamy
2025-02-05 15:10 ` Markus Elfring
2025-02-06 16:07 ` Havalige, Thippeswamy
2025-02-06 20:26 ` Bjorn Helgaas
2025-02-07 6:39 ` [v8 " Markus Elfring
2025-02-07 6:59 ` Manivannan Sadhasivam
2025-02-07 9:45 ` Markus Elfring
2025-02-11 23:16 ` Bjorn Helgaas
2025-02-12 5:36 ` Krzysztof Kozlowski
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=20250203182822.GA793389@bhelgaas \
--to=helgaas@kernel.org \
--cc=bharat.kumar.gogada@amd.com \
--cc=bhelgaas@google.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=jingoohan1@gmail.com \
--cc=krzk+dt@kernel.org \
--cc=kw@linux.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=manivannan.sadhasivam@linaro.org \
--cc=michal.simek@amd.com \
--cc=robh@kernel.org \
--cc=thippeswamy.havalige@amd.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.