From: Witold Sadowski <wsadowski@marvell.com>
To: <linux-kernel@vger.kernel.org>, <linux-spi@vger.kernel.org>,
<devicetree@vger.kernel.org>
Cc: <broonie@kernel.org>, <robh@kernel.org>,
<krzysztof.kozlowski+dt@linaro.org>, <conor+dt@kernel.org>,
<pthombar@cadence.com>, Witold Sadowski <wsadowski@marvell.com>
Subject: [PATCH v9 4/9] spi: cadence: Add Marvell SDMA operations
Date: Wed, 19 Jun 2024 07:17:10 -0700 [thread overview]
Message-ID: <20240619141716.1785467-5-wsadowski@marvell.com> (raw)
In-Reply-To: <20240619141716.1785467-1-wsadowski@marvell.com>
In Marvell xSPI implementation any access to SDMA register will result
in 8 byte SPI data transfer. Reading less data(eg. 1B) will result in
losing remaining bytes. To avoid that read/write 8 bytes into temporary
buffer, and read/write whole temporary buffer into SDMA.
Signed-off-by: Witold Sadowski <wsadowski@marvell.com>
---
drivers/spi/spi-cadence-xspi.c | 56 ++++++++++++++++++++++++++++++++--
1 file changed, 53 insertions(+), 3 deletions(-)
diff --git a/drivers/spi/spi-cadence-xspi.c b/drivers/spi/spi-cadence-xspi.c
index d0222284c507..c79f2a2931a8 100644
--- a/drivers/spi/spi-cadence-xspi.c
+++ b/drivers/spi/spi-cadence-xspi.c
@@ -310,6 +310,7 @@ struct cdns_xspi_dev {
u8 hw_num_banks;
const struct cdns_xspi_driver_data *driver_data;
+ void (*sdma_handler)(struct cdns_xspi_dev *cdns_xspi);
};
static void cdns_xspi_reset_dll(struct cdns_xspi_dev *cdns_xspi)
@@ -515,6 +516,52 @@ static void cdns_xspi_sdma_handle(struct cdns_xspi_dev *cdns_xspi)
}
}
+static void m_ioreadq(void __iomem *addr, void *buf, int len)
+{
+ u64 tmp_buf;
+
+ while (len) {
+ tmp_buf = readq(addr);
+ memcpy(buf, &tmp_buf, len > 8 ? 8 : len);
+ len = len > 8 ? len - 8 : 0;
+ buf += 8;
+ }
+}
+
+static void m_iowriteq(void __iomem *addr, const void *buf, int len)
+{
+ u64 tmp_buf;
+
+ while (len) {
+ memcpy(&tmp_buf, buf, len > 8 ? 8 : len);
+ writeq(tmp_buf, addr);
+ len = len > 8 ? len - 8 : 0;
+ buf += 8;
+ }
+}
+
+static void marvell_xspi_sdma_handle(struct cdns_xspi_dev *cdns_xspi)
+{
+ u32 sdma_size, sdma_trd_info;
+ u8 sdma_dir;
+
+ sdma_size = readl(cdns_xspi->iobase + CDNS_XSPI_SDMA_SIZE_REG);
+ sdma_trd_info = readl(cdns_xspi->iobase + CDNS_XSPI_SDMA_TRD_INFO_REG);
+ sdma_dir = FIELD_GET(CDNS_XSPI_SDMA_DIR, sdma_trd_info);
+
+ switch (sdma_dir) {
+ case CDNS_XSPI_SDMA_DIR_READ:
+ m_ioreadq(cdns_xspi->sdmabase,
+ cdns_xspi->in_buffer, sdma_size);
+ break;
+
+ case CDNS_XSPI_SDMA_DIR_WRITE:
+ m_iowriteq(cdns_xspi->sdmabase,
+ cdns_xspi->out_buffer, sdma_size);
+ break;
+ }
+}
+
static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
const struct spi_mem_op *op,
bool data_phase)
@@ -566,7 +613,7 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
cdns_xspi_set_interrupts(cdns_xspi, false);
return -EIO;
}
- cdns_xspi_sdma_handle(cdns_xspi);
+ cdns_xspi->sdma_handler(cdns_xspi);
}
wait_for_completion(&cdns_xspi->cmd_complete);
@@ -736,10 +783,13 @@ static int cdns_xspi_probe(struct platform_device *pdev)
if (!cdns_xspi->driver_data)
return -ENODEV;
- if (cdns_xspi->driver_data->mrvl_hw_overlay)
+ if (cdns_xspi->driver_data->mrvl_hw_overlay) {
host->mem_ops = &marvell_xspi_mem_ops;
- else
+ cdns_xspi->sdma_handler = &marvell_xspi_sdma_handle;
+ } else {
host->mem_ops = &cadence_xspi_mem_ops;
+ cdns_xspi->sdma_handler = &cdns_xspi_sdma_handle;
+ }
host->dev.of_node = pdev->dev.of_node;
host->bus_num = -1;
--
2.43.0
next prev parent reply other threads:[~2024-06-19 14:17 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-19 14:17 [PATCH v9 0/9] Marvell HW overlay support for Cadence xSPI Witold Sadowski
2024-06-19 14:17 ` [PATCH v9 1/9] spi: dt-bindings: cadence: Add Marvell overlay bindings documentation for Cadence XSPI Witold Sadowski
2024-06-19 14:17 ` [PATCH v9 2/9] spi: cadence: Add static PHY configuration in Marvell overlay Witold Sadowski
2024-06-19 14:17 ` [PATCH v9 3/9] spi: cadence: Add clock configuration for Marvell xSPI overlay Witold Sadowski
2024-06-19 14:17 ` Witold Sadowski [this message]
2024-06-24 14:29 ` [PATCH v9 4/9] spi: cadence: Add Marvell SDMA operations Mark Brown
2024-06-28 13:45 ` [EXTERNAL] " Witold Sadowski
2024-06-28 13:52 ` Mark Brown
2024-06-19 14:17 ` [PATCH v9 5/9] spi: cadence: Add Marvell xSPI interrupt changes Witold Sadowski
2024-06-19 14:17 ` [PATCH v9 6/9] spi: cadence: Add Marvell xfer operation support Witold Sadowski
2024-06-24 15:29 ` Mark Brown
2024-06-28 13:48 ` [EXTERNAL] " Witold Sadowski
2024-06-28 13:57 ` Mark Brown
2024-06-19 14:17 ` [PATCH v9 7/9] spi: cadence: Change resource mapping Witold Sadowski
2024-06-19 14:17 ` [PATCH v9 8/9] spi: cadence: Change cs property reading Witold Sadowski
2024-06-19 14:17 ` [PATCH v9 9/9] spi: cadence: Try to read spi-tx/rx-bus width property using ACPI Witold Sadowski
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=20240619141716.1785467-5-wsadowski@marvell.com \
--to=wsadowski@marvell.com \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-spi@vger.kernel.org \
--cc=pthombar@cadence.com \
--cc=robh@kernel.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;
as well as URLs for NNTP newsgroup(s).