xref: /dpdk/drivers/crypto/caam_jr/caam_jr_hw.c (revision c0ded849131598760a25e96ff368d035838af0b3)
1*a5e1018dSGagandeep Singh /* SPDX-License-Identifier: BSD-3-Clause
2*a5e1018dSGagandeep Singh  * Copyright 2017-2018 NXP
3*a5e1018dSGagandeep Singh  */
4*a5e1018dSGagandeep Singh 
5*a5e1018dSGagandeep Singh #include <fcntl.h>
6*a5e1018dSGagandeep Singh #include <unistd.h>
7*a5e1018dSGagandeep Singh #include <inttypes.h>
8*a5e1018dSGagandeep Singh #include <rte_common.h>
9*a5e1018dSGagandeep Singh #include <rte_memory.h>
10*a5e1018dSGagandeep Singh #include <rte_malloc.h>
11*a5e1018dSGagandeep Singh #include <rte_crypto.h>
12*a5e1018dSGagandeep Singh #include <rte_security.h>
13*a5e1018dSGagandeep Singh 
14*a5e1018dSGagandeep Singh #include <caam_jr_config.h>
15*a5e1018dSGagandeep Singh #include <caam_jr_hw_specific.h>
16*a5e1018dSGagandeep Singh #include <caam_jr_pvt.h>
17*a5e1018dSGagandeep Singh #include <caam_jr_log.h>
18*a5e1018dSGagandeep Singh 
19*a5e1018dSGagandeep Singh /* Used to retry resetting a job ring in SEC hardware. */
20*a5e1018dSGagandeep Singh #define SEC_TIMEOUT 100000
21*a5e1018dSGagandeep Singh 
22*a5e1018dSGagandeep Singh /* @brief Process Jump Halt Condition related errors
23*a5e1018dSGagandeep Singh  *
24*a5e1018dSGagandeep Singh  * @param [in]  error_code        The error code in the descriptor status word
25*a5e1018dSGagandeep Singh  */
26*a5e1018dSGagandeep Singh static inline void
hw_handle_jmp_halt_cond_err(union hw_error_code error_code)27*a5e1018dSGagandeep Singh hw_handle_jmp_halt_cond_err(union hw_error_code error_code)
28*a5e1018dSGagandeep Singh {
29*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG("JMP: %d, Descriptor Index: 0x%x, Condition: 0x%x",
30*a5e1018dSGagandeep Singh 			error_code.error_desc.jmp_halt_cond_src.jmp,
31*a5e1018dSGagandeep Singh 			error_code.error_desc.jmp_halt_cond_src.desc_idx,
32*a5e1018dSGagandeep Singh 			error_code.error_desc.jmp_halt_cond_src.cond);
33*a5e1018dSGagandeep Singh 	(void)error_code;
34*a5e1018dSGagandeep Singh }
35*a5e1018dSGagandeep Singh 
36*a5e1018dSGagandeep Singh /* @brief Process DECO related errors
37*a5e1018dSGagandeep Singh  *
38*a5e1018dSGagandeep Singh  * @param [in]  error_code        The error code in the descriptor status word
39*a5e1018dSGagandeep Singh  */
40*a5e1018dSGagandeep Singh static inline void
hw_handle_deco_err(union hw_error_code error_code)41*a5e1018dSGagandeep Singh hw_handle_deco_err(union hw_error_code error_code)
42*a5e1018dSGagandeep Singh {
43*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG("JMP: %d, Descriptor Index: 0x%x",
44*a5e1018dSGagandeep Singh 			error_code.error_desc.deco_src.jmp,
45*a5e1018dSGagandeep Singh 			error_code.error_desc.deco_src.desc_idx);
46*a5e1018dSGagandeep Singh 
47*a5e1018dSGagandeep Singh 	switch (error_code.error_desc.deco_src.desc_err) {
48*a5e1018dSGagandeep Singh 	case SEC_HW_ERR_DECO_HFN_THRESHOLD:
49*a5e1018dSGagandeep Singh 		CAAM_JR_DEBUG(" Warning: Descriptor completed normally,"
50*a5e1018dSGagandeep Singh 			"but 3GPP HFN matches or exceeds the Threshold ");
51*a5e1018dSGagandeep Singh 		break;
52*a5e1018dSGagandeep Singh 	default:
53*a5e1018dSGagandeep Singh 		CAAM_JR_DEBUG("Error 0x%04x not implemented",
54*a5e1018dSGagandeep Singh 				error_code.error_desc.deco_src.desc_err);
55*a5e1018dSGagandeep Singh 		break;
56*a5e1018dSGagandeep Singh 	}
57*a5e1018dSGagandeep Singh }
58*a5e1018dSGagandeep Singh 
59*a5e1018dSGagandeep Singh /* @brief Process  Jump Halt User Status related errors
60*a5e1018dSGagandeep Singh  *
61*a5e1018dSGagandeep Singh  * @param [in]  error_code        The error code in the descriptor status word
62*a5e1018dSGagandeep Singh  */
63*a5e1018dSGagandeep Singh static inline void
hw_handle_jmp_halt_user_err(union hw_error_code error_code __rte_unused)64*a5e1018dSGagandeep Singh hw_handle_jmp_halt_user_err(union hw_error_code error_code __rte_unused)
65*a5e1018dSGagandeep Singh {
66*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG(" Not implemented");
67*a5e1018dSGagandeep Singh }
68*a5e1018dSGagandeep Singh 
69*a5e1018dSGagandeep Singh /* @brief Process CCB related errors
70*a5e1018dSGagandeep Singh  *
71*a5e1018dSGagandeep Singh  * @param [in]  error_code        The error code in the descriptor status word
72*a5e1018dSGagandeep Singh  */
73*a5e1018dSGagandeep Singh static inline void
hw_handle_ccb_err(union hw_error_code hw_error_code __rte_unused)74*a5e1018dSGagandeep Singh hw_handle_ccb_err(union hw_error_code hw_error_code __rte_unused)
75*a5e1018dSGagandeep Singh {
76*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG(" Not implemented");
77*a5e1018dSGagandeep Singh }
78*a5e1018dSGagandeep Singh 
79*a5e1018dSGagandeep Singh /* @brief Process Job Ring related errors
80*a5e1018dSGagandeep Singh  *
81*a5e1018dSGagandeep Singh  * @param [in]  error_code        The error code in the descriptor status word
82*a5e1018dSGagandeep Singh  */
83*a5e1018dSGagandeep Singh static inline void
hw_handle_jr_err(union hw_error_code hw_error_code __rte_unused)84*a5e1018dSGagandeep Singh hw_handle_jr_err(union hw_error_code hw_error_code __rte_unused)
85*a5e1018dSGagandeep Singh {
86*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG(" Not implemented");
87*a5e1018dSGagandeep Singh }
88*a5e1018dSGagandeep Singh 
89*a5e1018dSGagandeep Singh int
hw_reset_job_ring(struct sec_job_ring_t * job_ring)90*a5e1018dSGagandeep Singh hw_reset_job_ring(struct sec_job_ring_t *job_ring)
91*a5e1018dSGagandeep Singh {
92*a5e1018dSGagandeep Singh 	int ret = 0;
93*a5e1018dSGagandeep Singh 
94*a5e1018dSGagandeep Singh 	ASSERT(job_ring->register_base_addr != NULL);
95*a5e1018dSGagandeep Singh 
96*a5e1018dSGagandeep Singh 	/* First reset the job ring in hw */
97*a5e1018dSGagandeep Singh 	ret = hw_shutdown_job_ring(job_ring);
98*a5e1018dSGagandeep Singh 	SEC_ASSERT(ret == 0, ret, "Failed resetting job ring in hardware");
99*a5e1018dSGagandeep Singh 
100*a5e1018dSGagandeep Singh 	/* In order to have the HW JR in a workable state
101*a5e1018dSGagandeep Singh 	 * after a reset, I need to re-write the input
102*a5e1018dSGagandeep Singh 	 * queue size, input start address, output queue
103*a5e1018dSGagandeep Singh 	 * size and output start address
104*a5e1018dSGagandeep Singh 	 */
105*a5e1018dSGagandeep Singh 	/* Write the JR input queue size to the HW register */
106*a5e1018dSGagandeep Singh 	hw_set_input_ring_size(job_ring, SEC_JOB_RING_SIZE);
107*a5e1018dSGagandeep Singh 
108*a5e1018dSGagandeep Singh 	/* Write the JR output queue size to the HW register */
109*a5e1018dSGagandeep Singh 	hw_set_output_ring_size(job_ring, SEC_JOB_RING_SIZE);
110*a5e1018dSGagandeep Singh 
111*a5e1018dSGagandeep Singh 	/* Write the JR input queue start address */
112*a5e1018dSGagandeep Singh 	hw_set_input_ring_start_addr(job_ring,
113*a5e1018dSGagandeep Singh 			caam_jr_dma_vtop(job_ring->input_ring));
114*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG(" Set input ring base address to : Virtual: 0x%" PRIx64
115*a5e1018dSGagandeep Singh 		      ",Physical: 0x%" PRIx64 ", Read from HW: 0x%" PRIx64,
116*a5e1018dSGagandeep Singh 		      (uint64_t)(uintptr_t)job_ring->input_ring,
117*a5e1018dSGagandeep Singh 		      caam_jr_dma_vtop(job_ring->input_ring),
118*a5e1018dSGagandeep Singh 		      hw_get_inp_queue_base(job_ring));
119*a5e1018dSGagandeep Singh 
120*a5e1018dSGagandeep Singh 	/* Write the JR output queue start address */
121*a5e1018dSGagandeep Singh 	hw_set_output_ring_start_addr(job_ring,
122*a5e1018dSGagandeep Singh 			caam_jr_dma_vtop(job_ring->output_ring));
123*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG(" Set output ring base address to: Virtual: 0x%" PRIx64
124*a5e1018dSGagandeep Singh 		      ",Physical: 0x%" PRIx64 ", Read from HW: 0x%" PRIx64,
125*a5e1018dSGagandeep Singh 		      (uint64_t)(uintptr_t)job_ring->output_ring,
126*a5e1018dSGagandeep Singh 		      caam_jr_dma_vtop(job_ring->output_ring),
127*a5e1018dSGagandeep Singh 		      hw_get_out_queue_base(job_ring));
128*a5e1018dSGagandeep Singh 	return ret;
129*a5e1018dSGagandeep Singh }
130*a5e1018dSGagandeep Singh 
131*a5e1018dSGagandeep Singh int
hw_shutdown_job_ring(struct sec_job_ring_t * job_ring)132*a5e1018dSGagandeep Singh hw_shutdown_job_ring(struct sec_job_ring_t *job_ring)
133*a5e1018dSGagandeep Singh {
134*a5e1018dSGagandeep Singh 	unsigned int timeout = SEC_TIMEOUT;
135*a5e1018dSGagandeep Singh 	uint32_t tmp = 0;
136*a5e1018dSGagandeep Singh 	int usleep_interval = 10;
137*a5e1018dSGagandeep Singh 
138*a5e1018dSGagandeep Singh 	if (job_ring->register_base_addr == NULL) {
139*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Jr[%p] has reg base addr as NULL.driver not init",
140*a5e1018dSGagandeep Singh 			job_ring);
141*a5e1018dSGagandeep Singh 		return 0;
142*a5e1018dSGagandeep Singh 	}
143*a5e1018dSGagandeep Singh 
144*a5e1018dSGagandeep Singh 	CAAM_JR_INFO("Resetting Job ring %p", job_ring);
145*a5e1018dSGagandeep Singh 
146*a5e1018dSGagandeep Singh 	/*
147*a5e1018dSGagandeep Singh 	 * Mask interrupts since we are going to poll
148*a5e1018dSGagandeep Singh 	 * for reset completion status
149*a5e1018dSGagandeep Singh 	 * Also, at POR, interrupts are ENABLED on a JR, thus
150*a5e1018dSGagandeep Singh 	 * this is the point where I can disable them without
151*a5e1018dSGagandeep Singh 	 * changing the code logic too much
152*a5e1018dSGagandeep Singh 	 */
153*a5e1018dSGagandeep Singh 	caam_jr_disable_irqs(job_ring->irq_fd);
154*a5e1018dSGagandeep Singh 
155*a5e1018dSGagandeep Singh 	/* initiate flush (required prior to reset) */
156*a5e1018dSGagandeep Singh 	SET_JR_REG(JRCR, job_ring, JR_REG_JRCR_VAL_RESET);
157*a5e1018dSGagandeep Singh 
158*a5e1018dSGagandeep Singh 	/* dummy read */
159*a5e1018dSGagandeep Singh 	tmp = GET_JR_REG(JRCR, job_ring);
160*a5e1018dSGagandeep Singh 
161*a5e1018dSGagandeep Singh 	do {
162*a5e1018dSGagandeep Singh 		tmp = GET_JR_REG(JRINT, job_ring);
163*a5e1018dSGagandeep Singh 		usleep(usleep_interval);
164*a5e1018dSGagandeep Singh 	} while (((tmp & JRINT_ERR_HALT_MASK) ==
165*a5e1018dSGagandeep Singh 			JRINT_ERR_HALT_INPROGRESS) && --timeout);
166*a5e1018dSGagandeep Singh 
167*a5e1018dSGagandeep Singh 	CAAM_JR_INFO("JRINT is %x", tmp);
168*a5e1018dSGagandeep Singh 	if ((tmp & JRINT_ERR_HALT_MASK) != JRINT_ERR_HALT_COMPLETE ||
169*a5e1018dSGagandeep Singh 		timeout == 0) {
170*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("0x%x, %d", tmp, timeout);
171*a5e1018dSGagandeep Singh 		/* unmask interrupts */
172*a5e1018dSGagandeep Singh 		if (job_ring->jr_mode != SEC_NOTIFICATION_TYPE_POLL)
173*a5e1018dSGagandeep Singh 			caam_jr_enable_irqs(job_ring->irq_fd);
174*a5e1018dSGagandeep Singh 		return -1;
175*a5e1018dSGagandeep Singh 	}
176*a5e1018dSGagandeep Singh 
177*a5e1018dSGagandeep Singh 	/* Initiate reset */
178*a5e1018dSGagandeep Singh 	timeout = SEC_TIMEOUT;
179*a5e1018dSGagandeep Singh 	SET_JR_REG(JRCR, job_ring, JR_REG_JRCR_VAL_RESET);
180*a5e1018dSGagandeep Singh 
181*a5e1018dSGagandeep Singh 	do {
182*a5e1018dSGagandeep Singh 		tmp = GET_JR_REG(JRCR, job_ring);
183*a5e1018dSGagandeep Singh 		usleep(usleep_interval);
184*a5e1018dSGagandeep Singh 	} while ((tmp & JR_REG_JRCR_VAL_RESET) && --timeout);
185*a5e1018dSGagandeep Singh 
186*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG("JRCR is %x", tmp);
187*a5e1018dSGagandeep Singh 	if (timeout == 0) {
188*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Failed to reset hw job ring %p", job_ring);
189*a5e1018dSGagandeep Singh 		/* unmask interrupts */
190*a5e1018dSGagandeep Singh 		if (job_ring->jr_mode != SEC_NOTIFICATION_TYPE_POLL)
191*a5e1018dSGagandeep Singh 			caam_jr_enable_irqs(job_ring->irq_fd);
192*a5e1018dSGagandeep Singh 		return -1;
193*a5e1018dSGagandeep Singh 	}
194*a5e1018dSGagandeep Singh 	/* unmask interrupts */
195*a5e1018dSGagandeep Singh 	if (job_ring->jr_mode != SEC_NOTIFICATION_TYPE_POLL)
196*a5e1018dSGagandeep Singh 		caam_jr_enable_irqs(job_ring->irq_fd);
197*a5e1018dSGagandeep Singh 	return 0;
198*a5e1018dSGagandeep Singh 
199*a5e1018dSGagandeep Singh }
200*a5e1018dSGagandeep Singh 
201*a5e1018dSGagandeep Singh void
hw_handle_job_ring_error(struct sec_job_ring_t * job_ring __rte_unused,uint32_t error_code)202*a5e1018dSGagandeep Singh hw_handle_job_ring_error(struct sec_job_ring_t *job_ring __rte_unused,
203*a5e1018dSGagandeep Singh 			 uint32_t error_code)
204*a5e1018dSGagandeep Singh {
205*a5e1018dSGagandeep Singh 	union hw_error_code hw_err_code;
206*a5e1018dSGagandeep Singh 
207*a5e1018dSGagandeep Singh 	hw_err_code.error = error_code;
208*a5e1018dSGagandeep Singh 	switch (hw_err_code.error_desc.value.ssrc) {
209*a5e1018dSGagandeep Singh 	case SEC_HW_ERR_SSRC_NO_SRC:
210*a5e1018dSGagandeep Singh 		ASSERT(hw_err_code.error_desc.no_status_src.res == 0);
211*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("No Status Source ");
212*a5e1018dSGagandeep Singh 		break;
213*a5e1018dSGagandeep Singh 	case SEC_HW_ERR_SSRC_CCB_ERR:
214*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("CCB Status Source");
215*a5e1018dSGagandeep Singh 		hw_handle_ccb_err(hw_err_code);
216*a5e1018dSGagandeep Singh 		break;
217*a5e1018dSGagandeep Singh 	case SEC_HW_ERR_SSRC_JMP_HALT_U:
218*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Jump Halt User Status Source");
219*a5e1018dSGagandeep Singh 		hw_handle_jmp_halt_user_err(hw_err_code);
220*a5e1018dSGagandeep Singh 		break;
221*a5e1018dSGagandeep Singh 	case SEC_HW_ERR_SSRC_DECO:
222*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("DECO Status Source");
223*a5e1018dSGagandeep Singh 		hw_handle_deco_err(hw_err_code);
224*a5e1018dSGagandeep Singh 		break;
225*a5e1018dSGagandeep Singh 	case SEC_HW_ERR_SSRC_JR:
226*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Job Ring Status Source");
227*a5e1018dSGagandeep Singh 		hw_handle_jr_err(hw_err_code);
228*a5e1018dSGagandeep Singh 		break;
229*a5e1018dSGagandeep Singh 	case SEC_HW_ERR_SSRC_JMP_HALT_COND:
230*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Jump Halt Condition Codes");
231*a5e1018dSGagandeep Singh 		hw_handle_jmp_halt_cond_err(hw_err_code);
232*a5e1018dSGagandeep Singh 		break;
233*a5e1018dSGagandeep Singh 	default:
234*a5e1018dSGagandeep Singh 		ASSERT(0);
235*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Unknown SSRC");
236*a5e1018dSGagandeep Singh 		break;
237*a5e1018dSGagandeep Singh 	}
238*a5e1018dSGagandeep Singh }
239*a5e1018dSGagandeep Singh 
240*a5e1018dSGagandeep Singh void
hw_job_ring_error_print(struct sec_job_ring_t * job_ring,int code)241*a5e1018dSGagandeep Singh hw_job_ring_error_print(struct sec_job_ring_t *job_ring, int code)
242*a5e1018dSGagandeep Singh {
243*a5e1018dSGagandeep Singh 	switch (code) {
244*a5e1018dSGagandeep Singh 	case JRINT_ERR_WRITE_STATUS:
245*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Error writing status to Output Ring ");
246*a5e1018dSGagandeep Singh 		break;
247*a5e1018dSGagandeep Singh 	case JRINT_ERR_BAD_INPUT_BASE:
248*a5e1018dSGagandeep Singh 		CAAM_JR_ERR(
249*a5e1018dSGagandeep Singh 		"Bad Input Ring Base (%p) (not on a 4-byte boundary) ",
250*a5e1018dSGagandeep Singh 		(void *)job_ring);
251*a5e1018dSGagandeep Singh 		break;
252*a5e1018dSGagandeep Singh 	case JRINT_ERR_BAD_OUTPUT_BASE:
253*a5e1018dSGagandeep Singh 		CAAM_JR_ERR(
254*a5e1018dSGagandeep Singh 		"Bad Output Ring Base (%p) (not on a 4-byte boundary) ",
255*a5e1018dSGagandeep Singh 		(void *)job_ring);
256*a5e1018dSGagandeep Singh 		break;
257*a5e1018dSGagandeep Singh 	case JRINT_ERR_WRITE_2_IRBA:
258*a5e1018dSGagandeep Singh 		CAAM_JR_ERR(
259*a5e1018dSGagandeep Singh 		"Invalid write to Input Ring Base Address Register ");
260*a5e1018dSGagandeep Singh 		break;
261*a5e1018dSGagandeep Singh 	case JRINT_ERR_WRITE_2_ORBA:
262*a5e1018dSGagandeep Singh 		CAAM_JR_ERR(
263*a5e1018dSGagandeep Singh 		"Invalid write to Output Ring Base Address Register ");
264*a5e1018dSGagandeep Singh 		break;
265*a5e1018dSGagandeep Singh 	case JRINT_ERR_RES_B4_HALT:
266*a5e1018dSGagandeep Singh 		CAAM_JR_ERR(
267*a5e1018dSGagandeep Singh 		"Job Ring [%p] released before Job Ring is halted",
268*a5e1018dSGagandeep Singh 		(void *)job_ring);
269*a5e1018dSGagandeep Singh 		break;
270*a5e1018dSGagandeep Singh 	case JRINT_ERR_REM_TOO_MANY:
271*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Removed too many jobs from job ring [%p]",
272*a5e1018dSGagandeep Singh 			(void *)job_ring);
273*a5e1018dSGagandeep Singh 		break;
274*a5e1018dSGagandeep Singh 	case JRINT_ERR_ADD_TOO_MANY:
275*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Added too many jobs on job ring [%p]", job_ring);
276*a5e1018dSGagandeep Singh 		break;
277*a5e1018dSGagandeep Singh 	default:
278*a5e1018dSGagandeep Singh 		CAAM_JR_ERR(" Unknown SEC JR Error :%d",
279*a5e1018dSGagandeep Singh 				code);
280*a5e1018dSGagandeep Singh 		break;
281*a5e1018dSGagandeep Singh 	}
282*a5e1018dSGagandeep Singh }
283*a5e1018dSGagandeep Singh 
284*a5e1018dSGagandeep Singh int
hw_job_ring_set_coalescing_param(struct sec_job_ring_t * job_ring,uint16_t irq_coalescing_timer,uint8_t irq_coalescing_count)285*a5e1018dSGagandeep Singh hw_job_ring_set_coalescing_param(struct sec_job_ring_t *job_ring,
286*a5e1018dSGagandeep Singh 				 uint16_t irq_coalescing_timer,
287*a5e1018dSGagandeep Singh 				 uint8_t irq_coalescing_count)
288*a5e1018dSGagandeep Singh {
289*a5e1018dSGagandeep Singh 	uint32_t reg_val = 0;
290*a5e1018dSGagandeep Singh 
291*a5e1018dSGagandeep Singh 	ASSERT(job_ring != NULL);
292*a5e1018dSGagandeep Singh 	if (job_ring->register_base_addr == NULL) {
293*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Jr[%p] has reg base addr as NULL.driver not init",
294*a5e1018dSGagandeep Singh 			job_ring);
295*a5e1018dSGagandeep Singh 		return -1;
296*a5e1018dSGagandeep Singh 	}
297*a5e1018dSGagandeep Singh 	/* Set descriptor count coalescing */
298*a5e1018dSGagandeep Singh 	reg_val |= (irq_coalescing_count << JR_REG_JRCFG_LO_ICDCT_SHIFT);
299*a5e1018dSGagandeep Singh 
300*a5e1018dSGagandeep Singh 	/* Set coalescing timer value */
301*a5e1018dSGagandeep Singh 	reg_val |= (irq_coalescing_timer << JR_REG_JRCFG_LO_ICTT_SHIFT);
302*a5e1018dSGagandeep Singh 
303*a5e1018dSGagandeep Singh 	/* Update parameters in HW */
304*a5e1018dSGagandeep Singh 	SET_JR_REG_LO(JRCFG, job_ring, reg_val);
305*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG("Set coalescing params on jr %p timer:%d, desc count: %d",
306*a5e1018dSGagandeep Singh 			job_ring, irq_coalescing_timer, irq_coalescing_timer);
307*a5e1018dSGagandeep Singh 
308*a5e1018dSGagandeep Singh 	return 0;
309*a5e1018dSGagandeep Singh }
310*a5e1018dSGagandeep Singh 
311*a5e1018dSGagandeep Singh int
hw_job_ring_enable_coalescing(struct sec_job_ring_t * job_ring)312*a5e1018dSGagandeep Singh hw_job_ring_enable_coalescing(struct sec_job_ring_t *job_ring)
313*a5e1018dSGagandeep Singh {
314*a5e1018dSGagandeep Singh 	uint32_t reg_val = 0;
315*a5e1018dSGagandeep Singh 
316*a5e1018dSGagandeep Singh 	ASSERT(job_ring != NULL);
317*a5e1018dSGagandeep Singh 	if (job_ring->register_base_addr == NULL) {
318*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Jr[%p] has reg base addr as NULL.driver not init",
319*a5e1018dSGagandeep Singh 			job_ring);
320*a5e1018dSGagandeep Singh 		return -1;
321*a5e1018dSGagandeep Singh 	}
322*a5e1018dSGagandeep Singh 
323*a5e1018dSGagandeep Singh 	/* Get the current value of the register */
324*a5e1018dSGagandeep Singh 	reg_val = GET_JR_REG_LO(JRCFG, job_ring);
325*a5e1018dSGagandeep Singh 
326*a5e1018dSGagandeep Singh 	/* Enable coalescing */
327*a5e1018dSGagandeep Singh 	reg_val |= JR_REG_JRCFG_LO_ICEN_EN;
328*a5e1018dSGagandeep Singh 
329*a5e1018dSGagandeep Singh 	/* Write in hw */
330*a5e1018dSGagandeep Singh 	SET_JR_REG_LO(JRCFG, job_ring, reg_val);
331*a5e1018dSGagandeep Singh 
332*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG("Enabled coalescing on jr %p ",
333*a5e1018dSGagandeep Singh 			job_ring);
334*a5e1018dSGagandeep Singh 
335*a5e1018dSGagandeep Singh 	return 0;
336*a5e1018dSGagandeep Singh }
337*a5e1018dSGagandeep Singh 
338*a5e1018dSGagandeep Singh int
hw_job_ring_disable_coalescing(struct sec_job_ring_t * job_ring)339*a5e1018dSGagandeep Singh hw_job_ring_disable_coalescing(struct sec_job_ring_t *job_ring)
340*a5e1018dSGagandeep Singh {
341*a5e1018dSGagandeep Singh 	uint32_t reg_val = 0;
342*a5e1018dSGagandeep Singh 
343*a5e1018dSGagandeep Singh 	ASSERT(job_ring != NULL);
344*a5e1018dSGagandeep Singh 
345*a5e1018dSGagandeep Singh 	if (job_ring->register_base_addr == NULL) {
346*a5e1018dSGagandeep Singh 		CAAM_JR_ERR("Jr[%p] has reg base addr as NULL.driver not init",
347*a5e1018dSGagandeep Singh 			job_ring);
348*a5e1018dSGagandeep Singh 		return -1;
349*a5e1018dSGagandeep Singh 	}
350*a5e1018dSGagandeep Singh 
351*a5e1018dSGagandeep Singh 	/* Get the current value of the register */
352*a5e1018dSGagandeep Singh 	reg_val = GET_JR_REG_LO(JRCFG, job_ring);
353*a5e1018dSGagandeep Singh 
354*a5e1018dSGagandeep Singh 	/* Disable coalescing */
355*a5e1018dSGagandeep Singh 	reg_val &= ~JR_REG_JRCFG_LO_ICEN_EN;
356*a5e1018dSGagandeep Singh 
357*a5e1018dSGagandeep Singh 	/* Write in hw */
358*a5e1018dSGagandeep Singh 	SET_JR_REG_LO(JRCFG, job_ring, reg_val);
359*a5e1018dSGagandeep Singh 	CAAM_JR_DEBUG("Disabled coalescing on jr %p ", job_ring);
360*a5e1018dSGagandeep Singh 
361*a5e1018dSGagandeep Singh 	return 0;
362*a5e1018dSGagandeep Singh }
363