Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Keystone Navigator QMSS driver internal header
0004  *
0005  * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
0006  * Author:  Sandeep Nair <sandeep_n@ti.com>
0007  *      Cyril Chemparathy <cyril@ti.com>
0008  *      Santosh Shilimkar <santosh.shilimkar@ti.com>
0009  */
0010 
0011 #ifndef __KNAV_QMSS_H__
0012 #define __KNAV_QMSS_H__
0013 
0014 #include <linux/percpu.h>
0015 
0016 #define THRESH_GTE  BIT(7)
0017 #define THRESH_LT   0
0018 
0019 #define PDSP_CTRL_PC_MASK   0xffff0000
0020 #define PDSP_CTRL_SOFT_RESET    BIT(0)
0021 #define PDSP_CTRL_ENABLE    BIT(1)
0022 #define PDSP_CTRL_RUNNING   BIT(15)
0023 
0024 #define ACC_MAX_CHANNEL     48
0025 #define ACC_DEFAULT_PERIOD  25 /* usecs */
0026 
0027 #define ACC_CHANNEL_INT_BASE        2
0028 
0029 #define ACC_LIST_ENTRY_TYPE     1
0030 #define ACC_LIST_ENTRY_WORDS        (1 << ACC_LIST_ENTRY_TYPE)
0031 #define ACC_LIST_ENTRY_QUEUE_IDX    0
0032 #define ACC_LIST_ENTRY_DESC_IDX (ACC_LIST_ENTRY_WORDS - 1)
0033 
0034 #define ACC_CMD_DISABLE_CHANNEL 0x80
0035 #define ACC_CMD_ENABLE_CHANNEL  0x81
0036 #define ACC_CFG_MULTI_QUEUE     BIT(21)
0037 
0038 #define ACC_INTD_OFFSET_EOI     (0x0010)
0039 #define ACC_INTD_OFFSET_COUNT(ch)   (0x0300 + 4 * (ch))
0040 #define ACC_INTD_OFFSET_STATUS(ch)  (0x0200 + 4 * ((ch) / 32))
0041 
0042 #define RANGE_MAX_IRQS          64
0043 
0044 #define ACC_DESCS_MAX       SZ_1K
0045 #define ACC_DESCS_MASK      (ACC_DESCS_MAX - 1)
0046 #define DESC_SIZE_MASK      0xful
0047 #define DESC_PTR_MASK       (~DESC_SIZE_MASK)
0048 
0049 #define KNAV_NAME_SIZE          32
0050 
0051 enum knav_acc_result {
0052     ACC_RET_IDLE,
0053     ACC_RET_SUCCESS,
0054     ACC_RET_INVALID_COMMAND,
0055     ACC_RET_INVALID_CHANNEL,
0056     ACC_RET_INACTIVE_CHANNEL,
0057     ACC_RET_ACTIVE_CHANNEL,
0058     ACC_RET_INVALID_QUEUE,
0059     ACC_RET_INVALID_RET,
0060 };
0061 
0062 struct knav_reg_config {
0063     u32     revision;
0064     u32     __pad1;
0065     u32     divert;
0066     u32     link_ram_base0;
0067     u32     link_ram_size0;
0068     u32     link_ram_base1;
0069     u32     __pad2[2];
0070     u32     starvation[];
0071 };
0072 
0073 struct knav_reg_region {
0074     u32     base;
0075     u32     start_index;
0076     u32     size_count;
0077     u32     __pad;
0078 };
0079 
0080 struct knav_reg_pdsp_regs {
0081     u32     control;
0082     u32     status;
0083     u32     cycle_count;
0084     u32     stall_count;
0085 };
0086 
0087 struct knav_reg_acc_command {
0088     u32     command;
0089     u32     queue_mask;
0090     u32     list_dma;
0091     u32     queue_num;
0092     u32     timer_config;
0093 };
0094 
0095 struct knav_link_ram_block {
0096     dma_addr_t   dma;
0097     void        *virt;
0098     size_t       size;
0099 };
0100 
0101 struct knav_acc_info {
0102     u32          pdsp_id;
0103     u32          start_channel;
0104     u32          list_entries;
0105     u32          pacing_mode;
0106     u32          timer_count;
0107     int          mem_size;
0108     int          list_size;
0109     struct knav_pdsp_info   *pdsp;
0110 };
0111 
0112 struct knav_acc_channel {
0113     u32         channel;
0114     u32         list_index;
0115     u32         open_mask;
0116     u32         *list_cpu[2];
0117     dma_addr_t      list_dma[2];
0118     char            name[KNAV_NAME_SIZE];
0119     atomic_t        retrigger_count;
0120 };
0121 
0122 struct knav_pdsp_info {
0123     const char                  *name;
0124     struct knav_reg_pdsp_regs  __iomem      *regs;
0125     union {
0126         void __iomem                *command;
0127         struct knav_reg_acc_command __iomem *acc_command;
0128         u32 __iomem             *qos_command;
0129     };
0130     void __iomem                    *intd;
0131     u32 __iomem                 *iram;
0132     u32                     id;
0133     struct list_head                list;
0134     bool                        loaded;
0135     bool                        started;
0136 };
0137 
0138 struct knav_qmgr_info {
0139     unsigned            start_queue;
0140     unsigned            num_queues;
0141     struct knav_reg_config __iomem  *reg_config;
0142     struct knav_reg_region __iomem  *reg_region;
0143     struct knav_reg_queue __iomem   *reg_push, *reg_pop, *reg_peek;
0144     void __iomem            *reg_status;
0145     struct list_head        list;
0146 };
0147 
0148 #define KNAV_NUM_LINKRAM    2
0149 
0150 /**
0151  * struct knav_queue_stats: queue statistics
0152  * pushes:          number of push operations
0153  * pops:            number of pop operations
0154  * push_errors:         number of push errors
0155  * pop_errors:          number of pop errors
0156  * notifies:            notifier counts
0157  */
0158 struct knav_queue_stats {
0159     unsigned int pushes;
0160     unsigned int pops;
0161     unsigned int push_errors;
0162     unsigned int pop_errors;
0163     unsigned int notifies;
0164 };
0165 
0166 /**
0167  * struct knav_reg_queue:   queue registers
0168  * @entry_count:        valid entries in the queue
0169  * @byte_count:         total byte count in thhe queue
0170  * @packet_size:        packet size for the queue
0171  * @ptr_size_thresh:        packet pointer size threshold
0172  */
0173 struct knav_reg_queue {
0174     u32     entry_count;
0175     u32     byte_count;
0176     u32     packet_size;
0177     u32     ptr_size_thresh;
0178 };
0179 
0180 /**
0181  * struct knav_region:      qmss region info
0182  * @dma_start, dma_end:     start and end dma address
0183  * @virt_start, virt_end:   start and end virtual address
0184  * @desc_size:          descriptor size
0185  * @used_desc:          consumed descriptors
0186  * @id:             region number
0187  * @num_desc:           total descriptors
0188  * @link_index:         index of the first descriptor
0189  * @name:           region name
0190  * @list:           instance in the device's region list
0191  * @pools:          list of descriptor pools in the region
0192  */
0193 struct knav_region {
0194     dma_addr_t      dma_start, dma_end;
0195     void            *virt_start, *virt_end;
0196     unsigned        desc_size;
0197     unsigned        used_desc;
0198     unsigned        id;
0199     unsigned        num_desc;
0200     unsigned        link_index;
0201     const char      *name;
0202     struct list_head    list;
0203     struct list_head    pools;
0204 };
0205 
0206 /**
0207  * struct knav_pool:        qmss pools
0208  * @dev:            device pointer
0209  * @region:         qmss region info
0210  * @queue:          queue registers
0211  * @kdev:           qmss device pointer
0212  * @region_offset:      offset from the base
0213  * @num_desc:           total descriptors
0214  * @desc_size:          descriptor size
0215  * @region_id:          region number
0216  * @name:           pool name
0217  * @list:           list head
0218  * @region_inst:        instance in the region's pool list
0219  */
0220 struct knav_pool {
0221     struct device           *dev;
0222     struct knav_region      *region;
0223     struct knav_queue       *queue;
0224     struct knav_device      *kdev;
0225     int             region_offset;
0226     int             num_desc;
0227     int             desc_size;
0228     int             region_id;
0229     const char          *name;
0230     struct list_head        list;
0231     struct list_head        region_inst;
0232 };
0233 
0234 /**
0235  * struct knav_queue_inst:      qmss queue instance properties
0236  * @descs:              descriptor pointer
0237  * @desc_head, desc_tail, desc_count:   descriptor counters
0238  * @acc:                accumulator channel pointer
0239  * @kdev:               qmss device pointer
0240  * @range:              range info
0241  * @qmgr:               queue manager info
0242  * @id:                 queue instance id
0243  * @irq_num:                irq line number
0244  * @notify_needed:          notifier needed based on queue type
0245  * @num_notifiers:          total notifiers
0246  * @handles:                list head
0247  * @name:               queue instance name
0248  * @irq_name:               irq line name
0249  */
0250 struct knav_queue_inst {
0251     u32             *descs;
0252     atomic_t            desc_head, desc_tail, desc_count;
0253     struct knav_acc_channel *acc;
0254     struct knav_device      *kdev;
0255     struct knav_range_info      *range;
0256     struct knav_qmgr_info       *qmgr;
0257     u32             id;
0258     int             irq_num;
0259     int             notify_needed;
0260     atomic_t            num_notifiers;
0261     struct list_head        handles;
0262     const char          *name;
0263     const char          *irq_name;
0264 };
0265 
0266 /**
0267  * struct knav_queue:           qmss queue properties
0268  * @reg_push, reg_pop, reg_peek:    push, pop queue registers
0269  * @inst:               qmss queue instance properties
0270  * @notifier_fn:            notifier function
0271  * @notifier_fn_arg:            notifier function argument
0272  * @notifier_enabled:           notier enabled for a give queue
0273  * @rcu:                rcu head
0274  * @flags:              queue flags
0275  * @list:               list head
0276  */
0277 struct knav_queue {
0278     struct knav_reg_queue __iomem   *reg_push, *reg_pop, *reg_peek;
0279     struct knav_queue_inst      *inst;
0280     struct knav_queue_stats __percpu    *stats;
0281     knav_queue_notify_fn        notifier_fn;
0282     void                *notifier_fn_arg;
0283     atomic_t            notifier_enabled;
0284     struct rcu_head         rcu;
0285     unsigned            flags;
0286     struct list_head        list;
0287 };
0288 
0289 enum qmss_version {
0290     QMSS,
0291     QMSS_66AK2G,
0292 };
0293 
0294 struct knav_device {
0295     struct device               *dev;
0296     unsigned                base_id;
0297     unsigned                num_queues;
0298     unsigned                num_queues_in_use;
0299     unsigned                inst_shift;
0300     struct knav_link_ram_block      link_rams[KNAV_NUM_LINKRAM];
0301     void                    *instances;
0302     struct list_head            regions;
0303     struct list_head            queue_ranges;
0304     struct list_head            pools;
0305     struct list_head            pdsps;
0306     struct list_head            qmgrs;
0307     enum qmss_version           version;
0308 };
0309 
0310 struct knav_range_ops {
0311     int (*init_range)(struct knav_range_info *range);
0312     int (*free_range)(struct knav_range_info *range);
0313     int (*init_queue)(struct knav_range_info *range,
0314                   struct knav_queue_inst *inst);
0315     int (*open_queue)(struct knav_range_info *range,
0316                   struct knav_queue_inst *inst, unsigned flags);
0317     int (*close_queue)(struct knav_range_info *range,
0318                    struct knav_queue_inst *inst);
0319     int (*set_notify)(struct knav_range_info *range,
0320                   struct knav_queue_inst *inst, bool enabled);
0321 };
0322 
0323 struct knav_irq_info {
0324     int     irq;
0325     struct cpumask  *cpu_mask;
0326 };
0327 
0328 struct knav_range_info {
0329     const char          *name;
0330     struct knav_device      *kdev;
0331     unsigned            queue_base;
0332     unsigned            num_queues;
0333     void                *queue_base_inst;
0334     unsigned            flags;
0335     struct list_head        list;
0336     struct knav_range_ops       *ops;
0337     struct knav_acc_info        acc_info;
0338     struct knav_acc_channel *acc;
0339     unsigned            num_irqs;
0340     struct knav_irq_info        irqs[RANGE_MAX_IRQS];
0341 };
0342 
0343 #define RANGE_RESERVED      BIT(0)
0344 #define RANGE_HAS_IRQ       BIT(1)
0345 #define RANGE_HAS_ACCUMULATOR   BIT(2)
0346 #define RANGE_MULTI_QUEUE   BIT(3)
0347 
0348 #define for_each_region(kdev, region)               \
0349     list_for_each_entry(region, &kdev->regions, list)
0350 
0351 #define first_region(kdev)                  \
0352     list_first_entry_or_null(&kdev->regions, \
0353                  struct knav_region, list)
0354 
0355 #define for_each_queue_range(kdev, range)           \
0356     list_for_each_entry(range, &kdev->queue_ranges, list)
0357 
0358 #define first_queue_range(kdev)                 \
0359     list_first_entry_or_null(&kdev->queue_ranges, \
0360                  struct knav_range_info, list)
0361 
0362 #define for_each_pool(kdev, pool)               \
0363     list_for_each_entry(pool, &kdev->pools, list)
0364 
0365 #define for_each_pdsp(kdev, pdsp)               \
0366     list_for_each_entry(pdsp, &kdev->pdsps, list)
0367 
0368 #define for_each_qmgr(kdev, qmgr)               \
0369     list_for_each_entry(qmgr, &kdev->qmgrs, list)
0370 
0371 static inline struct knav_pdsp_info *
0372 knav_find_pdsp(struct knav_device *kdev, unsigned pdsp_id)
0373 {
0374     struct knav_pdsp_info *pdsp;
0375 
0376     for_each_pdsp(kdev, pdsp)
0377         if (pdsp_id == pdsp->id)
0378             return pdsp;
0379     return NULL;
0380 }
0381 
0382 extern int knav_init_acc_range(struct knav_device *kdev,
0383                     struct device_node *node,
0384                     struct knav_range_info *range);
0385 extern void knav_queue_notify(struct knav_queue_inst *inst);
0386 
0387 #endif /* __KNAV_QMSS_H__ */