3074 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Copyright (c) 2006 ARM Ltd.4 * Copyright (c) 2010 ST-Ericsson SA5 * Copyright (c) 2017 Linaro Ltd.6 *7 * Author: Peter Pearse <peter.pearse@arm.com>8 * Author: Linus Walleij <linus.walleij@linaro.org>9 *10 * Documentation: ARM DDI 0196G == PL08011 * Documentation: ARM DDI 0218E == PL08112 * Documentation: S3C6410 User's Manual == PL080S13 *14 * PL080 & PL081 both have 16 sets of DMA signals that can be routed to any15 * channel.16 *17 * The PL080 has 8 channels available for simultaneous use, and the PL08118 * has only two channels. So on these DMA controllers the number of channels19 * and the number of incoming DMA signals are two totally different things.20 * It is usually not possible to theoretically handle all physical signals,21 * so a multiplexing scheme with possible denial of use is necessary.22 *23 * The PL080 has a dual bus master, PL081 has a single master.24 *25 * PL080S is a version modified by Samsung and used in S3C64xx SoCs.26 * It differs in following aspects:27 * - CH_CONFIG register at different offset,28 * - separate CH_CONTROL2 register for transfer size,29 * - bigger maximum transfer size,30 * - 8-word aligned LLI, instead of 4-word, due to extra CCTL2 word,31 * - no support for peripheral flow control.32 *33 * Memory to peripheral transfer may be visualized as34 * Get data from memory to DMAC35 * Until no data left36 * On burst request from peripheral37 * Destination burst from DMAC to peripheral38 * Clear burst request39 * Raise terminal count interrupt40 *41 * For peripherals with a FIFO:42 * Source burst size == half the depth of the peripheral FIFO43 * Destination burst size == the depth of the peripheral FIFO44 *45 * (Bursts are irrelevant for mem to mem transfers - there are no burst46 * signals, the DMA controller will simply facilitate its AHB master.)47 *48 * ASSUMES default (little) endianness for DMA transfers49 *50 * The PL08x has two flow control settings:51 * - DMAC flow control: the transfer size defines the number of transfers52 * which occur for the current LLI entry, and the DMAC raises TC at the53 * end of every LLI entry. Observed behaviour shows the DMAC listening54 * to both the BREQ and SREQ signals (contrary to documented),55 * transferring data if either is active. The LBREQ and LSREQ signals56 * are ignored.57 *58 * - Peripheral flow control: the transfer size is ignored (and should be59 * zero). The data is transferred from the current LLI entry, until60 * after the final transfer signalled by LBREQ or LSREQ. The DMAC61 * will then move to the next LLI entry. Unsupported by PL080S.62 */63#include <linux/amba/bus.h>64#include <linux/amba/pl08x.h>65#include <linux/debugfs.h>66#include <linux/delay.h>67#include <linux/device.h>68#include <linux/dmaengine.h>69#include <linux/dmapool.h>70#include <linux/dma-mapping.h>71#include <linux/export.h>72#include <linux/init.h>73#include <linux/interrupt.h>74#include <linux/module.h>75#include <linux/of.h>76#include <linux/of_dma.h>77#include <linux/pm_runtime.h>78#include <linux/seq_file.h>79#include <linux/slab.h>80#include <linux/amba/pl080.h>81 82#include "dmaengine.h"83#include "virt-dma.h"84 85#define DRIVER_NAME "pl08xdmac"86 87#define PL80X_DMA_BUSWIDTHS \88 BIT(DMA_SLAVE_BUSWIDTH_UNDEFINED) | \89 BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \90 BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \91 BIT(DMA_SLAVE_BUSWIDTH_4_BYTES)92 93static struct amba_driver pl08x_amba_driver;94struct pl08x_driver_data;95 96/**97 * struct vendor_data - vendor-specific config parameters for PL08x derivatives98 * @config_offset: offset to the configuration register99 * @channels: the number of channels available in this variant100 * @signals: the number of request signals available from the hardware101 * @dualmaster: whether this version supports dual AHB masters or not.102 * @nomadik: whether this variant is a ST Microelectronics Nomadik, where the103 * channels have Nomadik security extension bits that need to be checked104 * for permission before use and some registers are missing105 * @pl080s: whether this variant is a Samsung PL080S, which has separate106 * register and LLI word for transfer size.107 * @ftdmac020: whether this variant is a Faraday Technology FTDMAC020108 * @max_transfer_size: the maximum single element transfer size for this109 * PL08x variant.110 */111struct vendor_data {112 u8 config_offset;113 u8 channels;114 u8 signals;115 bool dualmaster;116 bool nomadik;117 bool pl080s;118 bool ftdmac020;119 u32 max_transfer_size;120};121 122/**123 * struct pl08x_bus_data - information of source or destination124 * busses for a transfer125 * @addr: current address126 * @maxwidth: the maximum width of a transfer on this bus127 * @buswidth: the width of this bus in bytes: 1, 2 or 4128 */129struct pl08x_bus_data {130 dma_addr_t addr;131 u8 maxwidth;132 u8 buswidth;133};134 135#define IS_BUS_ALIGNED(bus) IS_ALIGNED((bus)->addr, (bus)->buswidth)136 137/**138 * struct pl08x_phy_chan - holder for the physical channels139 * @id: physical index to this channel140 * @base: memory base address for this physical channel141 * @reg_config: configuration address for this physical channel142 * @reg_control: control address for this physical channel143 * @reg_src: transfer source address register144 * @reg_dst: transfer destination address register145 * @reg_lli: transfer LLI address register146 * @reg_busy: if the variant has a special per-channel busy register,147 * this contains a pointer to it148 * @lock: a lock to use when altering an instance of this struct149 * @serving: the virtual channel currently being served by this physical150 * channel151 * @locked: channel unavailable for the system, e.g. dedicated to secure152 * world153 * @ftdmac020: channel is on a FTDMAC020154 * @pl080s: channel is on a PL08s155 */156struct pl08x_phy_chan {157 unsigned int id;158 void __iomem *base;159 void __iomem *reg_config;160 void __iomem *reg_control;161 void __iomem *reg_src;162 void __iomem *reg_dst;163 void __iomem *reg_lli;164 void __iomem *reg_busy;165 spinlock_t lock;166 struct pl08x_dma_chan *serving;167 bool locked;168 bool ftdmac020;169 bool pl080s;170};171 172/**173 * struct pl08x_sg - structure containing data per sg174 * @src_addr: src address of sg175 * @dst_addr: dst address of sg176 * @len: transfer len in bytes177 * @node: node for txd's dsg_list178 */179struct pl08x_sg {180 dma_addr_t src_addr;181 dma_addr_t dst_addr;182 size_t len;183 struct list_head node;184};185 186/**187 * struct pl08x_txd - wrapper for struct dma_async_tx_descriptor188 * @vd: virtual DMA descriptor189 * @dsg_list: list of children sg's190 * @llis_bus: DMA memory address (physical) start for the LLIs191 * @llis_va: virtual memory address start for the LLIs192 * @cctl: control reg values for current txd193 * @ccfg: config reg values for current txd194 * @done: this marks completed descriptors, which should not have their195 * mux released.196 * @cyclic: indicate cyclic transfers197 */198struct pl08x_txd {199 struct virt_dma_desc vd;200 struct list_head dsg_list;201 dma_addr_t llis_bus;202 u32 *llis_va;203 /* Default cctl value for LLIs */204 u32 cctl;205 /*206 * Settings to be put into the physical channel when we207 * trigger this txd. Other registers are in llis_va[0].208 */209 u32 ccfg;210 bool done;211 bool cyclic;212};213 214/**215 * enum pl08x_dma_chan_state - holds the PL08x specific virtual channel216 * states217 * @PL08X_CHAN_IDLE: the channel is idle218 * @PL08X_CHAN_RUNNING: the channel has allocated a physical transport219 * channel and is running a transfer on it220 * @PL08X_CHAN_PAUSED: the channel has allocated a physical transport221 * channel, but the transfer is currently paused222 * @PL08X_CHAN_WAITING: the channel is waiting for a physical transport223 * channel to become available (only pertains to memcpy channels)224 */225enum pl08x_dma_chan_state {226 PL08X_CHAN_IDLE,227 PL08X_CHAN_RUNNING,228 PL08X_CHAN_PAUSED,229 PL08X_CHAN_WAITING,230};231 232/**233 * struct pl08x_dma_chan - this structure wraps a DMA ENGINE channel234 * @vc: wrapped virtual channel235 * @phychan: the physical channel utilized by this channel, if there is one236 * @name: name of channel237 * @cd: channel platform data238 * @cfg: slave configuration239 * @at: active transaction on this channel240 * @host: a pointer to the host (internal use)241 * @state: whether the channel is idle, paused, running etc242 * @slave: whether this channel is a device (slave) or for memcpy243 * @signal: the physical DMA request signal which this channel is using244 * @mux_use: count of descriptors using this DMA request signal setting245 * @waiting_at: time in jiffies when this channel moved to waiting state246 */247struct pl08x_dma_chan {248 struct virt_dma_chan vc;249 struct pl08x_phy_chan *phychan;250 const char *name;251 struct pl08x_channel_data *cd;252 struct dma_slave_config cfg;253 struct pl08x_txd *at;254 struct pl08x_driver_data *host;255 enum pl08x_dma_chan_state state;256 bool slave;257 int signal;258 unsigned mux_use;259 unsigned long waiting_at;260};261 262/**263 * struct pl08x_driver_data - the local state holder for the PL08x264 * @slave: optional slave engine for this instance265 * @memcpy: memcpy engine for this instance266 * @has_slave: the PL08x has a slave engine (routed signals)267 * @base: virtual memory base (remapped) for the PL08x268 * @adev: the corresponding AMBA (PrimeCell) bus entry269 * @vd: vendor data for this PL08x variant270 * @pd: platform data passed in from the platform/machine271 * @phy_chans: array of data for the physical channels272 * @pool: a pool for the LLI descriptors273 * @lli_buses: bitmask to or in to LLI pointer selecting AHB port for LLI274 * fetches275 * @mem_buses: set to indicate memory transfers on AHB2.276 * @lli_words: how many words are used in each LLI item for this variant277 */278struct pl08x_driver_data {279 struct dma_device slave;280 struct dma_device memcpy;281 bool has_slave;282 void __iomem *base;283 struct amba_device *adev;284 const struct vendor_data *vd;285 struct pl08x_platform_data *pd;286 struct pl08x_phy_chan *phy_chans;287 struct dma_pool *pool;288 u8 lli_buses;289 u8 mem_buses;290 u8 lli_words;291};292 293/*294 * PL08X specific defines295 */296 297/* The order of words in an LLI. */298#define PL080_LLI_SRC 0299#define PL080_LLI_DST 1300#define PL080_LLI_LLI 2301#define PL080_LLI_CCTL 3302#define PL080S_LLI_CCTL2 4303 304/* Total words in an LLI. */305#define PL080_LLI_WORDS 4306#define PL080S_LLI_WORDS 8307 308/*309 * Number of LLIs in each LLI buffer allocated for one transfer310 * (maximum times we call dma_pool_alloc on this pool without freeing)311 */312#define MAX_NUM_TSFR_LLIS 512313#define PL08X_ALIGN 8314 315static inline struct pl08x_dma_chan *to_pl08x_chan(struct dma_chan *chan)316{317 return container_of(chan, struct pl08x_dma_chan, vc.chan);318}319 320static inline struct pl08x_txd *to_pl08x_txd(struct dma_async_tx_descriptor *tx)321{322 return container_of(tx, struct pl08x_txd, vd.tx);323}324 325/*326 * Mux handling.327 *328 * This gives us the DMA request input to the PL08x primecell which the329 * peripheral described by the channel data will be routed to, possibly330 * via a board/SoC specific external MUX. One important point to note331 * here is that this does not depend on the physical channel.332 */333static int pl08x_request_mux(struct pl08x_dma_chan *plchan)334{335 const struct pl08x_platform_data *pd = plchan->host->pd;336 int ret;337 338 if (plchan->mux_use++ == 0 && pd->get_xfer_signal) {339 ret = pd->get_xfer_signal(plchan->cd);340 if (ret < 0) {341 plchan->mux_use = 0;342 return ret;343 }344 345 plchan->signal = ret;346 }347 return 0;348}349 350static void pl08x_release_mux(struct pl08x_dma_chan *plchan)351{352 const struct pl08x_platform_data *pd = plchan->host->pd;353 354 if (plchan->signal >= 0) {355 WARN_ON(plchan->mux_use == 0);356 357 if (--plchan->mux_use == 0 && pd->put_xfer_signal) {358 pd->put_xfer_signal(plchan->cd, plchan->signal);359 plchan->signal = -1;360 }361 }362}363 364/*365 * Physical channel handling366 */367 368/* Whether a certain channel is busy or not */369static int pl08x_phy_channel_busy(struct pl08x_phy_chan *ch)370{371 unsigned int val;372 373 /* If we have a special busy register, take a shortcut */374 if (ch->reg_busy) {375 val = readl(ch->reg_busy);376 return !!(val & BIT(ch->id));377 }378 val = readl(ch->reg_config);379 return val & PL080_CONFIG_ACTIVE;380}381 382/*383 * pl08x_write_lli() - Write an LLI into the DMA controller.384 *385 * The PL08x derivatives support linked lists, but the first item of the386 * list containing the source, destination, control word and next LLI is387 * ignored. Instead the driver has to write those values directly into the388 * SRC, DST, LLI and control registers. On FTDMAC020 also the SIZE389 * register need to be set up for the first transfer.390 */391static void pl08x_write_lli(struct pl08x_driver_data *pl08x,392 struct pl08x_phy_chan *phychan, const u32 *lli, u32 ccfg)393{394 if (pl08x->vd->pl080s)395 dev_vdbg(&pl08x->adev->dev,396 "WRITE channel %d: csrc=0x%08x, cdst=0x%08x, "397 "clli=0x%08x, cctl=0x%08x, cctl2=0x%08x, ccfg=0x%08x\n",398 phychan->id, lli[PL080_LLI_SRC], lli[PL080_LLI_DST],399 lli[PL080_LLI_LLI], lli[PL080_LLI_CCTL],400 lli[PL080S_LLI_CCTL2], ccfg);401 else402 dev_vdbg(&pl08x->adev->dev,403 "WRITE channel %d: csrc=0x%08x, cdst=0x%08x, "404 "clli=0x%08x, cctl=0x%08x, ccfg=0x%08x\n",405 phychan->id, lli[PL080_LLI_SRC], lli[PL080_LLI_DST],406 lli[PL080_LLI_LLI], lli[PL080_LLI_CCTL], ccfg);407 408 writel_relaxed(lli[PL080_LLI_SRC], phychan->reg_src);409 writel_relaxed(lli[PL080_LLI_DST], phychan->reg_dst);410 writel_relaxed(lli[PL080_LLI_LLI], phychan->reg_lli);411 412 /*413 * The FTMAC020 has a different layout in the CCTL word of the LLI414 * and the CCTL register which is split in CSR and SIZE registers.415 * Convert the LLI item CCTL into the proper values to write into416 * the CSR and SIZE registers.417 */418 if (phychan->ftdmac020) {419 u32 llictl = lli[PL080_LLI_CCTL];420 u32 val = 0;421 422 /* Write the transfer size (12 bits) to the size register */423 writel_relaxed(llictl & FTDMAC020_LLI_TRANSFER_SIZE_MASK,424 phychan->base + FTDMAC020_CH_SIZE);425 /*426 * Then write the control bits 28..16 to the control register427 * by shuffleing the bits around to where they are in the428 * main register. The mapping is as follows:429 * Bit 28: TC_MSK - mask on all except last LLI430 * Bit 27..25: SRC_WIDTH431 * Bit 24..22: DST_WIDTH432 * Bit 21..20: SRCAD_CTRL433 * Bit 19..17: DSTAD_CTRL434 * Bit 17: SRC_SEL435 * Bit 16: DST_SEL436 */437 if (llictl & FTDMAC020_LLI_TC_MSK)438 val |= FTDMAC020_CH_CSR_TC_MSK;439 val |= ((llictl & FTDMAC020_LLI_SRC_WIDTH_MSK) >>440 (FTDMAC020_LLI_SRC_WIDTH_SHIFT -441 FTDMAC020_CH_CSR_SRC_WIDTH_SHIFT));442 val |= ((llictl & FTDMAC020_LLI_DST_WIDTH_MSK) >>443 (FTDMAC020_LLI_DST_WIDTH_SHIFT -444 FTDMAC020_CH_CSR_DST_WIDTH_SHIFT));445 val |= ((llictl & FTDMAC020_LLI_SRCAD_CTL_MSK) >>446 (FTDMAC020_LLI_SRCAD_CTL_SHIFT -447 FTDMAC020_CH_CSR_SRCAD_CTL_SHIFT));448 val |= ((llictl & FTDMAC020_LLI_DSTAD_CTL_MSK) >>449 (FTDMAC020_LLI_DSTAD_CTL_SHIFT -450 FTDMAC020_CH_CSR_DSTAD_CTL_SHIFT));451 if (llictl & FTDMAC020_LLI_SRC_SEL)452 val |= FTDMAC020_CH_CSR_SRC_SEL;453 if (llictl & FTDMAC020_LLI_DST_SEL)454 val |= FTDMAC020_CH_CSR_DST_SEL;455 456 /*457 * Set up the bits that exist in the CSR but are not458 * part the LLI, i.e. only gets written to the control459 * register right here.460 *461 * FIXME: do not just handle memcpy, also handle slave DMA.462 */463 switch (pl08x->pd->memcpy_burst_size) {464 default:465 case PL08X_BURST_SZ_1:466 val |= PL080_BSIZE_1 <<467 FTDMAC020_CH_CSR_SRC_SIZE_SHIFT;468 break;469 case PL08X_BURST_SZ_4:470 val |= PL080_BSIZE_4 <<471 FTDMAC020_CH_CSR_SRC_SIZE_SHIFT;472 break;473 case PL08X_BURST_SZ_8:474 val |= PL080_BSIZE_8 <<475 FTDMAC020_CH_CSR_SRC_SIZE_SHIFT;476 break;477 case PL08X_BURST_SZ_16:478 val |= PL080_BSIZE_16 <<479 FTDMAC020_CH_CSR_SRC_SIZE_SHIFT;480 break;481 case PL08X_BURST_SZ_32:482 val |= PL080_BSIZE_32 <<483 FTDMAC020_CH_CSR_SRC_SIZE_SHIFT;484 break;485 case PL08X_BURST_SZ_64:486 val |= PL080_BSIZE_64 <<487 FTDMAC020_CH_CSR_SRC_SIZE_SHIFT;488 break;489 case PL08X_BURST_SZ_128:490 val |= PL080_BSIZE_128 <<491 FTDMAC020_CH_CSR_SRC_SIZE_SHIFT;492 break;493 case PL08X_BURST_SZ_256:494 val |= PL080_BSIZE_256 <<495 FTDMAC020_CH_CSR_SRC_SIZE_SHIFT;496 break;497 }498 499 /* Protection flags */500 if (pl08x->pd->memcpy_prot_buff)501 val |= FTDMAC020_CH_CSR_PROT2;502 if (pl08x->pd->memcpy_prot_cache)503 val |= FTDMAC020_CH_CSR_PROT3;504 /* We are the kernel, so we are in privileged mode */505 val |= FTDMAC020_CH_CSR_PROT1;506 507 writel_relaxed(val, phychan->reg_control);508 } else {509 /* Bits are just identical */510 writel_relaxed(lli[PL080_LLI_CCTL], phychan->reg_control);511 }512 513 /* Second control word on the PL080s */514 if (pl08x->vd->pl080s)515 writel_relaxed(lli[PL080S_LLI_CCTL2],516 phychan->base + PL080S_CH_CONTROL2);517 518 writel(ccfg, phychan->reg_config);519}520 521/*522 * Set the initial DMA register values i.e. those for the first LLI523 * The next LLI pointer and the configuration interrupt bit have524 * been set when the LLIs were constructed. Poke them into the hardware525 * and start the transfer.526 */527static void pl08x_start_next_txd(struct pl08x_dma_chan *plchan)528{529 struct pl08x_driver_data *pl08x = plchan->host;530 struct pl08x_phy_chan *phychan = plchan->phychan;531 struct virt_dma_desc *vd = vchan_next_desc(&plchan->vc);532 struct pl08x_txd *txd = to_pl08x_txd(&vd->tx);533 u32 val;534 535 list_del(&txd->vd.node);536 537 plchan->at = txd;538 539 /* Wait for channel inactive */540 while (pl08x_phy_channel_busy(phychan))541 cpu_relax();542 543 pl08x_write_lli(pl08x, phychan, &txd->llis_va[0], txd->ccfg);544 545 /* Enable the DMA channel */546 /* Do not access config register until channel shows as disabled */547 while (readl(pl08x->base + PL080_EN_CHAN) & BIT(phychan->id))548 cpu_relax();549 550 /* Do not access config register until channel shows as inactive */551 if (phychan->ftdmac020) {552 val = readl(phychan->reg_config);553 while (val & FTDMAC020_CH_CFG_BUSY)554 val = readl(phychan->reg_config);555 556 val = readl(phychan->reg_control);557 while (val & FTDMAC020_CH_CSR_EN)558 val = readl(phychan->reg_control);559 560 writel(val | FTDMAC020_CH_CSR_EN,561 phychan->reg_control);562 } else {563 val = readl(phychan->reg_config);564 while ((val & PL080_CONFIG_ACTIVE) ||565 (val & PL080_CONFIG_ENABLE))566 val = readl(phychan->reg_config);567 568 writel(val | PL080_CONFIG_ENABLE, phychan->reg_config);569 }570}571 572/*573 * Pause the channel by setting the HALT bit.574 *575 * For M->P transfers, pause the DMAC first and then stop the peripheral -576 * the FIFO can only drain if the peripheral is still requesting data.577 * (note: this can still timeout if the DMAC FIFO never drains of data.)578 *579 * For P->M transfers, disable the peripheral first to stop it filling580 * the DMAC FIFO, and then pause the DMAC.581 */582static void pl08x_pause_phy_chan(struct pl08x_phy_chan *ch)583{584 u32 val;585 int timeout;586 587 if (ch->ftdmac020) {588 /* Use the enable bit on the FTDMAC020 */589 val = readl(ch->reg_control);590 val &= ~FTDMAC020_CH_CSR_EN;591 writel(val, ch->reg_control);592 return;593 }594 595 /* Set the HALT bit and wait for the FIFO to drain */596 val = readl(ch->reg_config);597 val |= PL080_CONFIG_HALT;598 writel(val, ch->reg_config);599 600 /* Wait for channel inactive */601 for (timeout = 1000; timeout; timeout--) {602 if (!pl08x_phy_channel_busy(ch))603 break;604 udelay(1);605 }606 if (pl08x_phy_channel_busy(ch))607 pr_err("pl08x: channel%u timeout waiting for pause\n", ch->id);608}609 610static void pl08x_resume_phy_chan(struct pl08x_phy_chan *ch)611{612 u32 val;613 614 /* Use the enable bit on the FTDMAC020 */615 if (ch->ftdmac020) {616 val = readl(ch->reg_control);617 val |= FTDMAC020_CH_CSR_EN;618 writel(val, ch->reg_control);619 return;620 }621 622 /* Clear the HALT bit */623 val = readl(ch->reg_config);624 val &= ~PL080_CONFIG_HALT;625 writel(val, ch->reg_config);626}627 628/*629 * pl08x_terminate_phy_chan() stops the channel, clears the FIFO and630 * clears any pending interrupt status. This should not be used for631 * an on-going transfer, but as a method of shutting down a channel632 * (eg, when it's no longer used) or terminating a transfer.633 */634static void pl08x_terminate_phy_chan(struct pl08x_driver_data *pl08x,635 struct pl08x_phy_chan *ch)636{637 u32 val;638 639 /* The layout for the FTDMAC020 is different */640 if (ch->ftdmac020) {641 /* Disable all interrupts */642 val = readl(ch->reg_config);643 val |= (FTDMAC020_CH_CFG_INT_ABT_MASK |644 FTDMAC020_CH_CFG_INT_ERR_MASK |645 FTDMAC020_CH_CFG_INT_TC_MASK);646 writel(val, ch->reg_config);647 648 /* Abort and disable channel */649 val = readl(ch->reg_control);650 val &= ~FTDMAC020_CH_CSR_EN;651 val |= FTDMAC020_CH_CSR_ABT;652 writel(val, ch->reg_control);653 654 /* Clear ABT and ERR interrupt flags */655 writel(BIT(ch->id) | BIT(ch->id + 16),656 pl08x->base + PL080_ERR_CLEAR);657 writel(BIT(ch->id), pl08x->base + PL080_TC_CLEAR);658 659 return;660 }661 662 val = readl(ch->reg_config);663 val &= ~(PL080_CONFIG_ENABLE | PL080_CONFIG_ERR_IRQ_MASK |664 PL080_CONFIG_TC_IRQ_MASK);665 writel(val, ch->reg_config);666 667 writel(BIT(ch->id), pl08x->base + PL080_ERR_CLEAR);668 writel(BIT(ch->id), pl08x->base + PL080_TC_CLEAR);669}670 671static u32 get_bytes_in_phy_channel(struct pl08x_phy_chan *ch)672{673 u32 val;674 u32 bytes;675 676 if (ch->ftdmac020) {677 bytes = readl(ch->base + FTDMAC020_CH_SIZE);678 679 val = readl(ch->reg_control);680 val &= FTDMAC020_CH_CSR_SRC_WIDTH_MSK;681 val >>= FTDMAC020_CH_CSR_SRC_WIDTH_SHIFT;682 } else if (ch->pl080s) {683 val = readl(ch->base + PL080S_CH_CONTROL2);684 bytes = val & PL080S_CONTROL_TRANSFER_SIZE_MASK;685 686 val = readl(ch->reg_control);687 val &= PL080_CONTROL_SWIDTH_MASK;688 val >>= PL080_CONTROL_SWIDTH_SHIFT;689 } else {690 /* Plain PL08x */691 val = readl(ch->reg_control);692 bytes = val & PL080_CONTROL_TRANSFER_SIZE_MASK;693 694 val &= PL080_CONTROL_SWIDTH_MASK;695 val >>= PL080_CONTROL_SWIDTH_SHIFT;696 }697 698 switch (val) {699 case PL080_WIDTH_8BIT:700 break;701 case PL080_WIDTH_16BIT:702 bytes *= 2;703 break;704 case PL080_WIDTH_32BIT:705 bytes *= 4;706 break;707 }708 return bytes;709}710 711static u32 get_bytes_in_lli(struct pl08x_phy_chan *ch, const u32 *llis_va)712{713 u32 val;714 u32 bytes;715 716 if (ch->ftdmac020) {717 val = llis_va[PL080_LLI_CCTL];718 bytes = val & FTDMAC020_LLI_TRANSFER_SIZE_MASK;719 720 val = llis_va[PL080_LLI_CCTL];721 val &= FTDMAC020_LLI_SRC_WIDTH_MSK;722 val >>= FTDMAC020_LLI_SRC_WIDTH_SHIFT;723 } else if (ch->pl080s) {724 val = llis_va[PL080S_LLI_CCTL2];725 bytes = val & PL080S_CONTROL_TRANSFER_SIZE_MASK;726 727 val = llis_va[PL080_LLI_CCTL];728 val &= PL080_CONTROL_SWIDTH_MASK;729 val >>= PL080_CONTROL_SWIDTH_SHIFT;730 } else {731 /* Plain PL08x */732 val = llis_va[PL080_LLI_CCTL];733 bytes = val & PL080_CONTROL_TRANSFER_SIZE_MASK;734 735 val &= PL080_CONTROL_SWIDTH_MASK;736 val >>= PL080_CONTROL_SWIDTH_SHIFT;737 }738 739 switch (val) {740 case PL080_WIDTH_8BIT:741 break;742 case PL080_WIDTH_16BIT:743 bytes *= 2;744 break;745 case PL080_WIDTH_32BIT:746 bytes *= 4;747 break;748 }749 return bytes;750}751 752/* The channel should be paused when calling this */753static u32 pl08x_getbytes_chan(struct pl08x_dma_chan *plchan)754{755 struct pl08x_driver_data *pl08x = plchan->host;756 const u32 *llis_va, *llis_va_limit;757 struct pl08x_phy_chan *ch;758 dma_addr_t llis_bus;759 struct pl08x_txd *txd;760 u32 llis_max_words;761 size_t bytes;762 u32 clli;763 764 ch = plchan->phychan;765 txd = plchan->at;766 767 if (!ch || !txd)768 return 0;769 770 /*771 * Follow the LLIs to get the number of remaining772 * bytes in the currently active transaction.773 */774 clli = readl(ch->reg_lli) & ~PL080_LLI_LM_AHB2;775 776 /* First get the remaining bytes in the active transfer */777 bytes = get_bytes_in_phy_channel(ch);778 779 if (!clli)780 return bytes;781 782 llis_va = txd->llis_va;783 llis_bus = txd->llis_bus;784 785 llis_max_words = pl08x->lli_words * MAX_NUM_TSFR_LLIS;786 BUG_ON(clli < llis_bus || clli >= llis_bus +787 sizeof(u32) * llis_max_words);788 789 /*790 * Locate the next LLI - as this is an array,791 * it's simple maths to find.792 */793 llis_va += (clli - llis_bus) / sizeof(u32);794 795 llis_va_limit = llis_va + llis_max_words;796 797 for (; llis_va < llis_va_limit; llis_va += pl08x->lli_words) {798 bytes += get_bytes_in_lli(ch, llis_va);799 800 /*801 * A LLI pointer going backward terminates the LLI list802 */803 if (llis_va[PL080_LLI_LLI] <= clli)804 break;805 }806 807 return bytes;808}809 810/*811 * Allocate a physical channel for a virtual channel812 *813 * Try to locate a physical channel to be used for this transfer. If all814 * are taken return NULL and the requester will have to cope by using815 * some fallback PIO mode or retrying later.816 */817static struct pl08x_phy_chan *818pl08x_get_phy_channel(struct pl08x_driver_data *pl08x,819 struct pl08x_dma_chan *virt_chan)820{821 struct pl08x_phy_chan *ch = NULL;822 unsigned long flags;823 int i;824 825 for (i = 0; i < pl08x->vd->channels; i++) {826 ch = &pl08x->phy_chans[i];827 828 spin_lock_irqsave(&ch->lock, flags);829 830 if (!ch->locked && !ch->serving) {831 ch->serving = virt_chan;832 spin_unlock_irqrestore(&ch->lock, flags);833 break;834 }835 836 spin_unlock_irqrestore(&ch->lock, flags);837 }838 839 if (i == pl08x->vd->channels) {840 /* No physical channel available, cope with it */841 return NULL;842 }843 844 return ch;845}846 847/* Mark the physical channel as free. Note, this write is atomic. */848static inline void pl08x_put_phy_channel(struct pl08x_driver_data *pl08x,849 struct pl08x_phy_chan *ch)850{851 ch->serving = NULL;852}853 854/*855 * Try to allocate a physical channel. When successful, assign it to856 * this virtual channel, and initiate the next descriptor. The857 * virtual channel lock must be held at this point.858 */859static void pl08x_phy_alloc_and_start(struct pl08x_dma_chan *plchan)860{861 struct pl08x_driver_data *pl08x = plchan->host;862 struct pl08x_phy_chan *ch;863 864 ch = pl08x_get_phy_channel(pl08x, plchan);865 if (!ch) {866 dev_dbg(&pl08x->adev->dev, "no physical channel available for xfer on %s\n", plchan->name);867 plchan->state = PL08X_CHAN_WAITING;868 plchan->waiting_at = jiffies;869 return;870 }871 872 dev_dbg(&pl08x->adev->dev, "allocated physical channel %d for xfer on %s\n",873 ch->id, plchan->name);874 875 plchan->phychan = ch;876 plchan->state = PL08X_CHAN_RUNNING;877 pl08x_start_next_txd(plchan);878}879 880static void pl08x_phy_reassign_start(struct pl08x_phy_chan *ch,881 struct pl08x_dma_chan *plchan)882{883 struct pl08x_driver_data *pl08x = plchan->host;884 885 dev_dbg(&pl08x->adev->dev, "reassigned physical channel %d for xfer on %s\n",886 ch->id, plchan->name);887 888 /*889 * We do this without taking the lock; we're really only concerned890 * about whether this pointer is NULL or not, and we're guaranteed891 * that this will only be called when it _already_ is non-NULL.892 */893 ch->serving = plchan;894 plchan->phychan = ch;895 plchan->state = PL08X_CHAN_RUNNING;896 pl08x_start_next_txd(plchan);897}898 899/*900 * Free a physical DMA channel, potentially reallocating it to another901 * virtual channel if we have any pending.902 */903static void pl08x_phy_free(struct pl08x_dma_chan *plchan)904{905 struct pl08x_driver_data *pl08x = plchan->host;906 struct pl08x_dma_chan *p, *next;907 unsigned long waiting_at;908 retry:909 next = NULL;910 waiting_at = jiffies;911 912 /*913 * Find a waiting virtual channel for the next transfer.914 * To be fair, time when each channel reached waiting state is compared915 * to select channel that is waiting for the longest time.916 */917 list_for_each_entry(p, &pl08x->memcpy.channels, vc.chan.device_node)918 if (p->state == PL08X_CHAN_WAITING &&919 p->waiting_at <= waiting_at) {920 next = p;921 waiting_at = p->waiting_at;922 }923 924 if (!next && pl08x->has_slave) {925 list_for_each_entry(p, &pl08x->slave.channels, vc.chan.device_node)926 if (p->state == PL08X_CHAN_WAITING &&927 p->waiting_at <= waiting_at) {928 next = p;929 waiting_at = p->waiting_at;930 }931 }932 933 /* Ensure that the physical channel is stopped */934 pl08x_terminate_phy_chan(pl08x, plchan->phychan);935 936 if (next) {937 bool success;938 939 /*940 * Eww. We know this isn't going to deadlock941 * but lockdep probably doesn't.942 */943 spin_lock(&next->vc.lock);944 /* Re-check the state now that we have the lock */945 success = next->state == PL08X_CHAN_WAITING;946 if (success)947 pl08x_phy_reassign_start(plchan->phychan, next);948 spin_unlock(&next->vc.lock);949 950 /* If the state changed, try to find another channel */951 if (!success)952 goto retry;953 } else {954 /* No more jobs, so free up the physical channel */955 pl08x_put_phy_channel(pl08x, plchan->phychan);956 }957 958 plchan->phychan = NULL;959 plchan->state = PL08X_CHAN_IDLE;960}961 962/*963 * LLI handling964 */965 966static inline unsigned int967pl08x_get_bytes_for_lli(struct pl08x_driver_data *pl08x,968 u32 cctl,969 bool source)970{971 u32 val;972 973 if (pl08x->vd->ftdmac020) {974 if (source)975 val = (cctl & FTDMAC020_LLI_SRC_WIDTH_MSK) >>976 FTDMAC020_LLI_SRC_WIDTH_SHIFT;977 else978 val = (cctl & FTDMAC020_LLI_DST_WIDTH_MSK) >>979 FTDMAC020_LLI_DST_WIDTH_SHIFT;980 } else {981 if (source)982 val = (cctl & PL080_CONTROL_SWIDTH_MASK) >>983 PL080_CONTROL_SWIDTH_SHIFT;984 else985 val = (cctl & PL080_CONTROL_DWIDTH_MASK) >>986 PL080_CONTROL_DWIDTH_SHIFT;987 }988 989 switch (val) {990 case PL080_WIDTH_8BIT:991 return 1;992 case PL080_WIDTH_16BIT:993 return 2;994 case PL080_WIDTH_32BIT:995 return 4;996 default:997 break;998 }999 BUG();1000 return 0;1001}1002 1003static inline u32 pl08x_lli_control_bits(struct pl08x_driver_data *pl08x,1004 u32 cctl,1005 u8 srcwidth, u8 dstwidth,1006 size_t tsize)1007{1008 u32 retbits = cctl;1009 1010 /*1011 * Remove all src, dst and transfer size bits, then set the1012 * width and size according to the parameters. The bit offsets1013 * are different in the FTDMAC020 so we need to accound for this.1014 */1015 if (pl08x->vd->ftdmac020) {1016 retbits &= ~FTDMAC020_LLI_DST_WIDTH_MSK;1017 retbits &= ~FTDMAC020_LLI_SRC_WIDTH_MSK;1018 retbits &= ~FTDMAC020_LLI_TRANSFER_SIZE_MASK;1019 1020 switch (srcwidth) {1021 case 1:1022 retbits |= PL080_WIDTH_8BIT <<1023 FTDMAC020_LLI_SRC_WIDTH_SHIFT;1024 break;1025 case 2:1026 retbits |= PL080_WIDTH_16BIT <<1027 FTDMAC020_LLI_SRC_WIDTH_SHIFT;1028 break;1029 case 4:1030 retbits |= PL080_WIDTH_32BIT <<1031 FTDMAC020_LLI_SRC_WIDTH_SHIFT;1032 break;1033 default:1034 BUG();1035 break;1036 }1037 1038 switch (dstwidth) {1039 case 1:1040 retbits |= PL080_WIDTH_8BIT <<1041 FTDMAC020_LLI_DST_WIDTH_SHIFT;1042 break;1043 case 2:1044 retbits |= PL080_WIDTH_16BIT <<1045 FTDMAC020_LLI_DST_WIDTH_SHIFT;1046 break;1047 case 4:1048 retbits |= PL080_WIDTH_32BIT <<1049 FTDMAC020_LLI_DST_WIDTH_SHIFT;1050 break;1051 default:1052 BUG();1053 break;1054 }1055 1056 tsize &= FTDMAC020_LLI_TRANSFER_SIZE_MASK;1057 retbits |= tsize << FTDMAC020_LLI_TRANSFER_SIZE_SHIFT;1058 } else {1059 retbits &= ~PL080_CONTROL_DWIDTH_MASK;1060 retbits &= ~PL080_CONTROL_SWIDTH_MASK;1061 retbits &= ~PL080_CONTROL_TRANSFER_SIZE_MASK;1062 1063 switch (srcwidth) {1064 case 1:1065 retbits |= PL080_WIDTH_8BIT <<1066 PL080_CONTROL_SWIDTH_SHIFT;1067 break;1068 case 2:1069 retbits |= PL080_WIDTH_16BIT <<1070 PL080_CONTROL_SWIDTH_SHIFT;1071 break;1072 case 4:1073 retbits |= PL080_WIDTH_32BIT <<1074 PL080_CONTROL_SWIDTH_SHIFT;1075 break;1076 default:1077 BUG();1078 break;1079 }1080 1081 switch (dstwidth) {1082 case 1:1083 retbits |= PL080_WIDTH_8BIT <<1084 PL080_CONTROL_DWIDTH_SHIFT;1085 break;1086 case 2:1087 retbits |= PL080_WIDTH_16BIT <<1088 PL080_CONTROL_DWIDTH_SHIFT;1089 break;1090 case 4:1091 retbits |= PL080_WIDTH_32BIT <<1092 PL080_CONTROL_DWIDTH_SHIFT;1093 break;1094 default:1095 BUG();1096 break;1097 }1098 1099 tsize &= PL080_CONTROL_TRANSFER_SIZE_MASK;1100 retbits |= tsize << PL080_CONTROL_TRANSFER_SIZE_SHIFT;1101 }1102 1103 return retbits;1104}1105 1106struct pl08x_lli_build_data {1107 struct pl08x_txd *txd;1108 struct pl08x_bus_data srcbus;1109 struct pl08x_bus_data dstbus;1110 size_t remainder;1111 u32 lli_bus;1112};1113 1114/*1115 * Autoselect a master bus to use for the transfer. Slave will be the chosen as1116 * victim in case src & dest are not similarly aligned. i.e. If after aligning1117 * masters address with width requirements of transfer (by sending few byte by1118 * byte data), slave is still not aligned, then its width will be reduced to1119 * BYTE.1120 * - prefers the destination bus if both available1121 * - prefers bus with fixed address (i.e. peripheral)1122 */1123static void pl08x_choose_master_bus(struct pl08x_driver_data *pl08x,1124 struct pl08x_lli_build_data *bd,1125 struct pl08x_bus_data **mbus,1126 struct pl08x_bus_data **sbus,1127 u32 cctl)1128{1129 bool dst_incr;1130 bool src_incr;1131 1132 /*1133 * The FTDMAC020 only supports memory-to-memory transfer, so1134 * source and destination always increase.1135 */1136 if (pl08x->vd->ftdmac020) {1137 dst_incr = true;1138 src_incr = true;1139 } else {1140 dst_incr = !!(cctl & PL080_CONTROL_DST_INCR);1141 src_incr = !!(cctl & PL080_CONTROL_SRC_INCR);1142 }1143 1144 /*1145 * If either bus is not advancing, i.e. it is a peripheral, that1146 * one becomes master1147 */1148 if (!dst_incr) {1149 *mbus = &bd->dstbus;1150 *sbus = &bd->srcbus;1151 } else if (!src_incr) {1152 *mbus = &bd->srcbus;1153 *sbus = &bd->dstbus;1154 } else {1155 if (bd->dstbus.buswidth >= bd->srcbus.buswidth) {1156 *mbus = &bd->dstbus;1157 *sbus = &bd->srcbus;1158 } else {1159 *mbus = &bd->srcbus;1160 *sbus = &bd->dstbus;1161 }1162 }1163}1164 1165/*1166 * Fills in one LLI for a certain transfer descriptor and advance the counter1167 */1168static void pl08x_fill_lli_for_desc(struct pl08x_driver_data *pl08x,1169 struct pl08x_lli_build_data *bd,1170 int num_llis, int len, u32 cctl, u32 cctl2)1171{1172 u32 offset = num_llis * pl08x->lli_words;1173 u32 *llis_va = bd->txd->llis_va + offset;1174 dma_addr_t llis_bus = bd->txd->llis_bus;1175 1176 BUG_ON(num_llis >= MAX_NUM_TSFR_LLIS);1177 1178 /* Advance the offset to next LLI. */1179 offset += pl08x->lli_words;1180 1181 llis_va[PL080_LLI_SRC] = bd->srcbus.addr;1182 llis_va[PL080_LLI_DST] = bd->dstbus.addr;1183 llis_va[PL080_LLI_LLI] = (llis_bus + sizeof(u32) * offset);1184 llis_va[PL080_LLI_LLI] |= bd->lli_bus;1185 llis_va[PL080_LLI_CCTL] = cctl;1186 if (pl08x->vd->pl080s)1187 llis_va[PL080S_LLI_CCTL2] = cctl2;1188 1189 if (pl08x->vd->ftdmac020) {1190 /* FIXME: only memcpy so far so both increase */1191 bd->srcbus.addr += len;1192 bd->dstbus.addr += len;1193 } else {1194 if (cctl & PL080_CONTROL_SRC_INCR)1195 bd->srcbus.addr += len;1196 if (cctl & PL080_CONTROL_DST_INCR)1197 bd->dstbus.addr += len;1198 }1199 1200 BUG_ON(bd->remainder < len);1201 1202 bd->remainder -= len;1203}1204 1205static inline void prep_byte_width_lli(struct pl08x_driver_data *pl08x,1206 struct pl08x_lli_build_data *bd, u32 *cctl, u32 len,1207 int num_llis, size_t *total_bytes)1208{1209 *cctl = pl08x_lli_control_bits(pl08x, *cctl, 1, 1, len);1210 pl08x_fill_lli_for_desc(pl08x, bd, num_llis, len, *cctl, len);1211 (*total_bytes) += len;1212}1213 1214#if 11215static void pl08x_dump_lli(struct pl08x_driver_data *pl08x,1216 const u32 *llis_va, int num_llis)1217{1218 int i;1219 1220 if (pl08x->vd->pl080s) {1221 dev_vdbg(&pl08x->adev->dev,1222 "%-3s %-9s %-10s %-10s %-10s %-10s %s\n",1223 "lli", "", "csrc", "cdst", "clli", "cctl", "cctl2");1224 for (i = 0; i < num_llis; i++) {1225 dev_vdbg(&pl08x->adev->dev,1226 "%3d @%p: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",1227 i, llis_va, llis_va[PL080_LLI_SRC],1228 llis_va[PL080_LLI_DST], llis_va[PL080_LLI_LLI],1229 llis_va[PL080_LLI_CCTL],1230 llis_va[PL080S_LLI_CCTL2]);1231 llis_va += pl08x->lli_words;1232 }1233 } else {1234 dev_vdbg(&pl08x->adev->dev,1235 "%-3s %-9s %-10s %-10s %-10s %s\n",1236 "lli", "", "csrc", "cdst", "clli", "cctl");1237 for (i = 0; i < num_llis; i++) {1238 dev_vdbg(&pl08x->adev->dev,1239 "%3d @%p: 0x%08x 0x%08x 0x%08x 0x%08x\n",1240 i, llis_va, llis_va[PL080_LLI_SRC],1241 llis_va[PL080_LLI_DST], llis_va[PL080_LLI_LLI],1242 llis_va[PL080_LLI_CCTL]);1243 llis_va += pl08x->lli_words;1244 }1245 }1246}1247#else1248static inline void pl08x_dump_lli(struct pl08x_driver_data *pl08x,1249 const u32 *llis_va, int num_llis) {}1250#endif1251 1252/*1253 * This fills in the table of LLIs for the transfer descriptor1254 * Note that we assume we never have to change the burst sizes1255 * Return 0 for error1256 */1257static int pl08x_fill_llis_for_desc(struct pl08x_driver_data *pl08x,1258 struct pl08x_txd *txd)1259{1260 struct pl08x_bus_data *mbus, *sbus;1261 struct pl08x_lli_build_data bd;1262 int num_llis = 0;1263 u32 cctl, early_bytes = 0;1264 size_t max_bytes_per_lli, total_bytes;1265 u32 *llis_va, *last_lli;1266 struct pl08x_sg *dsg;1267 1268 txd->llis_va = dma_pool_alloc(pl08x->pool, GFP_NOWAIT, &txd->llis_bus);1269 if (!txd->llis_va) {1270 dev_err(&pl08x->adev->dev, "%s no memory for llis\n", __func__);1271 return 0;1272 }1273 1274 bd.txd = txd;1275 bd.lli_bus = (pl08x->lli_buses & PL08X_AHB2) ? PL080_LLI_LM_AHB2 : 0;1276 cctl = txd->cctl;1277 1278 /* Find maximum width of the source bus */1279 bd.srcbus.maxwidth = pl08x_get_bytes_for_lli(pl08x, cctl, true);1280 1281 /* Find maximum width of the destination bus */1282 bd.dstbus.maxwidth = pl08x_get_bytes_for_lli(pl08x, cctl, false);1283 1284 list_for_each_entry(dsg, &txd->dsg_list, node) {1285 total_bytes = 0;1286 cctl = txd->cctl;1287 1288 bd.srcbus.addr = dsg->src_addr;1289 bd.dstbus.addr = dsg->dst_addr;1290 bd.remainder = dsg->len;1291 bd.srcbus.buswidth = bd.srcbus.maxwidth;1292 bd.dstbus.buswidth = bd.dstbus.maxwidth;1293 1294 pl08x_choose_master_bus(pl08x, &bd, &mbus, &sbus, cctl);1295 1296 dev_vdbg(&pl08x->adev->dev,1297 "src=0x%08llx%s/%u dst=0x%08llx%s/%u len=%zu\n",1298 (u64)bd.srcbus.addr,1299 cctl & PL080_CONTROL_SRC_INCR ? "+" : "",1300 bd.srcbus.buswidth,1301 (u64)bd.dstbus.addr,1302 cctl & PL080_CONTROL_DST_INCR ? "+" : "",1303 bd.dstbus.buswidth,1304 bd.remainder);1305 dev_vdbg(&pl08x->adev->dev, "mbus=%s sbus=%s\n",1306 mbus == &bd.srcbus ? "src" : "dst",1307 sbus == &bd.srcbus ? "src" : "dst");1308 1309 /*1310 * Zero length is only allowed if all these requirements are1311 * met:1312 * - flow controller is peripheral.1313 * - src.addr is aligned to src.width1314 * - dst.addr is aligned to dst.width1315 *1316 * sg_len == 1 should be true, as there can be two cases here:1317 *1318 * - Memory addresses are contiguous and are not scattered.1319 * Here, Only one sg will be passed by user driver, with1320 * memory address and zero length. We pass this to controller1321 * and after the transfer it will receive the last burst1322 * request from peripheral and so transfer finishes.1323 *1324 * - Memory addresses are scattered and are not contiguous.1325 * Here, Obviously as DMA controller doesn't know when a lli's1326 * transfer gets over, it can't load next lli. So in this1327 * case, there has to be an assumption that only one lli is1328 * supported. Thus, we can't have scattered addresses.1329 */1330 if (!bd.remainder) {1331 u32 fc;1332 1333 /* FTDMAC020 only does memory-to-memory */1334 if (pl08x->vd->ftdmac020)1335 fc = PL080_FLOW_MEM2MEM;1336 else1337 fc = (txd->ccfg & PL080_CONFIG_FLOW_CONTROL_MASK) >>1338 PL080_CONFIG_FLOW_CONTROL_SHIFT;1339 if (!((fc >= PL080_FLOW_SRC2DST_DST) &&1340 (fc <= PL080_FLOW_SRC2DST_SRC))) {1341 dev_err(&pl08x->adev->dev, "%s sg len can't be zero",1342 __func__);1343 return 0;1344 }1345 1346 if (!IS_BUS_ALIGNED(&bd.srcbus) ||1347 !IS_BUS_ALIGNED(&bd.dstbus)) {1348 dev_err(&pl08x->adev->dev,1349 "%s src & dst address must be aligned to src"1350 " & dst width if peripheral is flow controller",1351 __func__);1352 return 0;1353 }1354 1355 cctl = pl08x_lli_control_bits(pl08x, cctl,1356 bd.srcbus.buswidth, bd.dstbus.buswidth,1357 0);1358 pl08x_fill_lli_for_desc(pl08x, &bd, num_llis++,1359 0, cctl, 0);1360 break;1361 }1362 1363 /*1364 * Send byte by byte for following cases1365 * - Less than a bus width available1366 * - until master bus is aligned1367 */1368 if (bd.remainder < mbus->buswidth)1369 early_bytes = bd.remainder;1370 else if (!IS_BUS_ALIGNED(mbus)) {1371 early_bytes = mbus->buswidth -1372 (mbus->addr & (mbus->buswidth - 1));1373 if ((bd.remainder - early_bytes) < mbus->buswidth)1374 early_bytes = bd.remainder;1375 }1376 1377 if (early_bytes) {1378 dev_vdbg(&pl08x->adev->dev,1379 "%s byte width LLIs (remain 0x%08zx)\n",1380 __func__, bd.remainder);1381 prep_byte_width_lli(pl08x, &bd, &cctl, early_bytes,1382 num_llis++, &total_bytes);1383 }1384 1385 if (bd.remainder) {1386 /*1387 * Master now aligned1388 * - if slave is not then we must set its width down1389 */1390 if (!IS_BUS_ALIGNED(sbus)) {1391 dev_dbg(&pl08x->adev->dev,1392 "%s set down bus width to one byte\n",1393 __func__);1394 1395 sbus->buswidth = 1;1396 }1397 1398 /*1399 * Bytes transferred = tsize * src width, not1400 * MIN(buswidths)1401 */1402 max_bytes_per_lli = bd.srcbus.buswidth *1403 pl08x->vd->max_transfer_size;1404 dev_vdbg(&pl08x->adev->dev,1405 "%s max bytes per lli = %zu\n",1406 __func__, max_bytes_per_lli);1407 1408 /*1409 * Make largest possible LLIs until less than one bus1410 * width left1411 */1412 while (bd.remainder > (mbus->buswidth - 1)) {1413 size_t lli_len, tsize, width;1414 1415 /*1416 * If enough left try to send max possible,1417 * otherwise try to send the remainder1418 */1419 lli_len = min(bd.remainder, max_bytes_per_lli);1420 1421 /*1422 * Check against maximum bus alignment:1423 * Calculate actual transfer size in relation to1424 * bus width an get a maximum remainder of the1425 * highest bus width - 11426 */1427 width = max(mbus->buswidth, sbus->buswidth);1428 lli_len = (lli_len / width) * width;1429 tsize = lli_len / bd.srcbus.buswidth;1430 1431 dev_vdbg(&pl08x->adev->dev,1432 "%s fill lli with single lli chunk of "1433 "size 0x%08zx (remainder 0x%08zx)\n",1434 __func__, lli_len, bd.remainder);1435 1436 cctl = pl08x_lli_control_bits(pl08x, cctl,1437 bd.srcbus.buswidth, bd.dstbus.buswidth,1438 tsize);1439 pl08x_fill_lli_for_desc(pl08x, &bd, num_llis++,1440 lli_len, cctl, tsize);1441 total_bytes += lli_len;1442 }1443 1444 /*1445 * Send any odd bytes1446 */1447 if (bd.remainder) {1448 dev_vdbg(&pl08x->adev->dev,1449 "%s align with boundary, send odd bytes (remain %zu)\n",1450 __func__, bd.remainder);1451 prep_byte_width_lli(pl08x, &bd, &cctl,1452 bd.remainder, num_llis++, &total_bytes);1453 }1454 }1455 1456 if (total_bytes != dsg->len) {1457 dev_err(&pl08x->adev->dev,1458 "%s size of encoded lli:s don't match total txd, transferred 0x%08zx from size 0x%08zx\n",1459 __func__, total_bytes, dsg->len);1460 return 0;1461 }1462 1463 if (num_llis >= MAX_NUM_TSFR_LLIS) {1464 dev_err(&pl08x->adev->dev,1465 "%s need to increase MAX_NUM_TSFR_LLIS from 0x%08x\n",1466 __func__, MAX_NUM_TSFR_LLIS);1467 return 0;1468 }1469 }1470 1471 llis_va = txd->llis_va;1472 last_lli = llis_va + (num_llis - 1) * pl08x->lli_words;1473 1474 if (txd->cyclic) {1475 /* Link back to the first LLI. */1476 last_lli[PL080_LLI_LLI] = txd->llis_bus | bd.lli_bus;1477 } else {1478 /* The final LLI terminates the LLI. */1479 last_lli[PL080_LLI_LLI] = 0;1480 /* The final LLI element shall also fire an interrupt. */1481 if (pl08x->vd->ftdmac020)1482 last_lli[PL080_LLI_CCTL] &= ~FTDMAC020_LLI_TC_MSK;1483 else1484 last_lli[PL080_LLI_CCTL] |= PL080_CONTROL_TC_IRQ_EN;1485 }1486 1487 pl08x_dump_lli(pl08x, llis_va, num_llis);1488 1489 return num_llis;1490}1491 1492static void pl08x_free_txd(struct pl08x_driver_data *pl08x,1493 struct pl08x_txd *txd)1494{1495 struct pl08x_sg *dsg, *_dsg;1496 1497 if (txd->llis_va)1498 dma_pool_free(pl08x->pool, txd->llis_va, txd->llis_bus);1499 1500 list_for_each_entry_safe(dsg, _dsg, &txd->dsg_list, node) {1501 list_del(&dsg->node);1502 kfree(dsg);1503 }1504 1505 kfree(txd);1506}1507 1508static void pl08x_desc_free(struct virt_dma_desc *vd)1509{1510 struct pl08x_txd *txd = to_pl08x_txd(&vd->tx);1511 struct pl08x_dma_chan *plchan = to_pl08x_chan(vd->tx.chan);1512 1513 dma_descriptor_unmap(&vd->tx);1514 if (!txd->done)1515 pl08x_release_mux(plchan);1516 1517 pl08x_free_txd(plchan->host, txd);1518}1519 1520static void pl08x_free_txd_list(struct pl08x_driver_data *pl08x,1521 struct pl08x_dma_chan *plchan)1522{1523 LIST_HEAD(head);1524 1525 vchan_get_all_descriptors(&plchan->vc, &head);1526 vchan_dma_desc_free_list(&plchan->vc, &head);1527}1528 1529/*1530 * The DMA ENGINE API1531 */1532static void pl08x_free_chan_resources(struct dma_chan *chan)1533{1534 /* Ensure all queued descriptors are freed */1535 vchan_free_chan_resources(to_virt_chan(chan));1536}1537 1538/*1539 * Code accessing dma_async_is_complete() in a tight loop may give problems.1540 * If slaves are relying on interrupts to signal completion this function1541 * must not be called with interrupts disabled.1542 */1543static enum dma_status pl08x_dma_tx_status(struct dma_chan *chan,1544 dma_cookie_t cookie, struct dma_tx_state *txstate)1545{1546 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);1547 struct virt_dma_desc *vd;1548 unsigned long flags;1549 enum dma_status ret;1550 size_t bytes = 0;1551 1552 ret = dma_cookie_status(chan, cookie, txstate);1553 if (ret == DMA_COMPLETE)1554 return ret;1555 1556 /*1557 * There's no point calculating the residue if there's1558 * no txstate to store the value.1559 */1560 if (!txstate) {1561 if (plchan->state == PL08X_CHAN_PAUSED)1562 ret = DMA_PAUSED;1563 return ret;1564 }1565 1566 spin_lock_irqsave(&plchan->vc.lock, flags);1567 ret = dma_cookie_status(chan, cookie, txstate);1568 if (ret != DMA_COMPLETE) {1569 vd = vchan_find_desc(&plchan->vc, cookie);1570 if (vd) {1571 /* On the issued list, so hasn't been processed yet */1572 struct pl08x_txd *txd = to_pl08x_txd(&vd->tx);1573 struct pl08x_sg *dsg;1574 1575 list_for_each_entry(dsg, &txd->dsg_list, node)1576 bytes += dsg->len;1577 } else {1578 bytes = pl08x_getbytes_chan(plchan);1579 }1580 }1581 spin_unlock_irqrestore(&plchan->vc.lock, flags);1582 1583 /*1584 * This cookie not complete yet1585 * Get number of bytes left in the active transactions and queue1586 */1587 dma_set_residue(txstate, bytes);1588 1589 if (plchan->state == PL08X_CHAN_PAUSED && ret == DMA_IN_PROGRESS)1590 ret = DMA_PAUSED;1591 1592 /* Whether waiting or running, we're in progress */1593 return ret;1594}1595 1596/* PrimeCell DMA extension */1597struct burst_table {1598 u32 burstwords;1599 u32 reg;1600};1601 1602static const struct burst_table burst_sizes[] = {1603 {1604 .burstwords = 256,1605 .reg = PL080_BSIZE_256,1606 },1607 {1608 .burstwords = 128,1609 .reg = PL080_BSIZE_128,1610 },1611 {1612 .burstwords = 64,1613 .reg = PL080_BSIZE_64,1614 },1615 {1616 .burstwords = 32,1617 .reg = PL080_BSIZE_32,1618 },1619 {1620 .burstwords = 16,1621 .reg = PL080_BSIZE_16,1622 },1623 {1624 .burstwords = 8,1625 .reg = PL080_BSIZE_8,1626 },1627 {1628 .burstwords = 4,1629 .reg = PL080_BSIZE_4,1630 },1631 {1632 .burstwords = 0,1633 .reg = PL080_BSIZE_1,1634 },1635};1636 1637/*1638 * Given the source and destination available bus masks, select which1639 * will be routed to each port. We try to have source and destination1640 * on separate ports, but always respect the allowable settings.1641 */1642static u32 pl08x_select_bus(bool ftdmac020, u8 src, u8 dst)1643{1644 u32 cctl = 0;1645 u32 dst_ahb2;1646 u32 src_ahb2;1647 1648 /* The FTDMAC020 use different bits to indicate src/dst bus */1649 if (ftdmac020) {1650 dst_ahb2 = FTDMAC020_LLI_DST_SEL;1651 src_ahb2 = FTDMAC020_LLI_SRC_SEL;1652 } else {1653 dst_ahb2 = PL080_CONTROL_DST_AHB2;1654 src_ahb2 = PL080_CONTROL_SRC_AHB2;1655 }1656 1657 if (!(dst & PL08X_AHB1) || ((dst & PL08X_AHB2) && (src & PL08X_AHB1)))1658 cctl |= dst_ahb2;1659 if (!(src & PL08X_AHB1) || ((src & PL08X_AHB2) && !(dst & PL08X_AHB2)))1660 cctl |= src_ahb2;1661 1662 return cctl;1663}1664 1665static u32 pl08x_cctl(u32 cctl)1666{1667 cctl &= ~(PL080_CONTROL_SRC_AHB2 | PL080_CONTROL_DST_AHB2 |1668 PL080_CONTROL_SRC_INCR | PL080_CONTROL_DST_INCR |1669 PL080_CONTROL_PROT_MASK);1670 1671 /* Access the cell in privileged mode, non-bufferable, non-cacheable */1672 return cctl | PL080_CONTROL_PROT_SYS;1673}1674 1675static u32 pl08x_width(enum dma_slave_buswidth width)1676{1677 switch (width) {1678 case DMA_SLAVE_BUSWIDTH_1_BYTE:1679 return PL080_WIDTH_8BIT;1680 case DMA_SLAVE_BUSWIDTH_2_BYTES:1681 return PL080_WIDTH_16BIT;1682 case DMA_SLAVE_BUSWIDTH_4_BYTES:1683 return PL080_WIDTH_32BIT;1684 default:1685 return ~0;1686 }1687}1688 1689static u32 pl08x_burst(u32 maxburst)1690{1691 int i;1692 1693 for (i = 0; i < ARRAY_SIZE(burst_sizes); i++)1694 if (burst_sizes[i].burstwords <= maxburst)1695 break;1696 1697 return burst_sizes[i].reg;1698}1699 1700static u32 pl08x_get_cctl(struct pl08x_dma_chan *plchan,1701 enum dma_slave_buswidth addr_width, u32 maxburst)1702{1703 u32 width, burst, cctl = 0;1704 1705 width = pl08x_width(addr_width);1706 if (width == ~0)1707 return ~0;1708 1709 cctl |= width << PL080_CONTROL_SWIDTH_SHIFT;1710 cctl |= width << PL080_CONTROL_DWIDTH_SHIFT;1711 1712 /*1713 * If this channel will only request single transfers, set this1714 * down to ONE element. Also select one element if no maxburst1715 * is specified.1716 */1717 if (plchan->cd->single)1718 maxburst = 1;1719 1720 burst = pl08x_burst(maxburst);1721 cctl |= burst << PL080_CONTROL_SB_SIZE_SHIFT;1722 cctl |= burst << PL080_CONTROL_DB_SIZE_SHIFT;1723 1724 return pl08x_cctl(cctl);1725}1726 1727/*1728 * Slave transactions callback to the slave device to allow1729 * synchronization of slave DMA signals with the DMAC enable1730 */1731static void pl08x_issue_pending(struct dma_chan *chan)1732{1733 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);1734 unsigned long flags;1735 1736 spin_lock_irqsave(&plchan->vc.lock, flags);1737 if (vchan_issue_pending(&plchan->vc)) {1738 if (!plchan->phychan && plchan->state != PL08X_CHAN_WAITING)1739 pl08x_phy_alloc_and_start(plchan);1740 }1741 spin_unlock_irqrestore(&plchan->vc.lock, flags);1742}1743 1744static struct pl08x_txd *pl08x_get_txd(struct pl08x_dma_chan *plchan)1745{1746 struct pl08x_txd *txd = kzalloc(sizeof(*txd), GFP_NOWAIT);1747 1748 if (txd)1749 INIT_LIST_HEAD(&txd->dsg_list);1750 return txd;1751}1752 1753static u32 pl08x_memcpy_cctl(struct pl08x_driver_data *pl08x)1754{1755 u32 cctl = 0;1756 1757 /* Conjure cctl */1758 switch (pl08x->pd->memcpy_burst_size) {1759 default:1760 dev_err(&pl08x->adev->dev,1761 "illegal burst size for memcpy, set to 1\n");1762 fallthrough;1763 case PL08X_BURST_SZ_1:1764 cctl |= PL080_BSIZE_1 << PL080_CONTROL_SB_SIZE_SHIFT |1765 PL080_BSIZE_1 << PL080_CONTROL_DB_SIZE_SHIFT;1766 break;1767 case PL08X_BURST_SZ_4:1768 cctl |= PL080_BSIZE_4 << PL080_CONTROL_SB_SIZE_SHIFT |1769 PL080_BSIZE_4 << PL080_CONTROL_DB_SIZE_SHIFT;1770 break;1771 case PL08X_BURST_SZ_8:1772 cctl |= PL080_BSIZE_8 << PL080_CONTROL_SB_SIZE_SHIFT |1773 PL080_BSIZE_8 << PL080_CONTROL_DB_SIZE_SHIFT;1774 break;1775 case PL08X_BURST_SZ_16:1776 cctl |= PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT |1777 PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT;1778 break;1779 case PL08X_BURST_SZ_32:1780 cctl |= PL080_BSIZE_32 << PL080_CONTROL_SB_SIZE_SHIFT |1781 PL080_BSIZE_32 << PL080_CONTROL_DB_SIZE_SHIFT;1782 break;1783 case PL08X_BURST_SZ_64:1784 cctl |= PL080_BSIZE_64 << PL080_CONTROL_SB_SIZE_SHIFT |1785 PL080_BSIZE_64 << PL080_CONTROL_DB_SIZE_SHIFT;1786 break;1787 case PL08X_BURST_SZ_128:1788 cctl |= PL080_BSIZE_128 << PL080_CONTROL_SB_SIZE_SHIFT |1789 PL080_BSIZE_128 << PL080_CONTROL_DB_SIZE_SHIFT;1790 break;1791 case PL08X_BURST_SZ_256:1792 cctl |= PL080_BSIZE_256 << PL080_CONTROL_SB_SIZE_SHIFT |1793 PL080_BSIZE_256 << PL080_CONTROL_DB_SIZE_SHIFT;1794 break;1795 }1796 1797 switch (pl08x->pd->memcpy_bus_width) {1798 default:1799 dev_err(&pl08x->adev->dev,1800 "illegal bus width for memcpy, set to 8 bits\n");1801 fallthrough;1802 case PL08X_BUS_WIDTH_8_BITS:1803 cctl |= PL080_WIDTH_8BIT << PL080_CONTROL_SWIDTH_SHIFT |1804 PL080_WIDTH_8BIT << PL080_CONTROL_DWIDTH_SHIFT;1805 break;1806 case PL08X_BUS_WIDTH_16_BITS:1807 cctl |= PL080_WIDTH_16BIT << PL080_CONTROL_SWIDTH_SHIFT |1808 PL080_WIDTH_16BIT << PL080_CONTROL_DWIDTH_SHIFT;1809 break;1810 case PL08X_BUS_WIDTH_32_BITS:1811 cctl |= PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT |1812 PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT;1813 break;1814 }1815 1816 /* Protection flags */1817 if (pl08x->pd->memcpy_prot_buff)1818 cctl |= PL080_CONTROL_PROT_BUFF;1819 if (pl08x->pd->memcpy_prot_cache)1820 cctl |= PL080_CONTROL_PROT_CACHE;1821 1822 /* We are the kernel, so we are in privileged mode */1823 cctl |= PL080_CONTROL_PROT_SYS;1824 1825 /* Both to be incremented or the code will break */1826 cctl |= PL080_CONTROL_SRC_INCR | PL080_CONTROL_DST_INCR;1827 1828 if (pl08x->vd->dualmaster)1829 cctl |= pl08x_select_bus(false,1830 pl08x->mem_buses,1831 pl08x->mem_buses);1832 1833 return cctl;1834}1835 1836static u32 pl08x_ftdmac020_memcpy_cctl(struct pl08x_driver_data *pl08x)1837{1838 u32 cctl = 0;1839 1840 /* Conjure cctl */1841 switch (pl08x->pd->memcpy_bus_width) {1842 default:1843 dev_err(&pl08x->adev->dev,1844 "illegal bus width for memcpy, set to 8 bits\n");1845 fallthrough;1846 case PL08X_BUS_WIDTH_8_BITS:1847 cctl |= PL080_WIDTH_8BIT << FTDMAC020_LLI_SRC_WIDTH_SHIFT |1848 PL080_WIDTH_8BIT << FTDMAC020_LLI_DST_WIDTH_SHIFT;1849 break;1850 case PL08X_BUS_WIDTH_16_BITS:1851 cctl |= PL080_WIDTH_16BIT << FTDMAC020_LLI_SRC_WIDTH_SHIFT |1852 PL080_WIDTH_16BIT << FTDMAC020_LLI_DST_WIDTH_SHIFT;1853 break;1854 case PL08X_BUS_WIDTH_32_BITS:1855 cctl |= PL080_WIDTH_32BIT << FTDMAC020_LLI_SRC_WIDTH_SHIFT |1856 PL080_WIDTH_32BIT << FTDMAC020_LLI_DST_WIDTH_SHIFT;1857 break;1858 }1859 1860 /*1861 * By default mask the TC IRQ on all LLIs, it will be unmasked on1862 * the last LLI item by other code.1863 */1864 cctl |= FTDMAC020_LLI_TC_MSK;1865 1866 /*1867 * Both to be incremented so leave bits FTDMAC020_LLI_SRCAD_CTL1868 * and FTDMAC020_LLI_DSTAD_CTL as zero1869 */1870 if (pl08x->vd->dualmaster)1871 cctl |= pl08x_select_bus(true,1872 pl08x->mem_buses,1873 pl08x->mem_buses);1874 1875 return cctl;1876}1877 1878/*1879 * Initialize a descriptor to be used by memcpy submit1880 */1881static struct dma_async_tx_descriptor *pl08x_prep_dma_memcpy(1882 struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,1883 size_t len, unsigned long flags)1884{1885 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);1886 struct pl08x_driver_data *pl08x = plchan->host;1887 struct pl08x_txd *txd;1888 struct pl08x_sg *dsg;1889 int ret;1890 1891 txd = pl08x_get_txd(plchan);1892 if (!txd) {1893 dev_err(&pl08x->adev->dev,1894 "%s no memory for descriptor\n", __func__);1895 return NULL;1896 }1897 1898 dsg = kzalloc(sizeof(struct pl08x_sg), GFP_NOWAIT);1899 if (!dsg) {1900 pl08x_free_txd(pl08x, txd);1901 return NULL;1902 }1903 list_add_tail(&dsg->node, &txd->dsg_list);1904 1905 dsg->src_addr = src;1906 dsg->dst_addr = dest;1907 dsg->len = len;1908 if (pl08x->vd->ftdmac020) {1909 /* Writing CCFG zero ENABLES all interrupts */1910 txd->ccfg = 0;1911 txd->cctl = pl08x_ftdmac020_memcpy_cctl(pl08x);1912 } else {1913 txd->ccfg = PL080_CONFIG_ERR_IRQ_MASK |1914 PL080_CONFIG_TC_IRQ_MASK |1915 PL080_FLOW_MEM2MEM << PL080_CONFIG_FLOW_CONTROL_SHIFT;1916 txd->cctl = pl08x_memcpy_cctl(pl08x);1917 }1918 1919 ret = pl08x_fill_llis_for_desc(plchan->host, txd);1920 if (!ret) {1921 pl08x_free_txd(pl08x, txd);1922 return NULL;1923 }1924 1925 return vchan_tx_prep(&plchan->vc, &txd->vd, flags);1926}1927 1928static struct pl08x_txd *pl08x_init_txd(1929 struct dma_chan *chan,1930 enum dma_transfer_direction direction,1931 dma_addr_t *slave_addr)1932{1933 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);1934 struct pl08x_driver_data *pl08x = plchan->host;1935 struct pl08x_txd *txd;1936 enum dma_slave_buswidth addr_width;1937 int ret, tmp;1938 u8 src_buses, dst_buses;1939 u32 maxburst, cctl;1940 1941 txd = pl08x_get_txd(plchan);1942 if (!txd) {1943 dev_err(&pl08x->adev->dev, "%s no txd\n", __func__);1944 return NULL;1945 }1946 1947 /*1948 * Set up addresses, the PrimeCell configured address1949 * will take precedence since this may configure the1950 * channel target address dynamically at runtime.1951 */1952 if (direction == DMA_MEM_TO_DEV) {1953 cctl = PL080_CONTROL_SRC_INCR;1954 *slave_addr = plchan->cfg.dst_addr;1955 addr_width = plchan->cfg.dst_addr_width;1956 maxburst = plchan->cfg.dst_maxburst;1957 src_buses = pl08x->mem_buses;1958 dst_buses = plchan->cd->periph_buses;1959 } else if (direction == DMA_DEV_TO_MEM) {1960 cctl = PL080_CONTROL_DST_INCR;1961 *slave_addr = plchan->cfg.src_addr;1962 addr_width = plchan->cfg.src_addr_width;1963 maxburst = plchan->cfg.src_maxburst;1964 src_buses = plchan->cd->periph_buses;1965 dst_buses = pl08x->mem_buses;1966 } else {1967 pl08x_free_txd(pl08x, txd);1968 dev_err(&pl08x->adev->dev,1969 "%s direction unsupported\n", __func__);1970 return NULL;1971 }1972 1973 cctl |= pl08x_get_cctl(plchan, addr_width, maxburst);1974 if (cctl == ~0) {1975 pl08x_free_txd(pl08x, txd);1976 dev_err(&pl08x->adev->dev,1977 "DMA slave configuration botched?\n");1978 return NULL;1979 }1980 1981 txd->cctl = cctl | pl08x_select_bus(false, src_buses, dst_buses);1982 1983 if (plchan->cfg.device_fc)1984 tmp = (direction == DMA_MEM_TO_DEV) ? PL080_FLOW_MEM2PER_PER :1985 PL080_FLOW_PER2MEM_PER;1986 else1987 tmp = (direction == DMA_MEM_TO_DEV) ? PL080_FLOW_MEM2PER :1988 PL080_FLOW_PER2MEM;1989 1990 txd->ccfg = PL080_CONFIG_ERR_IRQ_MASK |1991 PL080_CONFIG_TC_IRQ_MASK |1992 tmp << PL080_CONFIG_FLOW_CONTROL_SHIFT;1993 1994 ret = pl08x_request_mux(plchan);1995 if (ret < 0) {1996 pl08x_free_txd(pl08x, txd);1997 dev_dbg(&pl08x->adev->dev,1998 "unable to mux for transfer on %s due to platform restrictions\n",1999 plchan->name);2000 return NULL;2001 }2002 2003 dev_dbg(&pl08x->adev->dev, "allocated DMA request signal %d for xfer on %s\n",2004 plchan->signal, plchan->name);2005 2006 /* Assign the flow control signal to this channel */2007 if (direction == DMA_MEM_TO_DEV)2008 txd->ccfg |= plchan->signal << PL080_CONFIG_DST_SEL_SHIFT;2009 else2010 txd->ccfg |= plchan->signal << PL080_CONFIG_SRC_SEL_SHIFT;2011 2012 return txd;2013}2014 2015static int pl08x_tx_add_sg(struct pl08x_txd *txd,2016 enum dma_transfer_direction direction,2017 dma_addr_t slave_addr,2018 dma_addr_t buf_addr,2019 unsigned int len)2020{2021 struct pl08x_sg *dsg;2022 2023 dsg = kzalloc(sizeof(struct pl08x_sg), GFP_NOWAIT);2024 if (!dsg)2025 return -ENOMEM;2026 2027 list_add_tail(&dsg->node, &txd->dsg_list);2028 2029 dsg->len = len;2030 if (direction == DMA_MEM_TO_DEV) {2031 dsg->src_addr = buf_addr;2032 dsg->dst_addr = slave_addr;2033 } else {2034 dsg->src_addr = slave_addr;2035 dsg->dst_addr = buf_addr;2036 }2037 2038 return 0;2039}2040 2041static struct dma_async_tx_descriptor *pl08x_prep_slave_sg(2042 struct dma_chan *chan, struct scatterlist *sgl,2043 unsigned int sg_len, enum dma_transfer_direction direction,2044 unsigned long flags, void *context)2045{2046 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);2047 struct pl08x_driver_data *pl08x = plchan->host;2048 struct pl08x_txd *txd;2049 struct scatterlist *sg;2050 int ret, tmp;2051 dma_addr_t slave_addr;2052 2053 dev_dbg(&pl08x->adev->dev, "%s prepare transaction of %d bytes from %s\n",2054 __func__, sg_dma_len(sgl), plchan->name);2055 2056 txd = pl08x_init_txd(chan, direction, &slave_addr);2057 if (!txd)2058 return NULL;2059 2060 for_each_sg(sgl, sg, sg_len, tmp) {2061 ret = pl08x_tx_add_sg(txd, direction, slave_addr,2062 sg_dma_address(sg),2063 sg_dma_len(sg));2064 if (ret) {2065 pl08x_release_mux(plchan);2066 pl08x_free_txd(pl08x, txd);2067 dev_err(&pl08x->adev->dev, "%s no mem for pl080 sg\n",2068 __func__);2069 return NULL;2070 }2071 }2072 2073 ret = pl08x_fill_llis_for_desc(plchan->host, txd);2074 if (!ret) {2075 pl08x_release_mux(plchan);2076 pl08x_free_txd(pl08x, txd);2077 return NULL;2078 }2079 2080 return vchan_tx_prep(&plchan->vc, &txd->vd, flags);2081}2082 2083static struct dma_async_tx_descriptor *pl08x_prep_dma_cyclic(2084 struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,2085 size_t period_len, enum dma_transfer_direction direction,2086 unsigned long flags)2087{2088 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);2089 struct pl08x_driver_data *pl08x = plchan->host;2090 struct pl08x_txd *txd;2091 int ret, tmp;2092 dma_addr_t slave_addr;2093 2094 dev_dbg(&pl08x->adev->dev,2095 "%s prepare cyclic transaction of %zd/%zd bytes %s %s\n",2096 __func__, period_len, buf_len,2097 direction == DMA_MEM_TO_DEV ? "to" : "from",2098 plchan->name);2099 2100 txd = pl08x_init_txd(chan, direction, &slave_addr);2101 if (!txd)2102 return NULL;2103 2104 txd->cyclic = true;2105 txd->cctl |= PL080_CONTROL_TC_IRQ_EN;2106 for (tmp = 0; tmp < buf_len; tmp += period_len) {2107 ret = pl08x_tx_add_sg(txd, direction, slave_addr,2108 buf_addr + tmp, period_len);2109 if (ret) {2110 pl08x_release_mux(plchan);2111 pl08x_free_txd(pl08x, txd);2112 return NULL;2113 }2114 }2115 2116 ret = pl08x_fill_llis_for_desc(plchan->host, txd);2117 if (!ret) {2118 pl08x_release_mux(plchan);2119 pl08x_free_txd(pl08x, txd);2120 return NULL;2121 }2122 2123 return vchan_tx_prep(&plchan->vc, &txd->vd, flags);2124}2125 2126static int pl08x_config(struct dma_chan *chan,2127 struct dma_slave_config *config)2128{2129 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);2130 struct pl08x_driver_data *pl08x = plchan->host;2131 2132 if (!plchan->slave)2133 return -EINVAL;2134 2135 /* Reject definitely invalid configurations */2136 if (config->src_addr_width == DMA_SLAVE_BUSWIDTH_8_BYTES ||2137 config->dst_addr_width == DMA_SLAVE_BUSWIDTH_8_BYTES)2138 return -EINVAL;2139 2140 if (config->device_fc && pl08x->vd->pl080s) {2141 dev_err(&pl08x->adev->dev,2142 "%s: PL080S does not support peripheral flow control\n",2143 __func__);2144 return -EINVAL;2145 }2146 2147 plchan->cfg = *config;2148 2149 return 0;2150}2151 2152static int pl08x_terminate_all(struct dma_chan *chan)2153{2154 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);2155 struct pl08x_driver_data *pl08x = plchan->host;2156 unsigned long flags;2157 2158 spin_lock_irqsave(&plchan->vc.lock, flags);2159 if (!plchan->phychan && !plchan->at) {2160 spin_unlock_irqrestore(&plchan->vc.lock, flags);2161 return 0;2162 }2163 2164 plchan->state = PL08X_CHAN_IDLE;2165 2166 if (plchan->phychan) {2167 /*2168 * Mark physical channel as free and free any slave2169 * signal2170 */2171 pl08x_phy_free(plchan);2172 }2173 /* Dequeue jobs and free LLIs */2174 if (plchan->at) {2175 vchan_terminate_vdesc(&plchan->at->vd);2176 plchan->at = NULL;2177 }2178 /* Dequeue jobs not yet fired as well */2179 pl08x_free_txd_list(pl08x, plchan);2180 2181 spin_unlock_irqrestore(&plchan->vc.lock, flags);2182 2183 return 0;2184}2185 2186static void pl08x_synchronize(struct dma_chan *chan)2187{2188 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);2189 2190 vchan_synchronize(&plchan->vc);2191}2192 2193static int pl08x_pause(struct dma_chan *chan)2194{2195 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);2196 unsigned long flags;2197 2198 /*2199 * Anything succeeds on channels with no physical allocation and2200 * no queued transfers.2201 */2202 spin_lock_irqsave(&plchan->vc.lock, flags);2203 if (!plchan->phychan && !plchan->at) {2204 spin_unlock_irqrestore(&plchan->vc.lock, flags);2205 return 0;2206 }2207 2208 pl08x_pause_phy_chan(plchan->phychan);2209 plchan->state = PL08X_CHAN_PAUSED;2210 2211 spin_unlock_irqrestore(&plchan->vc.lock, flags);2212 2213 return 0;2214}2215 2216static int pl08x_resume(struct dma_chan *chan)2217{2218 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);2219 unsigned long flags;2220 2221 /*2222 * Anything succeeds on channels with no physical allocation and2223 * no queued transfers.2224 */2225 spin_lock_irqsave(&plchan->vc.lock, flags);2226 if (!plchan->phychan && !plchan->at) {2227 spin_unlock_irqrestore(&plchan->vc.lock, flags);2228 return 0;2229 }2230 2231 pl08x_resume_phy_chan(plchan->phychan);2232 plchan->state = PL08X_CHAN_RUNNING;2233 2234 spin_unlock_irqrestore(&plchan->vc.lock, flags);2235 2236 return 0;2237}2238 2239bool pl08x_filter_id(struct dma_chan *chan, void *chan_id)2240{2241 struct pl08x_dma_chan *plchan;2242 const char *name = chan_id;2243 2244 /* Reject channels for devices not bound to this driver */2245 if (chan->device->dev->driver != &pl08x_amba_driver.drv)2246 return false;2247 2248 plchan = to_pl08x_chan(chan);2249 2250 /* Check that the channel is not taken! */2251 if (!strcmp(plchan->name, name))2252 return true;2253 2254 return false;2255}2256EXPORT_SYMBOL_GPL(pl08x_filter_id);2257 2258static bool pl08x_filter_fn(struct dma_chan *chan, void *chan_id)2259{2260 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);2261 2262 return plchan->cd == chan_id;2263}2264 2265/*2266 * Just check that the device is there and active2267 * TODO: turn this bit on/off depending on the number of physical channels2268 * actually used, if it is zero... well shut it off. That will save some2269 * power. Cut the clock at the same time.2270 */2271static void pl08x_ensure_on(struct pl08x_driver_data *pl08x)2272{2273 /* The Nomadik variant does not have the config register */2274 if (pl08x->vd->nomadik)2275 return;2276 /* The FTDMAC020 variant does this in another register */2277 if (pl08x->vd->ftdmac020) {2278 writel(PL080_CONFIG_ENABLE, pl08x->base + FTDMAC020_CSR);2279 return;2280 }2281 writel(PL080_CONFIG_ENABLE, pl08x->base + PL080_CONFIG);2282}2283 2284static irqreturn_t pl08x_irq(int irq, void *dev)2285{2286 struct pl08x_driver_data *pl08x = dev;2287 u32 mask = 0, err, tc, i;2288 2289 /* check & clear - ERR & TC interrupts */2290 err = readl(pl08x->base + PL080_ERR_STATUS);2291 if (err) {2292 dev_err(&pl08x->adev->dev, "%s error interrupt, register value 0x%08x\n",2293 __func__, err);2294 writel(err, pl08x->base + PL080_ERR_CLEAR);2295 }2296 tc = readl(pl08x->base + PL080_TC_STATUS);2297 if (tc)2298 writel(tc, pl08x->base + PL080_TC_CLEAR);2299 2300 if (!err && !tc)2301 return IRQ_NONE;2302 2303 for (i = 0; i < pl08x->vd->channels; i++) {2304 if ((BIT(i) & err) || (BIT(i) & tc)) {2305 /* Locate physical channel */2306 struct pl08x_phy_chan *phychan = &pl08x->phy_chans[i];2307 struct pl08x_dma_chan *plchan = phychan->serving;2308 struct pl08x_txd *tx;2309 2310 if (!plchan) {2311 dev_err(&pl08x->adev->dev,2312 "%s Error TC interrupt on unused channel: 0x%08x\n",2313 __func__, i);2314 continue;2315 }2316 2317 spin_lock(&plchan->vc.lock);2318 tx = plchan->at;2319 if (tx && tx->cyclic) {2320 vchan_cyclic_callback(&tx->vd);2321 } else if (tx) {2322 plchan->at = NULL;2323 /*2324 * This descriptor is done, release its mux2325 * reservation.2326 */2327 pl08x_release_mux(plchan);2328 tx->done = true;2329 vchan_cookie_complete(&tx->vd);2330 2331 /*2332 * And start the next descriptor (if any),2333 * otherwise free this channel.2334 */2335 if (vchan_next_desc(&plchan->vc))2336 pl08x_start_next_txd(plchan);2337 else2338 pl08x_phy_free(plchan);2339 }2340 spin_unlock(&plchan->vc.lock);2341 2342 mask |= BIT(i);2343 }2344 }2345 2346 return mask ? IRQ_HANDLED : IRQ_NONE;2347}2348 2349static void pl08x_dma_slave_init(struct pl08x_dma_chan *chan)2350{2351 chan->slave = true;2352 chan->name = chan->cd->bus_id;2353 chan->cfg.src_addr = chan->cd->addr;2354 chan->cfg.dst_addr = chan->cd->addr;2355}2356 2357/*2358 * Initialise the DMAC memcpy/slave channels.2359 * Make a local wrapper to hold required data2360 */2361static int pl08x_dma_init_virtual_channels(struct pl08x_driver_data *pl08x,2362 struct dma_device *dmadev, unsigned int channels, bool slave)2363{2364 struct pl08x_dma_chan *chan;2365 int i;2366 2367 INIT_LIST_HEAD(&dmadev->channels);2368 2369 /*2370 * Register as many memcpy as we have physical channels,2371 * we won't always be able to use all but the code will have2372 * to cope with that situation.2373 */2374 for (i = 0; i < channels; i++) {2375 chan = kzalloc(sizeof(*chan), GFP_KERNEL);2376 if (!chan)2377 return -ENOMEM;2378 2379 chan->host = pl08x;2380 chan->state = PL08X_CHAN_IDLE;2381 chan->signal = -1;2382 2383 if (slave) {2384 chan->cd = &pl08x->pd->slave_channels[i];2385 /*2386 * Some implementations have muxed signals, whereas some2387 * use a mux in front of the signals and need dynamic2388 * assignment of signals.2389 */2390 chan->signal = i;2391 pl08x_dma_slave_init(chan);2392 } else {2393 chan->cd = kzalloc(sizeof(*chan->cd), GFP_KERNEL);2394 if (!chan->cd) {2395 kfree(chan);2396 return -ENOMEM;2397 }2398 chan->cd->bus_id = "memcpy";2399 chan->cd->periph_buses = pl08x->pd->mem_buses;2400 chan->name = kasprintf(GFP_KERNEL, "memcpy%d", i);2401 if (!chan->name) {2402 kfree(chan->cd);2403 kfree(chan);2404 return -ENOMEM;2405 }2406 }2407 dev_dbg(&pl08x->adev->dev,2408 "initialize virtual channel \"%s\"\n",2409 chan->name);2410 2411 chan->vc.desc_free = pl08x_desc_free;2412 vchan_init(&chan->vc, dmadev);2413 }2414 dev_info(&pl08x->adev->dev, "initialized %d virtual %s channels\n",2415 i, slave ? "slave" : "memcpy");2416 return i;2417}2418 2419static void pl08x_free_virtual_channels(struct dma_device *dmadev)2420{2421 struct pl08x_dma_chan *chan = NULL;2422 struct pl08x_dma_chan *next;2423 2424 list_for_each_entry_safe(chan,2425 next, &dmadev->channels, vc.chan.device_node) {2426 list_del(&chan->vc.chan.device_node);2427 kfree(chan);2428 }2429}2430 2431#ifdef CONFIG_DEBUG_FS2432static const char *pl08x_state_str(enum pl08x_dma_chan_state state)2433{2434 switch (state) {2435 case PL08X_CHAN_IDLE:2436 return "idle";2437 case PL08X_CHAN_RUNNING:2438 return "running";2439 case PL08X_CHAN_PAUSED:2440 return "paused";2441 case PL08X_CHAN_WAITING:2442 return "waiting";2443 default:2444 break;2445 }2446 return "UNKNOWN STATE";2447}2448 2449static int pl08x_debugfs_show(struct seq_file *s, void *data)2450{2451 struct pl08x_driver_data *pl08x = s->private;2452 struct pl08x_dma_chan *chan;2453 struct pl08x_phy_chan *ch;2454 unsigned long flags;2455 int i;2456 2457 seq_printf(s, "PL08x physical channels:\n");2458 seq_printf(s, "CHANNEL:\tUSER:\n");2459 seq_printf(s, "--------\t-----\n");2460 for (i = 0; i < pl08x->vd->channels; i++) {2461 struct pl08x_dma_chan *virt_chan;2462 2463 ch = &pl08x->phy_chans[i];2464 2465 spin_lock_irqsave(&ch->lock, flags);2466 virt_chan = ch->serving;2467 2468 seq_printf(s, "%d\t\t%s%s\n",2469 ch->id,2470 virt_chan ? virt_chan->name : "(none)",2471 ch->locked ? " LOCKED" : "");2472 2473 spin_unlock_irqrestore(&ch->lock, flags);2474 }2475 2476 seq_printf(s, "\nPL08x virtual memcpy channels:\n");2477 seq_printf(s, "CHANNEL:\tSTATE:\n");2478 seq_printf(s, "--------\t------\n");2479 list_for_each_entry(chan, &pl08x->memcpy.channels, vc.chan.device_node) {2480 seq_printf(s, "%s\t\t%s\n", chan->name,2481 pl08x_state_str(chan->state));2482 }2483 2484 if (pl08x->has_slave) {2485 seq_printf(s, "\nPL08x virtual slave channels:\n");2486 seq_printf(s, "CHANNEL:\tSTATE:\n");2487 seq_printf(s, "--------\t------\n");2488 list_for_each_entry(chan, &pl08x->slave.channels,2489 vc.chan.device_node) {2490 seq_printf(s, "%s\t\t%s\n", chan->name,2491 pl08x_state_str(chan->state));2492 }2493 }2494 2495 return 0;2496}2497 2498DEFINE_SHOW_ATTRIBUTE(pl08x_debugfs);2499 2500static void init_pl08x_debugfs(struct pl08x_driver_data *pl08x)2501{2502 /* Expose a simple debugfs interface to view all clocks */2503 debugfs_create_file(dev_name(&pl08x->adev->dev), S_IFREG | S_IRUGO,2504 NULL, pl08x, &pl08x_debugfs_fops);2505}2506 2507#else2508static inline void init_pl08x_debugfs(struct pl08x_driver_data *pl08x)2509{2510}2511#endif2512 2513#ifdef CONFIG_OF2514static struct dma_chan *pl08x_find_chan_id(struct pl08x_driver_data *pl08x,2515 u32 id)2516{2517 struct pl08x_dma_chan *chan;2518 2519 /* Trying to get a slave channel from something with no slave support */2520 if (!pl08x->has_slave)2521 return NULL;2522 2523 list_for_each_entry(chan, &pl08x->slave.channels, vc.chan.device_node) {2524 if (chan->signal == id)2525 return &chan->vc.chan;2526 }2527 2528 return NULL;2529}2530 2531static struct dma_chan *pl08x_of_xlate(struct of_phandle_args *dma_spec,2532 struct of_dma *ofdma)2533{2534 struct pl08x_driver_data *pl08x = ofdma->of_dma_data;2535 struct dma_chan *dma_chan;2536 struct pl08x_dma_chan *plchan;2537 2538 if (!pl08x)2539 return NULL;2540 2541 if (dma_spec->args_count != 2) {2542 dev_err(&pl08x->adev->dev,2543 "DMA channel translation requires two cells\n");2544 return NULL;2545 }2546 2547 dma_chan = pl08x_find_chan_id(pl08x, dma_spec->args[0]);2548 if (!dma_chan) {2549 dev_err(&pl08x->adev->dev,2550 "DMA slave channel not found\n");2551 return NULL;2552 }2553 2554 plchan = to_pl08x_chan(dma_chan);2555 dev_dbg(&pl08x->adev->dev,2556 "translated channel for signal %d\n",2557 dma_spec->args[0]);2558 2559 /* Augment channel data for applicable AHB buses */2560 plchan->cd->periph_buses = dma_spec->args[1];2561 return dma_get_slave_channel(dma_chan);2562}2563 2564static int pl08x_of_probe(struct amba_device *adev,2565 struct pl08x_driver_data *pl08x,2566 struct device_node *np)2567{2568 struct pl08x_platform_data *pd;2569 struct pl08x_channel_data *chanp = NULL;2570 u32 val;2571 int ret;2572 int i;2573 2574 pd = devm_kzalloc(&adev->dev, sizeof(*pd), GFP_KERNEL);2575 if (!pd)2576 return -ENOMEM;2577 2578 /* Eligible bus masters for fetching LLIs */2579 if (of_property_read_bool(np, "lli-bus-interface-ahb1"))2580 pd->lli_buses |= PL08X_AHB1;2581 if (of_property_read_bool(np, "lli-bus-interface-ahb2"))2582 pd->lli_buses |= PL08X_AHB2;2583 if (!pd->lli_buses) {2584 dev_info(&adev->dev, "no bus masters for LLIs stated, assume all\n");2585 pd->lli_buses |= PL08X_AHB1 | PL08X_AHB2;2586 }2587 2588 /* Eligible bus masters for memory access */2589 if (of_property_read_bool(np, "mem-bus-interface-ahb1"))2590 pd->mem_buses |= PL08X_AHB1;2591 if (of_property_read_bool(np, "mem-bus-interface-ahb2"))2592 pd->mem_buses |= PL08X_AHB2;2593 if (!pd->mem_buses) {2594 dev_info(&adev->dev, "no bus masters for memory stated, assume all\n");2595 pd->mem_buses |= PL08X_AHB1 | PL08X_AHB2;2596 }2597 2598 /* Parse the memcpy channel properties */2599 ret = of_property_read_u32(np, "memcpy-burst-size", &val);2600 if (ret) {2601 dev_info(&adev->dev, "no memcpy burst size specified, using 1 byte\n");2602 val = 1;2603 }2604 switch (val) {2605 default:2606 dev_err(&adev->dev, "illegal burst size for memcpy, set to 1\n");2607 fallthrough;2608 case 1:2609 pd->memcpy_burst_size = PL08X_BURST_SZ_1;2610 break;2611 case 4:2612 pd->memcpy_burst_size = PL08X_BURST_SZ_4;2613 break;2614 case 8:2615 pd->memcpy_burst_size = PL08X_BURST_SZ_8;2616 break;2617 case 16:2618 pd->memcpy_burst_size = PL08X_BURST_SZ_16;2619 break;2620 case 32:2621 pd->memcpy_burst_size = PL08X_BURST_SZ_32;2622 break;2623 case 64:2624 pd->memcpy_burst_size = PL08X_BURST_SZ_64;2625 break;2626 case 128:2627 pd->memcpy_burst_size = PL08X_BURST_SZ_128;2628 break;2629 case 256:2630 pd->memcpy_burst_size = PL08X_BURST_SZ_256;2631 break;2632 }2633 2634 ret = of_property_read_u32(np, "memcpy-bus-width", &val);2635 if (ret) {2636 dev_info(&adev->dev, "no memcpy bus width specified, using 8 bits\n");2637 val = 8;2638 }2639 switch (val) {2640 default:2641 dev_err(&adev->dev, "illegal bus width for memcpy, set to 8 bits\n");2642 fallthrough;2643 case 8:2644 pd->memcpy_bus_width = PL08X_BUS_WIDTH_8_BITS;2645 break;2646 case 16:2647 pd->memcpy_bus_width = PL08X_BUS_WIDTH_16_BITS;2648 break;2649 case 32:2650 pd->memcpy_bus_width = PL08X_BUS_WIDTH_32_BITS;2651 break;2652 }2653 2654 /*2655 * Allocate channel data for all possible slave channels (one2656 * for each possible signal), channels will then be allocated2657 * for a device and have it's AHB interfaces set up at2658 * translation time.2659 */2660 if (pl08x->vd->signals) {2661 chanp = devm_kcalloc(&adev->dev,2662 pl08x->vd->signals,2663 sizeof(struct pl08x_channel_data),2664 GFP_KERNEL);2665 if (!chanp)2666 return -ENOMEM;2667 2668 pd->slave_channels = chanp;2669 for (i = 0; i < pl08x->vd->signals; i++) {2670 /*2671 * chanp->periph_buses will be assigned at translation2672 */2673 chanp->bus_id = kasprintf(GFP_KERNEL, "slave%d", i);2674 chanp++;2675 }2676 pd->num_slave_channels = pl08x->vd->signals;2677 }2678 2679 pl08x->pd = pd;2680 2681 return of_dma_controller_register(adev->dev.of_node, pl08x_of_xlate,2682 pl08x);2683}2684#else2685static inline int pl08x_of_probe(struct amba_device *adev,2686 struct pl08x_driver_data *pl08x,2687 struct device_node *np)2688{2689 return -EINVAL;2690}2691#endif2692 2693static int pl08x_probe(struct amba_device *adev, const struct amba_id *id)2694{2695 struct pl08x_driver_data *pl08x;2696 struct vendor_data *vd = id->data;2697 struct device_node *np = adev->dev.of_node;2698 u32 tsfr_size;2699 int ret = 0;2700 int i;2701 2702 ret = amba_request_regions(adev, NULL);2703 if (ret)2704 return ret;2705 2706 /* Ensure that we can do DMA */2707 ret = dma_set_mask_and_coherent(&adev->dev, DMA_BIT_MASK(32));2708 if (ret)2709 goto out_no_pl08x;2710 2711 /* Create the driver state holder */2712 pl08x = kzalloc(sizeof(*pl08x), GFP_KERNEL);2713 if (!pl08x) {2714 ret = -ENOMEM;2715 goto out_no_pl08x;2716 }2717 2718 /* Assign useful pointers to the driver state */2719 pl08x->adev = adev;2720 pl08x->vd = vd;2721 2722 pl08x->base = ioremap(adev->res.start, resource_size(&adev->res));2723 if (!pl08x->base) {2724 ret = -ENOMEM;2725 goto out_no_ioremap;2726 }2727 2728 if (vd->ftdmac020) {2729 u32 val;2730 2731 val = readl(pl08x->base + FTDMAC020_REVISION);2732 dev_info(&pl08x->adev->dev, "FTDMAC020 %d.%d rel %d\n",2733 (val >> 16) & 0xff, (val >> 8) & 0xff, val & 0xff);2734 val = readl(pl08x->base + FTDMAC020_FEATURE);2735 dev_info(&pl08x->adev->dev, "FTDMAC020 %d channels, "2736 "%s built-in bridge, %s, %s linked lists\n",2737 (val >> 12) & 0x0f,2738 (val & BIT(10)) ? "no" : "has",2739 (val & BIT(9)) ? "AHB0 and AHB1" : "AHB0",2740 (val & BIT(8)) ? "supports" : "does not support");2741 2742 /* Vendor data from feature register */2743 if (!(val & BIT(8)))2744 dev_warn(&pl08x->adev->dev,2745 "linked lists not supported, required\n");2746 vd->channels = (val >> 12) & 0x0f;2747 vd->dualmaster = !!(val & BIT(9));2748 }2749 2750 /* Initialize memcpy engine */2751 dma_cap_set(DMA_MEMCPY, pl08x->memcpy.cap_mask);2752 pl08x->memcpy.dev = &adev->dev;2753 pl08x->memcpy.device_free_chan_resources = pl08x_free_chan_resources;2754 pl08x->memcpy.device_prep_dma_memcpy = pl08x_prep_dma_memcpy;2755 pl08x->memcpy.device_tx_status = pl08x_dma_tx_status;2756 pl08x->memcpy.device_issue_pending = pl08x_issue_pending;2757 pl08x->memcpy.device_config = pl08x_config;2758 pl08x->memcpy.device_pause = pl08x_pause;2759 pl08x->memcpy.device_resume = pl08x_resume;2760 pl08x->memcpy.device_terminate_all = pl08x_terminate_all;2761 pl08x->memcpy.device_synchronize = pl08x_synchronize;2762 pl08x->memcpy.src_addr_widths = PL80X_DMA_BUSWIDTHS;2763 pl08x->memcpy.dst_addr_widths = PL80X_DMA_BUSWIDTHS;2764 pl08x->memcpy.directions = BIT(DMA_MEM_TO_MEM);2765 pl08x->memcpy.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT;2766 if (vd->ftdmac020)2767 pl08x->memcpy.copy_align = DMAENGINE_ALIGN_4_BYTES;2768 2769 2770 /*2771 * Initialize slave engine, if the block has no signals, that means2772 * we have no slave support.2773 */2774 if (vd->signals) {2775 pl08x->has_slave = true;2776 dma_cap_set(DMA_SLAVE, pl08x->slave.cap_mask);2777 dma_cap_set(DMA_CYCLIC, pl08x->slave.cap_mask);2778 pl08x->slave.dev = &adev->dev;2779 pl08x->slave.device_free_chan_resources =2780 pl08x_free_chan_resources;2781 pl08x->slave.device_tx_status = pl08x_dma_tx_status;2782 pl08x->slave.device_issue_pending = pl08x_issue_pending;2783 pl08x->slave.device_prep_slave_sg = pl08x_prep_slave_sg;2784 pl08x->slave.device_prep_dma_cyclic = pl08x_prep_dma_cyclic;2785 pl08x->slave.device_config = pl08x_config;2786 pl08x->slave.device_pause = pl08x_pause;2787 pl08x->slave.device_resume = pl08x_resume;2788 pl08x->slave.device_terminate_all = pl08x_terminate_all;2789 pl08x->slave.device_synchronize = pl08x_synchronize;2790 pl08x->slave.src_addr_widths = PL80X_DMA_BUSWIDTHS;2791 pl08x->slave.dst_addr_widths = PL80X_DMA_BUSWIDTHS;2792 pl08x->slave.directions =2793 BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);2794 pl08x->slave.residue_granularity =2795 DMA_RESIDUE_GRANULARITY_SEGMENT;2796 }2797 2798 /* Get the platform data */2799 pl08x->pd = dev_get_platdata(&adev->dev);2800 if (!pl08x->pd) {2801 if (np) {2802 ret = pl08x_of_probe(adev, pl08x, np);2803 if (ret)2804 goto out_no_platdata;2805 } else {2806 dev_err(&adev->dev, "no platform data supplied\n");2807 ret = -EINVAL;2808 goto out_no_platdata;2809 }2810 } else {2811 pl08x->slave.filter.map = pl08x->pd->slave_map;2812 pl08x->slave.filter.mapcnt = pl08x->pd->slave_map_len;2813 pl08x->slave.filter.fn = pl08x_filter_fn;2814 }2815 2816 /* By default, AHB1 only. If dualmaster, from platform */2817 pl08x->lli_buses = PL08X_AHB1;2818 pl08x->mem_buses = PL08X_AHB1;2819 if (pl08x->vd->dualmaster) {2820 pl08x->lli_buses = pl08x->pd->lli_buses;2821 pl08x->mem_buses = pl08x->pd->mem_buses;2822 }2823 2824 if (vd->pl080s)2825 pl08x->lli_words = PL080S_LLI_WORDS;2826 else2827 pl08x->lli_words = PL080_LLI_WORDS;2828 tsfr_size = MAX_NUM_TSFR_LLIS * pl08x->lli_words * sizeof(u32);2829 2830 /* A DMA memory pool for LLIs, align on 1-byte boundary */2831 pl08x->pool = dma_pool_create(DRIVER_NAME, &pl08x->adev->dev,2832 tsfr_size, PL08X_ALIGN, 0);2833 if (!pl08x->pool) {2834 ret = -ENOMEM;2835 goto out_no_lli_pool;2836 }2837 2838 /* Turn on the PL08x */2839 pl08x_ensure_on(pl08x);2840 2841 /* Clear any pending interrupts */2842 if (vd->ftdmac020)2843 /* This variant has error IRQs in bits 16-19 */2844 writel(0x0000FFFF, pl08x->base + PL080_ERR_CLEAR);2845 else2846 writel(0x000000FF, pl08x->base + PL080_ERR_CLEAR);2847 writel(0x000000FF, pl08x->base + PL080_TC_CLEAR);2848 2849 /* Attach the interrupt handler */2850 ret = request_irq(adev->irq[0], pl08x_irq, 0, DRIVER_NAME, pl08x);2851 if (ret) {2852 dev_err(&adev->dev, "%s failed to request interrupt %d\n",2853 __func__, adev->irq[0]);2854 goto out_no_irq;2855 }2856 2857 /* Initialize physical channels */2858 pl08x->phy_chans = kcalloc(vd->channels, sizeof(*pl08x->phy_chans),2859 GFP_KERNEL);2860 if (!pl08x->phy_chans) {2861 ret = -ENOMEM;2862 goto out_no_phychans;2863 }2864 2865 for (i = 0; i < vd->channels; i++) {2866 struct pl08x_phy_chan *ch = &pl08x->phy_chans[i];2867 2868 ch->id = i;2869 ch->base = pl08x->base + PL080_Cx_BASE(i);2870 if (vd->ftdmac020) {2871 /* FTDMA020 has a special channel busy register */2872 ch->reg_busy = ch->base + FTDMAC020_CH_BUSY;2873 ch->reg_config = ch->base + FTDMAC020_CH_CFG;2874 ch->reg_control = ch->base + FTDMAC020_CH_CSR;2875 ch->reg_src = ch->base + FTDMAC020_CH_SRC_ADDR;2876 ch->reg_dst = ch->base + FTDMAC020_CH_DST_ADDR;2877 ch->reg_lli = ch->base + FTDMAC020_CH_LLP;2878 ch->ftdmac020 = true;2879 } else {2880 ch->reg_config = ch->base + vd->config_offset;2881 ch->reg_control = ch->base + PL080_CH_CONTROL;2882 ch->reg_src = ch->base + PL080_CH_SRC_ADDR;2883 ch->reg_dst = ch->base + PL080_CH_DST_ADDR;2884 ch->reg_lli = ch->base + PL080_CH_LLI;2885 }2886 if (vd->pl080s)2887 ch->pl080s = true;2888 2889 spin_lock_init(&ch->lock);2890 2891 /*2892 * Nomadik variants can have channels that are locked2893 * down for the secure world only. Lock up these channels2894 * by perpetually serving a dummy virtual channel.2895 */2896 if (vd->nomadik) {2897 u32 val;2898 2899 val = readl(ch->reg_config);2900 if (val & (PL080N_CONFIG_ITPROT | PL080N_CONFIG_SECPROT)) {2901 dev_info(&adev->dev, "physical channel %d reserved for secure access only\n", i);2902 ch->locked = true;2903 }2904 }2905 2906 dev_dbg(&adev->dev, "physical channel %d is %s\n",2907 i, pl08x_phy_channel_busy(ch) ? "BUSY" : "FREE");2908 }2909 2910 /* Register as many memcpy channels as there are physical channels */2911 ret = pl08x_dma_init_virtual_channels(pl08x, &pl08x->memcpy,2912 pl08x->vd->channels, false);2913 if (ret <= 0) {2914 dev_warn(&pl08x->adev->dev,2915 "%s failed to enumerate memcpy channels - %d\n",2916 __func__, ret);2917 goto out_no_memcpy;2918 }2919 2920 /* Register slave channels */2921 if (pl08x->has_slave) {2922 ret = pl08x_dma_init_virtual_channels(pl08x, &pl08x->slave,2923 pl08x->pd->num_slave_channels, true);2924 if (ret < 0) {2925 dev_warn(&pl08x->adev->dev,2926 "%s failed to enumerate slave channels - %d\n",2927 __func__, ret);2928 goto out_no_slave;2929 }2930 }2931 2932 ret = dma_async_device_register(&pl08x->memcpy);2933 if (ret) {2934 dev_warn(&pl08x->adev->dev,2935 "%s failed to register memcpy as an async device - %d\n",2936 __func__, ret);2937 goto out_no_memcpy_reg;2938 }2939 2940 if (pl08x->has_slave) {2941 ret = dma_async_device_register(&pl08x->slave);2942 if (ret) {2943 dev_warn(&pl08x->adev->dev,2944 "%s failed to register slave as an async device - %d\n",2945 __func__, ret);2946 goto out_no_slave_reg;2947 }2948 }2949 2950 amba_set_drvdata(adev, pl08x);2951 init_pl08x_debugfs(pl08x);2952 dev_info(&pl08x->adev->dev, "DMA: PL%03x%s rev%u at 0x%08llx irq %d\n",2953 amba_part(adev), pl08x->vd->pl080s ? "s" : "", amba_rev(adev),2954 (unsigned long long)adev->res.start, adev->irq[0]);2955 2956 return 0;2957 2958out_no_slave_reg:2959 dma_async_device_unregister(&pl08x->memcpy);2960out_no_memcpy_reg:2961 if (pl08x->has_slave)2962 pl08x_free_virtual_channels(&pl08x->slave);2963out_no_slave:2964 pl08x_free_virtual_channels(&pl08x->memcpy);2965out_no_memcpy:2966 kfree(pl08x->phy_chans);2967out_no_phychans:2968 free_irq(adev->irq[0], pl08x);2969out_no_irq:2970 dma_pool_destroy(pl08x->pool);2971out_no_lli_pool:2972out_no_platdata:2973 iounmap(pl08x->base);2974out_no_ioremap:2975 kfree(pl08x);2976out_no_pl08x:2977 amba_release_regions(adev);2978 return ret;2979}2980 2981/* PL080 has 8 channels and the PL080 have just 2 */2982static struct vendor_data vendor_pl080 = {2983 .config_offset = PL080_CH_CONFIG,2984 .channels = 8,2985 .signals = 16,2986 .dualmaster = true,2987 .max_transfer_size = PL080_CONTROL_TRANSFER_SIZE_MASK,2988};2989 2990static struct vendor_data vendor_nomadik = {2991 .config_offset = PL080_CH_CONFIG,2992 .channels = 8,2993 .signals = 32,2994 .dualmaster = true,2995 .nomadik = true,2996 .max_transfer_size = PL080_CONTROL_TRANSFER_SIZE_MASK,2997};2998 2999static struct vendor_data vendor_pl080s = {3000 .config_offset = PL080S_CH_CONFIG,3001 .channels = 8,3002 .signals = 32,3003 .pl080s = true,3004 .max_transfer_size = PL080S_CONTROL_TRANSFER_SIZE_MASK,3005};3006 3007static struct vendor_data vendor_pl081 = {3008 .config_offset = PL080_CH_CONFIG,3009 .channels = 2,3010 .signals = 16,3011 .dualmaster = false,3012 .max_transfer_size = PL080_CONTROL_TRANSFER_SIZE_MASK,3013};3014 3015static struct vendor_data vendor_ftdmac020 = {3016 .config_offset = PL080_CH_CONFIG,3017 .ftdmac020 = true,3018 .max_transfer_size = PL080_CONTROL_TRANSFER_SIZE_MASK,3019};3020 3021static const struct amba_id pl08x_ids[] = {3022 /* Samsung PL080S variant */3023 {3024 .id = 0x0a141080,3025 .mask = 0xffffffff,3026 .data = &vendor_pl080s,3027 },3028 /* PL080 */3029 {3030 .id = 0x00041080,3031 .mask = 0x000fffff,3032 .data = &vendor_pl080,3033 },3034 /* PL081 */3035 {3036 .id = 0x00041081,3037 .mask = 0x000fffff,3038 .data = &vendor_pl081,3039 },3040 /* Nomadik 8815 PL080 variant */3041 {3042 .id = 0x00280080,3043 .mask = 0x00ffffff,3044 .data = &vendor_nomadik,3045 },3046 /* Faraday Technology FTDMAC020 */3047 {3048 .id = 0x0003b080,3049 .mask = 0x000fffff,3050 .data = &vendor_ftdmac020,3051 },3052 { 0, 0 },3053};3054 3055MODULE_DEVICE_TABLE(amba, pl08x_ids);3056 3057static struct amba_driver pl08x_amba_driver = {3058 .drv.name = DRIVER_NAME,3059 .id_table = pl08x_ids,3060 .probe = pl08x_probe,3061};3062 3063static int __init pl08x_init(void)3064{3065 int retval;3066 retval = amba_driver_register(&pl08x_amba_driver);3067 if (retval)3068 printk(KERN_WARNING DRIVER_NAME3069 "failed to register as an AMBA device (%d)\n",3070 retval);3071 return retval;3072}3073subsys_initcall(pl08x_init);3074