root/drivers/net/ethernet/ti/davinci_cpdma.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. cpdma_desc_pool_destroy
  2. cpdma_desc_pool_create
  3. desc_phys
  4. desc_from_phys
  5. cpdma_desc_alloc
  6. cpdma_desc_free
  7. _cpdma_control_set
  8. _cpdma_control_get
  9. cpdma_chan_set_chan_shaper
  10. cpdma_chan_on
  11. cpdma_chan_fit_rate
  12. cpdma_chan_set_factors
  13. cpdma_ctlr_create
  14. cpdma_ctlr_start
  15. cpdma_ctlr_stop
  16. cpdma_ctlr_destroy
  17. cpdma_ctlr_int_ctrl
  18. cpdma_ctlr_eoi
  19. cpdma_ctrl_rxchs_state
  20. cpdma_ctrl_txchs_state
  21. cpdma_chan_set_descs
  22. cpdma_chan_split_pool
  23. cpdma_chan_set_weight
  24. cpdma_chan_get_min_rate
  25. cpdma_chan_set_rate
  26. cpdma_chan_get_rate
  27. cpdma_chan_create
  28. cpdma_chan_get_rx_buf_num
  29. cpdma_chan_destroy
  30. cpdma_chan_get_stats
  31. __cpdma_chan_submit
  32. cpdma_chan_submit_si
  33. cpdma_chan_idle_submit
  34. cpdma_chan_idle_submit_mapped
  35. cpdma_chan_submit
  36. cpdma_chan_submit_mapped
  37. cpdma_check_free_tx_desc
  38. __cpdma_chan_free
  39. __cpdma_chan_process
  40. cpdma_chan_process
  41. cpdma_chan_start
  42. cpdma_chan_stop
  43. cpdma_chan_int_ctrl
  44. cpdma_control_get
  45. cpdma_control_set
  46. cpdma_get_num_rx_descs
  47. cpdma_get_num_tx_descs
  48. cpdma_set_num_rx_descs

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Texas Instruments CPDMA Driver
   4  *
   5  * Copyright (C) 2010 Texas Instruments
   6  *
   7  */
   8 #include <linux/kernel.h>
   9 #include <linux/spinlock.h>
  10 #include <linux/device.h>
  11 #include <linux/module.h>
  12 #include <linux/slab.h>
  13 #include <linux/err.h>
  14 #include <linux/dma-mapping.h>
  15 #include <linux/io.h>
  16 #include <linux/delay.h>
  17 #include <linux/genalloc.h>
  18 #include "davinci_cpdma.h"
  19 
  20 /* DMA Registers */
  21 #define CPDMA_TXIDVER           0x00
  22 #define CPDMA_TXCONTROL         0x04
  23 #define CPDMA_TXTEARDOWN        0x08
  24 #define CPDMA_RXIDVER           0x10
  25 #define CPDMA_RXCONTROL         0x14
  26 #define CPDMA_SOFTRESET         0x1c
  27 #define CPDMA_RXTEARDOWN        0x18
  28 #define CPDMA_TX_PRI0_RATE      0x30
  29 #define CPDMA_TXINTSTATRAW      0x80
  30 #define CPDMA_TXINTSTATMASKED   0x84
  31 #define CPDMA_TXINTMASKSET      0x88
  32 #define CPDMA_TXINTMASKCLEAR    0x8c
  33 #define CPDMA_MACINVECTOR       0x90
  34 #define CPDMA_MACEOIVECTOR      0x94
  35 #define CPDMA_RXINTSTATRAW      0xa0
  36 #define CPDMA_RXINTSTATMASKED   0xa4
  37 #define CPDMA_RXINTMASKSET      0xa8
  38 #define CPDMA_RXINTMASKCLEAR    0xac
  39 #define CPDMA_DMAINTSTATRAW     0xb0
  40 #define CPDMA_DMAINTSTATMASKED  0xb4
  41 #define CPDMA_DMAINTMASKSET     0xb8
  42 #define CPDMA_DMAINTMASKCLEAR   0xbc
  43 #define CPDMA_DMAINT_HOSTERR    BIT(1)
  44 
  45 /* the following exist only if has_ext_regs is set */
  46 #define CPDMA_DMACONTROL        0x20
  47 #define CPDMA_DMASTATUS         0x24
  48 #define CPDMA_RXBUFFOFS         0x28
  49 #define CPDMA_EM_CONTROL        0x2c
  50 
  51 /* Descriptor mode bits */
  52 #define CPDMA_DESC_SOP          BIT(31)
  53 #define CPDMA_DESC_EOP          BIT(30)
  54 #define CPDMA_DESC_OWNER        BIT(29)
  55 #define CPDMA_DESC_EOQ          BIT(28)
  56 #define CPDMA_DESC_TD_COMPLETE  BIT(27)
  57 #define CPDMA_DESC_PASS_CRC     BIT(26)
  58 #define CPDMA_DESC_TO_PORT_EN   BIT(20)
  59 #define CPDMA_TO_PORT_SHIFT     16
  60 #define CPDMA_DESC_PORT_MASK    (BIT(18) | BIT(17) | BIT(16))
  61 #define CPDMA_DESC_CRC_LEN      4
  62 
  63 #define CPDMA_TEARDOWN_VALUE    0xfffffffc
  64 
  65 #define CPDMA_MAX_RLIM_CNT      16384
  66 
  67 struct cpdma_desc {
  68         /* hardware fields */
  69         u32                     hw_next;
  70         u32                     hw_buffer;
  71         u32                     hw_len;
  72         u32                     hw_mode;
  73         /* software fields */
  74         void                    *sw_token;
  75         u32                     sw_buffer;
  76         u32                     sw_len;
  77 };
  78 
  79 struct cpdma_desc_pool {
  80         phys_addr_t             phys;
  81         dma_addr_t              hw_addr;
  82         void __iomem            *iomap;         /* ioremap map */
  83         void                    *cpumap;        /* dma_alloc map */
  84         int                     desc_size, mem_size;
  85         int                     num_desc;
  86         struct device           *dev;
  87         struct gen_pool         *gen_pool;
  88 };
  89 
  90 enum cpdma_state {
  91         CPDMA_STATE_IDLE,
  92         CPDMA_STATE_ACTIVE,
  93         CPDMA_STATE_TEARDOWN,
  94 };
  95 
  96 struct cpdma_ctlr {
  97         enum cpdma_state        state;
  98         struct cpdma_params     params;
  99         struct device           *dev;
 100         struct cpdma_desc_pool  *pool;
 101         spinlock_t              lock;
 102         struct cpdma_chan       *channels[2 * CPDMA_MAX_CHANNELS];
 103         int chan_num;
 104         int                     num_rx_desc; /* RX descriptors number */
 105         int                     num_tx_desc; /* TX descriptors number */
 106 };
 107 
 108 struct cpdma_chan {
 109         struct cpdma_desc __iomem       *head, *tail;
 110         void __iomem                    *hdp, *cp, *rxfree;
 111         enum cpdma_state                state;
 112         struct cpdma_ctlr               *ctlr;
 113         int                             chan_num;
 114         spinlock_t                      lock;
 115         int                             count;
 116         u32                             desc_num;
 117         u32                             mask;
 118         cpdma_handler_fn                handler;
 119         enum dma_data_direction         dir;
 120         struct cpdma_chan_stats         stats;
 121         /* offsets into dmaregs */
 122         int     int_set, int_clear, td;
 123         int                             weight;
 124         u32                             rate_factor;
 125         u32                             rate;
 126 };
 127 
 128 struct cpdma_control_info {
 129         u32             reg;
 130         u32             shift, mask;
 131         int             access;
 132 #define ACCESS_RO       BIT(0)
 133 #define ACCESS_WO       BIT(1)
 134 #define ACCESS_RW       (ACCESS_RO | ACCESS_WO)
 135 };
 136 
 137 struct submit_info {
 138         struct cpdma_chan *chan;
 139         int directed;
 140         void *token;
 141         void *data_virt;
 142         dma_addr_t data_dma;
 143         int len;
 144 };
 145 
 146 static struct cpdma_control_info controls[] = {
 147         [CPDMA_TX_RLIM]           = {CPDMA_DMACONTROL,  8,  0xffff, ACCESS_RW},
 148         [CPDMA_CMD_IDLE]          = {CPDMA_DMACONTROL,  3,  1,      ACCESS_WO},
 149         [CPDMA_COPY_ERROR_FRAMES] = {CPDMA_DMACONTROL,  4,  1,      ACCESS_RW},
 150         [CPDMA_RX_OFF_LEN_UPDATE] = {CPDMA_DMACONTROL,  2,  1,      ACCESS_RW},
 151         [CPDMA_RX_OWNERSHIP_FLIP] = {CPDMA_DMACONTROL,  1,  1,      ACCESS_RW},
 152         [CPDMA_TX_PRIO_FIXED]     = {CPDMA_DMACONTROL,  0,  1,      ACCESS_RW},
 153         [CPDMA_STAT_IDLE]         = {CPDMA_DMASTATUS,   31, 1,      ACCESS_RO},
 154         [CPDMA_STAT_TX_ERR_CODE]  = {CPDMA_DMASTATUS,   20, 0xf,    ACCESS_RW},
 155         [CPDMA_STAT_TX_ERR_CHAN]  = {CPDMA_DMASTATUS,   16, 0x7,    ACCESS_RW},
 156         [CPDMA_STAT_RX_ERR_CODE]  = {CPDMA_DMASTATUS,   12, 0xf,    ACCESS_RW},
 157         [CPDMA_STAT_RX_ERR_CHAN]  = {CPDMA_DMASTATUS,   8,  0x7,    ACCESS_RW},
 158         [CPDMA_RX_BUFFER_OFFSET]  = {CPDMA_RXBUFFOFS,   0,  0xffff, ACCESS_RW},
 159 };
 160 
 161 #define tx_chan_num(chan)       (chan)
 162 #define rx_chan_num(chan)       ((chan) + CPDMA_MAX_CHANNELS)
 163 #define is_rx_chan(chan)        ((chan)->chan_num >= CPDMA_MAX_CHANNELS)
 164 #define is_tx_chan(chan)        (!is_rx_chan(chan))
 165 #define __chan_linear(chan_num) ((chan_num) & (CPDMA_MAX_CHANNELS - 1))
 166 #define chan_linear(chan)       __chan_linear((chan)->chan_num)
 167 
 168 /* The following make access to common cpdma_ctlr params more readable */
 169 #define dmaregs         params.dmaregs
 170 #define num_chan        params.num_chan
 171 
 172 /* various accessors */
 173 #define dma_reg_read(ctlr, ofs)         readl((ctlr)->dmaregs + (ofs))
 174 #define chan_read(chan, fld)            readl((chan)->fld)
 175 #define desc_read(desc, fld)            readl(&(desc)->fld)
 176 #define dma_reg_write(ctlr, ofs, v)     writel(v, (ctlr)->dmaregs + (ofs))
 177 #define chan_write(chan, fld, v)        writel(v, (chan)->fld)
 178 #define desc_write(desc, fld, v)        writel((u32)(v), &(desc)->fld)
 179 
 180 #define cpdma_desc_to_port(chan, mode, directed)                        \
 181         do {                                                            \
 182                 if (!is_rx_chan(chan) && ((directed == 1) ||            \
 183                                           (directed == 2)))             \
 184                         mode |= (CPDMA_DESC_TO_PORT_EN |                \
 185                                  (directed << CPDMA_TO_PORT_SHIFT));    \
 186         } while (0)
 187 
 188 #define CPDMA_DMA_EXT_MAP               BIT(16)
 189 
 190 static void cpdma_desc_pool_destroy(struct cpdma_ctlr *ctlr)
 191 {
 192         struct cpdma_desc_pool *pool = ctlr->pool;
 193 
 194         if (!pool)
 195                 return;
 196 
 197         WARN(gen_pool_size(pool->gen_pool) != gen_pool_avail(pool->gen_pool),
 198              "cpdma_desc_pool size %zd != avail %zd",
 199              gen_pool_size(pool->gen_pool),
 200              gen_pool_avail(pool->gen_pool));
 201         if (pool->cpumap)
 202                 dma_free_coherent(ctlr->dev, pool->mem_size, pool->cpumap,
 203                                   pool->phys);
 204 }
 205 
 206 /*
 207  * Utility constructs for a cpdma descriptor pool.  Some devices (e.g. davinci
 208  * emac) have dedicated on-chip memory for these descriptors.  Some other
 209  * devices (e.g. cpsw switches) use plain old memory.  Descriptor pools
 210  * abstract out these details
 211  */
 212 static int cpdma_desc_pool_create(struct cpdma_ctlr *ctlr)
 213 {
 214         struct cpdma_params *cpdma_params = &ctlr->params;
 215         struct cpdma_desc_pool *pool;
 216         int ret = -ENOMEM;
 217 
 218         pool = devm_kzalloc(ctlr->dev, sizeof(*pool), GFP_KERNEL);
 219         if (!pool)
 220                 goto gen_pool_create_fail;
 221         ctlr->pool = pool;
 222 
 223         pool->mem_size  = cpdma_params->desc_mem_size;
 224         pool->desc_size = ALIGN(sizeof(struct cpdma_desc),
 225                                 cpdma_params->desc_align);
 226         pool->num_desc  = pool->mem_size / pool->desc_size;
 227 
 228         if (cpdma_params->descs_pool_size) {
 229                 /* recalculate memory size required cpdma descriptor pool
 230                  * basing on number of descriptors specified by user and
 231                  * if memory size > CPPI internal RAM size (desc_mem_size)
 232                  * then switch to use DDR
 233                  */
 234                 pool->num_desc = cpdma_params->descs_pool_size;
 235                 pool->mem_size = pool->desc_size * pool->num_desc;
 236                 if (pool->mem_size > cpdma_params->desc_mem_size)
 237                         cpdma_params->desc_mem_phys = 0;
 238         }
 239 
 240         pool->gen_pool = devm_gen_pool_create(ctlr->dev, ilog2(pool->desc_size),
 241                                               -1, "cpdma");
 242         if (IS_ERR(pool->gen_pool)) {
 243                 ret = PTR_ERR(pool->gen_pool);
 244                 dev_err(ctlr->dev, "pool create failed %d\n", ret);
 245                 goto gen_pool_create_fail;
 246         }
 247 
 248         if (cpdma_params->desc_mem_phys) {
 249                 pool->phys  = cpdma_params->desc_mem_phys;
 250                 pool->iomap = devm_ioremap(ctlr->dev, pool->phys,
 251                                            pool->mem_size);
 252                 pool->hw_addr = cpdma_params->desc_hw_addr;
 253         } else {
 254                 pool->cpumap = dma_alloc_coherent(ctlr->dev,  pool->mem_size,
 255                                                   &pool->hw_addr, GFP_KERNEL);
 256                 pool->iomap = (void __iomem __force *)pool->cpumap;
 257                 pool->phys = pool->hw_addr; /* assumes no IOMMU, don't use this value */
 258         }
 259 
 260         if (!pool->iomap)
 261                 goto gen_pool_create_fail;
 262 
 263         ret = gen_pool_add_virt(pool->gen_pool, (unsigned long)pool->iomap,
 264                                 pool->phys, pool->mem_size, -1);
 265         if (ret < 0) {
 266                 dev_err(ctlr->dev, "pool add failed %d\n", ret);
 267                 goto gen_pool_add_virt_fail;
 268         }
 269 
 270         return 0;
 271 
 272 gen_pool_add_virt_fail:
 273         cpdma_desc_pool_destroy(ctlr);
 274 gen_pool_create_fail:
 275         ctlr->pool = NULL;
 276         return ret;
 277 }
 278 
 279 static inline dma_addr_t desc_phys(struct cpdma_desc_pool *pool,
 280                   struct cpdma_desc __iomem *desc)
 281 {
 282         if (!desc)
 283                 return 0;
 284         return pool->hw_addr + (__force long)desc - (__force long)pool->iomap;
 285 }
 286 
 287 static inline struct cpdma_desc __iomem *
 288 desc_from_phys(struct cpdma_desc_pool *pool, dma_addr_t dma)
 289 {
 290         return dma ? pool->iomap + dma - pool->hw_addr : NULL;
 291 }
 292 
 293 static struct cpdma_desc __iomem *
 294 cpdma_desc_alloc(struct cpdma_desc_pool *pool)
 295 {
 296         return (struct cpdma_desc __iomem *)
 297                 gen_pool_alloc(pool->gen_pool, pool->desc_size);
 298 }
 299 
 300 static void cpdma_desc_free(struct cpdma_desc_pool *pool,
 301                             struct cpdma_desc __iomem *desc, int num_desc)
 302 {
 303         gen_pool_free(pool->gen_pool, (unsigned long)desc, pool->desc_size);
 304 }
 305 
 306 static int _cpdma_control_set(struct cpdma_ctlr *ctlr, int control, int value)
 307 {
 308         struct cpdma_control_info *info = &controls[control];
 309         u32 val;
 310 
 311         if (!ctlr->params.has_ext_regs)
 312                 return -ENOTSUPP;
 313 
 314         if (ctlr->state != CPDMA_STATE_ACTIVE)
 315                 return -EINVAL;
 316 
 317         if (control < 0 || control >= ARRAY_SIZE(controls))
 318                 return -ENOENT;
 319 
 320         if ((info->access & ACCESS_WO) != ACCESS_WO)
 321                 return -EPERM;
 322 
 323         val  = dma_reg_read(ctlr, info->reg);
 324         val &= ~(info->mask << info->shift);
 325         val |= (value & info->mask) << info->shift;
 326         dma_reg_write(ctlr, info->reg, val);
 327 
 328         return 0;
 329 }
 330 
 331 static int _cpdma_control_get(struct cpdma_ctlr *ctlr, int control)
 332 {
 333         struct cpdma_control_info *info = &controls[control];
 334         int ret;
 335 
 336         if (!ctlr->params.has_ext_regs)
 337                 return -ENOTSUPP;
 338 
 339         if (ctlr->state != CPDMA_STATE_ACTIVE)
 340                 return -EINVAL;
 341 
 342         if (control < 0 || control >= ARRAY_SIZE(controls))
 343                 return -ENOENT;
 344 
 345         if ((info->access & ACCESS_RO) != ACCESS_RO)
 346                 return -EPERM;
 347 
 348         ret = (dma_reg_read(ctlr, info->reg) >> info->shift) & info->mask;
 349         return ret;
 350 }
 351 
 352 /* cpdma_chan_set_chan_shaper - set shaper for a channel
 353  * Has to be called under ctlr lock
 354  */
 355 static int cpdma_chan_set_chan_shaper(struct cpdma_chan *chan)
 356 {
 357         struct cpdma_ctlr *ctlr = chan->ctlr;
 358         u32 rate_reg;
 359         u32 rmask;
 360         int ret;
 361 
 362         if (!chan->rate)
 363                 return 0;
 364 
 365         rate_reg = CPDMA_TX_PRI0_RATE + 4 * chan->chan_num;
 366         dma_reg_write(ctlr, rate_reg, chan->rate_factor);
 367 
 368         rmask = _cpdma_control_get(ctlr, CPDMA_TX_RLIM);
 369         rmask |= chan->mask;
 370 
 371         ret = _cpdma_control_set(ctlr, CPDMA_TX_RLIM, rmask);
 372         return ret;
 373 }
 374 
 375 static int cpdma_chan_on(struct cpdma_chan *chan)
 376 {
 377         struct cpdma_ctlr *ctlr = chan->ctlr;
 378         struct cpdma_desc_pool  *pool = ctlr->pool;
 379         unsigned long flags;
 380 
 381         spin_lock_irqsave(&chan->lock, flags);
 382         if (chan->state != CPDMA_STATE_IDLE) {
 383                 spin_unlock_irqrestore(&chan->lock, flags);
 384                 return -EBUSY;
 385         }
 386         if (ctlr->state != CPDMA_STATE_ACTIVE) {
 387                 spin_unlock_irqrestore(&chan->lock, flags);
 388                 return -EINVAL;
 389         }
 390         dma_reg_write(ctlr, chan->int_set, chan->mask);
 391         chan->state = CPDMA_STATE_ACTIVE;
 392         if (chan->head) {
 393                 chan_write(chan, hdp, desc_phys(pool, chan->head));
 394                 if (chan->rxfree)
 395                         chan_write(chan, rxfree, chan->count);
 396         }
 397 
 398         spin_unlock_irqrestore(&chan->lock, flags);
 399         return 0;
 400 }
 401 
 402 /* cpdma_chan_fit_rate - set rate for a channel and check if it's possible.
 403  * rmask - mask of rate limited channels
 404  * Returns min rate in Kb/s
 405  */
 406 static int cpdma_chan_fit_rate(struct cpdma_chan *ch, u32 rate,
 407                                u32 *rmask, int *prio_mode)
 408 {
 409         struct cpdma_ctlr *ctlr = ch->ctlr;
 410         struct cpdma_chan *chan;
 411         u32 old_rate = ch->rate;
 412         u32 new_rmask = 0;
 413         int rlim = 0;
 414         int i;
 415 
 416         for (i = tx_chan_num(0); i < tx_chan_num(CPDMA_MAX_CHANNELS); i++) {
 417                 chan = ctlr->channels[i];
 418                 if (!chan)
 419                         continue;
 420 
 421                 if (chan == ch)
 422                         chan->rate = rate;
 423 
 424                 if (chan->rate) {
 425                         rlim = 1;
 426                         new_rmask |= chan->mask;
 427                         continue;
 428                 }
 429 
 430                 if (rlim)
 431                         goto err;
 432         }
 433 
 434         *rmask = new_rmask;
 435         *prio_mode = rlim;
 436         return 0;
 437 
 438 err:
 439         ch->rate = old_rate;
 440         dev_err(ctlr->dev, "Upper cpdma ch%d is not rate limited\n",
 441                 chan->chan_num);
 442         return -EINVAL;
 443 }
 444 
 445 static u32 cpdma_chan_set_factors(struct cpdma_ctlr *ctlr,
 446                                   struct cpdma_chan *ch)
 447 {
 448         u32 delta = UINT_MAX, prev_delta = UINT_MAX, best_delta = UINT_MAX;
 449         u32 best_send_cnt = 0, best_idle_cnt = 0;
 450         u32 new_rate, best_rate = 0, rate_reg;
 451         u64 send_cnt, idle_cnt;
 452         u32 min_send_cnt, freq;
 453         u64 divident, divisor;
 454 
 455         if (!ch->rate) {
 456                 ch->rate_factor = 0;
 457                 goto set_factor;
 458         }
 459 
 460         freq = ctlr->params.bus_freq_mhz * 1000 * 32;
 461         if (!freq) {
 462                 dev_err(ctlr->dev, "The bus frequency is not set\n");
 463                 return -EINVAL;
 464         }
 465 
 466         min_send_cnt = freq - ch->rate;
 467         send_cnt = DIV_ROUND_UP(min_send_cnt, ch->rate);
 468         while (send_cnt <= CPDMA_MAX_RLIM_CNT) {
 469                 divident = ch->rate * send_cnt;
 470                 divisor = min_send_cnt;
 471                 idle_cnt = DIV_ROUND_CLOSEST_ULL(divident, divisor);
 472 
 473                 divident = freq * idle_cnt;
 474                 divisor = idle_cnt + send_cnt;
 475                 new_rate = DIV_ROUND_CLOSEST_ULL(divident, divisor);
 476 
 477                 delta = new_rate >= ch->rate ? new_rate - ch->rate : delta;
 478                 if (delta < best_delta) {
 479                         best_delta = delta;
 480                         best_send_cnt = send_cnt;
 481                         best_idle_cnt = idle_cnt;
 482                         best_rate = new_rate;
 483 
 484                         if (!delta)
 485                                 break;
 486                 }
 487 
 488                 if (prev_delta >= delta) {
 489                         prev_delta = delta;
 490                         send_cnt++;
 491                         continue;
 492                 }
 493 
 494                 idle_cnt++;
 495                 divident = freq * idle_cnt;
 496                 send_cnt = DIV_ROUND_CLOSEST_ULL(divident, ch->rate);
 497                 send_cnt -= idle_cnt;
 498                 prev_delta = UINT_MAX;
 499         }
 500 
 501         ch->rate = best_rate;
 502         ch->rate_factor = best_send_cnt | (best_idle_cnt << 16);
 503 
 504 set_factor:
 505         rate_reg = CPDMA_TX_PRI0_RATE + 4 * ch->chan_num;
 506         dma_reg_write(ctlr, rate_reg, ch->rate_factor);
 507         return 0;
 508 }
 509 
 510 struct cpdma_ctlr *cpdma_ctlr_create(struct cpdma_params *params)
 511 {
 512         struct cpdma_ctlr *ctlr;
 513 
 514         ctlr = devm_kzalloc(params->dev, sizeof(*ctlr), GFP_KERNEL);
 515         if (!ctlr)
 516                 return NULL;
 517 
 518         ctlr->state = CPDMA_STATE_IDLE;
 519         ctlr->params = *params;
 520         ctlr->dev = params->dev;
 521         ctlr->chan_num = 0;
 522         spin_lock_init(&ctlr->lock);
 523 
 524         if (cpdma_desc_pool_create(ctlr))
 525                 return NULL;
 526         /* split pool equally between RX/TX by default */
 527         ctlr->num_tx_desc = ctlr->pool->num_desc / 2;
 528         ctlr->num_rx_desc = ctlr->pool->num_desc - ctlr->num_tx_desc;
 529 
 530         if (WARN_ON(ctlr->num_chan > CPDMA_MAX_CHANNELS))
 531                 ctlr->num_chan = CPDMA_MAX_CHANNELS;
 532         return ctlr;
 533 }
 534 
 535 int cpdma_ctlr_start(struct cpdma_ctlr *ctlr)
 536 {
 537         struct cpdma_chan *chan;
 538         unsigned long flags;
 539         int i, prio_mode;
 540 
 541         spin_lock_irqsave(&ctlr->lock, flags);
 542         if (ctlr->state != CPDMA_STATE_IDLE) {
 543                 spin_unlock_irqrestore(&ctlr->lock, flags);
 544                 return -EBUSY;
 545         }
 546 
 547         if (ctlr->params.has_soft_reset) {
 548                 unsigned timeout = 10 * 100;
 549 
 550                 dma_reg_write(ctlr, CPDMA_SOFTRESET, 1);
 551                 while (timeout) {
 552                         if (dma_reg_read(ctlr, CPDMA_SOFTRESET) == 0)
 553                                 break;
 554                         udelay(10);
 555                         timeout--;
 556                 }
 557                 WARN_ON(!timeout);
 558         }
 559 
 560         for (i = 0; i < ctlr->num_chan; i++) {
 561                 writel(0, ctlr->params.txhdp + 4 * i);
 562                 writel(0, ctlr->params.rxhdp + 4 * i);
 563                 writel(0, ctlr->params.txcp + 4 * i);
 564                 writel(0, ctlr->params.rxcp + 4 * i);
 565         }
 566 
 567         dma_reg_write(ctlr, CPDMA_RXINTMASKCLEAR, 0xffffffff);
 568         dma_reg_write(ctlr, CPDMA_TXINTMASKCLEAR, 0xffffffff);
 569 
 570         dma_reg_write(ctlr, CPDMA_TXCONTROL, 1);
 571         dma_reg_write(ctlr, CPDMA_RXCONTROL, 1);
 572 
 573         ctlr->state = CPDMA_STATE_ACTIVE;
 574 
 575         prio_mode = 0;
 576         for (i = 0; i < ARRAY_SIZE(ctlr->channels); i++) {
 577                 chan = ctlr->channels[i];
 578                 if (chan) {
 579                         cpdma_chan_set_chan_shaper(chan);
 580                         cpdma_chan_on(chan);
 581 
 582                         /* off prio mode if all tx channels are rate limited */
 583                         if (is_tx_chan(chan) && !chan->rate)
 584                                 prio_mode = 1;
 585                 }
 586         }
 587 
 588         _cpdma_control_set(ctlr, CPDMA_TX_PRIO_FIXED, prio_mode);
 589         _cpdma_control_set(ctlr, CPDMA_RX_BUFFER_OFFSET, 0);
 590 
 591         spin_unlock_irqrestore(&ctlr->lock, flags);
 592         return 0;
 593 }
 594 
 595 int cpdma_ctlr_stop(struct cpdma_ctlr *ctlr)
 596 {
 597         unsigned long flags;
 598         int i;
 599 
 600         spin_lock_irqsave(&ctlr->lock, flags);
 601         if (ctlr->state != CPDMA_STATE_ACTIVE) {
 602                 spin_unlock_irqrestore(&ctlr->lock, flags);
 603                 return -EINVAL;
 604         }
 605 
 606         ctlr->state = CPDMA_STATE_TEARDOWN;
 607         spin_unlock_irqrestore(&ctlr->lock, flags);
 608 
 609         for (i = 0; i < ARRAY_SIZE(ctlr->channels); i++) {
 610                 if (ctlr->channels[i])
 611                         cpdma_chan_stop(ctlr->channels[i]);
 612         }
 613 
 614         spin_lock_irqsave(&ctlr->lock, flags);
 615         dma_reg_write(ctlr, CPDMA_RXINTMASKCLEAR, 0xffffffff);
 616         dma_reg_write(ctlr, CPDMA_TXINTMASKCLEAR, 0xffffffff);
 617 
 618         dma_reg_write(ctlr, CPDMA_TXCONTROL, 0);
 619         dma_reg_write(ctlr, CPDMA_RXCONTROL, 0);
 620 
 621         ctlr->state = CPDMA_STATE_IDLE;
 622 
 623         spin_unlock_irqrestore(&ctlr->lock, flags);
 624         return 0;
 625 }
 626 
 627 int cpdma_ctlr_destroy(struct cpdma_ctlr *ctlr)
 628 {
 629         int ret = 0, i;
 630 
 631         if (!ctlr)
 632                 return -EINVAL;
 633 
 634         if (ctlr->state != CPDMA_STATE_IDLE)
 635                 cpdma_ctlr_stop(ctlr);
 636 
 637         for (i = 0; i < ARRAY_SIZE(ctlr->channels); i++)
 638                 cpdma_chan_destroy(ctlr->channels[i]);
 639 
 640         cpdma_desc_pool_destroy(ctlr);
 641         return ret;
 642 }
 643 
 644 int cpdma_ctlr_int_ctrl(struct cpdma_ctlr *ctlr, bool enable)
 645 {
 646         unsigned long flags;
 647         int i;
 648 
 649         spin_lock_irqsave(&ctlr->lock, flags);
 650         if (ctlr->state != CPDMA_STATE_ACTIVE) {
 651                 spin_unlock_irqrestore(&ctlr->lock, flags);
 652                 return -EINVAL;
 653         }
 654 
 655         for (i = 0; i < ARRAY_SIZE(ctlr->channels); i++) {
 656                 if (ctlr->channels[i])
 657                         cpdma_chan_int_ctrl(ctlr->channels[i], enable);
 658         }
 659 
 660         spin_unlock_irqrestore(&ctlr->lock, flags);
 661         return 0;
 662 }
 663 
 664 void cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr, u32 value)
 665 {
 666         dma_reg_write(ctlr, CPDMA_MACEOIVECTOR, value);
 667 }
 668 
 669 u32 cpdma_ctrl_rxchs_state(struct cpdma_ctlr *ctlr)
 670 {
 671         return dma_reg_read(ctlr, CPDMA_RXINTSTATMASKED);
 672 }
 673 
 674 u32 cpdma_ctrl_txchs_state(struct cpdma_ctlr *ctlr)
 675 {
 676         return dma_reg_read(ctlr, CPDMA_TXINTSTATMASKED);
 677 }
 678 
 679 static void cpdma_chan_set_descs(struct cpdma_ctlr *ctlr,
 680                                  int rx, int desc_num,
 681                                  int per_ch_desc)
 682 {
 683         struct cpdma_chan *chan, *most_chan = NULL;
 684         int desc_cnt = desc_num;
 685         int most_dnum = 0;
 686         int min, max, i;
 687 
 688         if (!desc_num)
 689                 return;
 690 
 691         if (rx) {
 692                 min = rx_chan_num(0);
 693                 max = rx_chan_num(CPDMA_MAX_CHANNELS);
 694         } else {
 695                 min = tx_chan_num(0);
 696                 max = tx_chan_num(CPDMA_MAX_CHANNELS);
 697         }
 698 
 699         for (i = min; i < max; i++) {
 700                 chan = ctlr->channels[i];
 701                 if (!chan)
 702                         continue;
 703 
 704                 if (chan->weight)
 705                         chan->desc_num = (chan->weight * desc_num) / 100;
 706                 else
 707                         chan->desc_num = per_ch_desc;
 708 
 709                 desc_cnt -= chan->desc_num;
 710 
 711                 if (most_dnum < chan->desc_num) {
 712                         most_dnum = chan->desc_num;
 713                         most_chan = chan;
 714                 }
 715         }
 716         /* use remains */
 717         if (most_chan)
 718                 most_chan->desc_num += desc_cnt;
 719 }
 720 
 721 /**
 722  * cpdma_chan_split_pool - Splits ctrl pool between all channels.
 723  * Has to be called under ctlr lock
 724  */
 725 static int cpdma_chan_split_pool(struct cpdma_ctlr *ctlr)
 726 {
 727         int tx_per_ch_desc = 0, rx_per_ch_desc = 0;
 728         int free_rx_num = 0, free_tx_num = 0;
 729         int rx_weight = 0, tx_weight = 0;
 730         int tx_desc_num, rx_desc_num;
 731         struct cpdma_chan *chan;
 732         int i;
 733 
 734         if (!ctlr->chan_num)
 735                 return 0;
 736 
 737         for (i = 0; i < ARRAY_SIZE(ctlr->channels); i++) {
 738                 chan = ctlr->channels[i];
 739                 if (!chan)
 740                         continue;
 741 
 742                 if (is_rx_chan(chan)) {
 743                         if (!chan->weight)
 744                                 free_rx_num++;
 745                         rx_weight += chan->weight;
 746                 } else {
 747                         if (!chan->weight)
 748                                 free_tx_num++;
 749                         tx_weight += chan->weight;
 750                 }
 751         }
 752 
 753         if (rx_weight > 100 || tx_weight > 100)
 754                 return -EINVAL;
 755 
 756         tx_desc_num = ctlr->num_tx_desc;
 757         rx_desc_num = ctlr->num_rx_desc;
 758 
 759         if (free_tx_num) {
 760                 tx_per_ch_desc = tx_desc_num - (tx_weight * tx_desc_num) / 100;
 761                 tx_per_ch_desc /= free_tx_num;
 762         }
 763         if (free_rx_num) {
 764                 rx_per_ch_desc = rx_desc_num - (rx_weight * rx_desc_num) / 100;
 765                 rx_per_ch_desc /= free_rx_num;
 766         }
 767 
 768         cpdma_chan_set_descs(ctlr, 0, tx_desc_num, tx_per_ch_desc);
 769         cpdma_chan_set_descs(ctlr, 1, rx_desc_num, rx_per_ch_desc);
 770 
 771         return 0;
 772 }
 773 
 774 
 775 /* cpdma_chan_set_weight - set weight of a channel in percentage.
 776  * Tx and Rx channels have separate weights. That is 100% for RX
 777  * and 100% for Tx. The weight is used to split cpdma resources
 778  * in correct proportion required by the channels, including number
 779  * of descriptors. The channel rate is not enough to know the
 780  * weight of a channel as the maximum rate of an interface is needed.
 781  * If weight = 0, then channel uses rest of descriptors leaved by
 782  * weighted channels.
 783  */
 784 int cpdma_chan_set_weight(struct cpdma_chan *ch, int weight)
 785 {
 786         struct cpdma_ctlr *ctlr = ch->ctlr;
 787         unsigned long flags, ch_flags;
 788         int ret;
 789 
 790         spin_lock_irqsave(&ctlr->lock, flags);
 791         spin_lock_irqsave(&ch->lock, ch_flags);
 792         if (ch->weight == weight) {
 793                 spin_unlock_irqrestore(&ch->lock, ch_flags);
 794                 spin_unlock_irqrestore(&ctlr->lock, flags);
 795                 return 0;
 796         }
 797         ch->weight = weight;
 798         spin_unlock_irqrestore(&ch->lock, ch_flags);
 799 
 800         /* re-split pool using new channel weight */
 801         ret = cpdma_chan_split_pool(ctlr);
 802         spin_unlock_irqrestore(&ctlr->lock, flags);
 803         return ret;
 804 }
 805 
 806 /* cpdma_chan_get_min_rate - get minimum allowed rate for channel
 807  * Should be called before cpdma_chan_set_rate.
 808  * Returns min rate in Kb/s
 809  */
 810 u32 cpdma_chan_get_min_rate(struct cpdma_ctlr *ctlr)
 811 {
 812         unsigned int divident, divisor;
 813 
 814         divident = ctlr->params.bus_freq_mhz * 32 * 1000;
 815         divisor = 1 + CPDMA_MAX_RLIM_CNT;
 816 
 817         return DIV_ROUND_UP(divident, divisor);
 818 }
 819 
 820 /* cpdma_chan_set_rate - limits bandwidth for transmit channel.
 821  * The bandwidth * limited channels have to be in order beginning from lowest.
 822  * ch - transmit channel the bandwidth is configured for
 823  * rate - bandwidth in Kb/s, if 0 - then off shaper
 824  */
 825 int cpdma_chan_set_rate(struct cpdma_chan *ch, u32 rate)
 826 {
 827         unsigned long flags, ch_flags;
 828         struct cpdma_ctlr *ctlr;
 829         int ret, prio_mode;
 830         u32 rmask;
 831 
 832         if (!ch || !is_tx_chan(ch))
 833                 return -EINVAL;
 834 
 835         if (ch->rate == rate)
 836                 return rate;
 837 
 838         ctlr = ch->ctlr;
 839         spin_lock_irqsave(&ctlr->lock, flags);
 840         spin_lock_irqsave(&ch->lock, ch_flags);
 841 
 842         ret = cpdma_chan_fit_rate(ch, rate, &rmask, &prio_mode);
 843         if (ret)
 844                 goto err;
 845 
 846         ret = cpdma_chan_set_factors(ctlr, ch);
 847         if (ret)
 848                 goto err;
 849 
 850         spin_unlock_irqrestore(&ch->lock, ch_flags);
 851 
 852         /* on shapers */
 853         _cpdma_control_set(ctlr, CPDMA_TX_RLIM, rmask);
 854         _cpdma_control_set(ctlr, CPDMA_TX_PRIO_FIXED, prio_mode);
 855         spin_unlock_irqrestore(&ctlr->lock, flags);
 856         return ret;
 857 
 858 err:
 859         spin_unlock_irqrestore(&ch->lock, ch_flags);
 860         spin_unlock_irqrestore(&ctlr->lock, flags);
 861         return ret;
 862 }
 863 
 864 u32 cpdma_chan_get_rate(struct cpdma_chan *ch)
 865 {
 866         unsigned long flags;
 867         u32 rate;
 868 
 869         spin_lock_irqsave(&ch->lock, flags);
 870         rate = ch->rate;
 871         spin_unlock_irqrestore(&ch->lock, flags);
 872 
 873         return rate;
 874 }
 875 
 876 struct cpdma_chan *cpdma_chan_create(struct cpdma_ctlr *ctlr, int chan_num,
 877                                      cpdma_handler_fn handler, int rx_type)
 878 {
 879         int offset = chan_num * 4;
 880         struct cpdma_chan *chan;
 881         unsigned long flags;
 882 
 883         chan_num = rx_type ? rx_chan_num(chan_num) : tx_chan_num(chan_num);
 884 
 885         if (__chan_linear(chan_num) >= ctlr->num_chan)
 886                 return ERR_PTR(-EINVAL);
 887 
 888         chan = devm_kzalloc(ctlr->dev, sizeof(*chan), GFP_KERNEL);
 889         if (!chan)
 890                 return ERR_PTR(-ENOMEM);
 891 
 892         spin_lock_irqsave(&ctlr->lock, flags);
 893         if (ctlr->channels[chan_num]) {
 894                 spin_unlock_irqrestore(&ctlr->lock, flags);
 895                 devm_kfree(ctlr->dev, chan);
 896                 return ERR_PTR(-EBUSY);
 897         }
 898 
 899         chan->ctlr      = ctlr;
 900         chan->state     = CPDMA_STATE_IDLE;
 901         chan->chan_num  = chan_num;
 902         chan->handler   = handler;
 903         chan->rate      = 0;
 904         chan->weight    = 0;
 905 
 906         if (is_rx_chan(chan)) {
 907                 chan->hdp       = ctlr->params.rxhdp + offset;
 908                 chan->cp        = ctlr->params.rxcp + offset;
 909                 chan->rxfree    = ctlr->params.rxfree + offset;
 910                 chan->int_set   = CPDMA_RXINTMASKSET;
 911                 chan->int_clear = CPDMA_RXINTMASKCLEAR;
 912                 chan->td        = CPDMA_RXTEARDOWN;
 913                 chan->dir       = DMA_FROM_DEVICE;
 914         } else {
 915                 chan->hdp       = ctlr->params.txhdp + offset;
 916                 chan->cp        = ctlr->params.txcp + offset;
 917                 chan->int_set   = CPDMA_TXINTMASKSET;
 918                 chan->int_clear = CPDMA_TXINTMASKCLEAR;
 919                 chan->td        = CPDMA_TXTEARDOWN;
 920                 chan->dir       = DMA_TO_DEVICE;
 921         }
 922         chan->mask = BIT(chan_linear(chan));
 923 
 924         spin_lock_init(&chan->lock);
 925 
 926         ctlr->channels[chan_num] = chan;
 927         ctlr->chan_num++;
 928 
 929         cpdma_chan_split_pool(ctlr);
 930 
 931         spin_unlock_irqrestore(&ctlr->lock, flags);
 932         return chan;
 933 }
 934 
 935 int cpdma_chan_get_rx_buf_num(struct cpdma_chan *chan)
 936 {
 937         unsigned long flags;
 938         int desc_num;
 939 
 940         spin_lock_irqsave(&chan->lock, flags);
 941         desc_num = chan->desc_num;
 942         spin_unlock_irqrestore(&chan->lock, flags);
 943 
 944         return desc_num;
 945 }
 946 
 947 int cpdma_chan_destroy(struct cpdma_chan *chan)
 948 {
 949         struct cpdma_ctlr *ctlr;
 950         unsigned long flags;
 951 
 952         if (!chan)
 953                 return -EINVAL;
 954         ctlr = chan->ctlr;
 955 
 956         spin_lock_irqsave(&ctlr->lock, flags);
 957         if (chan->state != CPDMA_STATE_IDLE)
 958                 cpdma_chan_stop(chan);
 959         ctlr->channels[chan->chan_num] = NULL;
 960         ctlr->chan_num--;
 961         devm_kfree(ctlr->dev, chan);
 962         cpdma_chan_split_pool(ctlr);
 963 
 964         spin_unlock_irqrestore(&ctlr->lock, flags);
 965         return 0;
 966 }
 967 
 968 int cpdma_chan_get_stats(struct cpdma_chan *chan,
 969                          struct cpdma_chan_stats *stats)
 970 {
 971         unsigned long flags;
 972         if (!chan)
 973                 return -EINVAL;
 974         spin_lock_irqsave(&chan->lock, flags);
 975         memcpy(stats, &chan->stats, sizeof(*stats));
 976         spin_unlock_irqrestore(&chan->lock, flags);
 977         return 0;
 978 }
 979 
 980 static void __cpdma_chan_submit(struct cpdma_chan *chan,
 981                                 struct cpdma_desc __iomem *desc)
 982 {
 983         struct cpdma_ctlr               *ctlr = chan->ctlr;
 984         struct cpdma_desc __iomem       *prev = chan->tail;
 985         struct cpdma_desc_pool          *pool = ctlr->pool;
 986         dma_addr_t                      desc_dma;
 987         u32                             mode;
 988 
 989         desc_dma = desc_phys(pool, desc);
 990 
 991         /* simple case - idle channel */
 992         if (!chan->head) {
 993                 chan->stats.head_enqueue++;
 994                 chan->head = desc;
 995                 chan->tail = desc;
 996                 if (chan->state == CPDMA_STATE_ACTIVE)
 997                         chan_write(chan, hdp, desc_dma);
 998                 return;
 999         }
1000 
1001         /* first chain the descriptor at the tail of the list */
1002         desc_write(prev, hw_next, desc_dma);
1003         chan->tail = desc;
1004         chan->stats.tail_enqueue++;
1005 
1006         /* next check if EOQ has been triggered already */
1007         mode = desc_read(prev, hw_mode);
1008         if (((mode & (CPDMA_DESC_EOQ | CPDMA_DESC_OWNER)) == CPDMA_DESC_EOQ) &&
1009             (chan->state == CPDMA_STATE_ACTIVE)) {
1010                 desc_write(prev, hw_mode, mode & ~CPDMA_DESC_EOQ);
1011                 chan_write(chan, hdp, desc_dma);
1012                 chan->stats.misqueued++;
1013         }
1014 }
1015 
1016 static int cpdma_chan_submit_si(struct submit_info *si)
1017 {
1018         struct cpdma_chan               *chan = si->chan;
1019         struct cpdma_ctlr               *ctlr = chan->ctlr;
1020         int                             len = si->len;
1021         struct cpdma_desc __iomem       *desc;
1022         dma_addr_t                      buffer;
1023         u32                             mode;
1024         int                             ret;
1025 
1026         if (chan->count >= chan->desc_num)      {
1027                 chan->stats.desc_alloc_fail++;
1028                 return -ENOMEM;
1029         }
1030 
1031         desc = cpdma_desc_alloc(ctlr->pool);
1032         if (!desc) {
1033                 chan->stats.desc_alloc_fail++;
1034                 return -ENOMEM;
1035         }
1036 
1037         if (len < ctlr->params.min_packet_size) {
1038                 len = ctlr->params.min_packet_size;
1039                 chan->stats.runt_transmit_buff++;
1040         }
1041 
1042         mode = CPDMA_DESC_OWNER | CPDMA_DESC_SOP | CPDMA_DESC_EOP;
1043         cpdma_desc_to_port(chan, mode, si->directed);
1044 
1045         if (si->data_dma) {
1046                 buffer = si->data_dma;
1047                 dma_sync_single_for_device(ctlr->dev, buffer, len, chan->dir);
1048         } else {
1049                 buffer = dma_map_single(ctlr->dev, si->data_virt, len, chan->dir);
1050                 ret = dma_mapping_error(ctlr->dev, buffer);
1051                 if (ret) {
1052                         cpdma_desc_free(ctlr->pool, desc, 1);
1053                         return -EINVAL;
1054                 }
1055         }
1056 
1057         /* Relaxed IO accessors can be used here as there is read barrier
1058          * at the end of write sequence.
1059          */
1060         writel_relaxed(0, &desc->hw_next);
1061         writel_relaxed(buffer, &desc->hw_buffer);
1062         writel_relaxed(len, &desc->hw_len);
1063         writel_relaxed(mode | len, &desc->hw_mode);
1064         writel_relaxed((uintptr_t)si->token, &desc->sw_token);
1065         writel_relaxed(buffer, &desc->sw_buffer);
1066         writel_relaxed(si->data_dma ? len | CPDMA_DMA_EXT_MAP : len,
1067                        &desc->sw_len);
1068         desc_read(desc, sw_len);
1069 
1070         __cpdma_chan_submit(chan, desc);
1071 
1072         if (chan->state == CPDMA_STATE_ACTIVE && chan->rxfree)
1073                 chan_write(chan, rxfree, 1);
1074 
1075         chan->count++;
1076         return 0;
1077 }
1078 
1079 int cpdma_chan_idle_submit(struct cpdma_chan *chan, void *token, void *data,
1080                            int len, int directed)
1081 {
1082         struct submit_info si;
1083         unsigned long flags;
1084         int ret;
1085 
1086         si.chan = chan;
1087         si.token = token;
1088         si.data_virt = data;
1089         si.data_dma = 0;
1090         si.len = len;
1091         si.directed = directed;
1092 
1093         spin_lock_irqsave(&chan->lock, flags);
1094         if (chan->state == CPDMA_STATE_TEARDOWN) {
1095                 spin_unlock_irqrestore(&chan->lock, flags);
1096                 return -EINVAL;
1097         }
1098 
1099         ret = cpdma_chan_submit_si(&si);
1100         spin_unlock_irqrestore(&chan->lock, flags);
1101         return ret;
1102 }
1103 
1104 int cpdma_chan_idle_submit_mapped(struct cpdma_chan *chan, void *token,
1105                                   dma_addr_t data, int len, int directed)
1106 {
1107         struct submit_info si;
1108         unsigned long flags;
1109         int ret;
1110 
1111         si.chan = chan;
1112         si.token = token;
1113         si.data_virt = NULL;
1114         si.data_dma = data;
1115         si.len = len;
1116         si.directed = directed;
1117 
1118         spin_lock_irqsave(&chan->lock, flags);
1119         if (chan->state == CPDMA_STATE_TEARDOWN) {
1120                 spin_unlock_irqrestore(&chan->lock, flags);
1121                 return -EINVAL;
1122         }
1123 
1124         ret = cpdma_chan_submit_si(&si);
1125         spin_unlock_irqrestore(&chan->lock, flags);
1126         return ret;
1127 }
1128 
1129 int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data,
1130                       int len, int directed)
1131 {
1132         struct submit_info si;
1133         unsigned long flags;
1134         int ret;
1135 
1136         si.chan = chan;
1137         si.token = token;
1138         si.data_virt = data;
1139         si.data_dma = 0;
1140         si.len = len;
1141         si.directed = directed;
1142 
1143         spin_lock_irqsave(&chan->lock, flags);
1144         if (chan->state != CPDMA_STATE_ACTIVE) {
1145                 spin_unlock_irqrestore(&chan->lock, flags);
1146                 return -EINVAL;
1147         }
1148 
1149         ret = cpdma_chan_submit_si(&si);
1150         spin_unlock_irqrestore(&chan->lock, flags);
1151         return ret;
1152 }
1153 
1154 int cpdma_chan_submit_mapped(struct cpdma_chan *chan, void *token,
1155                              dma_addr_t data, int len, int directed)
1156 {
1157         struct submit_info si;
1158         unsigned long flags;
1159         int ret;
1160 
1161         si.chan = chan;
1162         si.token = token;
1163         si.data_virt = NULL;
1164         si.data_dma = data;
1165         si.len = len;
1166         si.directed = directed;
1167 
1168         spin_lock_irqsave(&chan->lock, flags);
1169         if (chan->state != CPDMA_STATE_ACTIVE) {
1170                 spin_unlock_irqrestore(&chan->lock, flags);
1171                 return -EINVAL;
1172         }
1173 
1174         ret = cpdma_chan_submit_si(&si);
1175         spin_unlock_irqrestore(&chan->lock, flags);
1176         return ret;
1177 }
1178 
1179 bool cpdma_check_free_tx_desc(struct cpdma_chan *chan)
1180 {
1181         struct cpdma_ctlr       *ctlr = chan->ctlr;
1182         struct cpdma_desc_pool  *pool = ctlr->pool;
1183         bool                    free_tx_desc;
1184         unsigned long           flags;
1185 
1186         spin_lock_irqsave(&chan->lock, flags);
1187         free_tx_desc = (chan->count < chan->desc_num) &&
1188                          gen_pool_avail(pool->gen_pool);
1189         spin_unlock_irqrestore(&chan->lock, flags);
1190         return free_tx_desc;
1191 }
1192 
1193 static void __cpdma_chan_free(struct cpdma_chan *chan,
1194                               struct cpdma_desc __iomem *desc,
1195                               int outlen, int status)
1196 {
1197         struct cpdma_ctlr               *ctlr = chan->ctlr;
1198         struct cpdma_desc_pool          *pool = ctlr->pool;
1199         dma_addr_t                      buff_dma;
1200         int                             origlen;
1201         uintptr_t                       token;
1202 
1203         token      = desc_read(desc, sw_token);
1204         origlen    = desc_read(desc, sw_len);
1205 
1206         buff_dma   = desc_read(desc, sw_buffer);
1207         if (origlen & CPDMA_DMA_EXT_MAP) {
1208                 origlen &= ~CPDMA_DMA_EXT_MAP;
1209                 dma_sync_single_for_cpu(ctlr->dev, buff_dma, origlen,
1210                                         chan->dir);
1211         } else {
1212                 dma_unmap_single(ctlr->dev, buff_dma, origlen, chan->dir);
1213         }
1214 
1215         cpdma_desc_free(pool, desc, 1);
1216         (*chan->handler)((void *)token, outlen, status);
1217 }
1218 
1219 static int __cpdma_chan_process(struct cpdma_chan *chan)
1220 {
1221         struct cpdma_ctlr               *ctlr = chan->ctlr;
1222         struct cpdma_desc __iomem       *desc;
1223         int                             status, outlen;
1224         int                             cb_status = 0;
1225         struct cpdma_desc_pool          *pool = ctlr->pool;
1226         dma_addr_t                      desc_dma;
1227         unsigned long                   flags;
1228 
1229         spin_lock_irqsave(&chan->lock, flags);
1230 
1231         desc = chan->head;
1232         if (!desc) {
1233                 chan->stats.empty_dequeue++;
1234                 status = -ENOENT;
1235                 goto unlock_ret;
1236         }
1237         desc_dma = desc_phys(pool, desc);
1238 
1239         status  = desc_read(desc, hw_mode);
1240         outlen  = status & 0x7ff;
1241         if (status & CPDMA_DESC_OWNER) {
1242                 chan->stats.busy_dequeue++;
1243                 status = -EBUSY;
1244                 goto unlock_ret;
1245         }
1246 
1247         if (status & CPDMA_DESC_PASS_CRC)
1248                 outlen -= CPDMA_DESC_CRC_LEN;
1249 
1250         status  = status & (CPDMA_DESC_EOQ | CPDMA_DESC_TD_COMPLETE |
1251                             CPDMA_DESC_PORT_MASK | CPDMA_RX_VLAN_ENCAP);
1252 
1253         chan->head = desc_from_phys(pool, desc_read(desc, hw_next));
1254         chan_write(chan, cp, desc_dma);
1255         chan->count--;
1256         chan->stats.good_dequeue++;
1257 
1258         if ((status & CPDMA_DESC_EOQ) && chan->head) {
1259                 chan->stats.requeue++;
1260                 chan_write(chan, hdp, desc_phys(pool, chan->head));
1261         }
1262 
1263         spin_unlock_irqrestore(&chan->lock, flags);
1264         if (unlikely(status & CPDMA_DESC_TD_COMPLETE))
1265                 cb_status = -ENOSYS;
1266         else
1267                 cb_status = status;
1268 
1269         __cpdma_chan_free(chan, desc, outlen, cb_status);
1270         return status;
1271 
1272 unlock_ret:
1273         spin_unlock_irqrestore(&chan->lock, flags);
1274         return status;
1275 }
1276 
1277 int cpdma_chan_process(struct cpdma_chan *chan, int quota)
1278 {
1279         int used = 0, ret = 0;
1280 
1281         if (chan->state != CPDMA_STATE_ACTIVE)
1282                 return -EINVAL;
1283 
1284         while (used < quota) {
1285                 ret = __cpdma_chan_process(chan);
1286                 if (ret < 0)
1287                         break;
1288                 used++;
1289         }
1290         return used;
1291 }
1292 
1293 int cpdma_chan_start(struct cpdma_chan *chan)
1294 {
1295         struct cpdma_ctlr *ctlr = chan->ctlr;
1296         unsigned long flags;
1297         int ret;
1298 
1299         spin_lock_irqsave(&ctlr->lock, flags);
1300         ret = cpdma_chan_set_chan_shaper(chan);
1301         spin_unlock_irqrestore(&ctlr->lock, flags);
1302         if (ret)
1303                 return ret;
1304 
1305         ret = cpdma_chan_on(chan);
1306         if (ret)
1307                 return ret;
1308 
1309         return 0;
1310 }
1311 
1312 int cpdma_chan_stop(struct cpdma_chan *chan)
1313 {
1314         struct cpdma_ctlr       *ctlr = chan->ctlr;
1315         struct cpdma_desc_pool  *pool = ctlr->pool;
1316         unsigned long           flags;
1317         int                     ret;
1318         unsigned                timeout;
1319 
1320         spin_lock_irqsave(&chan->lock, flags);
1321         if (chan->state == CPDMA_STATE_TEARDOWN) {
1322                 spin_unlock_irqrestore(&chan->lock, flags);
1323                 return -EINVAL;
1324         }
1325 
1326         chan->state = CPDMA_STATE_TEARDOWN;
1327         dma_reg_write(ctlr, chan->int_clear, chan->mask);
1328 
1329         /* trigger teardown */
1330         dma_reg_write(ctlr, chan->td, chan_linear(chan));
1331 
1332         /* wait for teardown complete */
1333         timeout = 100 * 100; /* 100 ms */
1334         while (timeout) {
1335                 u32 cp = chan_read(chan, cp);
1336                 if ((cp & CPDMA_TEARDOWN_VALUE) == CPDMA_TEARDOWN_VALUE)
1337                         break;
1338                 udelay(10);
1339                 timeout--;
1340         }
1341         WARN_ON(!timeout);
1342         chan_write(chan, cp, CPDMA_TEARDOWN_VALUE);
1343 
1344         /* handle completed packets */
1345         spin_unlock_irqrestore(&chan->lock, flags);
1346         do {
1347                 ret = __cpdma_chan_process(chan);
1348                 if (ret < 0)
1349                         break;
1350         } while ((ret & CPDMA_DESC_TD_COMPLETE) == 0);
1351         spin_lock_irqsave(&chan->lock, flags);
1352 
1353         /* remaining packets haven't been tx/rx'ed, clean them up */
1354         while (chan->head) {
1355                 struct cpdma_desc __iomem *desc = chan->head;
1356                 dma_addr_t next_dma;
1357 
1358                 next_dma = desc_read(desc, hw_next);
1359                 chan->head = desc_from_phys(pool, next_dma);
1360                 chan->count--;
1361                 chan->stats.teardown_dequeue++;
1362 
1363                 /* issue callback without locks held */
1364                 spin_unlock_irqrestore(&chan->lock, flags);
1365                 __cpdma_chan_free(chan, desc, 0, -ENOSYS);
1366                 spin_lock_irqsave(&chan->lock, flags);
1367         }
1368 
1369         chan->state = CPDMA_STATE_IDLE;
1370         spin_unlock_irqrestore(&chan->lock, flags);
1371         return 0;
1372 }
1373 
1374 int cpdma_chan_int_ctrl(struct cpdma_chan *chan, bool enable)
1375 {
1376         unsigned long flags;
1377 
1378         spin_lock_irqsave(&chan->lock, flags);
1379         if (chan->state != CPDMA_STATE_ACTIVE) {
1380                 spin_unlock_irqrestore(&chan->lock, flags);
1381                 return -EINVAL;
1382         }
1383 
1384         dma_reg_write(chan->ctlr, enable ? chan->int_set : chan->int_clear,
1385                       chan->mask);
1386         spin_unlock_irqrestore(&chan->lock, flags);
1387 
1388         return 0;
1389 }
1390 
1391 int cpdma_control_get(struct cpdma_ctlr *ctlr, int control)
1392 {
1393         unsigned long flags;
1394         int ret;
1395 
1396         spin_lock_irqsave(&ctlr->lock, flags);
1397         ret = _cpdma_control_get(ctlr, control);
1398         spin_unlock_irqrestore(&ctlr->lock, flags);
1399 
1400         return ret;
1401 }
1402 
1403 int cpdma_control_set(struct cpdma_ctlr *ctlr, int control, int value)
1404 {
1405         unsigned long flags;
1406         int ret;
1407 
1408         spin_lock_irqsave(&ctlr->lock, flags);
1409         ret = _cpdma_control_set(ctlr, control, value);
1410         spin_unlock_irqrestore(&ctlr->lock, flags);
1411 
1412         return ret;
1413 }
1414 
1415 int cpdma_get_num_rx_descs(struct cpdma_ctlr *ctlr)
1416 {
1417         return ctlr->num_rx_desc;
1418 }
1419 
1420 int cpdma_get_num_tx_descs(struct cpdma_ctlr *ctlr)
1421 {
1422         return ctlr->num_tx_desc;
1423 }
1424 
1425 int cpdma_set_num_rx_descs(struct cpdma_ctlr *ctlr, int num_rx_desc)
1426 {
1427         unsigned long flags;
1428         int temp, ret;
1429 
1430         spin_lock_irqsave(&ctlr->lock, flags);
1431 
1432         temp = ctlr->num_rx_desc;
1433         ctlr->num_rx_desc = num_rx_desc;
1434         ctlr->num_tx_desc = ctlr->pool->num_desc - ctlr->num_rx_desc;
1435         ret = cpdma_chan_split_pool(ctlr);
1436         if (ret) {
1437                 ctlr->num_rx_desc = temp;
1438                 ctlr->num_tx_desc = ctlr->pool->num_desc - ctlr->num_rx_desc;
1439         }
1440 
1441         spin_unlock_irqrestore(&ctlr->lock, flags);
1442 
1443         return ret;
1444 }

/* [<][>][^][v][top][bottom][index][help] */