162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Intel(R) Trace Hub data structures
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2014-2015 Intel Corporation.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __INTEL_TH_H__
962306a36Sopenharmony_ci#define __INTEL_TH_H__
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/irqreturn.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/* intel_th_device device types */
1462306a36Sopenharmony_cienum {
1562306a36Sopenharmony_ci	/* Devices that generate trace data */
1662306a36Sopenharmony_ci	INTEL_TH_SOURCE = 0,
1762306a36Sopenharmony_ci	/* Output ports (MSC, PTI) */
1862306a36Sopenharmony_ci	INTEL_TH_OUTPUT,
1962306a36Sopenharmony_ci	/* Switch, the Global Trace Hub (GTH) */
2062306a36Sopenharmony_ci	INTEL_TH_SWITCH,
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct intel_th_device;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/**
2662306a36Sopenharmony_ci * struct intel_th_output - descriptor INTEL_TH_OUTPUT type devices
2762306a36Sopenharmony_ci * @port:	output port number, assigned by the switch
2862306a36Sopenharmony_ci * @type:	GTH_{MSU,CTP,PTI}
2962306a36Sopenharmony_ci * @scratchpad:	scratchpad bits to flag when this output is enabled
3062306a36Sopenharmony_ci * @multiblock:	true for multiblock output configuration
3162306a36Sopenharmony_ci * @active:	true when this output is enabled
3262306a36Sopenharmony_ci * @wait_empty:	wait for device pipeline to be empty
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci * Output port descriptor, used by switch driver to tell which output
3562306a36Sopenharmony_ci * port this output device corresponds to. Filled in at output device's
3662306a36Sopenharmony_ci * probe time by switch::assign(). Passed from output device driver to
3762306a36Sopenharmony_ci * switch related code to enable/disable its port.
3862306a36Sopenharmony_ci */
3962306a36Sopenharmony_cistruct intel_th_output {
4062306a36Sopenharmony_ci	int		port;
4162306a36Sopenharmony_ci	unsigned int	type;
4262306a36Sopenharmony_ci	unsigned int	scratchpad;
4362306a36Sopenharmony_ci	bool		multiblock;
4462306a36Sopenharmony_ci	bool		active;
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/**
4862306a36Sopenharmony_ci * struct intel_th_drvdata - describes hardware capabilities and quirks
4962306a36Sopenharmony_ci * @tscu_enable:	device needs SW to enable time stamping unit
5062306a36Sopenharmony_ci * @multi_is_broken:	device has multiblock mode is broken
5162306a36Sopenharmony_ci * @has_mintctl:	device has interrupt control (MINTCTL) register
5262306a36Sopenharmony_ci * @host_mode_only:	device can only operate in 'host debugger' mode
5362306a36Sopenharmony_ci */
5462306a36Sopenharmony_cistruct intel_th_drvdata {
5562306a36Sopenharmony_ci	unsigned int	tscu_enable        : 1,
5662306a36Sopenharmony_ci			multi_is_broken    : 1,
5762306a36Sopenharmony_ci			has_mintctl        : 1,
5862306a36Sopenharmony_ci			host_mode_only     : 1;
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define INTEL_TH_CAP(_th, _cap) ((_th)->drvdata ? (_th)->drvdata->_cap : 0)
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/**
6462306a36Sopenharmony_ci * struct intel_th_device - device on the intel_th bus
6562306a36Sopenharmony_ci * @dev:		device
6662306a36Sopenharmony_ci * @drvdata:		hardware capabilities/quirks
6762306a36Sopenharmony_ci * @resource:		array of resources available to this device
6862306a36Sopenharmony_ci * @num_resources:	number of resources in @resource array
6962306a36Sopenharmony_ci * @type:		INTEL_TH_{SOURCE,OUTPUT,SWITCH}
7062306a36Sopenharmony_ci * @id:			device instance or -1
7162306a36Sopenharmony_ci * @host_mode:		Intel TH is controlled by an external debug host
7262306a36Sopenharmony_ci * @output:		output descriptor for INTEL_TH_OUTPUT devices
7362306a36Sopenharmony_ci * @name:		device name to match the driver
7462306a36Sopenharmony_ci */
7562306a36Sopenharmony_cistruct intel_th_device {
7662306a36Sopenharmony_ci	struct device		dev;
7762306a36Sopenharmony_ci	const struct intel_th_drvdata *drvdata;
7862306a36Sopenharmony_ci	struct resource		*resource;
7962306a36Sopenharmony_ci	unsigned int		num_resources;
8062306a36Sopenharmony_ci	unsigned int		type;
8162306a36Sopenharmony_ci	int			id;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	/* INTEL_TH_SWITCH specific */
8462306a36Sopenharmony_ci	bool			host_mode;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	/* INTEL_TH_OUTPUT specific */
8762306a36Sopenharmony_ci	struct intel_th_output	output;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	char		name[];
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#define to_intel_th_device(_d)				\
9362306a36Sopenharmony_ci	container_of((_d), struct intel_th_device, dev)
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci/**
9662306a36Sopenharmony_ci * intel_th_device_get_resource() - obtain @num'th resource of type @type
9762306a36Sopenharmony_ci * @thdev:	the device to search the resource for
9862306a36Sopenharmony_ci * @type:	resource type
9962306a36Sopenharmony_ci * @num:	number of the resource
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_cistatic inline struct resource *
10262306a36Sopenharmony_ciintel_th_device_get_resource(struct intel_th_device *thdev, unsigned int type,
10362306a36Sopenharmony_ci			     unsigned int num)
10462306a36Sopenharmony_ci{
10562306a36Sopenharmony_ci	int i;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	for (i = 0; i < thdev->num_resources; i++)
10862306a36Sopenharmony_ci		if (resource_type(&thdev->resource[i]) == type && !num--)
10962306a36Sopenharmony_ci			return &thdev->resource[i];
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	return NULL;
11262306a36Sopenharmony_ci}
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci/*
11562306a36Sopenharmony_ci * GTH, output ports configuration
11662306a36Sopenharmony_ci */
11762306a36Sopenharmony_cienum {
11862306a36Sopenharmony_ci	GTH_NONE = 0,
11962306a36Sopenharmony_ci	GTH_MSU,	/* memory/usb */
12062306a36Sopenharmony_ci	GTH_CTP,	/* Common Trace Port */
12162306a36Sopenharmony_ci	GTH_LPP,	/* Low Power Path */
12262306a36Sopenharmony_ci	GTH_PTI,	/* MIPI-PTI */
12362306a36Sopenharmony_ci};
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci/**
12662306a36Sopenharmony_ci * intel_th_output_assigned() - if an output device is assigned to a switch port
12762306a36Sopenharmony_ci * @thdev:	the output device
12862306a36Sopenharmony_ci *
12962306a36Sopenharmony_ci * Return:	true if the device is INTEL_TH_OUTPUT *and* is assigned a port
13062306a36Sopenharmony_ci */
13162306a36Sopenharmony_cistatic inline bool
13262306a36Sopenharmony_ciintel_th_output_assigned(struct intel_th_device *thdev)
13362306a36Sopenharmony_ci{
13462306a36Sopenharmony_ci	return thdev->type == INTEL_TH_OUTPUT &&
13562306a36Sopenharmony_ci		(thdev->output.port >= 0 ||
13662306a36Sopenharmony_ci		 thdev->output.type == GTH_NONE);
13762306a36Sopenharmony_ci}
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci/**
14062306a36Sopenharmony_ci * struct intel_th_driver - driver for an intel_th_device device
14162306a36Sopenharmony_ci * @driver:	generic driver
14262306a36Sopenharmony_ci * @probe:	probe method
14362306a36Sopenharmony_ci * @remove:	remove method
14462306a36Sopenharmony_ci * @assign:	match a given output type device against available outputs
14562306a36Sopenharmony_ci * @unassign:	deassociate an output type device from an output port
14662306a36Sopenharmony_ci * @prepare:	prepare output port for tracing
14762306a36Sopenharmony_ci * @enable:	enable tracing for a given output device
14862306a36Sopenharmony_ci * @disable:	disable tracing for a given output device
14962306a36Sopenharmony_ci * @irq:	interrupt callback
15062306a36Sopenharmony_ci * @activate:	enable tracing on the output's side
15162306a36Sopenharmony_ci * @deactivate:	disable tracing on the output's side
15262306a36Sopenharmony_ci * @fops:	file operations for device nodes
15362306a36Sopenharmony_ci * @attr_group:	attributes provided by the driver
15462306a36Sopenharmony_ci *
15562306a36Sopenharmony_ci * Callbacks @probe and @remove are required for all device types.
15662306a36Sopenharmony_ci * Switch device driver needs to fill in @assign, @enable and @disable
15762306a36Sopenharmony_ci * callbacks.
15862306a36Sopenharmony_ci */
15962306a36Sopenharmony_cistruct intel_th_driver {
16062306a36Sopenharmony_ci	struct device_driver	driver;
16162306a36Sopenharmony_ci	int			(*probe)(struct intel_th_device *thdev);
16262306a36Sopenharmony_ci	void			(*remove)(struct intel_th_device *thdev);
16362306a36Sopenharmony_ci	/* switch (GTH) ops */
16462306a36Sopenharmony_ci	int			(*assign)(struct intel_th_device *thdev,
16562306a36Sopenharmony_ci					  struct intel_th_device *othdev);
16662306a36Sopenharmony_ci	void			(*unassign)(struct intel_th_device *thdev,
16762306a36Sopenharmony_ci					    struct intel_th_device *othdev);
16862306a36Sopenharmony_ci	void			(*prepare)(struct intel_th_device *thdev,
16962306a36Sopenharmony_ci					   struct intel_th_output *output);
17062306a36Sopenharmony_ci	void			(*enable)(struct intel_th_device *thdev,
17162306a36Sopenharmony_ci					  struct intel_th_output *output);
17262306a36Sopenharmony_ci	void			(*trig_switch)(struct intel_th_device *thdev,
17362306a36Sopenharmony_ci					       struct intel_th_output *output);
17462306a36Sopenharmony_ci	void			(*disable)(struct intel_th_device *thdev,
17562306a36Sopenharmony_ci					   struct intel_th_output *output);
17662306a36Sopenharmony_ci	/* output ops */
17762306a36Sopenharmony_ci	irqreturn_t		(*irq)(struct intel_th_device *thdev);
17862306a36Sopenharmony_ci	void			(*wait_empty)(struct intel_th_device *thdev);
17962306a36Sopenharmony_ci	int			(*activate)(struct intel_th_device *thdev);
18062306a36Sopenharmony_ci	void			(*deactivate)(struct intel_th_device *thdev);
18162306a36Sopenharmony_ci	/* file_operations for those who want a device node */
18262306a36Sopenharmony_ci	const struct file_operations *fops;
18362306a36Sopenharmony_ci	/* optional attributes */
18462306a36Sopenharmony_ci	const struct attribute_group *attr_group;
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci	/* source ops */
18762306a36Sopenharmony_ci	int			(*set_output)(struct intel_th_device *thdev,
18862306a36Sopenharmony_ci					      unsigned int master);
18962306a36Sopenharmony_ci};
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci#define to_intel_th_driver(_d)					\
19262306a36Sopenharmony_ci	container_of((_d), struct intel_th_driver, driver)
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci#define to_intel_th_driver_or_null(_d)		\
19562306a36Sopenharmony_ci	((_d) ? to_intel_th_driver(_d) : NULL)
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci/*
19862306a36Sopenharmony_ci * Subdevice tree structure is as follows:
19962306a36Sopenharmony_ci * + struct intel_th device (pci; dev_{get,set}_drvdata()
20062306a36Sopenharmony_ci *   + struct intel_th_device INTEL_TH_SWITCH (GTH)
20162306a36Sopenharmony_ci *     + struct intel_th_device INTEL_TH_OUTPUT (MSU, PTI)
20262306a36Sopenharmony_ci *   + struct intel_th_device INTEL_TH_SOURCE (STH)
20362306a36Sopenharmony_ci *
20462306a36Sopenharmony_ci * In other words, INTEL_TH_OUTPUT devices are children of INTEL_TH_SWITCH;
20562306a36Sopenharmony_ci * INTEL_TH_SWITCH and INTEL_TH_SOURCE are children of the intel_th device.
20662306a36Sopenharmony_ci */
20762306a36Sopenharmony_cistatic inline struct intel_th_device *
20862306a36Sopenharmony_cito_intel_th_parent(const struct intel_th_device *thdev)
20962306a36Sopenharmony_ci{
21062306a36Sopenharmony_ci	struct device *parent = thdev->dev.parent;
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	if (!parent)
21362306a36Sopenharmony_ci		return NULL;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	return to_intel_th_device(parent);
21662306a36Sopenharmony_ci}
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_cistatic inline struct intel_th *to_intel_th(const struct intel_th_device *thdev)
21962306a36Sopenharmony_ci{
22062306a36Sopenharmony_ci	if (thdev->type == INTEL_TH_OUTPUT)
22162306a36Sopenharmony_ci		thdev = to_intel_th_parent(thdev);
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	if (WARN_ON_ONCE(!thdev || thdev->type == INTEL_TH_OUTPUT))
22462306a36Sopenharmony_ci		return NULL;
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	return dev_get_drvdata(thdev->dev.parent);
22762306a36Sopenharmony_ci}
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_cistruct intel_th *
23062306a36Sopenharmony_ciintel_th_alloc(struct device *dev, const struct intel_th_drvdata *drvdata,
23162306a36Sopenharmony_ci	       struct resource *devres, unsigned int ndevres);
23262306a36Sopenharmony_civoid intel_th_free(struct intel_th *th);
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ciint intel_th_driver_register(struct intel_th_driver *thdrv);
23562306a36Sopenharmony_civoid intel_th_driver_unregister(struct intel_th_driver *thdrv);
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ciint intel_th_trace_enable(struct intel_th_device *thdev);
23862306a36Sopenharmony_ciint intel_th_trace_switch(struct intel_th_device *thdev);
23962306a36Sopenharmony_ciint intel_th_trace_disable(struct intel_th_device *thdev);
24062306a36Sopenharmony_ciint intel_th_set_output(struct intel_th_device *thdev,
24162306a36Sopenharmony_ci			unsigned int master);
24262306a36Sopenharmony_ciint intel_th_output_enable(struct intel_th *th, unsigned int otype);
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_cienum th_mmio_idx {
24562306a36Sopenharmony_ci	TH_MMIO_CONFIG = 0,
24662306a36Sopenharmony_ci	TH_MMIO_SW = 1,
24762306a36Sopenharmony_ci	TH_MMIO_RTIT = 2,
24862306a36Sopenharmony_ci	TH_MMIO_END,
24962306a36Sopenharmony_ci};
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci#define TH_POSSIBLE_OUTPUTS	8
25262306a36Sopenharmony_ci/* Total number of possible subdevices: outputs + GTH + STH */
25362306a36Sopenharmony_ci#define TH_SUBDEVICE_MAX	(TH_POSSIBLE_OUTPUTS + 2)
25462306a36Sopenharmony_ci#define TH_CONFIGURABLE_MASTERS 256
25562306a36Sopenharmony_ci#define TH_MSC_MAX		2
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci/* Maximum IRQ vectors */
25862306a36Sopenharmony_ci#define TH_NVEC_MAX		8
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci/**
26162306a36Sopenharmony_ci * struct intel_th - Intel TH controller
26262306a36Sopenharmony_ci * @dev:	driver core's device
26362306a36Sopenharmony_ci * @thdev:	subdevices
26462306a36Sopenharmony_ci * @hub:	"switch" subdevice (GTH)
26562306a36Sopenharmony_ci * @resource:	resources of the entire controller
26662306a36Sopenharmony_ci * @num_thdevs:	number of devices in the @thdev array
26762306a36Sopenharmony_ci * @num_resources:	number of resources in the @resource array
26862306a36Sopenharmony_ci * @irq:	irq number
26962306a36Sopenharmony_ci * @num_irqs:	number of IRQs is use
27062306a36Sopenharmony_ci * @id:		this Intel TH controller's device ID in the system
27162306a36Sopenharmony_ci * @major:	device node major for output devices
27262306a36Sopenharmony_ci */
27362306a36Sopenharmony_cistruct intel_th {
27462306a36Sopenharmony_ci	struct device		*dev;
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci	struct intel_th_device	*thdev[TH_SUBDEVICE_MAX];
27762306a36Sopenharmony_ci	struct intel_th_device	*hub;
27862306a36Sopenharmony_ci	const struct intel_th_drvdata	*drvdata;
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci	struct resource		resource[TH_MMIO_END];
28162306a36Sopenharmony_ci	int			(*activate)(struct intel_th *);
28262306a36Sopenharmony_ci	void			(*deactivate)(struct intel_th *);
28362306a36Sopenharmony_ci	unsigned int		num_thdevs;
28462306a36Sopenharmony_ci	unsigned int		num_resources;
28562306a36Sopenharmony_ci	int			irq;
28662306a36Sopenharmony_ci	int			num_irqs;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	int			id;
28962306a36Sopenharmony_ci	int			major;
29062306a36Sopenharmony_ci#ifdef CONFIG_MODULES
29162306a36Sopenharmony_ci	struct work_struct	request_module_work;
29262306a36Sopenharmony_ci#endif /* CONFIG_MODULES */
29362306a36Sopenharmony_ci#ifdef CONFIG_INTEL_TH_DEBUG
29462306a36Sopenharmony_ci	struct dentry		*dbg;
29562306a36Sopenharmony_ci#endif
29662306a36Sopenharmony_ci};
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cistatic inline struct intel_th_device *
29962306a36Sopenharmony_cito_intel_th_hub(struct intel_th_device *thdev)
30062306a36Sopenharmony_ci{
30162306a36Sopenharmony_ci	if (thdev->type == INTEL_TH_SWITCH)
30262306a36Sopenharmony_ci		return thdev;
30362306a36Sopenharmony_ci	else if (thdev->type == INTEL_TH_OUTPUT)
30462306a36Sopenharmony_ci		return to_intel_th_parent(thdev);
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	return to_intel_th(thdev)->hub;
30762306a36Sopenharmony_ci}
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci/*
31062306a36Sopenharmony_ci * Register windows
31162306a36Sopenharmony_ci */
31262306a36Sopenharmony_cienum {
31362306a36Sopenharmony_ci	/* Global Trace Hub (GTH) */
31462306a36Sopenharmony_ci	REG_GTH_OFFSET		= 0x0000,
31562306a36Sopenharmony_ci	REG_GTH_LENGTH		= 0x2000,
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	/* Timestamp counter unit (TSCU) */
31862306a36Sopenharmony_ci	REG_TSCU_OFFSET		= 0x2000,
31962306a36Sopenharmony_ci	REG_TSCU_LENGTH		= 0x1000,
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci	REG_CTS_OFFSET		= 0x3000,
32262306a36Sopenharmony_ci	REG_CTS_LENGTH		= 0x1000,
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	/* Software Trace Hub (STH) [0x4000..0x4fff] */
32562306a36Sopenharmony_ci	REG_STH_OFFSET		= 0x4000,
32662306a36Sopenharmony_ci	REG_STH_LENGTH		= 0x2000,
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci	/* Memory Storage Unit (MSU) [0xa0000..0xa1fff] */
32962306a36Sopenharmony_ci	REG_MSU_OFFSET		= 0xa0000,
33062306a36Sopenharmony_ci	REG_MSU_LENGTH		= 0x02000,
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci	/* Internal MSU trace buffer [0x80000..0x9ffff] */
33362306a36Sopenharmony_ci	BUF_MSU_OFFSET		= 0x80000,
33462306a36Sopenharmony_ci	BUF_MSU_LENGTH		= 0x20000,
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci	/* PTI output == same window as GTH */
33762306a36Sopenharmony_ci	REG_PTI_OFFSET		= REG_GTH_OFFSET,
33862306a36Sopenharmony_ci	REG_PTI_LENGTH		= REG_GTH_LENGTH,
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci	/* DCI Handler (DCIH) == some window as MSU */
34162306a36Sopenharmony_ci	REG_DCIH_OFFSET		= REG_MSU_OFFSET,
34262306a36Sopenharmony_ci	REG_DCIH_LENGTH		= REG_MSU_LENGTH,
34362306a36Sopenharmony_ci};
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci/*
34662306a36Sopenharmony_ci * Scratchpad bits: tell firmware and external debuggers
34762306a36Sopenharmony_ci * what we are up to.
34862306a36Sopenharmony_ci */
34962306a36Sopenharmony_cienum {
35062306a36Sopenharmony_ci	/* Memory is the primary destination */
35162306a36Sopenharmony_ci	SCRPD_MEM_IS_PRIM_DEST		= BIT(0),
35262306a36Sopenharmony_ci	/* XHCI DbC is the primary destination */
35362306a36Sopenharmony_ci	SCRPD_DBC_IS_PRIM_DEST		= BIT(1),
35462306a36Sopenharmony_ci	/* PTI is the primary destination */
35562306a36Sopenharmony_ci	SCRPD_PTI_IS_PRIM_DEST		= BIT(2),
35662306a36Sopenharmony_ci	/* BSSB is the primary destination */
35762306a36Sopenharmony_ci	SCRPD_BSSB_IS_PRIM_DEST		= BIT(3),
35862306a36Sopenharmony_ci	/* PTI is the alternate destination */
35962306a36Sopenharmony_ci	SCRPD_PTI_IS_ALT_DEST		= BIT(4),
36062306a36Sopenharmony_ci	/* BSSB is the alternate destination */
36162306a36Sopenharmony_ci	SCRPD_BSSB_IS_ALT_DEST		= BIT(5),
36262306a36Sopenharmony_ci	/* DeepSx exit occurred */
36362306a36Sopenharmony_ci	SCRPD_DEEPSX_EXIT		= BIT(6),
36462306a36Sopenharmony_ci	/* S4 exit occurred */
36562306a36Sopenharmony_ci	SCRPD_S4_EXIT			= BIT(7),
36662306a36Sopenharmony_ci	/* S5 exit occurred */
36762306a36Sopenharmony_ci	SCRPD_S5_EXIT			= BIT(8),
36862306a36Sopenharmony_ci	/* MSU controller 0/1 is enabled */
36962306a36Sopenharmony_ci	SCRPD_MSC0_IS_ENABLED		= BIT(9),
37062306a36Sopenharmony_ci	SCRPD_MSC1_IS_ENABLED		= BIT(10),
37162306a36Sopenharmony_ci	/* Sx exit occurred */
37262306a36Sopenharmony_ci	SCRPD_SX_EXIT			= BIT(11),
37362306a36Sopenharmony_ci	/* Trigger Unit is enabled */
37462306a36Sopenharmony_ci	SCRPD_TRIGGER_IS_ENABLED	= BIT(12),
37562306a36Sopenharmony_ci	SCRPD_ODLA_IS_ENABLED		= BIT(13),
37662306a36Sopenharmony_ci	SCRPD_SOCHAP_IS_ENABLED		= BIT(14),
37762306a36Sopenharmony_ci	SCRPD_STH_IS_ENABLED		= BIT(15),
37862306a36Sopenharmony_ci	SCRPD_DCIH_IS_ENABLED		= BIT(16),
37962306a36Sopenharmony_ci	SCRPD_VER_IS_ENABLED		= BIT(17),
38062306a36Sopenharmony_ci	/* External debugger is using Intel TH */
38162306a36Sopenharmony_ci	SCRPD_DEBUGGER_IN_USE		= BIT(24),
38262306a36Sopenharmony_ci};
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci#endif
385