0001
0002
0003
0004
0005
0006
0007
0008
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
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
0152
0153
0154
0155
0156
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
0168
0169
0170
0171
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
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
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
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
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
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
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
0268
0269
0270
0271
0272
0273
0274
0275
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