xref: /freebsd/sys/dev/qat/qat_common/adf_gen4_hw_data.c (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
1a977168cSMichal Gulbicki /* SPDX-License-Identifier: BSD-3-Clause */
2a977168cSMichal Gulbicki /* Copyright(c) 2021 Intel Corporation */
3a977168cSMichal Gulbicki #include "adf_accel_devices.h"
4*266b0663SKrzysztof Zdziarski #include "adf_common_drv.h"
5a977168cSMichal Gulbicki #include "adf_gen4_hw_data.h"
6a977168cSMichal Gulbicki 
7*266b0663SKrzysztof Zdziarski #define ADF_RPRESET_TIMEOUT_MS 5000
8*266b0663SKrzysztof Zdziarski #define ADF_RPRESET_POLLING_INTERVAL 20
9*266b0663SKrzysztof Zdziarski 
10a977168cSMichal Gulbicki static u64
build_csr_ring_base_addr(bus_addr_t addr,u32 size)11a977168cSMichal Gulbicki build_csr_ring_base_addr(bus_addr_t addr, u32 size)
12a977168cSMichal Gulbicki {
13a977168cSMichal Gulbicki 	return BUILD_RING_BASE_ADDR(addr, size);
14a977168cSMichal Gulbicki }
15a977168cSMichal Gulbicki 
16a977168cSMichal Gulbicki static u32
read_csr_ring_head(struct resource * csr_base_addr,u32 bank,u32 ring)17a977168cSMichal Gulbicki read_csr_ring_head(struct resource *csr_base_addr, u32 bank, u32 ring)
18a977168cSMichal Gulbicki {
19a977168cSMichal Gulbicki 	return READ_CSR_RING_HEAD(csr_base_addr, bank, ring);
20a977168cSMichal Gulbicki }
21a977168cSMichal Gulbicki 
22a977168cSMichal Gulbicki static void
write_csr_ring_head(struct resource * csr_base_addr,u32 bank,u32 ring,u32 value)23a977168cSMichal Gulbicki write_csr_ring_head(struct resource *csr_base_addr,
24a977168cSMichal Gulbicki 		    u32 bank,
25a977168cSMichal Gulbicki 		    u32 ring,
26a977168cSMichal Gulbicki 		    u32 value)
27a977168cSMichal Gulbicki {
28a977168cSMichal Gulbicki 	WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value);
29a977168cSMichal Gulbicki }
30a977168cSMichal Gulbicki 
31a977168cSMichal Gulbicki static u32
read_csr_ring_tail(struct resource * csr_base_addr,u32 bank,u32 ring)32a977168cSMichal Gulbicki read_csr_ring_tail(struct resource *csr_base_addr, u32 bank, u32 ring)
33a977168cSMichal Gulbicki {
34a977168cSMichal Gulbicki 	return READ_CSR_RING_TAIL(csr_base_addr, bank, ring);
35a977168cSMichal Gulbicki }
36a977168cSMichal Gulbicki 
37a977168cSMichal Gulbicki static void
write_csr_ring_tail(struct resource * csr_base_addr,u32 bank,u32 ring,u32 value)38a977168cSMichal Gulbicki write_csr_ring_tail(struct resource *csr_base_addr,
39a977168cSMichal Gulbicki 		    u32 bank,
40a977168cSMichal Gulbicki 		    u32 ring,
41a977168cSMichal Gulbicki 		    u32 value)
42a977168cSMichal Gulbicki {
43a977168cSMichal Gulbicki 	WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value);
44a977168cSMichal Gulbicki }
45a977168cSMichal Gulbicki 
46a977168cSMichal Gulbicki static u32
read_csr_e_stat(struct resource * csr_base_addr,u32 bank)47a977168cSMichal Gulbicki read_csr_e_stat(struct resource *csr_base_addr, u32 bank)
48a977168cSMichal Gulbicki {
49a977168cSMichal Gulbicki 	return READ_CSR_E_STAT(csr_base_addr, bank);
50a977168cSMichal Gulbicki }
51a977168cSMichal Gulbicki 
52a977168cSMichal Gulbicki static void
write_csr_ring_config(struct resource * csr_base_addr,u32 bank,u32 ring,u32 value)53a977168cSMichal Gulbicki write_csr_ring_config(struct resource *csr_base_addr,
54a977168cSMichal Gulbicki 		      u32 bank,
55a977168cSMichal Gulbicki 		      u32 ring,
56a977168cSMichal Gulbicki 		      u32 value)
57a977168cSMichal Gulbicki {
58a977168cSMichal Gulbicki 	WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value);
59a977168cSMichal Gulbicki }
60a977168cSMichal Gulbicki 
61*266b0663SKrzysztof Zdziarski static bus_addr_t
read_csr_ring_base(struct resource * csr_base_addr,u32 bank,u32 ring)62*266b0663SKrzysztof Zdziarski read_csr_ring_base(struct resource *csr_base_addr, u32 bank, u32 ring)
63*266b0663SKrzysztof Zdziarski {
64*266b0663SKrzysztof Zdziarski 	return READ_CSR_RING_BASE(csr_base_addr, bank, ring);
65*266b0663SKrzysztof Zdziarski }
66*266b0663SKrzysztof Zdziarski 
67a977168cSMichal Gulbicki static void
write_csr_ring_base(struct resource * csr_base_addr,u32 bank,u32 ring,bus_addr_t addr)68a977168cSMichal Gulbicki write_csr_ring_base(struct resource *csr_base_addr,
69a977168cSMichal Gulbicki 		    u32 bank,
70a977168cSMichal Gulbicki 		    u32 ring,
71a977168cSMichal Gulbicki 		    bus_addr_t addr)
72a977168cSMichal Gulbicki {
73a977168cSMichal Gulbicki 	WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, addr);
74a977168cSMichal Gulbicki }
75a977168cSMichal Gulbicki 
76a977168cSMichal Gulbicki static void
write_csr_int_flag(struct resource * csr_base_addr,u32 bank,u32 value)77a977168cSMichal Gulbicki write_csr_int_flag(struct resource *csr_base_addr, u32 bank, u32 value)
78a977168cSMichal Gulbicki {
79a977168cSMichal Gulbicki 	WRITE_CSR_INT_FLAG(csr_base_addr, bank, value);
80a977168cSMichal Gulbicki }
81a977168cSMichal Gulbicki 
82a977168cSMichal Gulbicki static void
write_csr_int_srcsel(struct resource * csr_base_addr,u32 bank)83a977168cSMichal Gulbicki write_csr_int_srcsel(struct resource *csr_base_addr, u32 bank)
84a977168cSMichal Gulbicki {
85a977168cSMichal Gulbicki 	WRITE_CSR_INT_SRCSEL(csr_base_addr, bank);
86a977168cSMichal Gulbicki }
87a977168cSMichal Gulbicki 
88a977168cSMichal Gulbicki static void
write_csr_int_col_en(struct resource * csr_base_addr,u32 bank,u32 value)89a977168cSMichal Gulbicki write_csr_int_col_en(struct resource *csr_base_addr, u32 bank, u32 value)
90a977168cSMichal Gulbicki {
91a977168cSMichal Gulbicki 	WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value);
92a977168cSMichal Gulbicki }
93a977168cSMichal Gulbicki 
94a977168cSMichal Gulbicki static void
write_csr_int_col_ctl(struct resource * csr_base_addr,u32 bank,u32 value)95a977168cSMichal Gulbicki write_csr_int_col_ctl(struct resource *csr_base_addr, u32 bank, u32 value)
96a977168cSMichal Gulbicki {
97a977168cSMichal Gulbicki 	WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value);
98a977168cSMichal Gulbicki }
99a977168cSMichal Gulbicki 
100a977168cSMichal Gulbicki static void
write_csr_int_flag_and_col(struct resource * csr_base_addr,u32 bank,u32 value)101a977168cSMichal Gulbicki write_csr_int_flag_and_col(struct resource *csr_base_addr, u32 bank, u32 value)
102a977168cSMichal Gulbicki {
103a977168cSMichal Gulbicki 	WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value);
104a977168cSMichal Gulbicki }
105a977168cSMichal Gulbicki 
106a977168cSMichal Gulbicki static u32
read_csr_ring_srv_arb_en(struct resource * csr_base_addr,u32 bank)107a977168cSMichal Gulbicki read_csr_ring_srv_arb_en(struct resource *csr_base_addr, u32 bank)
108a977168cSMichal Gulbicki {
109a977168cSMichal Gulbicki 	return READ_CSR_RING_SRV_ARB_EN(csr_base_addr, bank);
110a977168cSMichal Gulbicki }
111a977168cSMichal Gulbicki 
112a977168cSMichal Gulbicki static void
write_csr_ring_srv_arb_en(struct resource * csr_base_addr,u32 bank,u32 value)113a977168cSMichal Gulbicki write_csr_ring_srv_arb_en(struct resource *csr_base_addr, u32 bank, u32 value)
114a977168cSMichal Gulbicki {
115a977168cSMichal Gulbicki 	WRITE_CSR_RING_SRV_ARB_EN(csr_base_addr, bank, value);
116a977168cSMichal Gulbicki }
117a977168cSMichal Gulbicki 
118*266b0663SKrzysztof Zdziarski static u32
get_int_col_ctl_enable_mask(void)119*266b0663SKrzysztof Zdziarski get_int_col_ctl_enable_mask(void)
120*266b0663SKrzysztof Zdziarski {
121*266b0663SKrzysztof Zdziarski 	return ADF_RING_CSR_INT_COL_CTL_ENABLE;
122*266b0663SKrzysztof Zdziarski }
123*266b0663SKrzysztof Zdziarski 
124a977168cSMichal Gulbicki void
adf_gen4_init_hw_csr_info(struct adf_hw_csr_info * csr_info)125a977168cSMichal Gulbicki adf_gen4_init_hw_csr_info(struct adf_hw_csr_info *csr_info)
126a977168cSMichal Gulbicki {
127a977168cSMichal Gulbicki 	struct adf_hw_csr_ops *csr_ops = &csr_info->csr_ops;
128a977168cSMichal Gulbicki 
129a977168cSMichal Gulbicki 	csr_info->arb_enable_mask = 0x1;
130a977168cSMichal Gulbicki 
131*266b0663SKrzysztof Zdziarski 	csr_info->csr_addr_offset = ADF_RING_CSR_ADDR_OFFSET;
132*266b0663SKrzysztof Zdziarski 	csr_info->ring_bundle_size = ADF_RING_BUNDLE_SIZE;
133*266b0663SKrzysztof Zdziarski 
134a977168cSMichal Gulbicki 	csr_ops->build_csr_ring_base_addr = build_csr_ring_base_addr;
135a977168cSMichal Gulbicki 	csr_ops->read_csr_ring_head = read_csr_ring_head;
136a977168cSMichal Gulbicki 	csr_ops->write_csr_ring_head = write_csr_ring_head;
137a977168cSMichal Gulbicki 	csr_ops->read_csr_ring_tail = read_csr_ring_tail;
138a977168cSMichal Gulbicki 	csr_ops->write_csr_ring_tail = write_csr_ring_tail;
139a977168cSMichal Gulbicki 	csr_ops->read_csr_e_stat = read_csr_e_stat;
140a977168cSMichal Gulbicki 	csr_ops->write_csr_ring_config = write_csr_ring_config;
141*266b0663SKrzysztof Zdziarski 	csr_ops->read_csr_ring_base = read_csr_ring_base;
142a977168cSMichal Gulbicki 	csr_ops->write_csr_ring_base = write_csr_ring_base;
143a977168cSMichal Gulbicki 	csr_ops->write_csr_int_flag = write_csr_int_flag;
144a977168cSMichal Gulbicki 	csr_ops->write_csr_int_srcsel = write_csr_int_srcsel;
145a977168cSMichal Gulbicki 	csr_ops->write_csr_int_col_en = write_csr_int_col_en;
146a977168cSMichal Gulbicki 	csr_ops->write_csr_int_col_ctl = write_csr_int_col_ctl;
147a977168cSMichal Gulbicki 	csr_ops->write_csr_int_flag_and_col = write_csr_int_flag_and_col;
148a977168cSMichal Gulbicki 	csr_ops->read_csr_ring_srv_arb_en = read_csr_ring_srv_arb_en;
149a977168cSMichal Gulbicki 	csr_ops->write_csr_ring_srv_arb_en = write_csr_ring_srv_arb_en;
150*266b0663SKrzysztof Zdziarski 	csr_ops->get_int_col_ctl_enable_mask = get_int_col_ctl_enable_mask;
151a977168cSMichal Gulbicki }
152*266b0663SKrzysztof Zdziarski 
153*266b0663SKrzysztof Zdziarski static int
reset_ring_pair(struct resource * csr,u32 bank_number)154*266b0663SKrzysztof Zdziarski reset_ring_pair(struct resource *csr, u32 bank_number)
155*266b0663SKrzysztof Zdziarski {
156*266b0663SKrzysztof Zdziarski 	int reset_timeout = ADF_RPRESET_TIMEOUT_MS;
157*266b0663SKrzysztof Zdziarski 	const int timeout_step = ADF_RPRESET_POLLING_INTERVAL;
158*266b0663SKrzysztof Zdziarski 	u32 val;
159*266b0663SKrzysztof Zdziarski 
160*266b0663SKrzysztof Zdziarski 	/* Write rpresetctl register bit#0 as 1
161*266b0663SKrzysztof Zdziarski 	 * As rpresetctl registers have no RW bits, no need to preserve
162*266b0663SKrzysztof Zdziarski 	 * values for other bits, just write bit#0
163*266b0663SKrzysztof Zdziarski 	 * NOTE: bit#12-bit#31 are WO, the write operation only takes
164*266b0663SKrzysztof Zdziarski 	 * effect when bit#1 is written 1 for pasid level reset
165*266b0663SKrzysztof Zdziarski 	 */
166*266b0663SKrzysztof Zdziarski 	ADF_CSR_WR(csr,
167*266b0663SKrzysztof Zdziarski 		   ADF_WQM_CSR_RPRESETCTL(bank_number),
168*266b0663SKrzysztof Zdziarski 		   BIT(ADF_WQM_CSR_RPRESETCTL_SHIFT));
169*266b0663SKrzysztof Zdziarski 
170*266b0663SKrzysztof Zdziarski 	/* Read rpresetsts register to wait for rp reset complete */
171*266b0663SKrzysztof Zdziarski 	while (reset_timeout > 0) {
172*266b0663SKrzysztof Zdziarski 		val = ADF_CSR_RD(csr, ADF_WQM_CSR_RPRESETSTS(bank_number));
173*266b0663SKrzysztof Zdziarski 		if (val & ADF_WQM_CSR_RPRESETSTS_MASK)
174*266b0663SKrzysztof Zdziarski 			break;
175*266b0663SKrzysztof Zdziarski 		pause_ms("adfstop", timeout_step);
176*266b0663SKrzysztof Zdziarski 		reset_timeout -= timeout_step;
177*266b0663SKrzysztof Zdziarski 	}
178*266b0663SKrzysztof Zdziarski 	if (reset_timeout <= 0)
179*266b0663SKrzysztof Zdziarski 		return EFAULT;
180*266b0663SKrzysztof Zdziarski 
181*266b0663SKrzysztof Zdziarski 	/* When rp reset is done, clear rpresetsts bit0 */
182*266b0663SKrzysztof Zdziarski 	ADF_CSR_WR(csr,
183*266b0663SKrzysztof Zdziarski 		   ADF_WQM_CSR_RPRESETSTS(bank_number),
184*266b0663SKrzysztof Zdziarski 		   BIT(ADF_WQM_CSR_RPRESETSTS_SHIFT));
185*266b0663SKrzysztof Zdziarski 	return 0;
186*266b0663SKrzysztof Zdziarski }
187*266b0663SKrzysztof Zdziarski 
188*266b0663SKrzysztof Zdziarski int
adf_gen4_ring_pair_reset(struct adf_accel_dev * accel_dev,u32 bank_number)189*266b0663SKrzysztof Zdziarski adf_gen4_ring_pair_reset(struct adf_accel_dev *accel_dev, u32 bank_number)
190*266b0663SKrzysztof Zdziarski {
191*266b0663SKrzysztof Zdziarski 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
192*266b0663SKrzysztof Zdziarski 	u32 etr_bar_id = hw_data->get_etr_bar_id(hw_data);
193*266b0663SKrzysztof Zdziarski 	struct resource *csr;
194*266b0663SKrzysztof Zdziarski 	int ret;
195*266b0663SKrzysztof Zdziarski 
196*266b0663SKrzysztof Zdziarski 	if (bank_number >= hw_data->num_banks)
197*266b0663SKrzysztof Zdziarski 		return -EINVAL;
198*266b0663SKrzysztof Zdziarski 
199*266b0663SKrzysztof Zdziarski 	csr = (&GET_BARS(accel_dev)[etr_bar_id])->virt_addr;
200*266b0663SKrzysztof Zdziarski 
201*266b0663SKrzysztof Zdziarski 	ret = reset_ring_pair(csr, bank_number);
202*266b0663SKrzysztof Zdziarski 	if (ret)
203*266b0663SKrzysztof Zdziarski 		device_printf(GET_DEV(accel_dev),
204*266b0663SKrzysztof Zdziarski 			      "ring pair reset failure (timeout)\n");
205*266b0663SKrzysztof Zdziarski 
206*266b0663SKrzysztof Zdziarski 	return ret;
207*266b0663SKrzysztof Zdziarski }
208a977168cSMichal Gulbicki 
209a977168cSMichal Gulbicki static inline void
adf_gen4_unpack_ssm_wdtimer(u64 value,u32 * upper,u32 * lower)210a977168cSMichal Gulbicki adf_gen4_unpack_ssm_wdtimer(u64 value, u32 *upper, u32 *lower)
211a977168cSMichal Gulbicki {
212a977168cSMichal Gulbicki 	*lower = lower_32_bits(value);
213a977168cSMichal Gulbicki 	*upper = upper_32_bits(value);
214a977168cSMichal Gulbicki }
215a977168cSMichal Gulbicki 
216a977168cSMichal Gulbicki int
adf_gen4_set_ssm_wdtimer(struct adf_accel_dev * accel_dev)217a977168cSMichal Gulbicki adf_gen4_set_ssm_wdtimer(struct adf_accel_dev *accel_dev)
218a977168cSMichal Gulbicki {
219a977168cSMichal Gulbicki 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
220a977168cSMichal Gulbicki 	u64 timer_val_pke = ADF_SSM_WDT_PKE_DEFAULT_VALUE;
221a977168cSMichal Gulbicki 	u64 timer_val = ADF_SSM_WDT_DEFAULT_VALUE;
222a977168cSMichal Gulbicki 	u32 ssm_wdt_pke_high = 0;
223a977168cSMichal Gulbicki 	u32 ssm_wdt_pke_low = 0;
224a977168cSMichal Gulbicki 	u32 ssm_wdt_high = 0;
225a977168cSMichal Gulbicki 	u32 ssm_wdt_low = 0;
226a977168cSMichal Gulbicki 	struct resource *pmisc_addr;
227a977168cSMichal Gulbicki 	struct adf_bar *pmisc;
228a977168cSMichal Gulbicki 	int pmisc_id;
229a977168cSMichal Gulbicki 
230a977168cSMichal Gulbicki 	pmisc_id = hw_data->get_misc_bar_id(hw_data);
231a977168cSMichal Gulbicki 	pmisc = &GET_BARS(accel_dev)[pmisc_id];
232a977168cSMichal Gulbicki 	pmisc_addr = pmisc->virt_addr;
233a977168cSMichal Gulbicki 
234a977168cSMichal Gulbicki 	/* Convert 64bit WDT timer value into 32bit values for
235a977168cSMichal Gulbicki 	 * mmio write to 32bit CSRs.
236a977168cSMichal Gulbicki 	 */
237a977168cSMichal Gulbicki 	adf_gen4_unpack_ssm_wdtimer(timer_val, &ssm_wdt_high, &ssm_wdt_low);
238a977168cSMichal Gulbicki 	adf_gen4_unpack_ssm_wdtimer(timer_val_pke,
239a977168cSMichal Gulbicki 				    &ssm_wdt_pke_high,
240a977168cSMichal Gulbicki 				    &ssm_wdt_pke_low);
241a977168cSMichal Gulbicki 
242a977168cSMichal Gulbicki 	/* Enable WDT for sym and dc */
243a977168cSMichal Gulbicki 	ADF_CSR_WR(pmisc_addr, ADF_SSMWDTL_OFFSET, ssm_wdt_low);
244a977168cSMichal Gulbicki 	ADF_CSR_WR(pmisc_addr, ADF_SSMWDTH_OFFSET, ssm_wdt_high);
245a977168cSMichal Gulbicki 	/* Enable WDT for pke */
246a977168cSMichal Gulbicki 	ADF_CSR_WR(pmisc_addr, ADF_SSMWDTPKEL_OFFSET, ssm_wdt_pke_low);
247a977168cSMichal Gulbicki 	ADF_CSR_WR(pmisc_addr, ADF_SSMWDTPKEH_OFFSET, ssm_wdt_pke_high);
248a977168cSMichal Gulbicki 
249a977168cSMichal Gulbicki 	return 0;
250a977168cSMichal Gulbicki }
251*266b0663SKrzysztof Zdziarski 
252*266b0663SKrzysztof Zdziarski int
adf_pfvf_comms_disabled(struct adf_accel_dev * accel_dev)253*266b0663SKrzysztof Zdziarski adf_pfvf_comms_disabled(struct adf_accel_dev *accel_dev)
254*266b0663SKrzysztof Zdziarski {
255*266b0663SKrzysztof Zdziarski 	return 0;
256*266b0663SKrzysztof Zdziarski }
257