1*a4b16dadSTom Zanussi // SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
2*a4b16dadSTom Zanussi /* Copyright(c) 2020 Intel Corporation */
3*a4b16dadSTom Zanussi #include <linux/iopoll.h>
4*a4b16dadSTom Zanussi #include "adf_accel_devices.h"
5*a4b16dadSTom Zanussi #include "adf_common_drv.h"
6*a4b16dadSTom Zanussi #include "adf_gen4_hw_data.h"
7*a4b16dadSTom Zanussi 
build_csr_ring_base_addr(dma_addr_t addr,u32 size)8*a4b16dadSTom Zanussi static u64 build_csr_ring_base_addr(dma_addr_t addr, u32 size)
9*a4b16dadSTom Zanussi {
10*a4b16dadSTom Zanussi 	return BUILD_RING_BASE_ADDR(addr, size);
11*a4b16dadSTom Zanussi }
12*a4b16dadSTom Zanussi 
read_csr_ring_head(void __iomem * csr_base_addr,u32 bank,u32 ring)13*a4b16dadSTom Zanussi static u32 read_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring)
14*a4b16dadSTom Zanussi {
15*a4b16dadSTom Zanussi 	return READ_CSR_RING_HEAD(csr_base_addr, bank, ring);
16*a4b16dadSTom Zanussi }
17*a4b16dadSTom Zanussi 
write_csr_ring_head(void __iomem * csr_base_addr,u32 bank,u32 ring,u32 value)18*a4b16dadSTom Zanussi static void write_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring,
19*a4b16dadSTom Zanussi 				u32 value)
20*a4b16dadSTom Zanussi {
21*a4b16dadSTom Zanussi 	WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value);
22*a4b16dadSTom Zanussi }
23*a4b16dadSTom Zanussi 
read_csr_ring_tail(void __iomem * csr_base_addr,u32 bank,u32 ring)24*a4b16dadSTom Zanussi static u32 read_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring)
25*a4b16dadSTom Zanussi {
26*a4b16dadSTom Zanussi 	return READ_CSR_RING_TAIL(csr_base_addr, bank, ring);
27*a4b16dadSTom Zanussi }
28*a4b16dadSTom Zanussi 
write_csr_ring_tail(void __iomem * csr_base_addr,u32 bank,u32 ring,u32 value)29*a4b16dadSTom Zanussi static void write_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring,
30*a4b16dadSTom Zanussi 				u32 value)
31*a4b16dadSTom Zanussi {
32*a4b16dadSTom Zanussi 	WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value);
33*a4b16dadSTom Zanussi }
34*a4b16dadSTom Zanussi 
read_csr_e_stat(void __iomem * csr_base_addr,u32 bank)35*a4b16dadSTom Zanussi static u32 read_csr_e_stat(void __iomem *csr_base_addr, u32 bank)
36*a4b16dadSTom Zanussi {
37*a4b16dadSTom Zanussi 	return READ_CSR_E_STAT(csr_base_addr, bank);
38*a4b16dadSTom Zanussi }
39*a4b16dadSTom Zanussi 
write_csr_ring_config(void __iomem * csr_base_addr,u32 bank,u32 ring,u32 value)40*a4b16dadSTom Zanussi static void write_csr_ring_config(void __iomem *csr_base_addr, u32 bank, u32 ring,
41*a4b16dadSTom Zanussi 				  u32 value)
42*a4b16dadSTom Zanussi {
43*a4b16dadSTom Zanussi 	WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value);
44*a4b16dadSTom Zanussi }
45*a4b16dadSTom Zanussi 
write_csr_ring_base(void __iomem * csr_base_addr,u32 bank,u32 ring,dma_addr_t addr)46*a4b16dadSTom Zanussi static void write_csr_ring_base(void __iomem *csr_base_addr, u32 bank, u32 ring,
47*a4b16dadSTom Zanussi 				dma_addr_t addr)
48*a4b16dadSTom Zanussi {
49*a4b16dadSTom Zanussi 	WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, addr);
50*a4b16dadSTom Zanussi }
51*a4b16dadSTom Zanussi 
write_csr_int_flag(void __iomem * csr_base_addr,u32 bank,u32 value)52*a4b16dadSTom Zanussi static void write_csr_int_flag(void __iomem *csr_base_addr, u32 bank,
53*a4b16dadSTom Zanussi 			       u32 value)
54*a4b16dadSTom Zanussi {
55*a4b16dadSTom Zanussi 	WRITE_CSR_INT_FLAG(csr_base_addr, bank, value);
56*a4b16dadSTom Zanussi }
57*a4b16dadSTom Zanussi 
write_csr_int_srcsel(void __iomem * csr_base_addr,u32 bank)58*a4b16dadSTom Zanussi static void write_csr_int_srcsel(void __iomem *csr_base_addr, u32 bank)
59*a4b16dadSTom Zanussi {
60*a4b16dadSTom Zanussi 	WRITE_CSR_INT_SRCSEL(csr_base_addr, bank);
61*a4b16dadSTom Zanussi }
62*a4b16dadSTom Zanussi 
write_csr_int_col_en(void __iomem * csr_base_addr,u32 bank,u32 value)63*a4b16dadSTom Zanussi static void write_csr_int_col_en(void __iomem *csr_base_addr, u32 bank, u32 value)
64*a4b16dadSTom Zanussi {
65*a4b16dadSTom Zanussi 	WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value);
66*a4b16dadSTom Zanussi }
67*a4b16dadSTom Zanussi 
write_csr_int_col_ctl(void __iomem * csr_base_addr,u32 bank,u32 value)68*a4b16dadSTom Zanussi static void write_csr_int_col_ctl(void __iomem *csr_base_addr, u32 bank,
69*a4b16dadSTom Zanussi 				  u32 value)
70*a4b16dadSTom Zanussi {
71*a4b16dadSTom Zanussi 	WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value);
72*a4b16dadSTom Zanussi }
73*a4b16dadSTom Zanussi 
write_csr_int_flag_and_col(void __iomem * csr_base_addr,u32 bank,u32 value)74*a4b16dadSTom Zanussi static void write_csr_int_flag_and_col(void __iomem *csr_base_addr, u32 bank,
75*a4b16dadSTom Zanussi 				       u32 value)
76*a4b16dadSTom Zanussi {
77*a4b16dadSTom Zanussi 	WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value);
78*a4b16dadSTom Zanussi }
79*a4b16dadSTom Zanussi 
write_csr_ring_srv_arb_en(void __iomem * csr_base_addr,u32 bank,u32 value)80*a4b16dadSTom Zanussi static void write_csr_ring_srv_arb_en(void __iomem *csr_base_addr, u32 bank,
81*a4b16dadSTom Zanussi 				      u32 value)
82*a4b16dadSTom Zanussi {
83*a4b16dadSTom Zanussi 	WRITE_CSR_RING_SRV_ARB_EN(csr_base_addr, bank, value);
84*a4b16dadSTom Zanussi }
85*a4b16dadSTom Zanussi 
adf_gen4_init_hw_csr_ops(struct adf_hw_csr_ops * csr_ops)86*a4b16dadSTom Zanussi void adf_gen4_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops)
87*a4b16dadSTom Zanussi {
88*a4b16dadSTom Zanussi 	csr_ops->build_csr_ring_base_addr = build_csr_ring_base_addr;
89*a4b16dadSTom Zanussi 	csr_ops->read_csr_ring_head = read_csr_ring_head;
90*a4b16dadSTom Zanussi 	csr_ops->write_csr_ring_head = write_csr_ring_head;
91*a4b16dadSTom Zanussi 	csr_ops->read_csr_ring_tail = read_csr_ring_tail;
92*a4b16dadSTom Zanussi 	csr_ops->write_csr_ring_tail = write_csr_ring_tail;
93*a4b16dadSTom Zanussi 	csr_ops->read_csr_e_stat = read_csr_e_stat;
94*a4b16dadSTom Zanussi 	csr_ops->write_csr_ring_config = write_csr_ring_config;
95*a4b16dadSTom Zanussi 	csr_ops->write_csr_ring_base = write_csr_ring_base;
96*a4b16dadSTom Zanussi 	csr_ops->write_csr_int_flag = write_csr_int_flag;
97*a4b16dadSTom Zanussi 	csr_ops->write_csr_int_srcsel = write_csr_int_srcsel;
98*a4b16dadSTom Zanussi 	csr_ops->write_csr_int_col_en = write_csr_int_col_en;
99*a4b16dadSTom Zanussi 	csr_ops->write_csr_int_col_ctl = write_csr_int_col_ctl;
100*a4b16dadSTom Zanussi 	csr_ops->write_csr_int_flag_and_col = write_csr_int_flag_and_col;
101*a4b16dadSTom Zanussi 	csr_ops->write_csr_ring_srv_arb_en = write_csr_ring_srv_arb_en;
102*a4b16dadSTom Zanussi }
103*a4b16dadSTom Zanussi EXPORT_SYMBOL_GPL(adf_gen4_init_hw_csr_ops);
104*a4b16dadSTom Zanussi 
adf_gen4_unpack_ssm_wdtimer(u64 value,u32 * upper,u32 * lower)105*a4b16dadSTom Zanussi static inline void adf_gen4_unpack_ssm_wdtimer(u64 value, u32 *upper,
106*a4b16dadSTom Zanussi 					       u32 *lower)
107*a4b16dadSTom Zanussi {
108*a4b16dadSTom Zanussi 	*lower = lower_32_bits(value);
109*a4b16dadSTom Zanussi 	*upper = upper_32_bits(value);
110*a4b16dadSTom Zanussi }
111*a4b16dadSTom Zanussi 
adf_gen4_set_ssm_wdtimer(struct adf_accel_dev * accel_dev)112*a4b16dadSTom Zanussi void adf_gen4_set_ssm_wdtimer(struct adf_accel_dev *accel_dev)
113*a4b16dadSTom Zanussi {
114*a4b16dadSTom Zanussi 	void __iomem *pmisc_addr = adf_get_pmisc_base(accel_dev);
115*a4b16dadSTom Zanussi 	u64 timer_val_pke = ADF_SSM_WDT_PKE_DEFAULT_VALUE;
116*a4b16dadSTom Zanussi 	u64 timer_val = ADF_SSM_WDT_DEFAULT_VALUE;
117*a4b16dadSTom Zanussi 	u32 ssm_wdt_pke_high = 0;
118*a4b16dadSTom Zanussi 	u32 ssm_wdt_pke_low = 0;
119*a4b16dadSTom Zanussi 	u32 ssm_wdt_high = 0;
120*a4b16dadSTom Zanussi 	u32 ssm_wdt_low = 0;
121*a4b16dadSTom Zanussi 
122*a4b16dadSTom Zanussi 	/* Convert 64bit WDT timer value into 32bit values for
123*a4b16dadSTom Zanussi 	 * mmio write to 32bit CSRs.
124*a4b16dadSTom Zanussi 	 */
125*a4b16dadSTom Zanussi 	adf_gen4_unpack_ssm_wdtimer(timer_val, &ssm_wdt_high, &ssm_wdt_low);
126*a4b16dadSTom Zanussi 	adf_gen4_unpack_ssm_wdtimer(timer_val_pke, &ssm_wdt_pke_high,
127*a4b16dadSTom Zanussi 				    &ssm_wdt_pke_low);
128*a4b16dadSTom Zanussi 
129*a4b16dadSTom Zanussi 	/* Enable WDT for sym and dc */
130*a4b16dadSTom Zanussi 	ADF_CSR_WR(pmisc_addr, ADF_SSMWDTL_OFFSET, ssm_wdt_low);
131*a4b16dadSTom Zanussi 	ADF_CSR_WR(pmisc_addr, ADF_SSMWDTH_OFFSET, ssm_wdt_high);
132*a4b16dadSTom Zanussi 	/* Enable WDT for pke */
133*a4b16dadSTom Zanussi 	ADF_CSR_WR(pmisc_addr, ADF_SSMWDTPKEL_OFFSET, ssm_wdt_pke_low);
134*a4b16dadSTom Zanussi 	ADF_CSR_WR(pmisc_addr, ADF_SSMWDTPKEH_OFFSET, ssm_wdt_pke_high);
135*a4b16dadSTom Zanussi }
136*a4b16dadSTom Zanussi EXPORT_SYMBOL_GPL(adf_gen4_set_ssm_wdtimer);
137*a4b16dadSTom Zanussi 
adf_pfvf_comms_disabled(struct adf_accel_dev * accel_dev)138*a4b16dadSTom Zanussi int adf_pfvf_comms_disabled(struct adf_accel_dev *accel_dev)
139*a4b16dadSTom Zanussi {
140*a4b16dadSTom Zanussi 	return 0;
141*a4b16dadSTom Zanussi }
142*a4b16dadSTom Zanussi EXPORT_SYMBOL_GPL(adf_pfvf_comms_disabled);
143*a4b16dadSTom Zanussi 
reset_ring_pair(void __iomem * csr,u32 bank_number)144*a4b16dadSTom Zanussi static int reset_ring_pair(void __iomem *csr, u32 bank_number)
145*a4b16dadSTom Zanussi {
146*a4b16dadSTom Zanussi 	u32 status;
147*a4b16dadSTom Zanussi 	int ret;
148*a4b16dadSTom Zanussi 
149*a4b16dadSTom Zanussi 	/* Write rpresetctl register BIT(0) as 1
150*a4b16dadSTom Zanussi 	 * Since rpresetctl registers have no RW fields, no need to preserve
151*a4b16dadSTom Zanussi 	 * values for other bits. Just write directly.
152*a4b16dadSTom Zanussi 	 */
153*a4b16dadSTom Zanussi 	ADF_CSR_WR(csr, ADF_WQM_CSR_RPRESETCTL(bank_number),
154*a4b16dadSTom Zanussi 		   ADF_WQM_CSR_RPRESETCTL_RESET);
155*a4b16dadSTom Zanussi 
156*a4b16dadSTom Zanussi 	/* Read rpresetsts register and wait for rp reset to complete */
157*a4b16dadSTom Zanussi 	ret = read_poll_timeout(ADF_CSR_RD, status,
158*a4b16dadSTom Zanussi 				status & ADF_WQM_CSR_RPRESETSTS_STATUS,
159*a4b16dadSTom Zanussi 				ADF_RPRESET_POLL_DELAY_US,
160*a4b16dadSTom Zanussi 				ADF_RPRESET_POLL_TIMEOUT_US, true,
161*a4b16dadSTom Zanussi 				csr, ADF_WQM_CSR_RPRESETSTS(bank_number));
162*a4b16dadSTom Zanussi 	if (!ret) {
163*a4b16dadSTom Zanussi 		/* When rp reset is done, clear rpresetsts */
164*a4b16dadSTom Zanussi 		ADF_CSR_WR(csr, ADF_WQM_CSR_RPRESETSTS(bank_number),
165*a4b16dadSTom Zanussi 			   ADF_WQM_CSR_RPRESETSTS_STATUS);
166*a4b16dadSTom Zanussi 	}
167*a4b16dadSTom Zanussi 
168*a4b16dadSTom Zanussi 	return ret;
169*a4b16dadSTom Zanussi }
170*a4b16dadSTom Zanussi 
adf_gen4_ring_pair_reset(struct adf_accel_dev * accel_dev,u32 bank_number)171*a4b16dadSTom Zanussi int adf_gen4_ring_pair_reset(struct adf_accel_dev *accel_dev, u32 bank_number)
172*a4b16dadSTom Zanussi {
173*a4b16dadSTom Zanussi 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
174*a4b16dadSTom Zanussi 	u32 etr_bar_id = hw_data->get_etr_bar_id(hw_data);
175*a4b16dadSTom Zanussi 	void __iomem *csr;
176*a4b16dadSTom Zanussi 	int ret;
177*a4b16dadSTom Zanussi 
178*a4b16dadSTom Zanussi 	if (bank_number >= hw_data->num_banks)
179*a4b16dadSTom Zanussi 		return -EINVAL;
180*a4b16dadSTom Zanussi 
181*a4b16dadSTom Zanussi 	dev_dbg(&GET_DEV(accel_dev),
182*a4b16dadSTom Zanussi 		"ring pair reset for bank:%d\n", bank_number);
183*a4b16dadSTom Zanussi 
184*a4b16dadSTom Zanussi 	csr = (&GET_BARS(accel_dev)[etr_bar_id])->virt_addr;
185*a4b16dadSTom Zanussi 	ret = reset_ring_pair(csr, bank_number);
186*a4b16dadSTom Zanussi 	if (ret)
187*a4b16dadSTom Zanussi 		dev_err(&GET_DEV(accel_dev),
188*a4b16dadSTom Zanussi 			"ring pair reset failed (timeout)\n");
189*a4b16dadSTom Zanussi 	else
190*a4b16dadSTom Zanussi 		dev_dbg(&GET_DEV(accel_dev), "ring pair reset successful\n");
191*a4b16dadSTom Zanussi 
192*a4b16dadSTom Zanussi 	return ret;
193*a4b16dadSTom Zanussi }
194*a4b16dadSTom Zanussi EXPORT_SYMBOL_GPL(adf_gen4_ring_pair_reset);
195