162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Intel(R) Trace Hub Memory Storage Unit (MSU) data structures
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2014-2015 Intel Corporation.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __INTEL_TH_MSU_H__
962306a36Sopenharmony_ci#define __INTEL_TH_MSU_H__
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cienum {
1262306a36Sopenharmony_ci	REG_MSU_MSUPARAMS	= 0x0000,
1362306a36Sopenharmony_ci	REG_MSU_MSUSTS		= 0x0008,
1462306a36Sopenharmony_ci	REG_MSU_MINTCTL		= 0x0004, /* MSU-global interrupt control */
1562306a36Sopenharmony_ci	REG_MSU_MSC0CTL		= 0x0100, /* MSC0 control */
1662306a36Sopenharmony_ci	REG_MSU_MSC0STS		= 0x0104, /* MSC0 status */
1762306a36Sopenharmony_ci	REG_MSU_MSC0BAR		= 0x0108, /* MSC0 output base address */
1862306a36Sopenharmony_ci	REG_MSU_MSC0SIZE	= 0x010c, /* MSC0 output size */
1962306a36Sopenharmony_ci	REG_MSU_MSC0MWP		= 0x0110, /* MSC0 write pointer */
2062306a36Sopenharmony_ci	REG_MSU_MSC0NWSA	= 0x011c, /* MSC0 next window start address */
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	REG_MSU_MSC1CTL		= 0x0200, /* MSC1 control */
2362306a36Sopenharmony_ci	REG_MSU_MSC1STS		= 0x0204, /* MSC1 status */
2462306a36Sopenharmony_ci	REG_MSU_MSC1BAR		= 0x0208, /* MSC1 output base address */
2562306a36Sopenharmony_ci	REG_MSU_MSC1SIZE	= 0x020c, /* MSC1 output size */
2662306a36Sopenharmony_ci	REG_MSU_MSC1MWP		= 0x0210, /* MSC1 write pointer */
2762306a36Sopenharmony_ci	REG_MSU_MSC1NWSA	= 0x021c, /* MSC1 next window start address */
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* MSUSTS bits */
3162306a36Sopenharmony_ci#define MSUSTS_MSU_INT	BIT(0)
3262306a36Sopenharmony_ci#define MSUSTS_MSC0BLAST	BIT(16)
3362306a36Sopenharmony_ci#define MSUSTS_MSC1BLAST	BIT(24)
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/* MSCnCTL bits */
3662306a36Sopenharmony_ci#define MSC_EN		BIT(0)
3762306a36Sopenharmony_ci#define MSC_WRAPEN	BIT(1)
3862306a36Sopenharmony_ci#define MSC_RD_HDR_OVRD	BIT(2)
3962306a36Sopenharmony_ci#define MSC_MODE	(BIT(4) | BIT(5))
4062306a36Sopenharmony_ci#define MSC_LEN		(BIT(8) | BIT(9) | BIT(10))
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* MINTCTL bits */
4362306a36Sopenharmony_ci#define MICDE		BIT(0)
4462306a36Sopenharmony_ci#define M0BLIE		BIT(16)
4562306a36Sopenharmony_ci#define M1BLIE		BIT(24)
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* MSCnSTS bits */
4862306a36Sopenharmony_ci#define MSCSTS_WRAPSTAT	BIT(1)	/* Wrap occurred */
4962306a36Sopenharmony_ci#define MSCSTS_PLE	BIT(2)	/* Pipeline Empty */
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/*
5262306a36Sopenharmony_ci * Multiblock/multiwindow block descriptor
5362306a36Sopenharmony_ci */
5462306a36Sopenharmony_cistruct msc_block_desc {
5562306a36Sopenharmony_ci	u32	sw_tag;
5662306a36Sopenharmony_ci	u32	block_sz;
5762306a36Sopenharmony_ci	u32	next_blk;
5862306a36Sopenharmony_ci	u32	next_win;
5962306a36Sopenharmony_ci	u32	res0[4];
6062306a36Sopenharmony_ci	u32	hw_tag;
6162306a36Sopenharmony_ci	u32	valid_dw;
6262306a36Sopenharmony_ci	u32	ts_low;
6362306a36Sopenharmony_ci	u32	ts_high;
6462306a36Sopenharmony_ci	u32	res1[4];
6562306a36Sopenharmony_ci} __packed;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define MSC_BDESC	sizeof(struct msc_block_desc)
6862306a36Sopenharmony_ci#define DATA_IN_PAGE	(PAGE_SIZE - MSC_BDESC)
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/* MSC multiblock sw tag bits */
7162306a36Sopenharmony_ci#define MSC_SW_TAG_LASTBLK	BIT(0)
7262306a36Sopenharmony_ci#define MSC_SW_TAG_LASTWIN	BIT(1)
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci/* MSC multiblock hw tag bits */
7562306a36Sopenharmony_ci#define MSC_HW_TAG_TRIGGER	BIT(0)
7662306a36Sopenharmony_ci#define MSC_HW_TAG_BLOCKWRAP	BIT(1)
7762306a36Sopenharmony_ci#define MSC_HW_TAG_WINWRAP	BIT(2)
7862306a36Sopenharmony_ci#define MSC_HW_TAG_ENDBIT	BIT(3)
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistatic inline unsigned long msc_data_sz(struct msc_block_desc *bdesc)
8162306a36Sopenharmony_ci{
8262306a36Sopenharmony_ci	if (!bdesc->valid_dw)
8362306a36Sopenharmony_ci		return 0;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	return bdesc->valid_dw * 4 - MSC_BDESC;
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistatic inline unsigned long msc_total_sz(struct msc_block_desc *bdesc)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	return bdesc->valid_dw * 4;
9162306a36Sopenharmony_ci}
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistatic inline unsigned long msc_block_sz(struct msc_block_desc *bdesc)
9462306a36Sopenharmony_ci{
9562306a36Sopenharmony_ci	return bdesc->block_sz * 64 - MSC_BDESC;
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic inline bool msc_block_wrapped(struct msc_block_desc *bdesc)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	if (bdesc->hw_tag & (MSC_HW_TAG_BLOCKWRAP | MSC_HW_TAG_WINWRAP))
10162306a36Sopenharmony_ci		return true;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	return false;
10462306a36Sopenharmony_ci}
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_cistatic inline bool msc_block_last_written(struct msc_block_desc *bdesc)
10762306a36Sopenharmony_ci{
10862306a36Sopenharmony_ci	if ((bdesc->hw_tag & MSC_HW_TAG_ENDBIT) ||
10962306a36Sopenharmony_ci	    (msc_data_sz(bdesc) != msc_block_sz(bdesc)))
11062306a36Sopenharmony_ci		return true;
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	return false;
11362306a36Sopenharmony_ci}
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* waiting for Pipeline Empty bit(s) to assert for MSC */
11662306a36Sopenharmony_ci#define MSC_PLE_WAITLOOP_DEPTH	10000
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci#endif /* __INTEL_TH_MSU_H__ */
119