linux/drivers/soc/ti/knav_qmss.h
<<
>>
Prefs
   1/*
   2 * Keystone Navigator QMSS driver internal header
   3 *
   4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
   5 * Author:      Sandeep Nair <sandeep_n@ti.com>
   6 *              Cyril Chemparathy <cyril@ti.com>
   7 *              Santosh Shilimkar <santosh.shilimkar@ti.com>
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License
  11 * version 2 as published by the Free Software Foundation.
  12 *
  13 * This program is distributed in the hope that it will be useful, but
  14 * WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16 * General Public License for more details.
  17 */
  18
  19#ifndef __KNAV_QMSS_H__
  20#define __KNAV_QMSS_H__
  21
  22#include <linux/percpu.h>
  23
  24#define THRESH_GTE      BIT(7)
  25#define THRESH_LT       0
  26
  27#define PDSP_CTRL_PC_MASK       0xffff0000
  28#define PDSP_CTRL_SOFT_RESET    BIT(0)
  29#define PDSP_CTRL_ENABLE        BIT(1)
  30#define PDSP_CTRL_RUNNING       BIT(15)
  31
  32#define ACC_MAX_CHANNEL         48
  33#define ACC_DEFAULT_PERIOD      25 /* usecs */
  34
  35#define ACC_CHANNEL_INT_BASE            2
  36
  37#define ACC_LIST_ENTRY_TYPE             1
  38#define ACC_LIST_ENTRY_WORDS            (1 << ACC_LIST_ENTRY_TYPE)
  39#define ACC_LIST_ENTRY_QUEUE_IDX        0
  40#define ACC_LIST_ENTRY_DESC_IDX (ACC_LIST_ENTRY_WORDS - 1)
  41
  42#define ACC_CMD_DISABLE_CHANNEL 0x80
  43#define ACC_CMD_ENABLE_CHANNEL  0x81
  44#define ACC_CFG_MULTI_QUEUE             BIT(21)
  45
  46#define ACC_INTD_OFFSET_EOI             (0x0010)
  47#define ACC_INTD_OFFSET_COUNT(ch)       (0x0300 + 4 * (ch))
  48#define ACC_INTD_OFFSET_STATUS(ch)      (0x0200 + 4 * ((ch) / 32))
  49
  50#define RANGE_MAX_IRQS                  64
  51
  52#define ACC_DESCS_MAX           SZ_1K
  53#define ACC_DESCS_MASK          (ACC_DESCS_MAX - 1)
  54#define DESC_SIZE_MASK          0xful
  55#define DESC_PTR_MASK           (~DESC_SIZE_MASK)
  56
  57#define KNAV_NAME_SIZE                  32
  58
  59enum knav_acc_result {
  60        ACC_RET_IDLE,
  61        ACC_RET_SUCCESS,
  62        ACC_RET_INVALID_COMMAND,
  63        ACC_RET_INVALID_CHANNEL,
  64        ACC_RET_INACTIVE_CHANNEL,
  65        ACC_RET_ACTIVE_CHANNEL,
  66        ACC_RET_INVALID_QUEUE,
  67        ACC_RET_INVALID_RET,
  68};
  69
  70struct knav_reg_config {
  71        u32             revision;
  72        u32             __pad1;
  73        u32             divert;
  74        u32             link_ram_base0;
  75        u32             link_ram_size0;
  76        u32             link_ram_base1;
  77        u32             __pad2[2];
  78        u32             starvation[0];
  79};
  80
  81struct knav_reg_region {
  82        u32             base;
  83        u32             start_index;
  84        u32             size_count;
  85        u32             __pad;
  86};
  87
  88struct knav_reg_pdsp_regs {
  89        u32             control;
  90        u32             status;
  91        u32             cycle_count;
  92        u32             stall_count;
  93};
  94
  95struct knav_reg_acc_command {
  96        u32             command;
  97        u32             queue_mask;
  98        u32             list_dma;
  99        u32             queue_num;
 100        u32             timer_config;
 101};
 102
 103struct knav_link_ram_block {
 104        dma_addr_t       dma;
 105        void            *virt;
 106        size_t           size;
 107};
 108
 109struct knav_acc_info {
 110        u32                      pdsp_id;
 111        u32                      start_channel;
 112        u32                      list_entries;
 113        u32                      pacing_mode;
 114        u32                      timer_count;
 115        int                      mem_size;
 116        int                      list_size;
 117        struct knav_pdsp_info   *pdsp;
 118};
 119
 120struct knav_acc_channel {
 121        u32                     channel;
 122        u32                     list_index;
 123        u32                     open_mask;
 124        u32                     *list_cpu[2];
 125        dma_addr_t              list_dma[2];
 126        char                    name[KNAV_NAME_SIZE];
 127        atomic_t                retrigger_count;
 128};
 129
 130struct knav_pdsp_info {
 131        const char                                      *name;
 132        struct knav_reg_pdsp_regs  __iomem              *regs;
 133        union {
 134                void __iomem                            *command;
 135                struct knav_reg_acc_command __iomem     *acc_command;
 136                u32 __iomem                             *qos_command;
 137        };
 138        void __iomem                                    *intd;
 139        u32 __iomem                                     *iram;
 140        u32                                             id;
 141        struct list_head                                list;
 142        bool                                            loaded;
 143        bool                                            started;
 144};
 145
 146struct knav_qmgr_info {
 147        unsigned                        start_queue;
 148        unsigned                        num_queues;
 149        struct knav_reg_config __iomem  *reg_config;
 150        struct knav_reg_region __iomem  *reg_region;
 151        struct knav_reg_queue __iomem   *reg_push, *reg_pop, *reg_peek;
 152        void __iomem                    *reg_status;
 153        struct list_head                list;
 154};
 155
 156#define KNAV_NUM_LINKRAM        2
 157
 158/**
 159 * struct knav_queue_stats:     queue statistics
 160 * pushes:                      number of push operations
 161 * pops:                        number of pop operations
 162 * push_errors:                 number of push errors
 163 * pop_errors:                  number of pop errors
 164 * notifies:                    notifier counts
 165 */
 166struct knav_queue_stats {
 167        unsigned int pushes;
 168        unsigned int pops;
 169        unsigned int push_errors;
 170        unsigned int pop_errors;
 171        unsigned int notifies;
 172};
 173
 174/**
 175 * struct knav_reg_queue:       queue registers
 176 * @entry_count:                valid entries in the queue
 177 * @byte_count:                 total byte count in thhe queue
 178 * @packet_size:                packet size for the queue
 179 * @ptr_size_thresh:            packet pointer size threshold
 180 */
 181struct knav_reg_queue {
 182        u32             entry_count;
 183        u32             byte_count;
 184        u32             packet_size;
 185        u32             ptr_size_thresh;
 186};
 187
 188/**
 189 * struct knav_region:          qmss region info
 190 * @dma_start, dma_end:         start and end dma address
 191 * @virt_start, virt_end:       start and end virtual address
 192 * @desc_size:                  descriptor size
 193 * @used_desc:                  consumed descriptors
 194 * @id:                         region number
 195 * @num_desc:                   total descriptors
 196 * @link_index:                 index of the first descriptor
 197 * @name:                       region name
 198 * @list:                       instance in the device's region list
 199 * @pools:                      list of descriptor pools in the region
 200 */
 201struct knav_region {
 202        dma_addr_t              dma_start, dma_end;
 203        void                    *virt_start, *virt_end;
 204        unsigned                desc_size;
 205        unsigned                used_desc;
 206        unsigned                id;
 207        unsigned                num_desc;
 208        unsigned                link_index;
 209        const char              *name;
 210        struct list_head        list;
 211        struct list_head        pools;
 212};
 213
 214/**
 215 * struct knav_pool:            qmss pools
 216 * @dev:                        device pointer
 217 * @region:                     qmss region info
 218 * @queue:                      queue registers
 219 * @kdev:                       qmss device pointer
 220 * @region_offset:              offset from the base
 221 * @num_desc:                   total descriptors
 222 * @desc_size:                  descriptor size
 223 * @region_id:                  region number
 224 * @name:                       pool name
 225 * @list:                       list head
 226 * @region_inst:                instance in the region's pool list
 227 */
 228struct knav_pool {
 229        struct device                   *dev;
 230        struct knav_region              *region;
 231        struct knav_queue               *queue;
 232        struct knav_device              *kdev;
 233        int                             region_offset;
 234        int                             num_desc;
 235        int                             desc_size;
 236        int                             region_id;
 237        const char                      *name;
 238        struct list_head                list;
 239        struct list_head                region_inst;
 240};
 241
 242/**
 243 * struct knav_queue_inst:              qmss queue instace properties
 244 * @descs:                              descriptor pointer
 245 * @desc_head, desc_tail, desc_count:   descriptor counters
 246 * @acc:                                accumulator channel pointer
 247 * @kdev:                               qmss device pointer
 248 * @range:                              range info
 249 * @qmgr:                               queue manager info
 250 * @id:                                 queue instace id
 251 * @irq_num:                            irq line number
 252 * @notify_needed:                      notifier needed based on queue type
 253 * @num_notifiers:                      total notifiers
 254 * @handles:                            list head
 255 * @name:                               queue instance name
 256 * @irq_name:                           irq line name
 257 */
 258struct knav_queue_inst {
 259        u32                             *descs;
 260        atomic_t                        desc_head, desc_tail, desc_count;
 261        struct knav_acc_channel *acc;
 262        struct knav_device              *kdev;
 263        struct knav_range_info          *range;
 264        struct knav_qmgr_info           *qmgr;
 265        u32                             id;
 266        int                             irq_num;
 267        int                             notify_needed;
 268        atomic_t                        num_notifiers;
 269        struct list_head                handles;
 270        const char                      *name;
 271        const char                      *irq_name;
 272};
 273
 274/**
 275 * struct knav_queue:                   qmss queue properties
 276 * @reg_push, reg_pop, reg_peek:        push, pop queue registers
 277 * @inst:                               qmss queue instace properties
 278 * @notifier_fn:                        notifier function
 279 * @notifier_fn_arg:                    notifier function argument
 280 * @notifier_enabled:                   notier enabled for a give queue
 281 * @rcu:                                rcu head
 282 * @flags:                              queue flags
 283 * @list:                               list head
 284 */
 285struct knav_queue {
 286        struct knav_reg_queue __iomem   *reg_push, *reg_pop, *reg_peek;
 287        struct knav_queue_inst          *inst;
 288        struct knav_queue_stats __percpu        *stats;
 289        knav_queue_notify_fn            notifier_fn;
 290        void                            *notifier_fn_arg;
 291        atomic_t                        notifier_enabled;
 292        struct rcu_head                 rcu;
 293        unsigned                        flags;
 294        struct list_head                list;
 295};
 296
 297enum qmss_version {
 298        QMSS,
 299        QMSS_66AK2G,
 300};
 301
 302struct knav_device {
 303        struct device                           *dev;
 304        unsigned                                base_id;
 305        unsigned                                num_queues;
 306        unsigned                                num_queues_in_use;
 307        unsigned                                inst_shift;
 308        struct knav_link_ram_block              link_rams[KNAV_NUM_LINKRAM];
 309        void                                    *instances;
 310        struct list_head                        regions;
 311        struct list_head                        queue_ranges;
 312        struct list_head                        pools;
 313        struct list_head                        pdsps;
 314        struct list_head                        qmgrs;
 315        enum qmss_version                       version;
 316};
 317
 318struct knav_range_ops {
 319        int     (*init_range)(struct knav_range_info *range);
 320        int     (*free_range)(struct knav_range_info *range);
 321        int     (*init_queue)(struct knav_range_info *range,
 322                              struct knav_queue_inst *inst);
 323        int     (*open_queue)(struct knav_range_info *range,
 324                              struct knav_queue_inst *inst, unsigned flags);
 325        int     (*close_queue)(struct knav_range_info *range,
 326                               struct knav_queue_inst *inst);
 327        int     (*set_notify)(struct knav_range_info *range,
 328                              struct knav_queue_inst *inst, bool enabled);
 329};
 330
 331struct knav_irq_info {
 332        int     irq;
 333        u32     cpu_map;
 334};
 335
 336struct knav_range_info {
 337        const char                      *name;
 338        struct knav_device              *kdev;
 339        unsigned                        queue_base;
 340        unsigned                        num_queues;
 341        void                            *queue_base_inst;
 342        unsigned                        flags;
 343        struct list_head                list;
 344        struct knav_range_ops           *ops;
 345        struct knav_acc_info            acc_info;
 346        struct knav_acc_channel *acc;
 347        unsigned                        num_irqs;
 348        struct knav_irq_info            irqs[RANGE_MAX_IRQS];
 349};
 350
 351#define RANGE_RESERVED          BIT(0)
 352#define RANGE_HAS_IRQ           BIT(1)
 353#define RANGE_HAS_ACCUMULATOR   BIT(2)
 354#define RANGE_MULTI_QUEUE       BIT(3)
 355
 356#define for_each_region(kdev, region)                           \
 357        list_for_each_entry(region, &kdev->regions, list)
 358
 359#define first_region(kdev)                                      \
 360        list_first_entry_or_null(&kdev->regions, \
 361                                 struct knav_region, list)
 362
 363#define for_each_queue_range(kdev, range)                       \
 364        list_for_each_entry(range, &kdev->queue_ranges, list)
 365
 366#define first_queue_range(kdev)                                 \
 367        list_first_entry_or_null(&kdev->queue_ranges, \
 368                                 struct knav_range_info, list)
 369
 370#define for_each_pool(kdev, pool)                               \
 371        list_for_each_entry(pool, &kdev->pools, list)
 372
 373#define for_each_pdsp(kdev, pdsp)                               \
 374        list_for_each_entry(pdsp, &kdev->pdsps, list)
 375
 376#define for_each_qmgr(kdev, qmgr)                               \
 377        list_for_each_entry(qmgr, &kdev->qmgrs, list)
 378
 379static inline struct knav_pdsp_info *
 380knav_find_pdsp(struct knav_device *kdev, unsigned pdsp_id)
 381{
 382        struct knav_pdsp_info *pdsp;
 383
 384        for_each_pdsp(kdev, pdsp)
 385                if (pdsp_id == pdsp->id)
 386                        return pdsp;
 387        return NULL;
 388}
 389
 390extern int knav_init_acc_range(struct knav_device *kdev,
 391                                        struct device_node *node,
 392                                        struct knav_range_info *range);
 393extern void knav_queue_notify(struct knav_queue_inst *inst);
 394
 395#endif /* __KNAV_QMSS_H__ */
 396