summaryrefslogtreecommitdiffstats
path: root/sound/soc/intel/catpt/registers.h
blob: 47280d82842eb86c685af22a8f8f2b45530ddae1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright(c) 2020 Intel Corporation. All rights reserved.
 *
 * Author: Cezary Rojewski <cezary.rojewski@intel.com>
 */

#ifndef __SND_SOC_INTEL_CATPT_REGS_H
#define __SND_SOC_INTEL_CATPT_REGS_H

#include <linux/bitops.h>
#include <linux/iopoll.h>
#include <uapi/linux/pci_regs.h>

#define CATPT_SHIM_REGS_SIZE	4096
#define CATPT_DMA_REGS_SIZE	1024
#define CATPT_DMA_COUNT		2
#define CATPT_SSP_REGS_SIZE	512

/* DSP Shim registers */

#define CATPT_SHIM_CS1		0x00
#define CATPT_SHIM_ISC		0x18
#define CATPT_SHIM_ISD		0x20
#define CATPT_SHIM_IMC		0x28
#define CATPT_SHIM_IMD		0x30
#define CATPT_SHIM_IPCC		0x38
#define CATPT_SHIM_IPCD		0x40
#define CATPT_SHIM_CLKCTL	0x78
#define CATPT_SHIM_CS2		0x80
#define CATPT_SHIM_LTRC		0xE0
#define CATPT_SHIM_HMDC		0xE8

#define CATPT_CS_LPCS		BIT(31)
#define CATPT_CS_SFCR(ssp)	BIT(27 + (ssp))
#define CATPT_CS_S1IOCS		BIT(23)
#define CATPT_CS_S0IOCS		BIT(21)
#define CATPT_CS_PCE		BIT(15)
#define CATPT_CS_SDPM(ssp)	BIT(11 + (ssp))
#define CATPT_CS_STALL		BIT(10)
#define CATPT_CS_DCS		GENMASK(6, 4)
/* b100 DSP core & audio fabric high clock */
#define CATPT_CS_DCS_HIGH	(0x4 << 4)
#define CATPT_CS_SBCS(ssp)	BIT(2 + (ssp))
#define CATPT_CS_RST		BIT(1)

#define CATPT_ISC_IPCDB		BIT(1)
#define CATPT_ISC_IPCCD		BIT(0)
#define CATPT_ISD_DCPWM		BIT(31)
#define CATPT_ISD_IPCCB		BIT(1)
#define CATPT_ISD_IPCDD		BIT(0)

#define CATPT_IMC_IPCDB		BIT(1)
#define CATPT_IMC_IPCCD		BIT(0)
#define CATPT_IMD_IPCCB		BIT(1)
#define CATPT_IMD_IPCDD		BIT(0)

#define CATPT_IPCC_BUSY		BIT(31)
#define CATPT_IPCC_DONE		BIT(30)
#define CATPT_IPCD_BUSY		BIT(31)
#define CATPT_IPCD_DONE		BIT(30)

#define CATPT_CLKCTL_CFCIP	BIT(31)
#define CATPT_CLKCTL_SMOS	GENMASK(25, 24)

#define CATPT_HMDC_HDDA(e, ch)	BIT(8 * (e) + (ch))

/* defaults to reset SHIM registers to after each power cycle */
#define CATPT_CS_DEFAULT	0x8480040E
#define CATPT_ISC_DEFAULT	0x0
#define CATPT_ISD_DEFAULT	0x0
#define CATPT_IMC_DEFAULT	0x7FFF0003
#define CATPT_IMD_DEFAULT	0x7FFF0003
#define CATPT_IPCC_DEFAULT	0x0
#define CATPT_IPCD_DEFAULT	0x0
#define CATPT_CLKCTL_DEFAULT	0x7FF
#define CATPT_CS2_DEFAULT	0x0
#define CATPT_LTRC_DEFAULT	0x0
#define CATPT_HMDC_DEFAULT	0x0

/* PCI Configuration registers */

#define CATPT_PCI_PMCAPID	0x80
#define CATPT_PCI_PMCS		(CATPT_PCI_PMCAPID + PCI_PM_CTRL)
#define CATPT_PCI_VDRTCTL0	0xA0
#define CATPT_PCI_VDRTCTL2	0xA8

#define CATPT_VDRTCTL2_DTCGE	BIT(10)
#define CATPT_VDRTCTL2_DCLCGE	BIT(1)
#define CATPT_VDRTCTL2_CGEALL	0xF7F

/* LPT PCI Configuration bits */

#define LPT_VDRTCTL0_DSRAMPGE(b)	BIT(16 + (b))
#define LPT_VDRTCTL0_DSRAMPGE_MASK	GENMASK(31, 16)
#define LPT_VDRTCTL0_ISRAMPGE(b)	BIT(6 + (b))
#define LPT_VDRTCTL0_ISRAMPGE_MASK	GENMASK(15, 6)
#define LPT_VDRTCTL0_D3SRAMPGD		BIT(2)
#define LPT_VDRTCTL0_D3PGD		BIT(1)
#define LPT_VDRTCTL0_APLLSE		BIT(0)

