uboot/drivers/soc/ti/k3-navss-ringacc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * TI K3 AM65x NAVSS Ring accelerator Manager (RA) subsystem driver
   4 *
   5 * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
   6 */
   7
   8#include <common.h>
   9#include <cpu_func.h>
  10#include <log.h>
  11#include <asm/cache.h>
  12#include <asm/io.h>
  13#include <malloc.h>
  14#include <asm/bitops.h>
  15#include <dm.h>
  16#include <dm/device_compat.h>
  17#include <dm/devres.h>
  18#include <dm/read.h>
  19#include <dm/uclass.h>
  20#include <linux/bitops.h>
  21#include <linux/compat.h>
  22#include <linux/dma-mapping.h>
  23#include <linux/err.h>
  24#include <linux/soc/ti/k3-navss-ringacc.h>
  25#include <linux/soc/ti/ti_sci_protocol.h>
  26#include <linux/soc/ti/cppi5.h>
  27
  28#define set_bit(bit, bitmap)    __set_bit(bit, bitmap)
  29#define clear_bit(bit, bitmap)  __clear_bit(bit, bitmap)
  30#define dma_free_coherent(dev, size, cpu_addr, dma_handle) \
  31        dma_free_coherent(cpu_addr)
  32#define dma_zalloc_coherent(dev, size, dma_handle, flag) \
  33({ \
  34        void    *ring_mem_virt; \
  35        ring_mem_virt = dma_alloc_coherent((size), \
  36                                           (unsigned long *)(dma_handle)); \
  37        if (ring_mem_virt) \
  38                memset(ring_mem_virt, 0, (size)); \
  39        ring_mem_virt; \
  40})
  41
  42static LIST_HEAD(k3_nav_ringacc_list);
  43
  44static  void ringacc_writel(u32 v, void __iomem *reg)
  45{
  46        pr_debug("WRITEL(32): v(%08X)-->reg(%p)\n", v, reg);
  47        writel(v, reg);
  48}
  49
  50static  u32 ringacc_readl(void __iomem *reg)
  51{
  52        u32 v;
  53
  54        v = readl(reg);
  55        pr_debug("READL(32): v(%08X)<--reg(%p)\n", v, reg);
  56        return v;
  57}
  58
  59#define KNAV_RINGACC_CFG_RING_SIZE_ELCNT_MASK           GENMASK(19, 0)
  60#define K3_DMARING_RING_CFG_RING_SIZE_ELCNT_MASK                GENMASK(15, 0)
  61
  62/**
  63 * struct k3_nav_ring_rt_regs -  The RA Control/Status Registers region
  64 */
  65struct k3_nav_ring_rt_regs {
  66        u32     resv_16[4];
  67        u32     db;             /* RT Ring N Doorbell Register */
  68        u32     resv_4[1];
  69        u32     occ;            /* RT Ring N Occupancy Register */
  70        u32     indx;           /* RT Ring N Current Index Register */
  71        u32     hwocc;          /* RT Ring N Hardware Occupancy Register */
  72        u32     hwindx;         /* RT Ring N Current Index Register */
  73};
  74
  75#define KNAV_RINGACC_RT_REGS_STEP       0x1000
  76#define K3_DMARING_RING_RT_REGS_STEP                    0x2000
  77#define K3_DMARING_RING_RT_REGS_REVERSE_OFS             0x1000
  78#define KNAV_RINGACC_RT_OCC_MASK                GENMASK(20, 0)
  79#define K3_DMARING_RING_RT_OCC_TDOWN_COMPLETE           BIT(31)
  80#define K3_DMARING_RING_RT_DB_ENTRY_MASK                GENMASK(7, 0)
  81#define K3_DMARING_RING_RT_DB_TDOWN_ACK         BIT(31)
  82
  83
  84/**
  85 * struct k3_nav_ring_fifo_regs -  The Ring Accelerator Queues Registers region
  86 */
  87struct k3_nav_ring_fifo_regs {
  88        u32     head_data[128];         /* Ring Head Entry Data Registers */
  89        u32     tail_data[128];         /* Ring Tail Entry Data Registers */
  90        u32     peek_head_data[128];    /* Ring Peek Head Entry Data Regs */
  91        u32     peek_tail_data[128];    /* Ring Peek Tail Entry Data Regs */
  92};
  93
  94#define KNAV_RINGACC_FIFO_WINDOW_SIZE_BYTES  (512U)
  95#define KNAV_RINGACC_FIFO_REGS_STEP     0x1000
  96#define KNAV_RINGACC_MAX_DB_RING_CNT    (127U)
  97
  98/**
  99 * struct k3_nav_ring_ops -  Ring operations
 100 */
 101struct k3_nav_ring_ops {
 102        int (*push_tail)(struct k3_nav_ring *ring, void *elm);
 103        int (*push_head)(struct k3_nav_ring *ring, void *elm);
 104        int (*pop_tail)(struct k3_nav_ring *ring, void *elm);
 105        int (*pop_head)(struct k3_nav_ring *ring, void *elm);
 106};
 107
 108/**
 109 * struct k3_nav_ring_state - Internal state tracking structure
 110 *
 111 * @free: Number of free entries
 112 * @occ: Occupancy
 113 * @windex: Write index
 114 * @rindex: Read index
 115 */
 116struct k3_nav_ring_state {
 117        u32 free;
 118        u32 occ;
 119        u32 windex;
 120        u32 rindex;
 121        u32 tdown_complete:1;
 122};
 123
 124/**
 125 * struct k3_nav_ring - RA Ring descriptor
 126 *
 127 * @rt - Ring control/status registers
 128 * @fifos - Ring queues registers
 129 * @ring_mem_dma - Ring buffer dma address
 130 * @ring_mem_virt - Ring buffer virt address
 131 * @ops - Ring operations
 132 * @size - Ring size in elements
 133 * @elm_size - Size of the ring element
 134 * @mode - Ring mode
 135 * @flags - flags
 136 * @ring_id - Ring Id
 137 * @parent - Pointer on struct @k3_nav_ringacc
 138 * @use_count - Use count for shared rings
 139 */
 140struct k3_nav_ring {
 141        struct k3_nav_ring_rt_regs __iomem *rt;
 142        struct k3_nav_ring_fifo_regs __iomem *fifos;
 143        dma_addr_t      ring_mem_dma;
 144        void            *ring_mem_virt;
 145        struct k3_nav_ring_ops *ops;
 146        u32             size;
 147        enum k3_nav_ring_size elm_size;
 148        enum k3_nav_ring_mode mode;
 149        u32             flags;
 150#define KNAV_RING_FLAG_BUSY     BIT(1)
 151#define K3_NAV_RING_FLAG_SHARED BIT(2)
 152#define K3_NAV_RING_FLAG_REVERSE BIT(3)
 153        struct k3_nav_ring_state state;
 154        u32             ring_id;
 155        struct k3_nav_ringacc   *parent;
 156        u32             use_count;
 157};
 158
 159struct k3_nav_ringacc_ops {
 160        int (*init)(struct udevice *dev, struct k3_nav_ringacc *ringacc);
 161};
 162
 163/**
 164 * struct k3_nav_ringacc - Rings accelerator descriptor
 165 *
 166 * @dev - pointer on RA device
 167 * @num_rings - number of ring in RA
 168 * @rm_gp_range - general purpose rings range from tisci
 169 * @dma_ring_reset_quirk - DMA reset w/a enable
 170 * @num_proxies - number of RA proxies
 171 * @rings - array of rings descriptors (struct @k3_nav_ring)
 172 * @list - list of RAs in the system
 173 * @tisci - pointer ti-sci handle
 174 * @tisci_ring_ops - ti-sci rings ops
 175 * @tisci_dev_id - ti-sci device id
 176 * @ops: SoC specific ringacc operation
 177 * @dual_ring: indicate k3_dmaring dual ring support
 178 */
 179struct k3_nav_ringacc {
 180        struct udevice *dev;
 181        u32 num_rings; /* number of rings in Ringacc module */
 182        unsigned long *rings_inuse;
 183        struct ti_sci_resource *rm_gp_range;
 184        bool dma_ring_reset_quirk;
 185        u32 num_proxies;
 186
 187        struct k3_nav_ring *rings;
 188        struct list_head list;
 189
 190        const struct ti_sci_handle *tisci;
 191        const struct ti_sci_rm_ringacc_ops *tisci_ring_ops;
 192        u32  tisci_dev_id;
 193
 194        const struct k3_nav_ringacc_ops *ops;
 195        bool dual_ring;
 196};
 197
 198static int k3_nav_ringacc_ring_read_occ(struct k3_nav_ring *ring)
 199{
 200        return readl(&ring->rt->occ) & KNAV_RINGACC_RT_OCC_MASK;
 201}
 202
 203static void k3_nav_ringacc_ring_update_occ(struct k3_nav_ring *ring)
 204{
 205        u32 val;
 206
 207        val = readl(&ring->rt->occ);
 208
 209        ring->state.occ = val & KNAV_RINGACC_RT_OCC_MASK;
 210        ring->state.tdown_complete = !!(val & K3_DMARING_RING_RT_OCC_TDOWN_COMPLETE);
 211}
 212
 213static void *k3_nav_ringacc_get_elm_addr(struct k3_nav_ring *ring, u32 idx)
 214{
 215        return (idx * (4 << ring->elm_size) + ring->ring_mem_virt);
 216}
 217
 218static int k3_nav_ringacc_ring_push_mem(struct k3_nav_ring *ring, void *elem);
 219static int k3_nav_ringacc_ring_pop_mem(struct k3_nav_ring *ring, void *elem);
 220static int k3_dmaring_ring_fwd_pop_mem(struct k3_nav_ring *ring, void *elem);
 221static int k3_dmaring_ring_reverse_pop_mem(struct k3_nav_ring *ring, void *elem);
 222
 223static struct k3_nav_ring_ops k3_nav_mode_ring_ops = {
 224                .push_tail = k3_nav_ringacc_ring_push_mem,
 225                .pop_head = k3_nav_ringacc_ring_pop_mem,
 226};
 227
 228static struct k3_nav_ring_ops k3_dmaring_fwd_ring_ops = {
 229                .push_tail = k3_nav_ringacc_ring_push_mem,
 230                .pop_head = k3_dmaring_ring_fwd_pop_mem,
 231};
 232
 233static struct k3_nav_ring_ops k3_dmaring_reverse_ring_ops = {
 234                .pop_head = k3_dmaring_ring_reverse_pop_mem,
 235};
 236
 237struct udevice *k3_nav_ringacc_get_dev(struct k3_nav_ringacc *ringacc)
 238{
 239        return ringacc->dev;
 240}
 241
 242struct k3_nav_ring *k3_nav_ringacc_request_ring(struct k3_nav_ringacc *ringacc,
 243                                                int id)
 244{
 245        if (id == K3_NAV_RINGACC_RING_ID_ANY) {
 246                /* Request for any general purpose ring */
 247                struct ti_sci_resource_desc *gp_rings =
 248                                        &ringacc->rm_gp_range->desc[0];
 249                unsigned long size;
 250
 251                size = gp_rings->start + gp_rings->num;
 252                id = find_next_zero_bit(ringacc->rings_inuse,
 253                                        size, gp_rings->start);
 254                if (id == size)
 255                        goto error;
 256        } else if (id < 0) {
 257                goto error;
 258        }
 259
 260        if (test_bit(id, ringacc->rings_inuse) &&
 261            !(ringacc->rings[id].flags & K3_NAV_RING_FLAG_SHARED))
 262                goto error;
 263        else if (ringacc->rings[id].flags & K3_NAV_RING_FLAG_SHARED)
 264                goto out;
 265
 266        if (!try_module_get(ringacc->dev->driver->owner))
 267                goto error;
 268
 269        pr_debug("Giving ring#%d\n", id);
 270
 271        set_bit(id, ringacc->rings_inuse);
 272out:
 273        ringacc->rings[id].use_count++;
 274        return &ringacc->rings[id];
 275
 276error:
 277        return NULL;
 278}
 279
 280static int k3_dmaring_ring_request_rings_pair(struct k3_nav_ringacc *ringacc,
 281                                              int fwd_id, int compl_id,
 282                                              struct k3_nav_ring **fwd_ring,
 283                                              struct k3_nav_ring **compl_ring)
 284{
 285        /* k3_dmaring: fwd_id == compl_id, so we ignore compl_id */
 286        if (fwd_id < 0)
 287                return -EINVAL;
 288
 289        if (test_bit(fwd_id, ringacc->rings_inuse))
 290                return -EBUSY;
 291
 292        *fwd_ring = &ringacc->rings[fwd_id];
 293        *compl_ring = &ringacc->rings[fwd_id + ringacc->num_rings];
 294        set_bit(fwd_id, ringacc->rings_inuse);
 295        ringacc->rings[fwd_id].use_count++;
 296        dev_dbg(ringacc->dev, "Giving ring#%d\n", fwd_id);
 297
 298        return 0;
 299}
 300
 301int k3_nav_ringacc_request_rings_pair(struct k3_nav_ringacc *ringacc,
 302                                      int fwd_id, int compl_id,
 303                                      struct k3_nav_ring **fwd_ring,
 304                                      struct k3_nav_ring **compl_ring)
 305{
 306        int ret = 0;
 307
 308        if (!fwd_ring || !compl_ring)
 309                return -EINVAL;
 310
 311        if (ringacc->dual_ring)
 312                return k3_dmaring_ring_request_rings_pair(ringacc, fwd_id, compl_id,
 313                                                    fwd_ring, compl_ring);
 314
 315        *fwd_ring = k3_nav_ringacc_request_ring(ringacc, fwd_id);
 316        if (!(*fwd_ring))
 317                return -ENODEV;
 318
 319        *compl_ring = k3_nav_ringacc_request_ring(ringacc, compl_id);
 320        if (!(*compl_ring)) {
 321                k3_nav_ringacc_ring_free(*fwd_ring);
 322                ret = -ENODEV;
 323        }
 324
 325        return ret;
 326}
 327
 328static void k3_ringacc_ring_reset_sci(struct k3_nav_ring *ring)
 329{
 330        struct k3_nav_ringacc *ringacc = ring->parent;
 331        int ret;
 332
 333        ret = ringacc->tisci_ring_ops->config(
 334                        ringacc->tisci,
 335                        TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID,
 336                        ringacc->tisci_dev_id,
 337                        ring->ring_id,
 338                        0,
 339                        0,
 340                        ring->size,
 341                        0,
 342                        0,
 343                        0);
 344        if (ret)
 345                dev_err(ringacc->dev, "TISCI reset ring fail (%d) ring_idx %d\n",
 346                        ret, ring->ring_id);
 347}
 348
 349void k3_nav_ringacc_ring_reset(struct k3_nav_ring *ring)
 350{
 351        if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
 352                return;
 353
 354        memset(&ring->state, 0, sizeof(ring->state));
 355
 356        k3_ringacc_ring_reset_sci(ring);
 357}
 358
 359static void k3_ringacc_ring_reconfig_qmode_sci(struct k3_nav_ring *ring,
 360                                               enum k3_nav_ring_mode mode)
 361{
 362        struct k3_nav_ringacc *ringacc = ring->parent;
 363        int ret;
 364
 365        ret = ringacc->tisci_ring_ops->config(
 366                        ringacc->tisci,
 367                        TI_SCI_MSG_VALUE_RM_RING_MODE_VALID,
 368                        ringacc->tisci_dev_id,
 369                        ring->ring_id,
 370                        0,
 371                        0,
 372                        0,
 373                        mode,
 374                        0,
 375                        0);
 376        if (ret)
 377                dev_err(ringacc->dev, "TISCI reconf qmode fail (%d) ring_idx %d\n",
 378                        ret, ring->ring_id);
 379}
 380
 381void k3_nav_ringacc_ring_reset_dma(struct k3_nav_ring *ring, u32 occ)
 382{
 383        if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
 384                return;
 385
 386        if (!ring->parent->dma_ring_reset_quirk) {
 387                k3_nav_ringacc_ring_reset(ring);
 388                return;
 389        }
 390
 391        if (!occ)
 392                occ = ringacc_readl(&ring->rt->occ);
 393
 394        if (occ) {
 395                u32 db_ring_cnt, db_ring_cnt_cur;
 396
 397                pr_debug("%s %u occ: %u\n", __func__,
 398                         ring->ring_id, occ);
 399                /* 2. Reset the ring */
 400                k3_ringacc_ring_reset_sci(ring);
 401
 402                /*
 403                 * 3. Setup the ring in ring/doorbell mode
 404                 * (if not already in this mode)
 405                 */
 406                if (ring->mode != K3_NAV_RINGACC_RING_MODE_RING)
 407                        k3_ringacc_ring_reconfig_qmode_sci(
 408                                        ring, K3_NAV_RINGACC_RING_MODE_RING);
 409                /*
 410                 * 4. Ring the doorbell 2**22 – ringOcc times.
 411                 * This will wrap the internal UDMAP ring state occupancy
 412                 * counter (which is 21-bits wide) to 0.
 413                 */
 414                db_ring_cnt = (1U << 22) - occ;
 415
 416                while (db_ring_cnt != 0) {
 417                        /*
 418                         * Ring the doorbell with the maximum count each
 419                         * iteration if possible to minimize the total
 420                         * of writes
 421                         */
 422                        if (db_ring_cnt > KNAV_RINGACC_MAX_DB_RING_CNT)
 423                                db_ring_cnt_cur = KNAV_RINGACC_MAX_DB_RING_CNT;
 424                        else
 425                                db_ring_cnt_cur = db_ring_cnt;
 426
 427                        writel(db_ring_cnt_cur, &ring->rt->db);
 428                        db_ring_cnt -= db_ring_cnt_cur;
 429                }
 430
 431                /* 5. Restore the original ring mode (if not ring mode) */
 432                if (ring->mode != K3_NAV_RINGACC_RING_MODE_RING)
 433                        k3_ringacc_ring_reconfig_qmode_sci(ring, ring->mode);
 434        }
 435
 436        /* 2. Reset the ring */
 437        k3_nav_ringacc_ring_reset(ring);
 438}
 439
 440static void k3_ringacc_ring_free_sci(struct k3_nav_ring *ring)
 441{
 442        struct k3_nav_ringacc *ringacc = ring->parent;
 443        int ret;
 444
 445        ret = ringacc->tisci_ring_ops->config(
 446                        ringacc->tisci,
 447                        TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER,
 448                        ringacc->tisci_dev_id,
 449                        ring->ring_id,
 450                        0,
 451                        0,
 452                        0,
 453                        0,
 454                        0,
 455                        0);
 456        if (ret)
 457                dev_err(ringacc->dev, "TISCI ring free fail (%d) ring_idx %d\n",
 458                        ret, ring->ring_id);
 459}
 460
 461int k3_nav_ringacc_ring_free(struct k3_nav_ring *ring)
 462{
 463        struct k3_nav_ringacc *ringacc;
 464
 465        if (!ring)
 466                return -EINVAL;
 467
 468        ringacc = ring->parent;
 469
 470        /*
 471         * k3_dmaring: rings shared memory and configuration, only forward ring is
 472         * configured and reverse ring considered as slave.
 473         */
 474        if (ringacc->dual_ring && (ring->flags & K3_NAV_RING_FLAG_REVERSE))
 475                return 0;
 476
 477        pr_debug("%s flags: 0x%08x\n", __func__, ring->flags);
 478
 479        if (!test_bit(ring->ring_id, ringacc->rings_inuse))
 480                return -EINVAL;
 481
 482        if (--ring->use_count)
 483                goto out;
 484
 485        if (!(ring->flags & KNAV_RING_FLAG_BUSY))
 486                goto no_init;
 487
 488        k3_ringacc_ring_free_sci(ring);
 489
 490        dma_free_coherent(ringacc->dev,
 491                          ring->size * (4 << ring->elm_size),
 492                          ring->ring_mem_virt, ring->ring_mem_dma);
 493        ring->flags &= ~KNAV_RING_FLAG_BUSY;
 494        ring->ops = NULL;
 495
 496no_init:
 497        clear_bit(ring->ring_id, ringacc->rings_inuse);
 498
 499        module_put(ringacc->dev->driver->owner);
 500
 501out:
 502        return 0;
 503}
 504
 505u32 k3_nav_ringacc_get_ring_id(struct k3_nav_ring *ring)
 506{
 507        if (!ring)
 508                return -EINVAL;
 509
 510        return ring->ring_id;
 511}
 512
 513static int k3_nav_ringacc_ring_cfg_sci(struct k3_nav_ring *ring)
 514{
 515        struct k3_nav_ringacc *ringacc = ring->parent;
 516        u32 ring_idx;
 517        int ret;
 518
 519        if (!ringacc->tisci)
 520                return -EINVAL;
 521
 522        ring_idx = ring->ring_id;
 523        ret = ringacc->tisci_ring_ops->config(
 524                        ringacc->tisci,
 525                        TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER,
 526                        ringacc->tisci_dev_id,
 527                        ring_idx,
 528                        lower_32_bits(ring->ring_mem_dma),
 529                        upper_32_bits(ring->ring_mem_dma),
 530                        ring->size,
 531                        ring->mode,
 532                        ring->elm_size,
 533                        0);
 534        if (ret)
 535                dev_err(ringacc->dev, "TISCI config ring fail (%d) ring_idx %d\n",
 536                        ret, ring_idx);
 537
 538        return ret;
 539}
 540
 541static int k3_dmaring_ring_cfg(struct k3_nav_ring *ring, struct k3_nav_ring_cfg *cfg)
 542{
 543        struct k3_nav_ringacc *ringacc;
 544        struct k3_nav_ring *reverse_ring;
 545        int ret = 0;
 546
 547        if (cfg->elm_size != K3_NAV_RINGACC_RING_ELSIZE_8 ||
 548            cfg->mode != K3_NAV_RINGACC_RING_MODE_RING ||
 549            cfg->size & ~K3_DMARING_RING_CFG_RING_SIZE_ELCNT_MASK)
 550                return -EINVAL;
 551
 552        ringacc = ring->parent;
 553
 554        /*
 555         * k3_dmaring: rings shared memory and configuration, only forward ring is
 556         * configured and reverse ring considered as slave.
 557         */
 558        if (ringacc->dual_ring && (ring->flags & K3_NAV_RING_FLAG_REVERSE))
 559                return 0;
 560
 561        if (!test_bit(ring->ring_id, ringacc->rings_inuse))
 562                return -EINVAL;
 563
 564        ring->size = cfg->size;
 565        ring->elm_size = cfg->elm_size;
 566        ring->mode = cfg->mode;
 567        memset(&ring->state, 0, sizeof(ring->state));
 568
 569        ring->ops = &k3_dmaring_fwd_ring_ops;
 570
 571        ring->ring_mem_virt =
 572                dma_alloc_coherent(ring->size * (4 << ring->elm_size),
 573                                   (unsigned long *)&ring->ring_mem_dma);
 574        if (!ring->ring_mem_virt) {
 575                dev_err(ringacc->dev, "Failed to alloc ring mem\n");
 576                ret = -ENOMEM;
 577                goto err_free_ops;
 578        }
 579
 580        ret = k3_nav_ringacc_ring_cfg_sci(ring);
 581        if (ret)
 582                goto err_free_mem;
 583
 584        ring->flags |= KNAV_RING_FLAG_BUSY;
 585
 586        /* k3_dmaring: configure reverse ring */
 587        reverse_ring = &ringacc->rings[ring->ring_id + ringacc->num_rings];
 588        reverse_ring->size = cfg->size;
 589        reverse_ring->elm_size = cfg->elm_size;
 590        reverse_ring->mode = cfg->mode;
 591        memset(&reverse_ring->state, 0, sizeof(reverse_ring->state));
 592        reverse_ring->ops = &k3_dmaring_reverse_ring_ops;
 593
 594        reverse_ring->ring_mem_virt = ring->ring_mem_virt;
 595        reverse_ring->ring_mem_dma = ring->ring_mem_dma;
 596        reverse_ring->flags |= KNAV_RING_FLAG_BUSY;
 597
 598        return 0;
 599
 600err_free_mem:
 601        dma_free_coherent(ringacc->dev,
 602                          ring->size * (4 << ring->elm_size),
 603                          ring->ring_mem_virt,
 604                          ring->ring_mem_dma);
 605err_free_ops:
 606        ring->ops = NULL;
 607        return ret;
 608}
 609
 610int k3_nav_ringacc_ring_cfg(struct k3_nav_ring *ring,
 611                            struct k3_nav_ring_cfg *cfg)
 612{
 613        struct k3_nav_ringacc *ringacc = ring->parent;
 614        int ret = 0;
 615
 616        if (!ring || !cfg)
 617                return -EINVAL;
 618
 619        if (ringacc->dual_ring)
 620                return k3_dmaring_ring_cfg(ring, cfg);
 621
 622        if (cfg->elm_size > K3_NAV_RINGACC_RING_ELSIZE_256 ||
 623            cfg->mode > K3_NAV_RINGACC_RING_MODE_QM ||
 624            cfg->size & ~KNAV_RINGACC_CFG_RING_SIZE_ELCNT_MASK ||
 625            !test_bit(ring->ring_id, ringacc->rings_inuse))
 626                return -EINVAL;
 627
 628        if (ring->use_count != 1)
 629                return 0;
 630
 631        ring->size = cfg->size;
 632        ring->elm_size = cfg->elm_size;
 633        ring->mode = cfg->mode;
 634        memset(&ring->state, 0, sizeof(ring->state));
 635
 636        switch (ring->mode) {
 637        case K3_NAV_RINGACC_RING_MODE_RING:
 638                ring->ops = &k3_nav_mode_ring_ops;
 639                break;
 640        default:
 641                ring->ops = NULL;
 642                ret = -EINVAL;
 643                goto err_free_ops;
 644        };
 645
 646        ring->ring_mem_virt =
 647                        dma_zalloc_coherent(ringacc->dev,
 648                                            ring->size * (4 << ring->elm_size),
 649                                            &ring->ring_mem_dma, GFP_KERNEL);
 650        if (!ring->ring_mem_virt) {
 651                dev_err(ringacc->dev, "Failed to alloc ring mem\n");
 652                ret = -ENOMEM;
 653                goto err_free_ops;
 654        }
 655
 656        ret = k3_nav_ringacc_ring_cfg_sci(ring);
 657
 658        if (ret)
 659                goto err_free_mem;
 660
 661        ring->flags |= KNAV_RING_FLAG_BUSY;
 662        ring->flags |= (cfg->flags & K3_NAV_RINGACC_RING_SHARED) ?
 663                        K3_NAV_RING_FLAG_SHARED : 0;
 664
 665        return 0;
 666
 667err_free_mem:
 668        dma_free_coherent(ringacc->dev,
 669                          ring->size * (4 << ring->elm_size),
 670                          ring->ring_mem_virt,
 671                          ring->ring_mem_dma);
 672err_free_ops:
 673        ring->ops = NULL;
 674        return ret;
 675}
 676
 677u32 k3_nav_ringacc_ring_get_size(struct k3_nav_ring *ring)
 678{
 679        if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
 680                return -EINVAL;
 681
 682        return ring->size;
 683}
 684
 685u32 k3_nav_ringacc_ring_get_free(struct k3_nav_ring *ring)
 686{
 687        if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
 688                return -EINVAL;
 689
 690        if (!ring->state.free)
 691                ring->state.free = ring->size - ringacc_readl(&ring->rt->occ);
 692
 693        return ring->state.free;
 694}
 695
 696u32 k3_nav_ringacc_ring_get_occ(struct k3_nav_ring *ring)
 697{
 698        if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
 699                return -EINVAL;
 700
 701        return ringacc_readl(&ring->rt->occ);
 702}
 703
 704u32 k3_nav_ringacc_ring_is_full(struct k3_nav_ring *ring)
 705{
 706        return !k3_nav_ringacc_ring_get_free(ring);
 707}
 708
 709enum k3_ringacc_access_mode {
 710        K3_RINGACC_ACCESS_MODE_PUSH_HEAD,
 711        K3_RINGACC_ACCESS_MODE_POP_HEAD,
 712        K3_RINGACC_ACCESS_MODE_PUSH_TAIL,
 713        K3_RINGACC_ACCESS_MODE_POP_TAIL,
 714        K3_RINGACC_ACCESS_MODE_PEEK_HEAD,
 715        K3_RINGACC_ACCESS_MODE_PEEK_TAIL,
 716};
 717
 718static int k3_dmaring_ring_fwd_pop_mem(struct k3_nav_ring *ring, void *elem)
 719{
 720        void *elem_ptr;
 721        u32 elem_idx;
 722
 723        /*
 724         * k3_dmaring: forward ring is always tied DMA channel and HW does not
 725         * maintain any state data required for POP operation and its unknown
 726         * how much elements were consumed by HW. So, to actually
 727         * do POP, the read pointer has to be recalculated every time.
 728         */
 729        ring->state.occ = k3_nav_ringacc_ring_read_occ(ring);
 730        if (ring->state.windex >= ring->state.occ)
 731                elem_idx = ring->state.windex - ring->state.occ;
 732        else
 733                elem_idx = ring->size - (ring->state.occ - ring->state.windex);
 734
 735        elem_ptr = k3_nav_ringacc_get_elm_addr(ring, elem_idx);
 736        invalidate_dcache_range((unsigned long)ring->ring_mem_virt,
 737                                ALIGN((unsigned long)ring->ring_mem_virt +
 738                                      ring->size * (4 << ring->elm_size),
 739                                      ARCH_DMA_MINALIGN));
 740
 741        memcpy(elem, elem_ptr, (4 << ring->elm_size));
 742
 743        ring->state.occ--;
 744        writel(-1, &ring->rt->db);
 745
 746        dev_dbg(ring->parent->dev, "%s: occ%d Windex%d Rindex%d pos_ptr%px\n",
 747                __func__, ring->state.occ, ring->state.windex, elem_idx,
 748                elem_ptr);
 749        return 0;
 750}
 751
 752static int k3_dmaring_ring_reverse_pop_mem(struct k3_nav_ring *ring, void *elem)
 753{
 754        void *elem_ptr;
 755
 756        elem_ptr = k3_nav_ringacc_get_elm_addr(ring, ring->state.rindex);
 757
 758        if (ring->state.occ) {
 759                invalidate_dcache_range((unsigned long)ring->ring_mem_virt,
 760                                        ALIGN((unsigned long)ring->ring_mem_virt +
 761                                        ring->size * (4 << ring->elm_size),
 762                                        ARCH_DMA_MINALIGN));
 763
 764                memcpy(elem, elem_ptr, (4 << ring->elm_size));
 765                ring->state.rindex = (ring->state.rindex + 1) % ring->size;
 766                ring->state.occ--;
 767                writel(-1 & K3_DMARING_RING_RT_DB_ENTRY_MASK, &ring->rt->db);
 768        }
 769
 770        dev_dbg(ring->parent->dev, "%s: occ%d index%d pos_ptr%px\n",
 771                __func__, ring->state.occ, ring->state.rindex, elem_ptr);
 772        return 0;
 773}
 774
 775static int k3_nav_ringacc_ring_push_mem(struct k3_nav_ring *ring, void *elem)
 776{
 777        void *elem_ptr;
 778
 779        elem_ptr = k3_nav_ringacc_get_elm_addr(ring, ring->state.windex);
 780
 781        memcpy(elem_ptr, elem, (4 << ring->elm_size));
 782
 783        flush_dcache_range((unsigned long)ring->ring_mem_virt,
 784                           ALIGN((unsigned long)ring->ring_mem_virt +
 785                                 ring->size * (4 << ring->elm_size),
 786                                 ARCH_DMA_MINALIGN));
 787
 788        ring->state.windex = (ring->state.windex + 1) % ring->size;
 789        ring->state.free--;
 790        ringacc_writel(1, &ring->rt->db);
 791
 792        pr_debug("ring_push_mem: free%d index%d\n",
 793                 ring->state.free, ring->state.windex);
 794
 795        return 0;
 796}
 797
 798static int k3_nav_ringacc_ring_pop_mem(struct k3_nav_ring *ring, void *elem)
 799{
 800        void *elem_ptr;
 801
 802        elem_ptr = k3_nav_ringacc_get_elm_addr(ring, ring->state.rindex);
 803
 804        invalidate_dcache_range((unsigned long)ring->ring_mem_virt,
 805                                ALIGN((unsigned long)ring->ring_mem_virt +
 806                                      ring->size * (4 << ring->elm_size),
 807                                      ARCH_DMA_MINALIGN));
 808
 809        memcpy(elem, elem_ptr, (4 << ring->elm_size));
 810
 811        ring->state.rindex = (ring->state.rindex + 1) % ring->size;
 812        ring->state.occ--;
 813        ringacc_writel(-1, &ring->rt->db);
 814
 815        pr_debug("ring_pop_mem: occ%d index%d pos_ptr%p\n",
 816                 ring->state.occ, ring->state.rindex, elem_ptr);
 817        return 0;
 818}
 819
 820int k3_nav_ringacc_ring_push(struct k3_nav_ring *ring, void *elem)
 821{
 822        int ret = -EOPNOTSUPP;
 823
 824        if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
 825                return -EINVAL;
 826
 827        pr_debug("ring_push%d: free%d index%d\n",
 828                 ring->ring_id, ring->state.free, ring->state.windex);
 829
 830        if (k3_nav_ringacc_ring_is_full(ring))
 831                return -ENOMEM;
 832
 833        if (ring->ops && ring->ops->push_tail)
 834                ret = ring->ops->push_tail(ring, elem);
 835
 836        return ret;
 837}
 838
 839int k3_nav_ringacc_ring_push_head(struct k3_nav_ring *ring, void *elem)
 840{
 841        int ret = -EOPNOTSUPP;
 842
 843        if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
 844                return -EINVAL;
 845
 846        pr_debug("ring_push_head: free%d index%d\n",
 847                 ring->state.free, ring->state.windex);
 848
 849        if (k3_nav_ringacc_ring_is_full(ring))
 850                return -ENOMEM;
 851
 852        if (ring->ops && ring->ops->push_head)
 853                ret = ring->ops->push_head(ring, elem);
 854
 855        return ret;
 856}
 857
 858int k3_nav_ringacc_ring_pop(struct k3_nav_ring *ring, void *elem)
 859{
 860        int ret = -EOPNOTSUPP;
 861
 862        if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
 863                return -EINVAL;
 864
 865        if (!ring->state.occ)
 866                k3_nav_ringacc_ring_update_occ(ring);
 867
 868        pr_debug("ring_pop%d: occ%d index%d\n",
 869                 ring->ring_id, ring->state.occ, ring->state.rindex);
 870
 871        if (!ring->state.occ && !ring->state.tdown_complete)
 872                return -ENODATA;
 873
 874        if (ring->ops && ring->ops->pop_head)
 875                ret = ring->ops->pop_head(ring, elem);
 876
 877        return ret;
 878}
 879
 880int k3_nav_ringacc_ring_pop_tail(struct k3_nav_ring *ring, void *elem)
 881{
 882        int ret = -EOPNOTSUPP;
 883
 884        if (!ring || !(ring->flags & KNAV_RING_FLAG_BUSY))
 885                return -EINVAL;
 886
 887        if (!ring->state.occ)
 888                k3_nav_ringacc_ring_update_occ(ring);
 889
 890        pr_debug("ring_pop_tail: occ%d index%d\n",
 891                 ring->state.occ, ring->state.rindex);
 892
 893        if (!ring->state.occ)
 894                return -ENODATA;
 895
 896        if (ring->ops && ring->ops->pop_tail)
 897                ret = ring->ops->pop_tail(ring, elem);
 898
 899        return ret;
 900}
 901
 902static int k3_nav_ringacc_probe_dt(struct k3_nav_ringacc *ringacc)
 903{
 904        struct udevice *dev = ringacc->dev;
 905        struct udevice *devp = dev;
 906        struct udevice *tisci_dev = NULL;
 907        int ret;
 908
 909        ringacc->num_rings = dev_read_u32_default(dev, "ti,num-rings", 0);
 910        if (!ringacc->num_rings) {
 911                dev_err(dev, "ti,num-rings read failure %d\n", ret);
 912                return -EINVAL;
 913        }
 914
 915        ringacc->dma_ring_reset_quirk =
 916                        dev_read_bool(dev, "ti,dma-ring-reset-quirk");
 917
 918        ret = uclass_get_device_by_phandle(UCLASS_FIRMWARE, devp,
 919                                           "ti,sci", &tisci_dev);
 920        if (ret) {
 921                pr_debug("TISCI RA RM get failed (%d)\n", ret);
 922                ringacc->tisci = NULL;
 923                return -ENODEV;
 924        }
 925        ringacc->tisci = (struct ti_sci_handle *)
 926                         (ti_sci_get_handle_from_sysfw(tisci_dev));
 927
 928        ret = dev_read_u32_default(devp, "ti,sci", 0);
 929        if (!ret) {
 930                dev_err(dev, "TISCI RA RM disabled\n");
 931                ringacc->tisci = NULL;
 932                return ret;
 933        }
 934
 935        ret = dev_read_u32(devp, "ti,sci-dev-id", &ringacc->tisci_dev_id);
 936        if (ret) {
 937                dev_err(dev, "ti,sci-dev-id read failure %d\n", ret);
 938                ringacc->tisci = NULL;
 939                return ret;
 940        }
 941
 942        ringacc->rm_gp_range = devm_ti_sci_get_of_resource(
 943                                        ringacc->tisci, dev,
 944                                        ringacc->tisci_dev_id,
 945                                        "ti,sci-rm-range-gp-rings");
 946        if (IS_ERR(ringacc->rm_gp_range))
 947                ret = PTR_ERR(ringacc->rm_gp_range);
 948
 949        return 0;
 950}
 951
 952static int k3_nav_ringacc_init(struct udevice *dev, struct k3_nav_ringacc *ringacc)
 953{
 954        void __iomem *base_rt;
 955        int ret, i;
 956
 957        ret = k3_nav_ringacc_probe_dt(ringacc);
 958        if (ret)
 959                return ret;
 960
 961        base_rt = (uint32_t *)devfdt_get_addr_name(dev, "rt");
 962        pr_debug("rt %p\n", base_rt);
 963        if (IS_ERR(base_rt))
 964                return PTR_ERR(base_rt);
 965
 966        ringacc->rings = devm_kzalloc(dev,
 967                                      sizeof(*ringacc->rings) *
 968                                      ringacc->num_rings,
 969                                      GFP_KERNEL);
 970        ringacc->rings_inuse = devm_kcalloc(dev,
 971                                            BITS_TO_LONGS(ringacc->num_rings),
 972                                            sizeof(unsigned long), GFP_KERNEL);
 973
 974        if (!ringacc->rings || !ringacc->rings_inuse)
 975                return -ENOMEM;
 976
 977        for (i = 0; i < ringacc->num_rings; i++) {
 978                ringacc->rings[i].rt = base_rt +
 979                                       KNAV_RINGACC_RT_REGS_STEP * i;
 980                ringacc->rings[i].parent = ringacc;
 981                ringacc->rings[i].ring_id = i;
 982        }
 983        dev_set_drvdata(dev, ringacc);
 984
 985        ringacc->tisci_ring_ops = &ringacc->tisci->ops.rm_ring_ops;
 986
 987        list_add_tail(&ringacc->list, &k3_nav_ringacc_list);
 988
 989        dev_info(dev, "Ring Accelerator probed rings:%u, gp-rings[%u,%u] sci-dev-id:%u\n",
 990                 ringacc->num_rings,
 991                 ringacc->rm_gp_range->desc[0].start,
 992                 ringacc->rm_gp_range->desc[0].num,
 993                 ringacc->tisci_dev_id);
 994        dev_info(dev, "dma-ring-reset-quirk: %s\n",
 995                 ringacc->dma_ring_reset_quirk ? "enabled" : "disabled");
 996        return 0;
 997}
 998
 999struct k3_nav_ringacc *k3_ringacc_dmarings_init(struct udevice *dev,
1000                                                struct k3_ringacc_init_data *data)
1001{
1002        struct k3_nav_ringacc *ringacc;
1003        void __iomem *base_rt;
1004        int i;
1005
1006        ringacc = devm_kzalloc(dev, sizeof(*ringacc), GFP_KERNEL);
1007        if (!ringacc)
1008                return ERR_PTR(-ENOMEM);
1009
1010        ringacc->dual_ring = true;
1011
1012        ringacc->dev = dev;
1013        ringacc->num_rings = data->num_rings;
1014        ringacc->tisci = data->tisci;
1015        ringacc->tisci_dev_id = data->tisci_dev_id;
1016
1017        base_rt = (uint32_t *)devfdt_get_addr_name(dev, "ringrt");
1018        if (IS_ERR(base_rt))
1019                return base_rt;
1020
1021        ringacc->rings = devm_kzalloc(dev,
1022                                      sizeof(*ringacc->rings) *
1023                                      ringacc->num_rings * 2,
1024                                      GFP_KERNEL);
1025        ringacc->rings_inuse = devm_kcalloc(dev,
1026                                            BITS_TO_LONGS(ringacc->num_rings),
1027                                            sizeof(unsigned long), GFP_KERNEL);
1028
1029        if (!ringacc->rings || !ringacc->rings_inuse)
1030                return ERR_PTR(-ENOMEM);
1031
1032        for (i = 0; i < ringacc->num_rings; i++) {
1033                struct k3_nav_ring *ring = &ringacc->rings[i];
1034
1035                ring->rt = base_rt + K3_DMARING_RING_RT_REGS_STEP * i;
1036                ring->parent = ringacc;
1037                ring->ring_id = i;
1038
1039                ring = &ringacc->rings[ringacc->num_rings + i];
1040                ring->rt = base_rt + K3_DMARING_RING_RT_REGS_STEP * i +
1041                           K3_DMARING_RING_RT_REGS_REVERSE_OFS;
1042                ring->parent = ringacc;
1043                ring->ring_id = i;
1044                ring->flags = K3_NAV_RING_FLAG_REVERSE;
1045        }
1046
1047        ringacc->tisci_ring_ops = &ringacc->tisci->ops.rm_ring_ops;
1048
1049        dev_info(dev, "k3_dmaring Ring probed rings:%u, sci-dev-id:%u\n",
1050                 ringacc->num_rings,
1051                 ringacc->tisci_dev_id);
1052        dev_info(dev, "dma-ring-reset-quirk: %s\n",
1053                 ringacc->dma_ring_reset_quirk ? "enabled" : "disabled");
1054
1055        return ringacc;
1056}
1057
1058struct ringacc_match_data {
1059        struct k3_nav_ringacc_ops ops;
1060};
1061
1062static struct ringacc_match_data k3_nav_ringacc_data = {
1063        .ops = {
1064                .init = k3_nav_ringacc_init,
1065        },
1066};
1067
1068static const struct udevice_id knav_ringacc_ids[] = {
1069        { .compatible = "ti,am654-navss-ringacc", .data = (ulong)&k3_nav_ringacc_data, },
1070        {},
1071};
1072
1073static int k3_nav_ringacc_probe(struct udevice *dev)
1074{
1075        struct k3_nav_ringacc *ringacc;
1076        int ret;
1077        const struct ringacc_match_data *match_data;
1078
1079        match_data = (struct ringacc_match_data *)dev_get_driver_data(dev);
1080
1081        ringacc = dev_get_priv(dev);
1082        if (!ringacc)
1083                return -ENOMEM;
1084
1085        ringacc->dev = dev;
1086        ringacc->ops = &match_data->ops;
1087        ret = ringacc->ops->init(dev, ringacc);
1088        if (ret)
1089                return ret;
1090
1091        return 0;
1092}
1093
1094U_BOOT_DRIVER(k3_navss_ringacc) = {
1095        .name   = "k3-navss-ringacc",
1096        .id     = UCLASS_MISC,
1097        .of_match = knav_ringacc_ids,
1098        .probe = k3_nav_ringacc_probe,
1099        .priv_auto      = sizeof(struct k3_nav_ringacc),
1100};
1101