cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

knav_qmss.h (9532B)


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