/* WPT PCI Configuration bits */

#define WPT_VDRTCTL0_DSRAMPGE(b)	BIT(12 + (b))
#define WPT_VDRTCTL0_DSRAMPGE_MASK	GENMASK(31, 12)
#define WPT_VDRTCTL0_ISRAMPGE(b)	BIT(2 + (b))
#define WPT_VDRTCTL0_ISRAMPGE_MASK	GENMASK(11, 2)
#define WPT_VDRTCTL0_D3SRAMPGD		BIT(1)
#define WPT_VDRTCTL0_D3PGD		BIT(0)

#define WPT_VDRTCTL2_APLLSE		BIT(31)

/* defaults to reset SSP registers to after each power cycle */
#define CATPT_SSC0_DEFAULT		0x0
#define CATPT_SSC1_DEFAULT		0x0
#define CATPT_SSS_DEFAULT		0xF004
#define CATPT_SSIT_DEFAULT		0x0
#define CATPT_SSD_DEFAULT		0xC43893A3
#define CATPT_SSTO_DEFAULT		0x0
#define CATPT_SSPSP_DEFAULT		0x0
#define CATPT_SSTSA_DEFAULT		0x0
#define CATPT_SSRSA_DEFAULT		0x0
#define CATPT_SSTSS_DEFAULT		0x0
#define CATPT_SSCR2_DEFAULT		0x0
#define CATPT_SSPSP2_DEFAULT		0x0

/* Physically the same block, access address differs between host and dsp */
#define CATPT_DSP_DRAM_OFFSET		0x400000
#define catpt_to_host_offset(offset)	((offset) & ~(CATPT_DSP_DRAM_OFFSET))
#define catpt_to_dsp_offset(offset)	((offset) | CATPT_DSP_DRAM_OFFSET)

#define CATPT_MEMBLOCK_SIZE	0x8000
#define catpt_num_dram(cdev)	(hweight_long((cdev)->spec->dram_mask))
#define catpt_num_iram(cdev)	(hweight_long((cdev)->spec->iram_mask))
#define catpt_dram_size(cdev)	(catpt_num_dram(cdev) * CATPT_MEMBLOCK_SIZE)
#define catpt_iram_size(cdev)	(catpt_num_iram(cdev) * CATPT_MEMBLOCK_SIZE)

/* registry I/O helpers */

#define catpt_shim_addr(cdev) \
	((cdev)->lpe_ba + (cdev)->spec->host_shim_offset)
#define catpt_dma_addr(cdev, dma) \
	((cdev)->lpe_ba + (cdev)->spec->host_dma_offset[dma])
#define catpt_ssp_addr(cdev, ssp) \
	((cdev)->lpe_ba + (cdev)->spec->host_ssp_offset[ssp])
#define catpt_inbox_addr(cdev) \
	((cdev)->lpe_ba + (cdev)->ipc.config.inbox_offset)
#define catpt_outbox_addr(cdev) \
	((cdev)->lpe_ba + (cdev)->ipc.config.outbox_offset)

#define catpt_writel_ssp(cdev, ssp, reg, val) \
	writel(val, catpt_ssp_addr(cdev, ssp) + (reg))

#define catpt_readl_shim(cdev, reg) \
	readl(catpt_shim_addr(cdev) + CATPT_SHIM_##reg)
#define catpt_writel_shim(cdev, reg, val) \
	writel(val, catpt_shim_addr(cdev) + CATPT_SHIM_##reg)
#define catpt_updatel_shim(cdev, reg, mask, val) \
	catpt_writel_shim(cdev, reg, \
			  (catpt_readl_shim(cdev, reg) & ~(mask)) | (val))

#define catpt_readl_poll_shim(cdev, reg, val, cond, delay_us, timeout_us) \
	readl_poll_timeout(catpt_shim_addr(cdev) + CATPT_SHIM_##reg, \
			   val, cond, delay_us, timeout_us)

#define catpt_readl_pci(cdev, reg) \
	readl(cdev->pci_ba + CATPT_PCI_##reg)
#define catpt_writel_pci(cdev, reg, val) \
	writel(val, cdev->pci_ba + CATPT_PCI_##reg)
#define catpt_updatel_pci(cdev, reg, mask, val) \
	catpt_writel_pci(cdev, reg, \
			 (catpt_readl_pci(cdev, reg) & ~(mask)) | (val))

#define catpt_readl_poll_pci(cdev, reg, val, cond, delay_us, timeout_us) \
	readl_poll_timeout((cdev)->pci_ba + CATPT_PCI_##reg, \
			   val, cond, delay_us, timeout_us)

#endif