xref: /openbmc/linux/drivers/accel/habanalabs/include/common/hl_boot_if.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1e65e175bSOded Gabbay /* SPDX-License-Identifier: GPL-2.0
2e65e175bSOded Gabbay  *
3e65e175bSOded Gabbay  * Copyright 2018-2020 HabanaLabs, Ltd.
4e65e175bSOded Gabbay  * All Rights Reserved.
5e65e175bSOded Gabbay  *
6e65e175bSOded Gabbay  */
7e65e175bSOded Gabbay 
8e65e175bSOded Gabbay #ifndef HL_BOOT_IF_H
9e65e175bSOded Gabbay #define HL_BOOT_IF_H
10e65e175bSOded Gabbay 
11e65e175bSOded Gabbay #define LKD_HARD_RESET_MAGIC		0xED7BD694 /* deprecated - do not use */
12e65e175bSOded Gabbay #define HL_POWER9_HOST_MAGIC		0x1DA30009
13e65e175bSOded Gabbay 
14e65e175bSOded Gabbay #define BOOT_FIT_SRAM_OFFSET		0x200000
15e65e175bSOded Gabbay 
16e65e175bSOded Gabbay #define VERSION_MAX_LEN			128
17e65e175bSOded Gabbay 
18e65e175bSOded Gabbay enum cpu_boot_err {
19e65e175bSOded Gabbay 	CPU_BOOT_ERR_DRAM_INIT_FAIL = 0,
20e65e175bSOded Gabbay 	CPU_BOOT_ERR_FIT_CORRUPTED = 1,
21e65e175bSOded Gabbay 	CPU_BOOT_ERR_TS_INIT_FAIL = 2,
22e65e175bSOded Gabbay 	CPU_BOOT_ERR_DRAM_SKIPPED = 3,
23e65e175bSOded Gabbay 	CPU_BOOT_ERR_BMC_WAIT_SKIPPED = 4,
24e65e175bSOded Gabbay 	CPU_BOOT_ERR_NIC_DATA_NOT_RDY = 5,
25e65e175bSOded Gabbay 	CPU_BOOT_ERR_NIC_FW_FAIL = 6,
26e65e175bSOded Gabbay 	CPU_BOOT_ERR_SECURITY_NOT_RDY = 7,
27e65e175bSOded Gabbay 	CPU_BOOT_ERR_SECURITY_FAIL = 8,
28e65e175bSOded Gabbay 	CPU_BOOT_ERR_EFUSE_FAIL = 9,
29e65e175bSOded Gabbay 	CPU_BOOT_ERR_PRI_IMG_VER_FAIL = 10,
30e65e175bSOded Gabbay 	CPU_BOOT_ERR_SEC_IMG_VER_FAIL = 11,
31e65e175bSOded Gabbay 	CPU_BOOT_ERR_PLL_FAIL = 12,
32e65e175bSOded Gabbay 	CPU_BOOT_ERR_DEVICE_UNUSABLE_FAIL = 13,
33e65e175bSOded Gabbay 	CPU_BOOT_ERR_BOOT_FW_CRIT_ERR = 18,
34e65e175bSOded Gabbay 	CPU_BOOT_ERR_BINNING_FAIL = 19,
35e65e175bSOded Gabbay 	CPU_BOOT_ERR_TPM_FAIL = 20,
36e65e175bSOded Gabbay 	CPU_BOOT_ERR_TMP_THRESH_INIT_FAIL = 21,
37e65e175bSOded Gabbay 	CPU_BOOT_ERR_EEPROM_FAIL = 22,
38e65e175bSOded Gabbay 	CPU_BOOT_ERR_ENG_ARC_MEM_SCRUB_FAIL = 23,
39e65e175bSOded Gabbay 	CPU_BOOT_ERR_ENABLED = 31,
40e65e175bSOded Gabbay 	CPU_BOOT_ERR_SCND_EN = 63,
41e65e175bSOded Gabbay 	CPU_BOOT_ERR_LAST = 64 /* we have 2 registers of 32 bits */
42e65e175bSOded Gabbay };
43e65e175bSOded Gabbay 
44139dad04SOded Gabbay /*
45139dad04SOded Gabbay  * Mask for fatal failures
46139dad04SOded Gabbay  * This mask contains all possible fatal failures, and a dynamic code
47139dad04SOded Gabbay  * will clear the non-relevant ones.
48139dad04SOded Gabbay  */
49139dad04SOded Gabbay #define CPU_BOOT_ERR_FATAL_MASK					\
50139dad04SOded Gabbay 		((1 << CPU_BOOT_ERR_DRAM_INIT_FAIL) |		\
51139dad04SOded Gabbay 		 (1 << CPU_BOOT_ERR_PLL_FAIL) |			\
52139dad04SOded Gabbay 		 (1 << CPU_BOOT_ERR_DEVICE_UNUSABLE_FAIL) |	\
53139dad04SOded Gabbay 		 (1 << CPU_BOOT_ERR_BINNING_FAIL) |		\
54139dad04SOded Gabbay 		 (1 << CPU_BOOT_ERR_DRAM_SKIPPED) |		\
55139dad04SOded Gabbay 		 (1 << CPU_BOOT_ERR_ENG_ARC_MEM_SCRUB_FAIL) |	\
56139dad04SOded Gabbay 		 (1 << CPU_BOOT_ERR_EEPROM_FAIL))
57e65e175bSOded Gabbay 
58e65e175bSOded Gabbay /*
59e65e175bSOded Gabbay  * CPU error bits in BOOT_ERROR registers
60e65e175bSOded Gabbay  *
61e65e175bSOded Gabbay  * CPU_BOOT_ERR0_DRAM_INIT_FAIL		DRAM initialization failed.
62e65e175bSOded Gabbay  *					DRAM is not reliable to use.
63e65e175bSOded Gabbay  *
64e65e175bSOded Gabbay  * CPU_BOOT_ERR0_FIT_CORRUPTED		FIT data integrity verification of the
65e65e175bSOded Gabbay  *					image provided by the host has failed.
66e65e175bSOded Gabbay  *
67e65e175bSOded Gabbay  * CPU_BOOT_ERR0_TS_INIT_FAIL		Thermal Sensor initialization failed.
68e65e175bSOded Gabbay  *					Boot continues as usual, but keep in
69e65e175bSOded Gabbay  *					mind this is a warning.
70e65e175bSOded Gabbay  *
71e65e175bSOded Gabbay  * CPU_BOOT_ERR0_DRAM_SKIPPED		DRAM initialization has been skipped.
72e65e175bSOded Gabbay  *					Skipping DRAM initialization has been
73e65e175bSOded Gabbay  *					requested (e.g. strap, command, etc.)
74e65e175bSOded Gabbay  *					and FW skipped the DRAM initialization.
75e65e175bSOded Gabbay  *					Host can initialize the DRAM.
76e65e175bSOded Gabbay  *
77e65e175bSOded Gabbay  * CPU_BOOT_ERR0_BMC_WAIT_SKIPPED	Waiting for BMC data will be skipped.
78e65e175bSOded Gabbay  *					Meaning the BMC data might not be
79e65e175bSOded Gabbay  *					available until reset.
80e65e175bSOded Gabbay  *
81e65e175bSOded Gabbay  * CPU_BOOT_ERR0_NIC_DATA_NOT_RDY	NIC data from BMC is not ready.
82e65e175bSOded Gabbay  *					BMC has not provided the NIC data yet.
83e65e175bSOded Gabbay  *					Once provided this bit will be cleared.
84e65e175bSOded Gabbay  *
85e65e175bSOded Gabbay  * CPU_BOOT_ERR0_NIC_FW_FAIL		NIC FW loading failed.
86e65e175bSOded Gabbay  *					The NIC FW loading and initialization
87e65e175bSOded Gabbay  *					failed. This means NICs are not usable.
88e65e175bSOded Gabbay  *
89e65e175bSOded Gabbay  * CPU_BOOT_ERR0_SECURITY_NOT_RDY	Chip security initialization has been
90e65e175bSOded Gabbay  *					started, but is not ready yet - chip
91e65e175bSOded Gabbay  *					cannot be accessed.
92e65e175bSOded Gabbay  *
93e65e175bSOded Gabbay  * CPU_BOOT_ERR0_SECURITY_FAIL		Security related tasks have failed.
94e65e175bSOded Gabbay  *					The tasks are security init (root of
95e65e175bSOded Gabbay  *					trust), boot authentication (chain of
96e65e175bSOded Gabbay  *					trust), data packets authentication.
97e65e175bSOded Gabbay  *
98e65e175bSOded Gabbay  * CPU_BOOT_ERR0_EFUSE_FAIL		Reading from eFuse failed.
99e65e175bSOded Gabbay  *					The PCI device ID might be wrong.
100e65e175bSOded Gabbay  *
101e65e175bSOded Gabbay  * CPU_BOOT_ERR0_PRI_IMG_VER_FAIL	Verification of primary image failed.
102e65e175bSOded Gabbay  *					It mean that ppboot checksum
103e65e175bSOded Gabbay  *					verification for the preboot primary
104e65e175bSOded Gabbay  *					image has failed to match expected
105e65e175bSOded Gabbay  *					checksum. Trying to program image again
106e65e175bSOded Gabbay  *					might solve this.
107e65e175bSOded Gabbay  *
108e65e175bSOded Gabbay  * CPU_BOOT_ERR0_SEC_IMG_VER_FAIL	Verification of secondary image failed.
109e65e175bSOded Gabbay  *					It mean that ppboot checksum
110e65e175bSOded Gabbay  *					verification for the preboot secondary
111e65e175bSOded Gabbay  *					image has failed to match expected
112e65e175bSOded Gabbay  *					checksum. Trying to program image again
113e65e175bSOded Gabbay  *					might solve this.
114e65e175bSOded Gabbay  *
115e65e175bSOded Gabbay  * CPU_BOOT_ERR0_PLL_FAIL		PLL settings failed, meaning that one
116e65e175bSOded Gabbay  *					of the PLLs remains in REF_CLK
117e65e175bSOded Gabbay  *
118e65e175bSOded Gabbay  * CPU_BOOT_ERR0_DEVICE_UNUSABLE_FAIL	Device is unusable and customer support
119e65e175bSOded Gabbay  *					should be contacted.
120e65e175bSOded Gabbay  *
121e65e175bSOded Gabbay  * CPU_BOOT_ERR0_BOOT_FW_CRIT_ERR	Critical error was detected during
122e65e175bSOded Gabbay  *					the execution of ppboot or preboot.
123e65e175bSOded Gabbay  *					for example: stack overflow.
124e65e175bSOded Gabbay  *
125e65e175bSOded Gabbay  * CPU_BOOT_ERR0_BINNING_FAIL		Binning settings failed, meaning
126e65e175bSOded Gabbay  *					malfunctioning components might still be
127e65e175bSOded Gabbay  *					in use.
128e65e175bSOded Gabbay  *
129e65e175bSOded Gabbay  * CPU_BOOT_ERR0_TPM_FAIL		TPM verification flow failed.
130e65e175bSOded Gabbay  *
131e65e175bSOded Gabbay  * CPU_BOOT_ERR0_TMP_THRESH_INIT_FAIL	Failed to set threshold for tmperature
132e65e175bSOded Gabbay  *					sensor.
133e65e175bSOded Gabbay  *
134e65e175bSOded Gabbay  * CPU_BOOT_ERR_EEPROM_FAIL		Failed reading EEPROM data. Defaults
135e65e175bSOded Gabbay  *					are used.
136e65e175bSOded Gabbay  *
137e65e175bSOded Gabbay  * CPU_BOOT_ERR_ENG_ARC_MEM_SCRUB_FAIL	Failed scrubbing the Engines/ARCFarm
138e65e175bSOded Gabbay  *					memories. Boot disabled until reset.
139e65e175bSOded Gabbay  *
140e65e175bSOded Gabbay  * CPU_BOOT_ERR0_ENABLED		Error registers enabled.
141e65e175bSOded Gabbay  *					This is a main indication that the
142e65e175bSOded Gabbay  *					running FW populates the error
143e65e175bSOded Gabbay  *					registers. Meaning the error bits are
144e65e175bSOded Gabbay  *					not garbage, but actual error statuses.
145e65e175bSOded Gabbay  */
146e65e175bSOded Gabbay #define CPU_BOOT_ERR0_DRAM_INIT_FAIL		(1 << CPU_BOOT_ERR_DRAM_INIT_FAIL)
147e65e175bSOded Gabbay #define CPU_BOOT_ERR0_FIT_CORRUPTED		(1 << CPU_BOOT_ERR_FIT_CORRUPTED)
148e65e175bSOded Gabbay #define CPU_BOOT_ERR0_TS_INIT_FAIL		(1 << CPU_BOOT_ERR_TS_INIT_FAIL)
149e65e175bSOded Gabbay #define CPU_BOOT_ERR0_DRAM_SKIPPED		(1 << CPU_BOOT_ERR_DRAM_SKIPPED)
150e65e175bSOded Gabbay #define CPU_BOOT_ERR0_BMC_WAIT_SKIPPED		(1 << CPU_BOOT_ERR_BMC_WAIT_SKIPPED)
151e65e175bSOded Gabbay #define CPU_BOOT_ERR0_NIC_DATA_NOT_RDY		(1 << CPU_BOOT_ERR_NIC_DATA_NOT_RDY)
152e65e175bSOded Gabbay #define CPU_BOOT_ERR0_NIC_FW_FAIL		(1 << CPU_BOOT_ERR_NIC_FW_FAIL)
153e65e175bSOded Gabbay #define CPU_BOOT_ERR0_SECURITY_NOT_RDY		(1 << CPU_BOOT_ERR_SECURITY_NOT_RDY)
154e65e175bSOded Gabbay #define CPU_BOOT_ERR0_SECURITY_FAIL		(1 << CPU_BOOT_ERR_SECURITY_FAIL)
155e65e175bSOded Gabbay #define CPU_BOOT_ERR0_EFUSE_FAIL		(1 << CPU_BOOT_ERR_EFUSE_FAIL)
156e65e175bSOded Gabbay #define CPU_BOOT_ERR0_PRI_IMG_VER_FAIL		(1 << CPU_BOOT_ERR_PRI_IMG_VER_FAIL)
157e65e175bSOded Gabbay #define CPU_BOOT_ERR0_SEC_IMG_VER_FAIL		(1 << CPU_BOOT_ERR_SEC_IMG_VER_FAIL)
158e65e175bSOded Gabbay #define CPU_BOOT_ERR0_PLL_FAIL			(1 << CPU_BOOT_ERR_PLL_FAIL)
159e65e175bSOded Gabbay #define CPU_BOOT_ERR0_DEVICE_UNUSABLE_FAIL	(1 << CPU_BOOT_ERR_DEVICE_UNUSABLE_FAIL)
160e65e175bSOded Gabbay #define CPU_BOOT_ERR0_BOOT_FW_CRIT_ERR		(1 << CPU_BOOT_ERR_BOOT_FW_CRIT_ERR)
161e65e175bSOded Gabbay #define CPU_BOOT_ERR0_BINNING_FAIL		(1 << CPU_BOOT_ERR_BINNING_FAIL)
162e65e175bSOded Gabbay #define CPU_BOOT_ERR0_TPM_FAIL			(1 << CPU_BOOT_ERR_TPM_FAIL)
163e65e175bSOded Gabbay #define CPU_BOOT_ERR0_TMP_THRESH_INIT_FAIL	(1 << CPU_BOOT_ERR_TMP_THRESH_INIT_FAIL)
164e65e175bSOded Gabbay #define CPU_BOOT_ERR0_EEPROM_FAIL		(1 << CPU_BOOT_ERR_EEPROM_FAIL)
165e65e175bSOded Gabbay #define CPU_BOOT_ERR0_ENG_ARC_MEM_SCRUB_FAIL	(1 << CPU_BOOT_ERR_ENG_ARC_MEM_SCRUB_FAIL)
166e65e175bSOded Gabbay #define CPU_BOOT_ERR0_ENABLED			(1 << CPU_BOOT_ERR_ENABLED)
167e65e175bSOded Gabbay #define CPU_BOOT_ERR1_ENABLED			(1 << CPU_BOOT_ERR_ENABLED)
168e65e175bSOded Gabbay 
169e65e175bSOded Gabbay enum cpu_boot_dev_sts {
170e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_SECURITY_EN = 0,
171e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_DEBUG_EN = 1,
172e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_WATCHDOG_EN = 2,
173e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_DRAM_INIT_EN = 3,
174e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_BMC_WAIT_EN = 4,
175e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_E2E_CRED_EN = 5,
176e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_HBM_CRED_EN = 6,
177e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_RL_EN = 7,
178e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_SRAM_SCR_EN = 8,
179e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_DRAM_SCR_EN = 9,
180e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_FW_HARD_RST_EN = 10,
181e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_PLL_INFO_EN = 11,
182e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_SP_SRAM_EN = 12,
183e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_CLK_GATE_EN = 13,
184e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_HBM_ECC_EN = 14,
185e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_PKT_PI_ACK_EN = 15,
186e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_FW_LD_COM_EN = 16,
187e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_FW_IATU_CONF_EN = 17,
188e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_FW_NIC_MAC_EN = 18,
189e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_DYN_PLL_EN = 19,
190e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_GIC_PRIVILEGED_EN = 20,
191e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_EQ_INDEX_EN = 21,
192e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_MULTI_IRQ_POLL_EN = 22,
193e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_FW_NIC_STAT_XPCS91_EN = 23,
194e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_FW_NIC_STAT_EXT_EN = 24,
195e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_IS_IDLE_CHECK_EN = 25,
196e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_MAP_HWMON_EN = 26,
197e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_ENABLED = 31,
198e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_SCND_EN = 63,
199e65e175bSOded Gabbay 	CPU_BOOT_DEV_STS_LAST = 64 /* we have 2 registers of 32 bits */
200e65e175bSOded Gabbay };
201e65e175bSOded Gabbay 
202e65e175bSOded Gabbay /*
203e65e175bSOded Gabbay  * BOOT DEVICE STATUS bits in BOOT_DEVICE_STS registers
204e65e175bSOded Gabbay  *
205e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_SECURITY_EN	Security is Enabled.
206e65e175bSOded Gabbay  *					This is an indication for security
207e65e175bSOded Gabbay  *					enabled in FW, which means that
208e65e175bSOded Gabbay  *					all conditions for security are met:
209e65e175bSOded Gabbay  *					device is indicated as security enabled,
210e65e175bSOded Gabbay  *					registers are protected, and device
211e65e175bSOded Gabbay  *					uses keys for image verification.
212e65e175bSOded Gabbay  *					Initialized in: preboot
213e65e175bSOded Gabbay  *
214e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_DEBUG_EN		Debug is enabled.
215e65e175bSOded Gabbay  *					Enabled when JTAG or DEBUG is enabled
216e65e175bSOded Gabbay  *					in FW.
217e65e175bSOded Gabbay  *					Initialized in: preboot
218e65e175bSOded Gabbay  *
219e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_WATCHDOG_EN	Watchdog is enabled.
220e65e175bSOded Gabbay  *					Watchdog is enabled in FW.
221e65e175bSOded Gabbay  *					Initialized in: preboot
222e65e175bSOded Gabbay  *
223e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_DRAM_INIT_EN	DRAM initialization is enabled.
224e65e175bSOded Gabbay  *					DRAM initialization has been done in FW.
225e65e175bSOded Gabbay  *					Initialized in: u-boot
226e65e175bSOded Gabbay  *
227e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_BMC_WAIT_EN	Waiting for BMC data enabled.
228e65e175bSOded Gabbay  *					If set, it means that during boot,
229e65e175bSOded Gabbay  *					FW waited for BMC data.
230e65e175bSOded Gabbay  *					Initialized in: u-boot
231e65e175bSOded Gabbay  *
232e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_E2E_CRED_EN	E2E credits initialized.
233e65e175bSOded Gabbay  *					FW initialized E2E credits.
234e65e175bSOded Gabbay  *					Initialized in: u-boot
235e65e175bSOded Gabbay  *
236e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_HBM_CRED_EN	HBM credits initialized.
237e65e175bSOded Gabbay  *					FW initialized HBM credits.
238e65e175bSOded Gabbay  *					Initialized in: u-boot
239e65e175bSOded Gabbay  *
240e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_RL_EN		Rate limiter initialized.
241e65e175bSOded Gabbay  *					FW initialized rate limiter.
242e65e175bSOded Gabbay  *					Initialized in: u-boot
243e65e175bSOded Gabbay  *
244e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_SRAM_SCR_EN	SRAM scrambler enabled.
245e65e175bSOded Gabbay  *					FW initialized SRAM scrambler.
246e65e175bSOded Gabbay  *					Initialized in: linux
247e65e175bSOded Gabbay  *
248e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_DRAM_SCR_EN	DRAM scrambler enabled.
249e65e175bSOded Gabbay  *					FW initialized DRAM scrambler.
250e65e175bSOded Gabbay  *					Initialized in: u-boot
251e65e175bSOded Gabbay  *
252e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_FW_HARD_RST_EN	FW hard reset procedure is enabled.
253e65e175bSOded Gabbay  *					FW has the hard reset procedure
254e65e175bSOded Gabbay  *					implemented. This means that FW will
255e65e175bSOded Gabbay  *					perform hard reset procedure on
256e65e175bSOded Gabbay  *					receiving the halt-machine event.
257e65e175bSOded Gabbay  *					Initialized in: preboot, u-boot, linux
258e65e175bSOded Gabbay  *
259e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_PLL_INFO_EN	FW retrieval of PLL info is enabled.
260e65e175bSOded Gabbay  *					Initialized in: linux
261e65e175bSOded Gabbay  *
262e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_SP_SRAM_EN		SP SRAM is initialized and available
263e65e175bSOded Gabbay  *					for use.
264e65e175bSOded Gabbay  *					Initialized in: preboot
265e65e175bSOded Gabbay  *
266e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_CLK_GATE_EN	Clock Gating enabled.
267e65e175bSOded Gabbay  *					FW initialized Clock Gating.
268e65e175bSOded Gabbay  *					Initialized in: preboot
269e65e175bSOded Gabbay  *
270e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_HBM_ECC_EN		HBM ECC handling Enabled.
271e65e175bSOded Gabbay  *					FW handles HBM ECC indications.
272e65e175bSOded Gabbay  *					Initialized in: linux
273e65e175bSOded Gabbay  *
274e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_PKT_PI_ACK_EN	Packets ack value used in the armcpd
275e65e175bSOded Gabbay  *					is set to the PI counter.
276e65e175bSOded Gabbay  *					Initialized in: linux
277e65e175bSOded Gabbay  *
278e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_FW_LD_COM_EN	Flexible FW loading communication
279e65e175bSOded Gabbay  *					protocol is enabled.
280e65e175bSOded Gabbay  *					Initialized in: preboot
281e65e175bSOded Gabbay  *
282e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_FW_IATU_CONF_EN	FW iATU configuration is enabled.
283e65e175bSOded Gabbay  *					This bit if set, means the iATU has been
284e65e175bSOded Gabbay  *					configured and is ready for use.
285e65e175bSOded Gabbay  *					Initialized in: ppboot
286e65e175bSOded Gabbay  *
287e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_FW_NIC_MAC_EN	NIC MAC channels init is done by FW and
288e65e175bSOded Gabbay  *					any access to them is done via the FW.
289e65e175bSOded Gabbay  *					Initialized in: linux
290e65e175bSOded Gabbay  *
291e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_DYN_PLL_EN		Dynamic PLL configuration is enabled.
292e65e175bSOded Gabbay  *					FW sends to host a bitmap of supported
293e65e175bSOded Gabbay  *					PLLs.
294e65e175bSOded Gabbay  *					Initialized in: linux
295e65e175bSOded Gabbay  *
296e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_GIC_PRIVILEGED_EN	GIC access permission only from
297e65e175bSOded Gabbay  *					previleged entity. FW sets this status
298e65e175bSOded Gabbay  *					bit for host. If this bit is set then
299e65e175bSOded Gabbay  *					GIC can not be accessed from host.
300e65e175bSOded Gabbay  *					Initialized in: linux
301e65e175bSOded Gabbay  *
302e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_EQ_INDEX_EN	Event Queue (EQ) index is a running
303e65e175bSOded Gabbay  *					index for each new event sent to host.
304e65e175bSOded Gabbay  *					This is used as a method in host to
305e65e175bSOded Gabbay  *					identify that the waiting event in
306e65e175bSOded Gabbay  *					queue is actually a new event which
307e65e175bSOded Gabbay  *					was not served before.
308e65e175bSOded Gabbay  *					Initialized in: linux
309e65e175bSOded Gabbay  *
310e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_MULTI_IRQ_POLL_EN	Use multiple scratchpad interfaces to
311e65e175bSOded Gabbay  *					prevent IRQs overriding each other.
312e65e175bSOded Gabbay  *					Initialized in: linux
313e65e175bSOded Gabbay  *
314e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_FW_NIC_STAT_XPCS91_EN
315e65e175bSOded Gabbay  *					NIC STAT and XPCS91 access is restricted
316e65e175bSOded Gabbay  *					and is done via FW only.
317e65e175bSOded Gabbay  *					Initialized in: linux
318e65e175bSOded Gabbay  *
319e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_FW_NIC_STAT_EXT_EN
320e65e175bSOded Gabbay  *					NIC STAT get all is supported.
321e65e175bSOded Gabbay  *					Initialized in: linux
322e65e175bSOded Gabbay  *
323e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_IS_IDLE_CHECK_EN
324e65e175bSOded Gabbay  *					F/W checks if the device is idle by reading defined set
325e65e175bSOded Gabbay  *					of registers. It returns a bitmask of all the engines,
326e65e175bSOded Gabbay  *					where a bit is set if the engine is not idle.
327e65e175bSOded Gabbay  *					Initialized in: linux
328e65e175bSOded Gabbay  *
329e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_MAP_HWMON_EN
330e65e175bSOded Gabbay  *					If set, means f/w supports proprietary
331e65e175bSOded Gabbay  *					HWMON enum mapping to cpucp enums.
332e65e175bSOded Gabbay  *					Initialized in: linux
333e65e175bSOded Gabbay  *
334e65e175bSOded Gabbay  * CPU_BOOT_DEV_STS0_ENABLED		Device status register enabled.
335e65e175bSOded Gabbay  *					This is a main indication that the
336e65e175bSOded Gabbay  *					running FW populates the device status
337e65e175bSOded Gabbay  *					register. Meaning the device status
338e65e175bSOded Gabbay  *					bits are not garbage, but actual
339e65e175bSOded Gabbay  *					statuses.
340e65e175bSOded Gabbay  *					Initialized in: preboot
341e65e175bSOded Gabbay  *
342e65e175bSOded Gabbay  */
343e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_SECURITY_EN		(1 << CPU_BOOT_DEV_STS_SECURITY_EN)
344e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_DEBUG_EN		(1 << CPU_BOOT_DEV_STS_DEBUG_EN)
345e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_WATCHDOG_EN		(1 << CPU_BOOT_DEV_STS_WATCHDOG_EN)
346e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_DRAM_INIT_EN		(1 << CPU_BOOT_DEV_STS_DRAM_INIT_EN)
347e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_BMC_WAIT_EN		(1 << CPU_BOOT_DEV_STS_BMC_WAIT_EN)
348e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_E2E_CRED_EN		(1 << CPU_BOOT_DEV_STS_E2E_CRED_EN)
349e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_HBM_CRED_EN		(1 << CPU_BOOT_DEV_STS_HBM_CRED_EN)
350e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_RL_EN			(1 << CPU_BOOT_DEV_STS_RL_EN)
351e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_SRAM_SCR_EN		(1 << CPU_BOOT_DEV_STS_SRAM_SCR_EN)
352e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_DRAM_SCR_EN		(1 << CPU_BOOT_DEV_STS_DRAM_SCR_EN)
353e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_FW_HARD_RST_EN	(1 << CPU_BOOT_DEV_STS_FW_HARD_RST_EN)
354e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_PLL_INFO_EN		(1 << CPU_BOOT_DEV_STS_PLL_INFO_EN)
355e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_SP_SRAM_EN		(1 << CPU_BOOT_DEV_STS_SP_SRAM_EN)
356e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_CLK_GATE_EN		(1 << CPU_BOOT_DEV_STS_CLK_GATE_EN)
357e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_HBM_ECC_EN		(1 << CPU_BOOT_DEV_STS_HBM_ECC_EN)
358e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_PKT_PI_ACK_EN		(1 << CPU_BOOT_DEV_STS_PKT_PI_ACK_EN)
359e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_FW_LD_COM_EN		(1 << CPU_BOOT_DEV_STS_FW_LD_COM_EN)
360e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_FW_IATU_CONF_EN	(1 << CPU_BOOT_DEV_STS_FW_IATU_CONF_EN)
361e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_FW_NIC_MAC_EN		(1 << CPU_BOOT_DEV_STS_FW_NIC_MAC_EN)
362e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_DYN_PLL_EN		(1 << CPU_BOOT_DEV_STS_DYN_PLL_EN)
363e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_GIC_PRIVILEGED_EN	(1 << CPU_BOOT_DEV_STS_GIC_PRIVILEGED_EN)
364e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_EQ_INDEX_EN		(1 << CPU_BOOT_DEV_STS_EQ_INDEX_EN)
365e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_MULTI_IRQ_POLL_EN	(1 << CPU_BOOT_DEV_STS_MULTI_IRQ_POLL_EN)
366e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_FW_NIC_STAT_XPCS91_EN	(1 << CPU_BOOT_DEV_STS_FW_NIC_STAT_XPCS91_EN)
367e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_FW_NIC_STAT_EXT_EN	(1 << CPU_BOOT_DEV_STS_FW_NIC_STAT_EXT_EN)
368e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_IS_IDLE_CHECK_EN	(1 << CPU_BOOT_DEV_STS_IS_IDLE_CHECK_EN)
369e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_MAP_HWMON_EN		(1 << CPU_BOOT_DEV_STS_MAP_HWMON_EN)
370e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS0_ENABLED		(1 << CPU_BOOT_DEV_STS_ENABLED)
371e65e175bSOded Gabbay #define CPU_BOOT_DEV_STS1_ENABLED		(1 << CPU_BOOT_DEV_STS_ENABLED)
372e65e175bSOded Gabbay 
373e65e175bSOded Gabbay enum cpu_boot_status {
374e65e175bSOded Gabbay 	CPU_BOOT_STATUS_NA = 0,		/* Default value after reset of chip */
375e65e175bSOded Gabbay 	CPU_BOOT_STATUS_IN_WFE = 1,
376e65e175bSOded Gabbay 	CPU_BOOT_STATUS_DRAM_RDY = 2,
377e65e175bSOded Gabbay 	CPU_BOOT_STATUS_SRAM_AVAIL = 3,
378e65e175bSOded Gabbay 	CPU_BOOT_STATUS_IN_BTL = 4,	/* BTL is H/W FSM */
379e65e175bSOded Gabbay 	CPU_BOOT_STATUS_IN_PREBOOT = 5,
380e65e175bSOded Gabbay 	CPU_BOOT_STATUS_IN_SPL,		/* deprecated - not reported */
381e65e175bSOded Gabbay 	CPU_BOOT_STATUS_IN_UBOOT = 7,
382e65e175bSOded Gabbay 	CPU_BOOT_STATUS_DRAM_INIT_FAIL,	/* deprecated - will be removed */
383e65e175bSOded Gabbay 	CPU_BOOT_STATUS_FIT_CORRUPTED,	/* deprecated - will be removed */
384e65e175bSOded Gabbay 	/* U-Boot console prompt activated, commands are not processed */
385e65e175bSOded Gabbay 	CPU_BOOT_STATUS_UBOOT_NOT_READY = 10,
386e65e175bSOded Gabbay 	/* Finished NICs init, reported after DRAM and NICs */
387e65e175bSOded Gabbay 	CPU_BOOT_STATUS_NIC_FW_RDY = 11,
388e65e175bSOded Gabbay 	CPU_BOOT_STATUS_TS_INIT_FAIL,	/* deprecated - will be removed */
389e65e175bSOded Gabbay 	CPU_BOOT_STATUS_DRAM_SKIPPED,	/* deprecated - will be removed */
390e65e175bSOded Gabbay 	CPU_BOOT_STATUS_BMC_WAITING_SKIPPED, /* deprecated - will be removed */
391e65e175bSOded Gabbay 	/* Last boot loader progress status, ready to receive commands */
392e65e175bSOded Gabbay 	CPU_BOOT_STATUS_READY_TO_BOOT = 15,
393e65e175bSOded Gabbay 	/* Internal Boot finished, ready for boot-fit */
394e65e175bSOded Gabbay 	CPU_BOOT_STATUS_WAITING_FOR_BOOT_FIT = 16,
395e65e175bSOded Gabbay 	/* Internal Security has been initialized, device can be accessed */
396e65e175bSOded Gabbay 	CPU_BOOT_STATUS_SECURITY_READY = 17,
397e65e175bSOded Gabbay };
398e65e175bSOded Gabbay 
399e65e175bSOded Gabbay enum kmd_msg {
400e65e175bSOded Gabbay 	KMD_MSG_NA = 0,
401e65e175bSOded Gabbay 	KMD_MSG_GOTO_WFE,
402e65e175bSOded Gabbay 	KMD_MSG_FIT_RDY,
403e65e175bSOded Gabbay 	KMD_MSG_SKIP_BMC,
404e65e175bSOded Gabbay 	RESERVED,
405e65e175bSOded Gabbay 	KMD_MSG_RST_DEV,
406e65e175bSOded Gabbay 	KMD_MSG_LAST
407e65e175bSOded Gabbay };
408e65e175bSOded Gabbay 
409e65e175bSOded Gabbay enum cpu_msg_status {
410e65e175bSOded Gabbay 	CPU_MSG_CLR = 0,
411e65e175bSOded Gabbay 	CPU_MSG_OK,
412e65e175bSOded Gabbay 	CPU_MSG_ERR,
413e65e175bSOded Gabbay };
414e65e175bSOded Gabbay 
415e65e175bSOded Gabbay /* communication registers mapping - consider ABI when changing */
416e65e175bSOded Gabbay struct cpu_dyn_regs {
417e65e175bSOded Gabbay 	__le32 cpu_pq_base_addr_low;
418e65e175bSOded Gabbay 	__le32 cpu_pq_base_addr_high;
419e65e175bSOded Gabbay 	__le32 cpu_pq_length;
420e65e175bSOded Gabbay 	__le32 cpu_pq_init_status;
421e65e175bSOded Gabbay 	__le32 cpu_eq_base_addr_low;
422e65e175bSOded Gabbay 	__le32 cpu_eq_base_addr_high;
423e65e175bSOded Gabbay 	__le32 cpu_eq_length;
424e65e175bSOded Gabbay 	__le32 cpu_eq_ci;
425e65e175bSOded Gabbay 	__le32 cpu_cq_base_addr_low;
426e65e175bSOded Gabbay 	__le32 cpu_cq_base_addr_high;
427e65e175bSOded Gabbay 	__le32 cpu_cq_length;
428e65e175bSOded Gabbay 	__le32 cpu_pf_pq_pi;
429e65e175bSOded Gabbay 	__le32 cpu_boot_dev_sts0;
430e65e175bSOded Gabbay 	__le32 cpu_boot_dev_sts1;
431e65e175bSOded Gabbay 	__le32 cpu_boot_err0;
432e65e175bSOded Gabbay 	__le32 cpu_boot_err1;
433e65e175bSOded Gabbay 	__le32 cpu_boot_status;
434e65e175bSOded Gabbay 	__le32 fw_upd_sts;
435e65e175bSOded Gabbay 	__le32 fw_upd_cmd;
436e65e175bSOded Gabbay 	__le32 fw_upd_pending_sts;
437e65e175bSOded Gabbay 	__le32 fuse_ver_offset;
438e65e175bSOded Gabbay 	__le32 preboot_ver_offset;
439e65e175bSOded Gabbay 	__le32 uboot_ver_offset;
440e65e175bSOded Gabbay 	__le32 hw_state;
441e65e175bSOded Gabbay 	__le32 kmd_msg_to_cpu;
442e65e175bSOded Gabbay 	__le32 cpu_cmd_status_to_host;
443e65e175bSOded Gabbay 	__le32 gic_host_pi_upd_irq;
444e65e175bSOded Gabbay 	__le32 gic_tpc_qm_irq_ctrl;
445e65e175bSOded Gabbay 	__le32 gic_mme_qm_irq_ctrl;
446e65e175bSOded Gabbay 	__le32 gic_dma_qm_irq_ctrl;
447e65e175bSOded Gabbay 	__le32 gic_nic_qm_irq_ctrl;
448e65e175bSOded Gabbay 	__le32 gic_dma_core_irq_ctrl;
449e65e175bSOded Gabbay 	__le32 gic_host_halt_irq;
450e65e175bSOded Gabbay 	__le32 gic_host_ints_irq;
451e65e175bSOded Gabbay 	__le32 gic_host_soft_rst_irq;
452e65e175bSOded Gabbay 	__le32 gic_rot_qm_irq_ctrl;
453e65e175bSOded Gabbay 	__le32 cpu_rst_status;
454e65e175bSOded Gabbay 	__le32 eng_arc_irq_ctrl;
455e65e175bSOded Gabbay 	__le32 reserved1[20];		/* reserve for future use */
456e65e175bSOded Gabbay };
457e65e175bSOded Gabbay 
458e65e175bSOded Gabbay /* TODO: remove the desc magic after the code is updated to use message */
459e65e175bSOded Gabbay /* HCDM - Habana Communications Descriptor Magic */
460e65e175bSOded Gabbay #define HL_COMMS_DESC_MAGIC	0x4843444D
461e65e175bSOded Gabbay #define HL_COMMS_DESC_VER	3
462e65e175bSOded Gabbay 
463e65e175bSOded Gabbay /* HCMv - Habana Communications Message + header version */
464e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_VALUE	0x48434D00
465e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_MASK		0xFFFFFF00
466e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_VER_MASK	0xFF
467e65e175bSOded Gabbay 
468e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_VER(ver)	(HL_COMMS_MSG_MAGIC_VALUE |	\
469e65e175bSOded Gabbay 					((ver) & HL_COMMS_MSG_MAGIC_VER_MASK))
470e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_V0		HL_COMMS_DESC_MAGIC
471e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_V1		HL_COMMS_MSG_MAGIC_VER(1)
472e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_V2		HL_COMMS_MSG_MAGIC_VER(2)
473e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_V3		HL_COMMS_MSG_MAGIC_VER(3)
474e65e175bSOded Gabbay 
475e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC		HL_COMMS_MSG_MAGIC_V3
476e65e175bSOded Gabbay 
477e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_VALIDATE_MAGIC(magic)			\
478e65e175bSOded Gabbay 		(((magic) & HL_COMMS_MSG_MAGIC_MASK) ==			\
479e65e175bSOded Gabbay 		HL_COMMS_MSG_MAGIC_VALUE)
480e65e175bSOded Gabbay 
481e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_VALIDATE_VERSION(magic, ver)			\
482e65e175bSOded Gabbay 		(((magic) & HL_COMMS_MSG_MAGIC_VER_MASK) >=		\
483e65e175bSOded Gabbay 		((ver) & HL_COMMS_MSG_MAGIC_VER_MASK))
484e65e175bSOded Gabbay 
485e65e175bSOded Gabbay #define HL_COMMS_MSG_MAGIC_VALIDATE(magic, ver)				\
486e65e175bSOded Gabbay 		(HL_COMMS_MSG_MAGIC_VALIDATE_MAGIC((magic)) &&		\
487e65e175bSOded Gabbay 		HL_COMMS_MSG_MAGIC_VALIDATE_VERSION((magic), (ver)))
488e65e175bSOded Gabbay 
489e65e175bSOded Gabbay enum comms_msg_type {
490e65e175bSOded Gabbay 	HL_COMMS_DESC_TYPE = 0,
491e65e175bSOded Gabbay 	HL_COMMS_RESET_CAUSE_TYPE = 1,
492e65e175bSOded Gabbay 	HL_COMMS_FW_CFG_SKIP_TYPE = 2,
493e65e175bSOded Gabbay 	HL_COMMS_BINNING_CONF_TYPE = 3,
494e65e175bSOded Gabbay };
495e65e175bSOded Gabbay 
496e65e175bSOded Gabbay /*
497e65e175bSOded Gabbay  * Binning information shared between LKD and FW
498e65e175bSOded Gabbay  * @tpc_mask_l - TPC binning information lower 64 bit
499e65e175bSOded Gabbay  * @dec_mask - Decoder binning information
500e65e175bSOded Gabbay  * @dram_mask - DRAM binning information
501e65e175bSOded Gabbay  * @edma_mask - EDMA binning information
502e65e175bSOded Gabbay  * @mme_mask_l - MME binning information lower 32
503e65e175bSOded Gabbay  * @mme_mask_h - MME binning information upper 32
504e65e175bSOded Gabbay  * @rot_mask - Rotator binning information
505e65e175bSOded Gabbay  * @xbar_mask - xBAR binning information
506e65e175bSOded Gabbay  * @reserved - reserved field for future binning info w/o ABI change
507e65e175bSOded Gabbay  * @tpc_mask_h - TPC binning information upper 64 bit
508e65e175bSOded Gabbay  * @nic_mask - NIC binning information
509e65e175bSOded Gabbay  */
510e65e175bSOded Gabbay struct lkd_fw_binning_info {
511e65e175bSOded Gabbay 	__le64 tpc_mask_l;
512e65e175bSOded Gabbay 	__le32 dec_mask;
513e65e175bSOded Gabbay 	__le32 dram_mask;
514e65e175bSOded Gabbay 	__le32 edma_mask;
515e65e175bSOded Gabbay 	__le32 mme_mask_l;
516e65e175bSOded Gabbay 	__le32 mme_mask_h;
517e65e175bSOded Gabbay 	__le32 rot_mask;
518e65e175bSOded Gabbay 	__le32 xbar_mask;
519e65e175bSOded Gabbay 	__le32 reserved0;
520e65e175bSOded Gabbay 	__le64 tpc_mask_h;
521e65e175bSOded Gabbay 	__le64 nic_mask;
522e65e175bSOded Gabbay 	__le32 reserved1[8];
523e65e175bSOded Gabbay };
524e65e175bSOded Gabbay 
525e65e175bSOded Gabbay /* TODO: remove this struct after the code is updated to use message */
526e65e175bSOded Gabbay /* this is the comms descriptor header - meta data */
527e65e175bSOded Gabbay struct comms_desc_header {
528e65e175bSOded Gabbay 	__le32 magic;		/* magic for validation */
529e65e175bSOded Gabbay 	__le32 crc32;		/* CRC32 of the descriptor w/o header */
530e65e175bSOded Gabbay 	__le16 size;		/* size of the descriptor w/o header */
531e65e175bSOded Gabbay 	__u8 version;	/* descriptor version */
532e65e175bSOded Gabbay 	__u8 reserved[5];	/* pad to 64 bit */
533e65e175bSOded Gabbay };
534e65e175bSOded Gabbay 
535e65e175bSOded Gabbay /* this is the comms message header - meta data */
536e65e175bSOded Gabbay struct comms_msg_header {
537e65e175bSOded Gabbay 	__le32 magic;		/* magic for validation */
538e65e175bSOded Gabbay 	__le32 crc32;		/* CRC32 of the message w/o header */
539e65e175bSOded Gabbay 	__le16 size;		/* size of the message w/o header */
540e65e175bSOded Gabbay 	__u8 version;	/* message payload version */
541e65e175bSOded Gabbay 	__u8 type;		/* message type */
542e65e175bSOded Gabbay 	__u8 reserved[4];	/* pad to 64 bit */
543e65e175bSOded Gabbay };
544e65e175bSOded Gabbay 
545e65e175bSOded Gabbay enum lkd_fw_ascii_msg_lvls {
546e65e175bSOded Gabbay 	LKD_FW_ASCII_MSG_ERR = 0,
547e65e175bSOded Gabbay 	LKD_FW_ASCII_MSG_WRN = 1,
548e65e175bSOded Gabbay 	LKD_FW_ASCII_MSG_INF = 2,
549e65e175bSOded Gabbay 	LKD_FW_ASCII_MSG_DBG = 3,
550e65e175bSOded Gabbay };
551e65e175bSOded Gabbay 
552e65e175bSOded Gabbay #define LKD_FW_ASCII_MSG_MAX_LEN	128
553e65e175bSOded Gabbay #define LKD_FW_ASCII_MSG_MAX		4	/* consider ABI when changing */
554e65e175bSOded Gabbay 
555e65e175bSOded Gabbay struct lkd_fw_ascii_msg {
556e65e175bSOded Gabbay 	__u8 valid;
557e65e175bSOded Gabbay 	__u8 msg_lvl;
558e65e175bSOded Gabbay 	__u8 reserved[6];
559e65e175bSOded Gabbay 	char msg[LKD_FW_ASCII_MSG_MAX_LEN];
560e65e175bSOded Gabbay };
561e65e175bSOded Gabbay 
562e65e175bSOded Gabbay /* this is the main FW descriptor - consider ABI when changing */
563e65e175bSOded Gabbay struct lkd_fw_comms_desc {
564e65e175bSOded Gabbay 	struct comms_desc_header header;
565e65e175bSOded Gabbay 	struct cpu_dyn_regs cpu_dyn_regs;
566e65e175bSOded Gabbay 	char fuse_ver[VERSION_MAX_LEN];
567e65e175bSOded Gabbay 	char cur_fw_ver[VERSION_MAX_LEN];
568e65e175bSOded Gabbay 	/* can be used for 1 more version w/o ABI change */
569e65e175bSOded Gabbay 	char reserved0[VERSION_MAX_LEN];
570e65e175bSOded Gabbay 	__le64 img_addr;	/* address for next FW component load */
571e65e175bSOded Gabbay 	struct lkd_fw_binning_info binning_info;
572e65e175bSOded Gabbay 	struct lkd_fw_ascii_msg ascii_msg[LKD_FW_ASCII_MSG_MAX];
573e65e175bSOded Gabbay };
574e65e175bSOded Gabbay 
575e65e175bSOded Gabbay enum comms_reset_cause {
576e65e175bSOded Gabbay 	HL_RESET_CAUSE_UNKNOWN = 0,
577e65e175bSOded Gabbay 	HL_RESET_CAUSE_HEARTBEAT = 1,
578e65e175bSOded Gabbay 	HL_RESET_CAUSE_TDR = 2,
579e65e175bSOded Gabbay };
580e65e175bSOded Gabbay 
581e65e175bSOded Gabbay /* TODO: remove define after struct name is aligned on all projects */
582e65e175bSOded Gabbay #define lkd_msg_comms lkd_fw_comms_msg
583e65e175bSOded Gabbay 
584e65e175bSOded Gabbay /* this is the comms message descriptor */
585e65e175bSOded Gabbay struct lkd_fw_comms_msg {
586e65e175bSOded Gabbay 	struct comms_msg_header header;
587e65e175bSOded Gabbay 	/* union for future expantions of new messages */
588e65e175bSOded Gabbay 	union {
589e65e175bSOded Gabbay 		struct {
590e65e175bSOded Gabbay 			struct cpu_dyn_regs cpu_dyn_regs;
591e65e175bSOded Gabbay 			char fuse_ver[VERSION_MAX_LEN];
592e65e175bSOded Gabbay 			char cur_fw_ver[VERSION_MAX_LEN];
593e65e175bSOded Gabbay 			/* can be used for 1 more version w/o ABI change */
594e65e175bSOded Gabbay 			char reserved0[VERSION_MAX_LEN];
595e65e175bSOded Gabbay 			/* address for next FW component load */
596e65e175bSOded Gabbay 			__le64 img_addr;
597e65e175bSOded Gabbay 			struct lkd_fw_binning_info binning_info;
598e65e175bSOded Gabbay 			struct lkd_fw_ascii_msg ascii_msg[LKD_FW_ASCII_MSG_MAX];
599e65e175bSOded Gabbay 		};
600e65e175bSOded Gabbay 		struct {
601e65e175bSOded Gabbay 			__u8 reset_cause;
602e65e175bSOded Gabbay 		};
603e65e175bSOded Gabbay 		struct {
604e65e175bSOded Gabbay 			__u8 fw_cfg_skip; /* 1 - skip, 0 - don't skip */
605e65e175bSOded Gabbay 		};
606e65e175bSOded Gabbay 		struct lkd_fw_binning_info binning_conf;
607e65e175bSOded Gabbay 	};
608e65e175bSOded Gabbay };
609e65e175bSOded Gabbay 
610e65e175bSOded Gabbay /*
611e65e175bSOded Gabbay  * LKD commands:
612e65e175bSOded Gabbay  *
613e65e175bSOded Gabbay  * COMMS_NOOP			Used to clear the command register and no actual
614e65e175bSOded Gabbay  *				command is send.
615e65e175bSOded Gabbay  *
616e65e175bSOded Gabbay  * COMMS_CLR_STS		Clear status command - FW should clear the
617e65e175bSOded Gabbay  *				status register. Used for synchronization
618e65e175bSOded Gabbay  *				between the commands as part of the race free
619e65e175bSOded Gabbay  *				protocol.
620e65e175bSOded Gabbay  *
621e65e175bSOded Gabbay  * COMMS_RST_STATE		Reset the current communication state which is
622e65e175bSOded Gabbay  *				kept by FW for proper responses.
623e65e175bSOded Gabbay  *				Should be used in the beginning of the
624e65e175bSOded Gabbay  *				communication cycle to clean any leftovers from
625e65e175bSOded Gabbay  *				previous communication attempts.
626e65e175bSOded Gabbay  *
627e65e175bSOded Gabbay  * COMMS_PREP_DESC		Prepare descriptor for setting up the
628e65e175bSOded Gabbay  *				communication and other dynamic data:
629e65e175bSOded Gabbay  *				struct lkd_fw_comms_desc.
630e65e175bSOded Gabbay  *				This command has a parameter stating the next FW
631e65e175bSOded Gabbay  *				component size, so the FW can actually prepare a
632e65e175bSOded Gabbay  *				space for it and in the status response provide
633e65e175bSOded Gabbay  *				the descriptor offset. The Offset of the next FW
634e65e175bSOded Gabbay  *				data component is a part of the descriptor
635e65e175bSOded Gabbay  *				structure.
636e65e175bSOded Gabbay  *
637e65e175bSOded Gabbay  * COMMS_DATA_RDY		The FW data has been uploaded and is ready for
638e65e175bSOded Gabbay  *				validation.
639e65e175bSOded Gabbay  *
640e65e175bSOded Gabbay  * COMMS_EXEC			Execute the next FW component.
641e65e175bSOded Gabbay  *
642e65e175bSOded Gabbay  * COMMS_RST_DEV		Reset the device.
643e65e175bSOded Gabbay  *
644e65e175bSOded Gabbay  * COMMS_GOTO_WFE		Execute WFE command. Allowed only on non-secure
645e65e175bSOded Gabbay  *				devices.
646e65e175bSOded Gabbay  *
647e65e175bSOded Gabbay  * COMMS_SKIP_BMC		Perform actions required for BMC-less servers.
648e65e175bSOded Gabbay  *				Do not wait for BMC response.
649e65e175bSOded Gabbay  *
650e65e175bSOded Gabbay  * COMMS_PREP_DESC_ELBI		Same as COMMS_PREP_DESC only that the memory
651e65e175bSOded Gabbay  *				space is allocated in a ELBI access only
652e65e175bSOded Gabbay  *				address range.
653e65e175bSOded Gabbay  *
654e65e175bSOded Gabbay  */
655e65e175bSOded Gabbay enum comms_cmd {
656e65e175bSOded Gabbay 	COMMS_NOOP = 0,
657e65e175bSOded Gabbay 	COMMS_CLR_STS = 1,
658e65e175bSOded Gabbay 	COMMS_RST_STATE = 2,
659e65e175bSOded Gabbay 	COMMS_PREP_DESC = 3,
660e65e175bSOded Gabbay 	COMMS_DATA_RDY = 4,
661e65e175bSOded Gabbay 	COMMS_EXEC = 5,
662e65e175bSOded Gabbay 	COMMS_RST_DEV = 6,
663e65e175bSOded Gabbay 	COMMS_GOTO_WFE = 7,
664e65e175bSOded Gabbay 	COMMS_SKIP_BMC = 8,
665e65e175bSOded Gabbay 	COMMS_PREP_DESC_ELBI = 10,
666e65e175bSOded Gabbay 	COMMS_INVLD_LAST
667e65e175bSOded Gabbay };
668e65e175bSOded Gabbay 
669e65e175bSOded Gabbay #define COMMS_COMMAND_SIZE_SHIFT	0
670e65e175bSOded Gabbay #define COMMS_COMMAND_SIZE_MASK		0x1FFFFFF
671e65e175bSOded Gabbay #define COMMS_COMMAND_CMD_SHIFT		27
672e65e175bSOded Gabbay #define COMMS_COMMAND_CMD_MASK		0xF8000000
673e65e175bSOded Gabbay 
674e65e175bSOded Gabbay /*
675e65e175bSOded Gabbay  * LKD command to FW register structure
676e65e175bSOded Gabbay  * @size	- FW component size
677e65e175bSOded Gabbay  * @cmd		- command from enum comms_cmd
678e65e175bSOded Gabbay  */
679e65e175bSOded Gabbay struct comms_command {
680e65e175bSOded Gabbay 	union {		/* bit fields are only for FW use */
681e65e175bSOded Gabbay 		struct {
682e65e175bSOded Gabbay 			u32 size :25;		/* 32MB max. */
683e65e175bSOded Gabbay 			u32 reserved :2;
684e65e175bSOded Gabbay 			enum comms_cmd cmd :5;		/* 32 commands */
685e65e175bSOded Gabbay 		};
686e65e175bSOded Gabbay 		__le32 val;
687e65e175bSOded Gabbay 	};
688e65e175bSOded Gabbay };
689e65e175bSOded Gabbay 
690e65e175bSOded Gabbay /*
691e65e175bSOded Gabbay  * FW status
692e65e175bSOded Gabbay  *
693e65e175bSOded Gabbay  * COMMS_STS_NOOP		Used to clear the status register and no actual
694e65e175bSOded Gabbay  *				status is provided.
695e65e175bSOded Gabbay  *
696e65e175bSOded Gabbay  * COMMS_STS_ACK		Command has been received and recognized.
697e65e175bSOded Gabbay  *
698e65e175bSOded Gabbay  * COMMS_STS_OK			Command execution has finished successfully.
699e65e175bSOded Gabbay  *
700e65e175bSOded Gabbay  * COMMS_STS_ERR		Command execution was unsuccessful and resulted
701e65e175bSOded Gabbay  *				in error.
702e65e175bSOded Gabbay  *
703e65e175bSOded Gabbay  * COMMS_STS_VALID_ERR		FW validation has failed.
704e65e175bSOded Gabbay  *
705e65e175bSOded Gabbay  * COMMS_STS_TIMEOUT_ERR	Command execution has timed out.
706e65e175bSOded Gabbay  */
707e65e175bSOded Gabbay enum comms_sts {
708e65e175bSOded Gabbay 	COMMS_STS_NOOP = 0,
709e65e175bSOded Gabbay 	COMMS_STS_ACK = 1,
710e65e175bSOded Gabbay 	COMMS_STS_OK = 2,
711e65e175bSOded Gabbay 	COMMS_STS_ERR = 3,
712e65e175bSOded Gabbay 	COMMS_STS_VALID_ERR = 4,
713e65e175bSOded Gabbay 	COMMS_STS_TIMEOUT_ERR = 5,
714e65e175bSOded Gabbay 	COMMS_STS_INVLD_LAST
715e65e175bSOded Gabbay };
716e65e175bSOded Gabbay 
717e65e175bSOded Gabbay /* RAM types for FW components loading - defines the base address */
718e65e175bSOded Gabbay enum comms_ram_types {
719e65e175bSOded Gabbay 	COMMS_SRAM = 0,
720e65e175bSOded Gabbay 	COMMS_DRAM = 1,
721e65e175bSOded Gabbay };
722e65e175bSOded Gabbay 
723e65e175bSOded Gabbay #define COMMS_STATUS_OFFSET_SHIFT	0
724e65e175bSOded Gabbay #define COMMS_STATUS_OFFSET_MASK	0x03FFFFFF
725e65e175bSOded Gabbay #define COMMS_STATUS_OFFSET_ALIGN_SHIFT	2
726e65e175bSOded Gabbay #define COMMS_STATUS_RAM_TYPE_SHIFT	26
727e65e175bSOded Gabbay #define COMMS_STATUS_RAM_TYPE_MASK	0x0C000000
728e65e175bSOded Gabbay #define COMMS_STATUS_STATUS_SHIFT	28
729e65e175bSOded Gabbay #define COMMS_STATUS_STATUS_MASK	0xF0000000
730e65e175bSOded Gabbay 
731e65e175bSOded Gabbay /*
732e65e175bSOded Gabbay  * FW status to LKD register structure
733e65e175bSOded Gabbay  * @offset	- an offset from the base of the ram_type shifted right by
734e65e175bSOded Gabbay  *		  2 bits (always aligned to 32 bits).
735e65e175bSOded Gabbay  *		  Allows a maximum addressable offset of 256MB from RAM base.
736e65e175bSOded Gabbay  *		  Example: for real offset in RAM of 0x800000 (8MB), the value
737e65e175bSOded Gabbay  *		  in offset field is (0x800000 >> 2) = 0x200000.
738e65e175bSOded Gabbay  * @ram_type	- the RAM type that should be used for offset from
739e65e175bSOded Gabbay  *		  enum comms_ram_types
740e65e175bSOded Gabbay  * @status	- status from enum comms_sts
741e65e175bSOded Gabbay  */
742e65e175bSOded Gabbay struct comms_status {
743e65e175bSOded Gabbay 	union {		/* bit fields are only for FW use */
744e65e175bSOded Gabbay 		struct {
745e65e175bSOded Gabbay 			u32 offset :26;
746e65e175bSOded Gabbay 			enum comms_ram_types ram_type :2;
747139dad04SOded Gabbay 			enum comms_sts status :4;	/* 16 statuses */
748139dad04SOded Gabbay 		};
749139dad04SOded Gabbay 		__le32 val;
750139dad04SOded Gabbay 	};
751139dad04SOded Gabbay };
752139dad04SOded Gabbay 
753139dad04SOded Gabbay #define NAME_MAX_LEN	32 /* bytes */
754139dad04SOded Gabbay struct hl_module_data {
755139dad04SOded Gabbay 	__u8 name[NAME_MAX_LEN];
756139dad04SOded Gabbay 	__u8 version[VERSION_MAX_LEN];
757139dad04SOded Gabbay };
758139dad04SOded Gabbay 
759139dad04SOded Gabbay /**
760139dad04SOded Gabbay  * struct hl_component_versions - versions associated with hl component.
761139dad04SOded Gabbay  * @struct_size: size of all the struct (including dynamic size of modules).
762139dad04SOded Gabbay  * @modules_offset: offset of the modules field in this struct.
763139dad04SOded Gabbay  * @component: version of the component itself.
764139dad04SOded Gabbay  * @fw_os: Firmware OS Version.
765139dad04SOded Gabbay  * @comp_name: Name of the component.
766139dad04SOded Gabbay  * @modules_counter: number of set bits in modules_mask.
767139dad04SOded Gabbay  * @reserved: reserved for future use.
768139dad04SOded Gabbay  * @modules: versions of the component's modules. Elborated explanation in
769139dad04SOded Gabbay  *              struct cpucp_versions.
770139dad04SOded Gabbay  */
771139dad04SOded Gabbay struct hl_component_versions {
772139dad04SOded Gabbay 	__le16 struct_size;
773*336b78c6SOded Gabbay 	__le16 modules_offset;
774139dad04SOded Gabbay 	__u8 component[VERSION_MAX_LEN];
775139dad04SOded Gabbay 	__u8 fw_os[VERSION_MAX_LEN];
776139dad04SOded Gabbay 	__u8 comp_name[NAME_MAX_LEN];
777*336b78c6SOded Gabbay 	__u8 modules_counter;
778*336b78c6SOded Gabbay 	__u8 reserved[3];
779*336b78c6SOded Gabbay 	struct hl_module_data modules[];
780*336b78c6SOded Gabbay };
781*336b78c6SOded Gabbay 
782*336b78c6SOded Gabbay /* Max size of fit size */
783139dad04SOded Gabbay #define HL_FW_VERSIONS_FIT_SIZE	4096
784139dad04SOded Gabbay 
785139dad04SOded Gabbay #endif /* HL_BOOT_IF_H */
786139dad04SOded Gabbay