From: Manivannan Sadhasivam <mani@kernel.org>
To: Frank Li <Frank.Li@nxp.com>
Cc: manivannan.sadhasivam@linaro.org, aisheng.dong@nxp.com,
bhelgaas@google.com, devicetree@vger.kernel.org,
festevam@gmail.com, imx@lists.linux.dev, jdmason@kudzu.us,
kernel@pengutronix.de, kishon@kernel.org, kw@linux.com,
linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
lorenzo.pieralisi@arm.com, lpieralisi@kernel.org, maz@kernel.org,
s.hauer@pengutronix.de, shawnguo@kernel.org, tglx@linutronix.de
Subject: Re: [PATCH v2 3/5] PCI: endpoint: pci-epf-test: add doorbell test
Date: Fri, 20 Oct 2023 23:14:28 +0530 [thread overview]
Message-ID: <20231020174428.GB46191@thinkpad> (raw)
In-Reply-To: <20230911220920.1817033-4-Frank.Li@nxp.com>
On Mon, Sep 11, 2023 at 06:09:18PM -0400, Frank Li wrote:
Subject could be,
PCI: endpoint: pci-epf-test: Add doorbell support
> Add three register: doorbell_bar, doorbell_addr, doorbell_data,
> doorbell_done. Call pci_epf_alloc_doorbell() all a doorbell address space.
>
> Root complex(RC) side driver can trigger pci-epc-test's doorbell callback
> handler by write doorbell_data to mapped doorbell_bar's address space.
>
> pci-epc-test will set doorbell_done in doorbell callback.
>
How about,
Add doorbell support to the EPF test driver by introducing 3 new registers:
doorbell_bar
doorbell_addr
doorbell_data
The PCI RC driver can trigger the doorbell on the EP side by writing the
content of "doorbell_data" to the address specified by the "doorbell_addr"
register in the "doorbell_bar" BAR region.
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
You should also update Documentation/PCI/endpoint/pci-test-* files in a separate
commit with doorbell support.
> ---
> drivers/pci/endpoint/functions/pci-epf-test.c | 59 ++++++++++++++++++-
> 1 file changed, 58 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
> index 1f0d2b84296a3..566549919b87b 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-test.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-test.c
> @@ -11,6 +11,7 @@
> #include <linux/dmaengine.h>
> #include <linux/io.h>
> #include <linux/module.h>
> +#include <linux/msi.h>
> #include <linux/slab.h>
> #include <linux/pci_ids.h>
> #include <linux/random.h>
> @@ -39,17 +40,21 @@
> #define STATUS_IRQ_RAISED BIT(6)
> #define STATUS_SRC_ADDR_INVALID BIT(7)
> #define STATUS_DST_ADDR_INVALID BIT(8)
> +#define STATUS_DOORBELL_SUCCESS BIT(9)
>
> #define FLAG_USE_DMA BIT(0)
>
> #define TIMER_RESOLUTION 1
>
> +#define MAGIC_VERSION_MASK GENMASK(7, 0)
> +
> static struct workqueue_struct *kpcitest_workqueue;
>
> struct pci_epf_test {
> void *reg[PCI_STD_NUM_BARS];
> struct pci_epf *epf;
> enum pci_barno test_reg_bar;
> + enum pci_barno doorbell_bar;
> size_t msix_table_offset;
> struct delayed_work cmd_handler;
> struct dma_chan *dma_chan_tx;
> @@ -74,6 +79,9 @@ struct pci_epf_test_reg {
> u32 irq_type;
> u32 irq_number;
> u32 flags;
> + u32 doorbell_bar;
> + u32 doorbell_addr;
> + u32 doorbell_data;
> } __packed;
>
> static struct pci_epf_header test_header = {
> @@ -693,6 +701,8 @@ static void pci_epf_test_unbind(struct pci_epf *epf)
> struct pci_epf_bar *epf_bar;
> int bar;
>
> + pci_epf_free_doorbell(epf);
> +
> cancel_delayed_work(&epf_test->cmd_handler);
> pci_epf_test_clean_dma_chan(epf_test);
> for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
> @@ -808,9 +818,22 @@ static int pci_epf_test_link_up(struct pci_epf *epf)
> return 0;
> }
>
> +static int pci_epf_test_doorbell(struct pci_epf *epf, int index)
> +{
> + struct pci_epf_test *epf_test = epf_get_drvdata(epf);
> + enum pci_barno test_reg_bar = epf_test->test_reg_bar;
> + struct pci_epf_test_reg *reg = epf_test->reg[test_reg_bar];
> +
> + reg->status |= STATUS_DOORBELL_SUCCESS;
> + pci_epf_test_raise_irq(epf_test, reg);
> +
> + return 0;
> +}
> +
> static const struct pci_epc_event_ops pci_epf_test_event_ops = {
> .core_init = pci_epf_test_core_init,
> .link_up = pci_epf_test_link_up,
> + .doorbell = pci_epf_test_doorbell,
I would like to pass this callback directly to the pci_epf_alloc_doorbell() API.
Would that be feasible?
> };
>
> static int pci_epf_test_alloc_space(struct pci_epf *epf)
> @@ -859,7 +882,7 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)
> epf_bar = &epf->bar[bar];
> add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1;
>
> - if (bar == test_reg_bar)
> + if (bar == test_reg_bar || bar == epf_test->doorbell_bar)
> continue;
>
> if (!!(epc_features->reserved_bar & (1 << bar)))
> @@ -900,9 +923,14 @@ static int pci_epf_test_bind(struct pci_epf *epf)
> struct pci_epf_test *epf_test = epf_get_drvdata(epf);
> const struct pci_epc_features *epc_features;
> enum pci_barno test_reg_bar = BAR_0;
> + enum pci_barno doorbell_bar = NO_BAR;
> struct pci_epc *epc = epf->epc;
> bool linkup_notifier = false;
> bool core_init_notifier = false;
> + struct pci_epf_test_reg *reg;
> + struct msi_msg *msg;
> + u64 doorbell_addr;
> + u32 align;
>
> if (WARN_ON_ONCE(!epc))
> return -EINVAL;
> @@ -923,10 +951,39 @@ static int pci_epf_test_bind(struct pci_epf *epf)
> epf_test->test_reg_bar = test_reg_bar;
> epf_test->epc_features = epc_features;
>
> + align = epc_features->align;
> + align = align ? align : 128;
> +
> + ret = pci_epf_alloc_doorbell(epf, 1);
This should be renamed as pci_epc_alloc_doorbell() as per comment on patch 1/3.
Also, the "msi_msg" pointer should be part of the EPC struct.
> + if (!ret) {
> + msg = epf->msg;
> + doorbell_bar = pci_epc_get_next_free_bar(epc_features, test_reg_bar + 1);
> +
> + if (doorbell_bar > 0) {
> + epf_test->doorbell_bar = doorbell_bar;
> + doorbell_addr = msg->address_hi;
> + doorbell_addr <<= 32;
> + doorbell_addr |= msg->address_lo;
> + epf->bar[doorbell_bar].phys_addr = round_down(doorbell_addr, align);
> + epf->bar[doorbell_bar].barno = doorbell_bar;
> + epf->bar[doorbell_bar].size = align;
> + } else {
> + pci_epf_free_doorbell(epf);
This one too should be renamed.
> + }
> + }
> +
> ret = pci_epf_test_alloc_space(epf);
This one too.
> if (ret)
> return ret;
>
> + reg = epf_test->reg[test_reg_bar];
> + reg->magic |= FIELD_PREP(MAGIC_VERSION_MASK, 0x1);
Why are you writing this register? This register serves for the purpose of
testing BAR0.
- Mani
> + if (doorbell_bar > 0) {
> + reg->doorbell_addr = doorbell_addr & (align - 1);
> + reg->doorbell_data = msg->data;
> + reg->doorbell_bar = doorbell_bar;
> + }
> +
> if (!core_init_notifier) {
> ret = pci_epf_test_core_init(epf);
> if (ret)
> --
> 2.34.1
>
--
மணிவண்ணன் சதாசிவம்
WARNING: multiple messages have this Message-ID (diff)
From: Manivannan Sadhasivam <mani@kernel.org>
To: Frank Li <Frank.Li@nxp.com>
Cc: manivannan.sadhasivam@linaro.org, aisheng.dong@nxp.com,
bhelgaas@google.com, devicetree@vger.kernel.org,
festevam@gmail.com, imx@lists.linux.dev, jdmason@kudzu.us,
kernel@pengutronix.de, kishon@kernel.org, kw@linux.com,
linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
lorenzo.pieralisi@arm.com, lpieralisi@kernel.org, maz@kernel.org,
s.hauer@pengutronix.de, shawnguo@kernel.org, tglx@linutronix.de
Subject: Re: [PATCH v2 3/5] PCI: endpoint: pci-epf-test: add doorbell test
Date: Fri, 20 Oct 2023 23:14:28 +0530 [thread overview]
Message-ID: <20231020174428.GB46191@thinkpad> (raw)
In-Reply-To: <20230911220920.1817033-4-Frank.Li@nxp.com>
On Mon, Sep 11, 2023 at 06:09:18PM -0400, Frank Li wrote:
Subject could be,
PCI: endpoint: pci-epf-test: Add doorbell support
> Add three register: doorbell_bar, doorbell_addr, doorbell_data,
> doorbell_done. Call pci_epf_alloc_doorbell() all a doorbell address space.
>
> Root complex(RC) side driver can trigger pci-epc-test's doorbell callback
> handler by write doorbell_data to mapped doorbell_bar's address space.
>
> pci-epc-test will set doorbell_done in doorbell callback.
>
How about,
Add doorbell support to the EPF test driver by introducing 3 new registers:
doorbell_bar
doorbell_addr
doorbell_data
The PCI RC driver can trigger the doorbell on the EP side by writing the
content of "doorbell_data" to the address specified by the "doorbell_addr"
register in the "doorbell_bar" BAR region.
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
You should also update Documentation/PCI/endpoint/pci-test-* files in a separate
commit with doorbell support.
> ---
> drivers/pci/endpoint/functions/pci-epf-test.c | 59 ++++++++++++++++++-
> 1 file changed, 58 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
> index 1f0d2b84296a3..566549919b87b 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-test.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-test.c
> @@ -11,6 +11,7 @@
> #include <linux/dmaengine.h>
> #include <linux/io.h>
> #include <linux/module.h>
> +#include <linux/msi.h>
> #include <linux/slab.h>
> #include <linux/pci_ids.h>
> #include <linux/random.h>
> @@ -39,17 +40,21 @@
> #define STATUS_IRQ_RAISED BIT(6)
> #define STATUS_SRC_ADDR_INVALID BIT(7)
> #define STATUS_DST_ADDR_INVALID BIT(8)
> +#define STATUS_DOORBELL_SUCCESS BIT(9)
>
> #define FLAG_USE_DMA BIT(0)
>
> #define TIMER_RESOLUTION 1
>
> +#define MAGIC_VERSION_MASK GENMASK(7, 0)
> +
> static struct workqueue_struct *kpcitest_workqueue;
>
> struct pci_epf_test {
> void *reg[PCI_STD_NUM_BARS];
> struct pci_epf *epf;
> enum pci_barno test_reg_bar;
> + enum pci_barno doorbell_bar;
> size_t msix_table_offset;
> struct delayed_work cmd_handler;
> struct dma_chan *dma_chan_tx;
> @@ -74,6 +79,9 @@ struct pci_epf_test_reg {
> u32 irq_type;
> u32 irq_number;
> u32 flags;
> + u32 doorbell_bar;
> + u32 doorbell_addr;
> + u32 doorbell_data;
> } __packed;
>
> static struct pci_epf_header test_header = {
> @@ -693,6 +701,8 @@ static void pci_epf_test_unbind(struct pci_epf *epf)
> struct pci_epf_bar *epf_bar;
> int bar;
>
> + pci_epf_free_doorbell(epf);
> +
> cancel_delayed_work(&epf_test->cmd_handler);
> pci_epf_test_clean_dma_chan(epf_test);
> for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
> @@ -808,9 +818,22 @@ static int pci_epf_test_link_up(struct pci_epf *epf)
> return 0;
> }
>
> +static int pci_epf_test_doorbell(struct pci_epf *epf, int index)
> +{
> + struct pci_epf_test *epf_test = epf_get_drvdata(epf);
> + enum pci_barno test_reg_bar = epf_test->test_reg_bar;
> + struct pci_epf_test_reg *reg = epf_test->reg[test_reg_bar];
> +
> + reg->status |= STATUS_DOORBELL_SUCCESS;
> + pci_epf_test_raise_irq(epf_test, reg);
> +
> + return 0;
> +}
> +
> static const struct pci_epc_event_ops pci_epf_test_event_ops = {
> .core_init = pci_epf_test_core_init,
> .link_up = pci_epf_test_link_up,
> + .doorbell = pci_epf_test_doorbell,
I would like to pass this callback directly to the pci_epf_alloc_doorbell() API.
Would that be feasible?
> };
>
> static int pci_epf_test_alloc_space(struct pci_epf *epf)
> @@ -859,7 +882,7 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)
> epf_bar = &epf->bar[bar];
> add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1;
>
> - if (bar == test_reg_bar)
> + if (bar == test_reg_bar || bar == epf_test->doorbell_bar)
> continue;
>
> if (!!(epc_features->reserved_bar & (1 << bar)))
> @@ -900,9 +923,14 @@ static int pci_epf_test_bind(struct pci_epf *epf)
> struct pci_epf_test *epf_test = epf_get_drvdata(epf);
> const struct pci_epc_features *epc_features;
> enum pci_barno test_reg_bar = BAR_0;
> + enum pci_barno doorbell_bar = NO_BAR;
> struct pci_epc *epc = epf->epc;
> bool linkup_notifier = false;
> bool core_init_notifier = false;
> + struct pci_epf_test_reg *reg;
> + struct msi_msg *msg;
> + u64 doorbell_addr;
> + u32 align;
>
> if (WARN_ON_ONCE(!epc))
> return -EINVAL;
> @@ -923,10 +951,39 @@ static int pci_epf_test_bind(struct pci_epf *epf)
> epf_test->test_reg_bar = test_reg_bar;
> epf_test->epc_features = epc_features;
>
> + align = epc_features->align;
> + align = align ? align : 128;
> +
> + ret = pci_epf_alloc_doorbell(epf, 1);
This should be renamed as pci_epc_alloc_doorbell() as per comment on patch 1/3.
Also, the "msi_msg" pointer should be part of the EPC struct.
> + if (!ret) {
> + msg = epf->msg;
> + doorbell_bar = pci_epc_get_next_free_bar(epc_features, test_reg_bar + 1);
> +
> + if (doorbell_bar > 0) {
> + epf_test->doorbell_bar = doorbell_bar;
> + doorbell_addr = msg->address_hi;
> + doorbell_addr <<= 32;
> + doorbell_addr |= msg->address_lo;
> + epf->bar[doorbell_bar].phys_addr = round_down(doorbell_addr, align);
> + epf->bar[doorbell_bar].barno = doorbell_bar;
> + epf->bar[doorbell_bar].size = align;
> + } else {
> + pci_epf_free_doorbell(epf);
This one too should be renamed.
> + }
> + }
> +
> ret = pci_epf_test_alloc_space(epf);
This one too.
> if (ret)
> return ret;
>
> + reg = epf_test->reg[test_reg_bar];
> + reg->magic |= FIELD_PREP(MAGIC_VERSION_MASK, 0x1);
Why are you writing this register? This register serves for the purpose of
testing BAR0.
- Mani
> + if (doorbell_bar > 0) {
> + reg->doorbell_addr = doorbell_addr & (align - 1);
> + reg->doorbell_data = msg->data;
> + reg->doorbell_bar = doorbell_bar;
> + }
> +
> if (!core_init_notifier) {
> ret = pci_epf_test_core_init(epf);
> if (ret)
> --
> 2.34.1
>
--
மணிவண்ணன் சதாசிவம்
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-10-20 17:44 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-11 22:09 [PATCH v2 0/5] Add RC-to-EP doorbell with platform MSI controller Frank Li
2023-09-11 22:09 ` Frank Li
2023-09-11 22:09 ` [PATCH v2 1/5] PCI: endpoint: Add RC-to-EP doorbell support using " Frank Li
2023-09-11 22:09 ` Frank Li
2023-09-29 9:30 ` Kishon Vijay Abraham I
2023-09-29 9:30 ` Kishon Vijay Abraham I
2023-09-29 14:39 ` Frank Li
2023-09-29 14:39 ` Frank Li
2023-10-17 18:37 ` Manivannan Sadhasivam
2023-10-17 18:37 ` Manivannan Sadhasivam
2023-10-17 18:55 ` Frank Li
2023-10-17 18:55 ` Frank Li
2023-10-19 15:04 ` Manivannan Sadhasivam
2023-10-19 15:04 ` Manivannan Sadhasivam
2023-10-19 16:00 ` Frank Li
2023-10-19 16:00 ` Frank Li
2023-10-19 17:23 ` Manivannan Sadhasivam
2023-10-19 17:23 ` Manivannan Sadhasivam
2023-10-19 18:11 ` [PATCH v2 1/5] PCI: endpoint: Add RC-to-EP doorbell support using platform MSI controllery Frank Li
2023-10-19 18:11 ` Frank Li
2023-10-20 17:12 ` Manivannan Sadhasivam
2023-10-20 17:12 ` Manivannan Sadhasivam
2023-10-20 18:00 ` Frank Li
2023-10-20 18:00 ` Frank Li
2023-10-20 18:10 ` Manivannan Sadhasivam
2023-10-20 18:10 ` Manivannan Sadhasivam
2023-09-11 22:09 ` [PATCH v2 2/5] PCI: dwc: add doorbell support by use MSI controller Frank Li
2023-09-11 22:09 ` Frank Li
2023-09-11 22:09 ` [PATCH v2 3/5] PCI: endpoint: pci-epf-test: add doorbell test Frank Li
2023-09-11 22:09 ` Frank Li
2023-09-29 9:33 ` Kishon Vijay Abraham I
2023-09-29 9:33 ` Kishon Vijay Abraham I
2023-09-29 14:26 ` Frank Li
2023-09-29 14:26 ` Frank Li
2023-10-20 17:44 ` Manivannan Sadhasivam [this message]
2023-10-20 17:44 ` Manivannan Sadhasivam
2023-09-11 22:09 ` [PATCH v2 4/5] misc: pci_endpoint_test: Add doorbell test case Frank Li
2023-09-11 22:09 ` Frank Li
2023-10-20 17:53 ` Manivannan Sadhasivam
2023-10-20 17:53 ` Manivannan Sadhasivam
2023-10-20 18:01 ` Manivannan Sadhasivam
2023-10-20 18:01 ` Manivannan Sadhasivam
2023-10-20 18:07 ` Frank Li
2023-10-20 18:07 ` Frank Li
2023-10-20 18:26 ` Manivannan Sadhasivam
2023-10-20 18:26 ` Manivannan Sadhasivam
2023-10-30 18:33 ` Frank Li
2023-10-30 18:33 ` Frank Li
2023-11-02 17:58 ` Manivannan Sadhasivam
2023-11-02 17:58 ` Manivannan Sadhasivam
2023-11-09 4:44 ` Kishon Vijay Abraham I
2023-11-09 4:44 ` Kishon Vijay Abraham I
2023-09-11 22:09 ` [PATCH v2 5/5] tools: PCI: Add 'B' option for test doorbell Frank Li
2023-09-11 22:09 ` Frank Li
2023-10-20 17:55 ` Manivannan Sadhasivam
2023-10-20 17:55 ` Manivannan Sadhasivam
2023-09-20 21:39 ` [PATCH v2 0/5] Add RC-to-EP doorbell with platform MSI controller Frank Li
2023-09-20 21:39 ` Frank Li
2023-09-30 9:02 ` Manivannan Sadhasivam
2023-09-30 9:02 ` Manivannan Sadhasivam
2023-10-10 14:21 ` Frank Li
2023-10-10 14:21 ` Frank Li
2023-10-16 14:50 ` Frank Li
2023-10-16 14:50 ` Frank Li
2023-10-16 17:16 ` Manivannan Sadhasivam
2023-10-16 17:16 ` Manivannan Sadhasivam
2024-10-09 16:01 ` Niklas Cassel
2024-10-09 16:20 ` 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=20231020174428.GB46191@thinkpad \
--to=mani@kernel.org \
--cc=Frank.Li@nxp.com \
--cc=aisheng.dong@nxp.com \
--cc=bhelgaas@google.com \
--cc=devicetree@vger.kernel.org \
--cc=festevam@gmail.com \
--cc=imx@lists.linux.dev \
--cc=jdmason@kudzu.us \
--cc=kernel@pengutronix.de \
--cc=kishon@kernel.org \
--cc=kw@linux.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-imx@nxp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=lpieralisi@kernel.org \
--cc=manivannan.sadhasivam@linaro.org \
--cc=maz@kernel.org \
--cc=s.hauer@pengutronix.de \
--cc=shawnguo@kernel.org \
--cc=tglx@linutronix.de \
/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.