xref: /dpdk/drivers/common/cnxk/roc_ml.c (revision dfcf94749ac9a899eb091bb99ac78d57ed7b215b)
1*dfcf9474SSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause
2*dfcf9474SSrikanth Yalavarthi  * Copyright (c) 2022 Marvell.
3*dfcf9474SSrikanth Yalavarthi  */
4*dfcf9474SSrikanth Yalavarthi 
5*dfcf9474SSrikanth Yalavarthi #include "roc_api.h"
6*dfcf9474SSrikanth Yalavarthi #include "roc_priv.h"
7*dfcf9474SSrikanth Yalavarthi 
8*dfcf9474SSrikanth Yalavarthi #define TIME_SEC_IN_MS 1000
9*dfcf9474SSrikanth Yalavarthi 
10*dfcf9474SSrikanth Yalavarthi static int
roc_ml_reg_wait_to_clear(struct roc_ml * roc_ml,uint64_t offset,uint64_t mask)11*dfcf9474SSrikanth Yalavarthi roc_ml_reg_wait_to_clear(struct roc_ml *roc_ml, uint64_t offset, uint64_t mask)
12*dfcf9474SSrikanth Yalavarthi {
13*dfcf9474SSrikanth Yalavarthi 	uint64_t start_cycle;
14*dfcf9474SSrikanth Yalavarthi 	uint64_t wait_cycles;
15*dfcf9474SSrikanth Yalavarthi 	uint64_t reg_val;
16*dfcf9474SSrikanth Yalavarthi 
17*dfcf9474SSrikanth Yalavarthi 	wait_cycles = (ROC_ML_TIMEOUT_MS * plt_tsc_hz()) / TIME_SEC_IN_MS;
18*dfcf9474SSrikanth Yalavarthi 	start_cycle = plt_tsc_cycles();
19*dfcf9474SSrikanth Yalavarthi 	do {
20*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, offset);
21*dfcf9474SSrikanth Yalavarthi 
22*dfcf9474SSrikanth Yalavarthi 		if (!(reg_val & mask))
23*dfcf9474SSrikanth Yalavarthi 			return 0;
24*dfcf9474SSrikanth Yalavarthi 	} while (plt_tsc_cycles() - start_cycle < wait_cycles);
25*dfcf9474SSrikanth Yalavarthi 
26*dfcf9474SSrikanth Yalavarthi 	return -ETIME;
27*dfcf9474SSrikanth Yalavarthi }
28*dfcf9474SSrikanth Yalavarthi 
29*dfcf9474SSrikanth Yalavarthi uint64_t
roc_ml_reg_read64(struct roc_ml * roc_ml,uint64_t offset)30*dfcf9474SSrikanth Yalavarthi roc_ml_reg_read64(struct roc_ml *roc_ml, uint64_t offset)
31*dfcf9474SSrikanth Yalavarthi {
32*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
33*dfcf9474SSrikanth Yalavarthi 
34*dfcf9474SSrikanth Yalavarthi 	return plt_read64(PLT_PTR_ADD(ml->ml_reg_addr, offset));
35*dfcf9474SSrikanth Yalavarthi }
36*dfcf9474SSrikanth Yalavarthi 
37*dfcf9474SSrikanth Yalavarthi void
roc_ml_reg_write64(struct roc_ml * roc_ml,uint64_t val,uint64_t offset)38*dfcf9474SSrikanth Yalavarthi roc_ml_reg_write64(struct roc_ml *roc_ml, uint64_t val, uint64_t offset)
39*dfcf9474SSrikanth Yalavarthi {
40*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
41*dfcf9474SSrikanth Yalavarthi 
42*dfcf9474SSrikanth Yalavarthi 	plt_write64(val, PLT_PTR_ADD(ml->ml_reg_addr, offset));
43*dfcf9474SSrikanth Yalavarthi }
44*dfcf9474SSrikanth Yalavarthi 
45*dfcf9474SSrikanth Yalavarthi uint32_t
roc_ml_reg_read32(struct roc_ml * roc_ml,uint64_t offset)46*dfcf9474SSrikanth Yalavarthi roc_ml_reg_read32(struct roc_ml *roc_ml, uint64_t offset)
47*dfcf9474SSrikanth Yalavarthi {
48*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
49*dfcf9474SSrikanth Yalavarthi 
50*dfcf9474SSrikanth Yalavarthi 	return plt_read32(PLT_PTR_ADD(ml->ml_reg_addr, offset));
51*dfcf9474SSrikanth Yalavarthi }
52*dfcf9474SSrikanth Yalavarthi 
53*dfcf9474SSrikanth Yalavarthi void
roc_ml_reg_write32(struct roc_ml * roc_ml,uint32_t val,uint64_t offset)54*dfcf9474SSrikanth Yalavarthi roc_ml_reg_write32(struct roc_ml *roc_ml, uint32_t val, uint64_t offset)
55*dfcf9474SSrikanth Yalavarthi {
56*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
57*dfcf9474SSrikanth Yalavarthi 
58*dfcf9474SSrikanth Yalavarthi 	plt_write32(val, PLT_PTR_ADD(ml->ml_reg_addr, offset));
59*dfcf9474SSrikanth Yalavarthi }
60*dfcf9474SSrikanth Yalavarthi 
61*dfcf9474SSrikanth Yalavarthi void
roc_ml_reg_save(struct roc_ml * roc_ml,uint64_t offset)62*dfcf9474SSrikanth Yalavarthi roc_ml_reg_save(struct roc_ml *roc_ml, uint64_t offset)
63*dfcf9474SSrikanth Yalavarthi {
64*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
65*dfcf9474SSrikanth Yalavarthi 
66*dfcf9474SSrikanth Yalavarthi 	if (offset == ML_MLR_BASE) {
67*dfcf9474SSrikanth Yalavarthi 		ml->ml_mlr_base =
68*dfcf9474SSrikanth Yalavarthi 			FIELD_GET(ROC_ML_MLR_BASE_BASE, roc_ml_reg_read64(roc_ml, offset));
69*dfcf9474SSrikanth Yalavarthi 		ml->ml_mlr_base_saved = true;
70*dfcf9474SSrikanth Yalavarthi 	}
71*dfcf9474SSrikanth Yalavarthi }
72*dfcf9474SSrikanth Yalavarthi 
73*dfcf9474SSrikanth Yalavarthi void *
roc_ml_addr_ap2mlip(struct roc_ml * roc_ml,void * addr)74*dfcf9474SSrikanth Yalavarthi roc_ml_addr_ap2mlip(struct roc_ml *roc_ml, void *addr)
75*dfcf9474SSrikanth Yalavarthi {
76*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
77*dfcf9474SSrikanth Yalavarthi 	uint64_t ml_mlr_base;
78*dfcf9474SSrikanth Yalavarthi 
79*dfcf9474SSrikanth Yalavarthi 	ml_mlr_base = (ml->ml_mlr_base_saved) ? ml->ml_mlr_base :
80*dfcf9474SSrikanth Yalavarthi 						FIELD_GET(ROC_ML_MLR_BASE_BASE,
81*dfcf9474SSrikanth Yalavarthi 							  roc_ml_reg_read64(roc_ml, ML_MLR_BASE));
82*dfcf9474SSrikanth Yalavarthi 	return PLT_PTR_ADD(addr, ML_AXI_START_ADDR - ml_mlr_base);
83*dfcf9474SSrikanth Yalavarthi }
84*dfcf9474SSrikanth Yalavarthi 
85*dfcf9474SSrikanth Yalavarthi void *
roc_ml_addr_mlip2ap(struct roc_ml * roc_ml,void * addr)86*dfcf9474SSrikanth Yalavarthi roc_ml_addr_mlip2ap(struct roc_ml *roc_ml, void *addr)
87*dfcf9474SSrikanth Yalavarthi {
88*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
89*dfcf9474SSrikanth Yalavarthi 	uint64_t ml_mlr_base;
90*dfcf9474SSrikanth Yalavarthi 
91*dfcf9474SSrikanth Yalavarthi 	ml_mlr_base = (ml->ml_mlr_base_saved) ? ml->ml_mlr_base :
92*dfcf9474SSrikanth Yalavarthi 						FIELD_GET(ROC_ML_MLR_BASE_BASE,
93*dfcf9474SSrikanth Yalavarthi 							  roc_ml_reg_read64(roc_ml, ML_MLR_BASE));
94*dfcf9474SSrikanth Yalavarthi 	return PLT_PTR_ADD(addr, ml_mlr_base - ML_AXI_START_ADDR);
95*dfcf9474SSrikanth Yalavarthi }
96*dfcf9474SSrikanth Yalavarthi 
97*dfcf9474SSrikanth Yalavarthi uint64_t
roc_ml_addr_pa_to_offset(struct roc_ml * roc_ml,uint64_t phys_addr)98*dfcf9474SSrikanth Yalavarthi roc_ml_addr_pa_to_offset(struct roc_ml *roc_ml, uint64_t phys_addr)
99*dfcf9474SSrikanth Yalavarthi {
100*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
101*dfcf9474SSrikanth Yalavarthi 
102*dfcf9474SSrikanth Yalavarthi 	if (roc_model_is_cn10ka())
103*dfcf9474SSrikanth Yalavarthi 		return phys_addr - ml->pci_dev->mem_resource[0].phys_addr;
104*dfcf9474SSrikanth Yalavarthi 	else
105*dfcf9474SSrikanth Yalavarthi 		return phys_addr - ml->pci_dev->mem_resource[0].phys_addr - ML_MLAB_BLK_OFFSET;
106*dfcf9474SSrikanth Yalavarthi }
107*dfcf9474SSrikanth Yalavarthi 
108*dfcf9474SSrikanth Yalavarthi uint64_t
roc_ml_addr_offset_to_pa(struct roc_ml * roc_ml,uint64_t offset)109*dfcf9474SSrikanth Yalavarthi roc_ml_addr_offset_to_pa(struct roc_ml *roc_ml, uint64_t offset)
110*dfcf9474SSrikanth Yalavarthi {
111*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
112*dfcf9474SSrikanth Yalavarthi 
113*dfcf9474SSrikanth Yalavarthi 	if (roc_model_is_cn10ka())
114*dfcf9474SSrikanth Yalavarthi 		return ml->pci_dev->mem_resource[0].phys_addr + offset;
115*dfcf9474SSrikanth Yalavarthi 	else
116*dfcf9474SSrikanth Yalavarthi 		return ml->pci_dev->mem_resource[0].phys_addr + ML_MLAB_BLK_OFFSET + offset;
117*dfcf9474SSrikanth Yalavarthi }
118*dfcf9474SSrikanth Yalavarthi 
119*dfcf9474SSrikanth Yalavarthi void
roc_ml_scratch_write_job(struct roc_ml * roc_ml,void * work_ptr)120*dfcf9474SSrikanth Yalavarthi roc_ml_scratch_write_job(struct roc_ml *roc_ml, void *work_ptr)
121*dfcf9474SSrikanth Yalavarthi {
122*dfcf9474SSrikanth Yalavarthi 	union ml_scratch_work_ptr_s reg_work_ptr;
123*dfcf9474SSrikanth Yalavarthi 	union ml_scratch_fw_ctrl_s reg_fw_ctrl;
124*dfcf9474SSrikanth Yalavarthi 
125*dfcf9474SSrikanth Yalavarthi 	reg_work_ptr.u64 = 0;
126*dfcf9474SSrikanth Yalavarthi 	reg_work_ptr.s.work_ptr = PLT_U64_CAST(roc_ml_addr_ap2mlip(roc_ml, work_ptr));
127*dfcf9474SSrikanth Yalavarthi 
128*dfcf9474SSrikanth Yalavarthi 	reg_fw_ctrl.u64 = 0;
129*dfcf9474SSrikanth Yalavarthi 	reg_fw_ctrl.s.valid = 1;
130*dfcf9474SSrikanth Yalavarthi 
131*dfcf9474SSrikanth Yalavarthi 	roc_ml_reg_write64(roc_ml, reg_work_ptr.u64, ML_SCRATCH_WORK_PTR);
132*dfcf9474SSrikanth Yalavarthi 	roc_ml_reg_write64(roc_ml, reg_fw_ctrl.u64, ML_SCRATCH_FW_CTRL);
133*dfcf9474SSrikanth Yalavarthi }
134*dfcf9474SSrikanth Yalavarthi 
135*dfcf9474SSrikanth Yalavarthi bool
roc_ml_scratch_is_valid_bit_set(struct roc_ml * roc_ml)136*dfcf9474SSrikanth Yalavarthi roc_ml_scratch_is_valid_bit_set(struct roc_ml *roc_ml)
137*dfcf9474SSrikanth Yalavarthi {
138*dfcf9474SSrikanth Yalavarthi 	union ml_scratch_fw_ctrl_s reg_fw_ctrl;
139*dfcf9474SSrikanth Yalavarthi 
140*dfcf9474SSrikanth Yalavarthi 	reg_fw_ctrl.u64 = roc_ml_reg_read64(roc_ml, ML_SCRATCH_FW_CTRL);
141*dfcf9474SSrikanth Yalavarthi 
142*dfcf9474SSrikanth Yalavarthi 	if (reg_fw_ctrl.s.valid == 1)
143*dfcf9474SSrikanth Yalavarthi 		return true;
144*dfcf9474SSrikanth Yalavarthi 
145*dfcf9474SSrikanth Yalavarthi 	return false;
146*dfcf9474SSrikanth Yalavarthi }
147*dfcf9474SSrikanth Yalavarthi 
148*dfcf9474SSrikanth Yalavarthi bool
roc_ml_scratch_is_done_bit_set(struct roc_ml * roc_ml)149*dfcf9474SSrikanth Yalavarthi roc_ml_scratch_is_done_bit_set(struct roc_ml *roc_ml)
150*dfcf9474SSrikanth Yalavarthi {
151*dfcf9474SSrikanth Yalavarthi 	union ml_scratch_fw_ctrl_s reg_fw_ctrl;
152*dfcf9474SSrikanth Yalavarthi 
153*dfcf9474SSrikanth Yalavarthi 	reg_fw_ctrl.u64 = roc_ml_reg_read64(roc_ml, ML_SCRATCH_FW_CTRL);
154*dfcf9474SSrikanth Yalavarthi 
155*dfcf9474SSrikanth Yalavarthi 	if (reg_fw_ctrl.s.done == 1)
156*dfcf9474SSrikanth Yalavarthi 		return true;
157*dfcf9474SSrikanth Yalavarthi 
158*dfcf9474SSrikanth Yalavarthi 	return false;
159*dfcf9474SSrikanth Yalavarthi }
160*dfcf9474SSrikanth Yalavarthi 
161*dfcf9474SSrikanth Yalavarthi bool
roc_ml_scratch_enqueue(struct roc_ml * roc_ml,void * work_ptr)162*dfcf9474SSrikanth Yalavarthi roc_ml_scratch_enqueue(struct roc_ml *roc_ml, void *work_ptr)
163*dfcf9474SSrikanth Yalavarthi {
164*dfcf9474SSrikanth Yalavarthi 	union ml_scratch_work_ptr_s reg_work_ptr;
165*dfcf9474SSrikanth Yalavarthi 	union ml_scratch_fw_ctrl_s reg_fw_ctrl;
166*dfcf9474SSrikanth Yalavarthi 	bool ret = false;
167*dfcf9474SSrikanth Yalavarthi 
168*dfcf9474SSrikanth Yalavarthi 	reg_work_ptr.u64 = 0;
169*dfcf9474SSrikanth Yalavarthi 	reg_work_ptr.s.work_ptr = PLT_U64_CAST(roc_ml_addr_ap2mlip(roc_ml, work_ptr));
170*dfcf9474SSrikanth Yalavarthi 
171*dfcf9474SSrikanth Yalavarthi 	reg_fw_ctrl.u64 = 0;
172*dfcf9474SSrikanth Yalavarthi 	reg_fw_ctrl.s.valid = 1;
173*dfcf9474SSrikanth Yalavarthi 
174*dfcf9474SSrikanth Yalavarthi 	if (plt_spinlock_trylock(&roc_ml->sp_spinlock) != 0) {
175*dfcf9474SSrikanth Yalavarthi 		bool valid = roc_ml_scratch_is_valid_bit_set(roc_ml);
176*dfcf9474SSrikanth Yalavarthi 		bool done = roc_ml_scratch_is_done_bit_set(roc_ml);
177*dfcf9474SSrikanth Yalavarthi 
178*dfcf9474SSrikanth Yalavarthi 		if (valid == done) {
179*dfcf9474SSrikanth Yalavarthi 			roc_ml_clk_force_on(roc_ml);
180*dfcf9474SSrikanth Yalavarthi 			roc_ml_dma_stall_off(roc_ml);
181*dfcf9474SSrikanth Yalavarthi 
182*dfcf9474SSrikanth Yalavarthi 			roc_ml_reg_write64(roc_ml, reg_work_ptr.u64, ML_SCRATCH_WORK_PTR);
183*dfcf9474SSrikanth Yalavarthi 			roc_ml_reg_write64(roc_ml, reg_fw_ctrl.u64, ML_SCRATCH_FW_CTRL);
184*dfcf9474SSrikanth Yalavarthi 
185*dfcf9474SSrikanth Yalavarthi 			ret = true;
186*dfcf9474SSrikanth Yalavarthi 		}
187*dfcf9474SSrikanth Yalavarthi 		plt_spinlock_unlock(&roc_ml->sp_spinlock);
188*dfcf9474SSrikanth Yalavarthi 	}
189*dfcf9474SSrikanth Yalavarthi 
190*dfcf9474SSrikanth Yalavarthi 	return ret;
191*dfcf9474SSrikanth Yalavarthi }
192*dfcf9474SSrikanth Yalavarthi 
193*dfcf9474SSrikanth Yalavarthi bool
roc_ml_scratch_dequeue(struct roc_ml * roc_ml,void * work_ptr)194*dfcf9474SSrikanth Yalavarthi roc_ml_scratch_dequeue(struct roc_ml *roc_ml, void *work_ptr)
195*dfcf9474SSrikanth Yalavarthi {
196*dfcf9474SSrikanth Yalavarthi 	union ml_scratch_work_ptr_s reg_work_ptr;
197*dfcf9474SSrikanth Yalavarthi 	bool ret = false;
198*dfcf9474SSrikanth Yalavarthi 
199*dfcf9474SSrikanth Yalavarthi 	if (plt_spinlock_trylock(&roc_ml->sp_spinlock) != 0) {
200*dfcf9474SSrikanth Yalavarthi 		bool valid = roc_ml_scratch_is_valid_bit_set(roc_ml);
201*dfcf9474SSrikanth Yalavarthi 		bool done = roc_ml_scratch_is_done_bit_set(roc_ml);
202*dfcf9474SSrikanth Yalavarthi 
203*dfcf9474SSrikanth Yalavarthi 		if (valid && done) {
204*dfcf9474SSrikanth Yalavarthi 			reg_work_ptr.u64 = roc_ml_reg_read64(roc_ml, ML_SCRATCH_WORK_PTR);
205*dfcf9474SSrikanth Yalavarthi 			if (work_ptr ==
206*dfcf9474SSrikanth Yalavarthi 			    roc_ml_addr_mlip2ap(roc_ml, PLT_PTR_CAST(reg_work_ptr.u64))) {
207*dfcf9474SSrikanth Yalavarthi 				roc_ml_dma_stall_on(roc_ml);
208*dfcf9474SSrikanth Yalavarthi 				roc_ml_clk_force_off(roc_ml);
209*dfcf9474SSrikanth Yalavarthi 
210*dfcf9474SSrikanth Yalavarthi 				roc_ml_reg_write64(roc_ml, 0, ML_SCRATCH_WORK_PTR);
211*dfcf9474SSrikanth Yalavarthi 				roc_ml_reg_write64(roc_ml, 0, ML_SCRATCH_FW_CTRL);
212*dfcf9474SSrikanth Yalavarthi 				ret = true;
213*dfcf9474SSrikanth Yalavarthi 			}
214*dfcf9474SSrikanth Yalavarthi 		}
215*dfcf9474SSrikanth Yalavarthi 		plt_spinlock_unlock(&roc_ml->sp_spinlock);
216*dfcf9474SSrikanth Yalavarthi 	}
217*dfcf9474SSrikanth Yalavarthi 
218*dfcf9474SSrikanth Yalavarthi 	return ret;
219*dfcf9474SSrikanth Yalavarthi }
220*dfcf9474SSrikanth Yalavarthi 
221*dfcf9474SSrikanth Yalavarthi void
roc_ml_scratch_queue_reset(struct roc_ml * roc_ml)222*dfcf9474SSrikanth Yalavarthi roc_ml_scratch_queue_reset(struct roc_ml *roc_ml)
223*dfcf9474SSrikanth Yalavarthi {
224*dfcf9474SSrikanth Yalavarthi 	if (plt_spinlock_trylock(&roc_ml->sp_spinlock) != 0) {
225*dfcf9474SSrikanth Yalavarthi 		roc_ml_dma_stall_on(roc_ml);
226*dfcf9474SSrikanth Yalavarthi 		roc_ml_clk_force_off(roc_ml);
227*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, 0, ML_SCRATCH_WORK_PTR);
228*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, 0, ML_SCRATCH_FW_CTRL);
229*dfcf9474SSrikanth Yalavarthi 		plt_spinlock_unlock(&roc_ml->sp_spinlock);
230*dfcf9474SSrikanth Yalavarthi 	}
231*dfcf9474SSrikanth Yalavarthi }
232*dfcf9474SSrikanth Yalavarthi 
233*dfcf9474SSrikanth Yalavarthi bool
roc_ml_jcmdq_enqueue_lf(struct roc_ml * roc_ml,struct ml_job_cmd_s * job_cmd)234*dfcf9474SSrikanth Yalavarthi roc_ml_jcmdq_enqueue_lf(struct roc_ml *roc_ml, struct ml_job_cmd_s *job_cmd)
235*dfcf9474SSrikanth Yalavarthi {
236*dfcf9474SSrikanth Yalavarthi 	bool ret = false;
237*dfcf9474SSrikanth Yalavarthi 
238*dfcf9474SSrikanth Yalavarthi 	if (FIELD_GET(ROC_ML_JCMDQ_STATUS_AVAIL_COUNT,
239*dfcf9474SSrikanth Yalavarthi 		      roc_ml_reg_read64(roc_ml, ML_JCMDQ_STATUS)) != 0) {
240*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, job_cmd->w0.u64, ML_JCMDQ_IN(0));
241*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, job_cmd->w1.u64, ML_JCMDQ_IN(1));
242*dfcf9474SSrikanth Yalavarthi 		ret = true;
243*dfcf9474SSrikanth Yalavarthi 	}
244*dfcf9474SSrikanth Yalavarthi 
245*dfcf9474SSrikanth Yalavarthi 	return ret;
246*dfcf9474SSrikanth Yalavarthi }
247*dfcf9474SSrikanth Yalavarthi 
248*dfcf9474SSrikanth Yalavarthi bool
roc_ml_jcmdq_enqueue_sl(struct roc_ml * roc_ml,struct ml_job_cmd_s * job_cmd)249*dfcf9474SSrikanth Yalavarthi roc_ml_jcmdq_enqueue_sl(struct roc_ml *roc_ml, struct ml_job_cmd_s *job_cmd)
250*dfcf9474SSrikanth Yalavarthi {
251*dfcf9474SSrikanth Yalavarthi 	bool ret = false;
252*dfcf9474SSrikanth Yalavarthi 
253*dfcf9474SSrikanth Yalavarthi 	if (plt_spinlock_trylock(&roc_ml->fp_spinlock) != 0) {
254*dfcf9474SSrikanth Yalavarthi 		if (FIELD_GET(ROC_ML_JCMDQ_STATUS_AVAIL_COUNT,
255*dfcf9474SSrikanth Yalavarthi 			      roc_ml_reg_read64(roc_ml, ML_JCMDQ_STATUS)) != 0) {
256*dfcf9474SSrikanth Yalavarthi 			roc_ml_reg_write64(roc_ml, job_cmd->w0.u64, ML_JCMDQ_IN(0));
257*dfcf9474SSrikanth Yalavarthi 			roc_ml_reg_write64(roc_ml, job_cmd->w1.u64, ML_JCMDQ_IN(1));
258*dfcf9474SSrikanth Yalavarthi 			ret = true;
259*dfcf9474SSrikanth Yalavarthi 		}
260*dfcf9474SSrikanth Yalavarthi 		plt_spinlock_unlock(&roc_ml->fp_spinlock);
261*dfcf9474SSrikanth Yalavarthi 	}
262*dfcf9474SSrikanth Yalavarthi 
263*dfcf9474SSrikanth Yalavarthi 	return ret;
264*dfcf9474SSrikanth Yalavarthi }
265*dfcf9474SSrikanth Yalavarthi 
266*dfcf9474SSrikanth Yalavarthi void
roc_ml_clk_force_on(struct roc_ml * roc_ml)267*dfcf9474SSrikanth Yalavarthi roc_ml_clk_force_on(struct roc_ml *roc_ml)
268*dfcf9474SSrikanth Yalavarthi {
269*dfcf9474SSrikanth Yalavarthi 	uint64_t reg_val = 0;
270*dfcf9474SSrikanth Yalavarthi 
271*dfcf9474SSrikanth Yalavarthi 	reg_val = roc_ml_reg_read64(roc_ml, ML_CFG);
272*dfcf9474SSrikanth Yalavarthi 	reg_val |= ROC_ML_CFG_MLIP_CLK_FORCE;
273*dfcf9474SSrikanth Yalavarthi 	roc_ml_reg_write64(roc_ml, reg_val, ML_CFG);
274*dfcf9474SSrikanth Yalavarthi }
275*dfcf9474SSrikanth Yalavarthi 
276*dfcf9474SSrikanth Yalavarthi void
roc_ml_clk_force_off(struct roc_ml * roc_ml)277*dfcf9474SSrikanth Yalavarthi roc_ml_clk_force_off(struct roc_ml *roc_ml)
278*dfcf9474SSrikanth Yalavarthi {
279*dfcf9474SSrikanth Yalavarthi 	uint64_t reg_val = 0;
280*dfcf9474SSrikanth Yalavarthi 
281*dfcf9474SSrikanth Yalavarthi 	roc_ml_reg_write64(roc_ml, 0, ML_SCRATCH_WORK_PTR);
282*dfcf9474SSrikanth Yalavarthi 
283*dfcf9474SSrikanth Yalavarthi 	reg_val = roc_ml_reg_read64(roc_ml, ML_CFG);
284*dfcf9474SSrikanth Yalavarthi 	reg_val &= ~ROC_ML_CFG_MLIP_CLK_FORCE;
285*dfcf9474SSrikanth Yalavarthi 	roc_ml_reg_write64(roc_ml, reg_val, ML_CFG);
286*dfcf9474SSrikanth Yalavarthi }
287*dfcf9474SSrikanth Yalavarthi 
288*dfcf9474SSrikanth Yalavarthi void
roc_ml_dma_stall_on(struct roc_ml * roc_ml)289*dfcf9474SSrikanth Yalavarthi roc_ml_dma_stall_on(struct roc_ml *roc_ml)
290*dfcf9474SSrikanth Yalavarthi {
291*dfcf9474SSrikanth Yalavarthi 	uint64_t reg_val = 0;
292*dfcf9474SSrikanth Yalavarthi 
293*dfcf9474SSrikanth Yalavarthi 	reg_val = roc_ml_reg_read64(roc_ml, ML_JOB_MGR_CTRL);
294*dfcf9474SSrikanth Yalavarthi 	reg_val |= ROC_ML_JOB_MGR_CTRL_STALL_ON_IDLE;
295*dfcf9474SSrikanth Yalavarthi 	roc_ml_reg_write64(roc_ml, reg_val, ML_JOB_MGR_CTRL);
296*dfcf9474SSrikanth Yalavarthi }
297*dfcf9474SSrikanth Yalavarthi 
298*dfcf9474SSrikanth Yalavarthi void
roc_ml_dma_stall_off(struct roc_ml * roc_ml)299*dfcf9474SSrikanth Yalavarthi roc_ml_dma_stall_off(struct roc_ml *roc_ml)
300*dfcf9474SSrikanth Yalavarthi {
301*dfcf9474SSrikanth Yalavarthi 	uint64_t reg_val = 0;
302*dfcf9474SSrikanth Yalavarthi 
303*dfcf9474SSrikanth Yalavarthi 	reg_val = roc_ml_reg_read64(roc_ml, ML_JOB_MGR_CTRL);
304*dfcf9474SSrikanth Yalavarthi 	reg_val &= ~ROC_ML_JOB_MGR_CTRL_STALL_ON_IDLE;
305*dfcf9474SSrikanth Yalavarthi 	roc_ml_reg_write64(roc_ml, reg_val, ML_JOB_MGR_CTRL);
306*dfcf9474SSrikanth Yalavarthi }
307*dfcf9474SSrikanth Yalavarthi 
308*dfcf9474SSrikanth Yalavarthi bool
roc_ml_mlip_is_enabled(struct roc_ml * roc_ml)309*dfcf9474SSrikanth Yalavarthi roc_ml_mlip_is_enabled(struct roc_ml *roc_ml)
310*dfcf9474SSrikanth Yalavarthi {
311*dfcf9474SSrikanth Yalavarthi 	uint64_t reg_val;
312*dfcf9474SSrikanth Yalavarthi 
313*dfcf9474SSrikanth Yalavarthi 	reg_val = roc_ml_reg_read64(roc_ml, ML_CFG);
314*dfcf9474SSrikanth Yalavarthi 
315*dfcf9474SSrikanth Yalavarthi 	if ((reg_val & ROC_ML_CFG_MLIP_ENA) != 0)
316*dfcf9474SSrikanth Yalavarthi 		return true;
317*dfcf9474SSrikanth Yalavarthi 
318*dfcf9474SSrikanth Yalavarthi 	return false;
319*dfcf9474SSrikanth Yalavarthi }
320*dfcf9474SSrikanth Yalavarthi 
321*dfcf9474SSrikanth Yalavarthi int
roc_ml_mlip_reset(struct roc_ml * roc_ml,bool force)322*dfcf9474SSrikanth Yalavarthi roc_ml_mlip_reset(struct roc_ml *roc_ml, bool force)
323*dfcf9474SSrikanth Yalavarthi {
324*dfcf9474SSrikanth Yalavarthi 	uint64_t reg_val;
325*dfcf9474SSrikanth Yalavarthi 
326*dfcf9474SSrikanth Yalavarthi 	/* Force reset */
327*dfcf9474SSrikanth Yalavarthi 	if (force) {
328*dfcf9474SSrikanth Yalavarthi 		/* Set ML(0)_CFG[ENA] = 0. */
329*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_CFG);
330*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_CFG_ENA;
331*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_CFG);
332*dfcf9474SSrikanth Yalavarthi 
333*dfcf9474SSrikanth Yalavarthi 		/* Set ML(0)_CFG[MLIP_ENA] = 0. */
334*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_CFG);
335*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_CFG_MLIP_ENA;
336*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_CFG);
337*dfcf9474SSrikanth Yalavarthi 
338*dfcf9474SSrikanth Yalavarthi 		/* Clear ML_MLR_BASE */
339*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, 0, ML_MLR_BASE);
340*dfcf9474SSrikanth Yalavarthi 	}
341*dfcf9474SSrikanth Yalavarthi 
342*dfcf9474SSrikanth Yalavarthi 	if (roc_model_is_cn10ka()) {
343*dfcf9474SSrikanth Yalavarthi 		/* Wait for all active jobs to finish.
344*dfcf9474SSrikanth Yalavarthi 		 * ML_CFG[ENA] : When set, MLW will accept job commands. This
345*dfcf9474SSrikanth Yalavarthi 		 * bit can be cleared at any time. If [BUSY] is set, software
346*dfcf9474SSrikanth Yalavarthi 		 * must wait until [BUSY] == 0 before setting this bit.
347*dfcf9474SSrikanth Yalavarthi 		 */
348*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_CFG, ROC_ML_CFG_BUSY);
349*dfcf9474SSrikanth Yalavarthi 
350*dfcf9474SSrikanth Yalavarthi 		/* (1) Set ML(0)_AXI_BRIDGE_CTRL(0..1)[FENCE] = 1 to instruct
351*dfcf9474SSrikanth Yalavarthi 		 * the AXI bridge not to accept any new transactions from MLIP.
352*dfcf9474SSrikanth Yalavarthi 		 */
353*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(0));
354*dfcf9474SSrikanth Yalavarthi 		reg_val |= ROC_ML_AXI_BRIDGE_CTRL_FENCE;
355*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(0));
356*dfcf9474SSrikanth Yalavarthi 
357*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(1));
358*dfcf9474SSrikanth Yalavarthi 		reg_val |= ROC_ML_AXI_BRIDGE_CTRL_FENCE;
359*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(1));
360*dfcf9474SSrikanth Yalavarthi 
361*dfcf9474SSrikanth Yalavarthi 		/* (2) Wait until ML(0)_AXI_BRIDGE_CTRL(0..1)[BUSY] = 0 which
362*dfcf9474SSrikanth Yalavarthi 		 * indicates that there is no outstanding transactions on
363*dfcf9474SSrikanth Yalavarthi 		 * AXI-NCB paths.
364*dfcf9474SSrikanth Yalavarthi 		 */
365*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_AXI_BRIDGE_CTRL(0),
366*dfcf9474SSrikanth Yalavarthi 					 ROC_ML_AXI_BRIDGE_CTRL_BUSY);
367*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_AXI_BRIDGE_CTRL(1),
368*dfcf9474SSrikanth Yalavarthi 					 ROC_ML_AXI_BRIDGE_CTRL_BUSY);
369*dfcf9474SSrikanth Yalavarthi 
370*dfcf9474SSrikanth Yalavarthi 		/* (3) Wait until ML(0)_JOB_MGR_CTRL[BUSY] = 0 which indicates
371*dfcf9474SSrikanth Yalavarthi 		 * that there are no pending jobs in the MLW's job manager.
372*dfcf9474SSrikanth Yalavarthi 		 */
373*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_JOB_MGR_CTRL, ROC_ML_JOB_MGR_CTRL_BUSY);
374*dfcf9474SSrikanth Yalavarthi 
375*dfcf9474SSrikanth Yalavarthi 		/* (4) Set ML(0)_CFG[ENA] = 0. */
376*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_CFG);
377*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_CFG_ENA;
378*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_CFG);
379*dfcf9474SSrikanth Yalavarthi 
380*dfcf9474SSrikanth Yalavarthi 		/* (5) Set ML(0)_CFG[MLIP_ENA] = 0. */
381*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_CFG);
382*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_CFG_MLIP_ENA;
383*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_CFG);
384*dfcf9474SSrikanth Yalavarthi 
385*dfcf9474SSrikanth Yalavarthi 		/* (6) Set ML(0)_AXI_BRIDGE_CTRL(0..1)[FENCE] = 0.*/
386*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(0));
387*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_AXI_BRIDGE_CTRL_FENCE;
388*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(0));
389*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(1));
390*dfcf9474SSrikanth Yalavarthi 	}
391*dfcf9474SSrikanth Yalavarthi 
392*dfcf9474SSrikanth Yalavarthi 	if (roc_model_is_cnf10kb()) {
393*dfcf9474SSrikanth Yalavarthi 		/* (1) Clear MLAB(0)_CFG[ENA]. Any new jobs will bypass the job
394*dfcf9474SSrikanth Yalavarthi 		 * execution stages and their completions will be returned to
395*dfcf9474SSrikanth Yalavarthi 		 * PSM.
396*dfcf9474SSrikanth Yalavarthi 		 */
397*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_CFG);
398*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_CFG_ENA;
399*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_CFG);
400*dfcf9474SSrikanth Yalavarthi 
401*dfcf9474SSrikanth Yalavarthi 		/* (2) Quiesce the ACC and DMA AXI interfaces: For each of the
402*dfcf9474SSrikanth Yalavarthi 		 * two MLAB(0)_AXI_BRIDGE_CTRL(0..1) registers:
403*dfcf9474SSrikanth Yalavarthi 		 *
404*dfcf9474SSrikanth Yalavarthi 		 * (a) Set MLAB(0)_AXI_BRIDGE_CTRL(0..1)[FENCE] to block new AXI
405*dfcf9474SSrikanth Yalavarthi 		 * commands from MLIP.
406*dfcf9474SSrikanth Yalavarthi 		 *
407*dfcf9474SSrikanth Yalavarthi 		 * (b) Poll MLAB(0)_AXI_BRIDGE_CTRL(0..1)[BUSY] == 0.
408*dfcf9474SSrikanth Yalavarthi 		 */
409*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(0));
410*dfcf9474SSrikanth Yalavarthi 		reg_val |= ROC_ML_AXI_BRIDGE_CTRL_FENCE;
411*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(0));
412*dfcf9474SSrikanth Yalavarthi 
413*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_AXI_BRIDGE_CTRL(0),
414*dfcf9474SSrikanth Yalavarthi 					 ROC_ML_AXI_BRIDGE_CTRL_BUSY);
415*dfcf9474SSrikanth Yalavarthi 
416*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(1));
417*dfcf9474SSrikanth Yalavarthi 		reg_val |= ROC_ML_AXI_BRIDGE_CTRL_FENCE;
418*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(1));
419*dfcf9474SSrikanth Yalavarthi 
420*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_AXI_BRIDGE_CTRL(1),
421*dfcf9474SSrikanth Yalavarthi 					 ROC_ML_AXI_BRIDGE_CTRL_BUSY);
422*dfcf9474SSrikanth Yalavarthi 
423*dfcf9474SSrikanth Yalavarthi 		/* (3) Clear MLAB(0)_CFG[MLIP_ENA] to reset MLIP.
424*dfcf9474SSrikanth Yalavarthi 		 */
425*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_CFG);
426*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_CFG_MLIP_ENA;
427*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_CFG);
428*dfcf9474SSrikanth Yalavarthi 
429*dfcf9474SSrikanth Yalavarthi cnf10kb_mlip_reset_stage_4a:
430*dfcf9474SSrikanth Yalavarthi 		/* (4) Flush any outstanding jobs in MLAB's job execution
431*dfcf9474SSrikanth Yalavarthi 		 * stages:
432*dfcf9474SSrikanth Yalavarthi 		 *
433*dfcf9474SSrikanth Yalavarthi 		 * (a) Wait for completion stage to clear:
434*dfcf9474SSrikanth Yalavarthi 		 *   - Poll MLAB(0)_STG(0..2)_STATUS[VALID] == 0.
435*dfcf9474SSrikanth Yalavarthi 		 */
436*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_STGX_STATUS(0), ROC_ML_STG_STATUS_VALID);
437*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_STGX_STATUS(1), ROC_ML_STG_STATUS_VALID);
438*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_STGX_STATUS(2), ROC_ML_STG_STATUS_VALID);
439*dfcf9474SSrikanth Yalavarthi 
440*dfcf9474SSrikanth Yalavarthi cnf10kb_mlip_reset_stage_4b:
441*dfcf9474SSrikanth Yalavarthi 		/* (4b) Clear job run stage: Poll
442*dfcf9474SSrikanth Yalavarthi 		 * MLAB(0)_STG_CONTROL[RUN_TO_COMP] == 0.
443*dfcf9474SSrikanth Yalavarthi 		 */
444*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_STG_CONTROL, ROC_ML_STG_CONTROL_RUN_TO_COMP);
445*dfcf9474SSrikanth Yalavarthi 
446*dfcf9474SSrikanth Yalavarthi 		/* (4b) Clear job run stage: If MLAB(0)_STG(1)_STATUS[VALID] ==
447*dfcf9474SSrikanth Yalavarthi 		 * 1:
448*dfcf9474SSrikanth Yalavarthi 		 *     - Set MLAB(0)_STG_CONTROL[RUN_TO_COMP].
449*dfcf9474SSrikanth Yalavarthi 		 *     - Poll MLAB(0)_STG_CONTROL[RUN_TO_COMP] == 0.
450*dfcf9474SSrikanth Yalavarthi 		 *     - Repeat step (a) to clear job completion stage.
451*dfcf9474SSrikanth Yalavarthi 		 */
452*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_STGX_STATUS(1));
453*dfcf9474SSrikanth Yalavarthi 		if (reg_val & ROC_ML_STG_STATUS_VALID) {
454*dfcf9474SSrikanth Yalavarthi 			reg_val = roc_ml_reg_read64(roc_ml, ML_STG_CONTROL);
455*dfcf9474SSrikanth Yalavarthi 			reg_val |= ROC_ML_STG_CONTROL_RUN_TO_COMP;
456*dfcf9474SSrikanth Yalavarthi 			roc_ml_reg_write64(roc_ml, reg_val, ML_STG_CONTROL);
457*dfcf9474SSrikanth Yalavarthi 
458*dfcf9474SSrikanth Yalavarthi 			roc_ml_reg_wait_to_clear(roc_ml, ML_STG_CONTROL,
459*dfcf9474SSrikanth Yalavarthi 						 ROC_ML_STG_CONTROL_RUN_TO_COMP);
460*dfcf9474SSrikanth Yalavarthi 
461*dfcf9474SSrikanth Yalavarthi 			goto cnf10kb_mlip_reset_stage_4a;
462*dfcf9474SSrikanth Yalavarthi 		}
463*dfcf9474SSrikanth Yalavarthi 
464*dfcf9474SSrikanth Yalavarthi 		/* (4c) Clear job fetch stage: Poll
465*dfcf9474SSrikanth Yalavarthi 		 * MLAB(0)_STG_CONTROL[FETCH_TO_RUN] == 0.
466*dfcf9474SSrikanth Yalavarthi 		 */
467*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_wait_to_clear(roc_ml, ML_STG_CONTROL, ROC_ML_STG_CONTROL_FETCH_TO_RUN);
468*dfcf9474SSrikanth Yalavarthi 
469*dfcf9474SSrikanth Yalavarthi 		/* (4c) Clear job fetch stage: If
470*dfcf9474SSrikanth Yalavarthi 		 * MLAB(0)_STG(0..2)_STATUS[VALID] == 1:
471*dfcf9474SSrikanth Yalavarthi 		 *     - Set MLAB(0)_STG_CONTROL[FETCH_TO_RUN].
472*dfcf9474SSrikanth Yalavarthi 		 *     - Poll MLAB(0)_STG_CONTROL[FETCH_TO_RUN] == 0.
473*dfcf9474SSrikanth Yalavarthi 		 *     - Repeat step (b) to clear job run and completion stages.
474*dfcf9474SSrikanth Yalavarthi 		 */
475*dfcf9474SSrikanth Yalavarthi 		reg_val = (roc_ml_reg_read64(roc_ml, ML_STGX_STATUS(0)) |
476*dfcf9474SSrikanth Yalavarthi 			   roc_ml_reg_read64(roc_ml, ML_STGX_STATUS(1)) |
477*dfcf9474SSrikanth Yalavarthi 			   roc_ml_reg_read64(roc_ml, ML_STGX_STATUS(2)));
478*dfcf9474SSrikanth Yalavarthi 
479*dfcf9474SSrikanth Yalavarthi 		if (reg_val & ROC_ML_STG_STATUS_VALID) {
480*dfcf9474SSrikanth Yalavarthi 			reg_val = roc_ml_reg_read64(roc_ml, ML_STG_CONTROL);
481*dfcf9474SSrikanth Yalavarthi 			reg_val |= ROC_ML_STG_CONTROL_RUN_TO_COMP;
482*dfcf9474SSrikanth Yalavarthi 			roc_ml_reg_write64(roc_ml, reg_val, ML_STG_CONTROL);
483*dfcf9474SSrikanth Yalavarthi 
484*dfcf9474SSrikanth Yalavarthi 			roc_ml_reg_wait_to_clear(roc_ml, ML_STG_CONTROL,
485*dfcf9474SSrikanth Yalavarthi 						 ROC_ML_STG_CONTROL_RUN_TO_COMP);
486*dfcf9474SSrikanth Yalavarthi 
487*dfcf9474SSrikanth Yalavarthi 			goto cnf10kb_mlip_reset_stage_4b;
488*dfcf9474SSrikanth Yalavarthi 		}
489*dfcf9474SSrikanth Yalavarthi 
490*dfcf9474SSrikanth Yalavarthi 		/* (5) Reset the ACC and DMA AXI interfaces: For each of the two
491*dfcf9474SSrikanth Yalavarthi 		 * MLAB(0)_AXI_BRIDGE_CTRL(0..1) registers:
492*dfcf9474SSrikanth Yalavarthi 		 *
493*dfcf9474SSrikanth Yalavarthi 		 * (5a) Set and then clear
494*dfcf9474SSrikanth Yalavarthi 		 * MLAB(0)_AXI_BRIDGE_CTRL(0..1)[FLUSH_WRITE_DATA].
495*dfcf9474SSrikanth Yalavarthi 		 *
496*dfcf9474SSrikanth Yalavarthi 		 * (5b) Clear MLAB(0)_AXI_BRIDGE_CTRL(0..1)[FENCE].
497*dfcf9474SSrikanth Yalavarthi 		 */
498*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(0));
499*dfcf9474SSrikanth Yalavarthi 		reg_val |= ROC_ML_AXI_BRIDGE_CTRL_FLUSH_WRITE_DATA;
500*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(0));
501*dfcf9474SSrikanth Yalavarthi 
502*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(0));
503*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_AXI_BRIDGE_CTRL_FLUSH_WRITE_DATA;
504*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(0));
505*dfcf9474SSrikanth Yalavarthi 
506*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(0));
507*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_AXI_BRIDGE_CTRL_FENCE;
508*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(0));
509*dfcf9474SSrikanth Yalavarthi 
510*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(1));
511*dfcf9474SSrikanth Yalavarthi 		reg_val |= ROC_ML_AXI_BRIDGE_CTRL_FLUSH_WRITE_DATA;
512*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(1));
513*dfcf9474SSrikanth Yalavarthi 
514*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(1));
515*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_AXI_BRIDGE_CTRL_FLUSH_WRITE_DATA;
516*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(1));
517*dfcf9474SSrikanth Yalavarthi 
518*dfcf9474SSrikanth Yalavarthi 		reg_val = roc_ml_reg_read64(roc_ml, ML_AXI_BRIDGE_CTRL(1));
519*dfcf9474SSrikanth Yalavarthi 		reg_val &= ~ROC_ML_AXI_BRIDGE_CTRL_FENCE;
520*dfcf9474SSrikanth Yalavarthi 		roc_ml_reg_write64(roc_ml, reg_val, ML_AXI_BRIDGE_CTRL(1));
521*dfcf9474SSrikanth Yalavarthi 	}
522*dfcf9474SSrikanth Yalavarthi 
523*dfcf9474SSrikanth Yalavarthi 	return 0;
524*dfcf9474SSrikanth Yalavarthi }
525*dfcf9474SSrikanth Yalavarthi 
526*dfcf9474SSrikanth Yalavarthi int
roc_ml_dev_init(struct roc_ml * roc_ml)527*dfcf9474SSrikanth Yalavarthi roc_ml_dev_init(struct roc_ml *roc_ml)
528*dfcf9474SSrikanth Yalavarthi {
529*dfcf9474SSrikanth Yalavarthi 	struct plt_pci_device *pci_dev;
530*dfcf9474SSrikanth Yalavarthi 	struct dev *dev;
531*dfcf9474SSrikanth Yalavarthi 	struct ml *ml;
532*dfcf9474SSrikanth Yalavarthi 
533*dfcf9474SSrikanth Yalavarthi 	if (roc_ml == NULL || roc_ml->pci_dev == NULL)
534*dfcf9474SSrikanth Yalavarthi 		return -EINVAL;
535*dfcf9474SSrikanth Yalavarthi 
536*dfcf9474SSrikanth Yalavarthi 	PLT_STATIC_ASSERT(sizeof(struct ml) <= ROC_ML_MEM_SZ);
537*dfcf9474SSrikanth Yalavarthi 
538*dfcf9474SSrikanth Yalavarthi 	ml = roc_ml_to_ml_priv(roc_ml);
539*dfcf9474SSrikanth Yalavarthi 	memset(ml, 0, sizeof(*ml));
540*dfcf9474SSrikanth Yalavarthi 	pci_dev = roc_ml->pci_dev;
541*dfcf9474SSrikanth Yalavarthi 	dev = &ml->dev;
542*dfcf9474SSrikanth Yalavarthi 
543*dfcf9474SSrikanth Yalavarthi 	ml->pci_dev = pci_dev;
544*dfcf9474SSrikanth Yalavarthi 	dev->roc_ml = roc_ml;
545*dfcf9474SSrikanth Yalavarthi 
546*dfcf9474SSrikanth Yalavarthi 	ml->ml_reg_addr = ml->pci_dev->mem_resource[0].addr;
547*dfcf9474SSrikanth Yalavarthi 	ml->ml_mlr_base = 0;
548*dfcf9474SSrikanth Yalavarthi 	ml->ml_mlr_base_saved = false;
549*dfcf9474SSrikanth Yalavarthi 
550*dfcf9474SSrikanth Yalavarthi 	plt_ml_dbg("ML: PCI Physical Address : 0x%016lx", ml->pci_dev->mem_resource[0].phys_addr);
551*dfcf9474SSrikanth Yalavarthi 	plt_ml_dbg("ML: PCI Virtual Address : 0x%016lx",
552*dfcf9474SSrikanth Yalavarthi 		   PLT_U64_CAST(ml->pci_dev->mem_resource[0].addr));
553*dfcf9474SSrikanth Yalavarthi 
554*dfcf9474SSrikanth Yalavarthi 	plt_spinlock_init(&roc_ml->sp_spinlock);
555*dfcf9474SSrikanth Yalavarthi 	plt_spinlock_init(&roc_ml->fp_spinlock);
556*dfcf9474SSrikanth Yalavarthi 
557*dfcf9474SSrikanth Yalavarthi 	return 0;
558*dfcf9474SSrikanth Yalavarthi }
559*dfcf9474SSrikanth Yalavarthi 
560*dfcf9474SSrikanth Yalavarthi int
roc_ml_dev_fini(struct roc_ml * roc_ml)561*dfcf9474SSrikanth Yalavarthi roc_ml_dev_fini(struct roc_ml *roc_ml)
562*dfcf9474SSrikanth Yalavarthi {
563*dfcf9474SSrikanth Yalavarthi 	struct ml *ml = roc_ml_to_ml_priv(roc_ml);
564*dfcf9474SSrikanth Yalavarthi 
565*dfcf9474SSrikanth Yalavarthi 	if (ml == NULL)
566*dfcf9474SSrikanth Yalavarthi 		return -EINVAL;
567*dfcf9474SSrikanth Yalavarthi 
568*dfcf9474SSrikanth Yalavarthi 	return 0;
569*dfcf9474SSrikanth Yalavarthi }
570*dfcf9474SSrikanth Yalavarthi 
571*dfcf9474SSrikanth Yalavarthi int
roc_ml_blk_init(struct roc_bphy * roc_bphy,struct roc_ml * roc_ml)572*dfcf9474SSrikanth Yalavarthi roc_ml_blk_init(struct roc_bphy *roc_bphy, struct roc_ml *roc_ml)
573*dfcf9474SSrikanth Yalavarthi {
574*dfcf9474SSrikanth Yalavarthi 	struct dev *dev;
575*dfcf9474SSrikanth Yalavarthi 	struct ml *ml;
576*dfcf9474SSrikanth Yalavarthi 
577*dfcf9474SSrikanth Yalavarthi 	if ((roc_ml == NULL) || (roc_bphy == NULL))
578*dfcf9474SSrikanth Yalavarthi 		return -EINVAL;
579*dfcf9474SSrikanth Yalavarthi 
580*dfcf9474SSrikanth Yalavarthi 	PLT_STATIC_ASSERT(sizeof(struct ml) <= ROC_ML_MEM_SZ);
581*dfcf9474SSrikanth Yalavarthi 
582*dfcf9474SSrikanth Yalavarthi 	ml = roc_ml_to_ml_priv(roc_ml);
583*dfcf9474SSrikanth Yalavarthi 	memset(ml, 0, sizeof(*ml));
584*dfcf9474SSrikanth Yalavarthi 
585*dfcf9474SSrikanth Yalavarthi 	dev = &ml->dev;
586*dfcf9474SSrikanth Yalavarthi 
587*dfcf9474SSrikanth Yalavarthi 	ml->pci_dev = roc_bphy->pci_dev;
588*dfcf9474SSrikanth Yalavarthi 	dev->roc_ml = roc_ml;
589*dfcf9474SSrikanth Yalavarthi 
590*dfcf9474SSrikanth Yalavarthi 	plt_ml_dbg(
591*dfcf9474SSrikanth Yalavarthi 		"MLAB: Physical Address : 0x%016lx",
592*dfcf9474SSrikanth Yalavarthi 		PLT_PTR_ADD_U64_CAST(ml->pci_dev->mem_resource[0].phys_addr, ML_MLAB_BLK_OFFSET));
593*dfcf9474SSrikanth Yalavarthi 	plt_ml_dbg("MLAB: Virtual Address : 0x%016lx",
594*dfcf9474SSrikanth Yalavarthi 		   PLT_PTR_ADD_U64_CAST(ml->pci_dev->mem_resource[0].addr, ML_MLAB_BLK_OFFSET));
595*dfcf9474SSrikanth Yalavarthi 
596*dfcf9474SSrikanth Yalavarthi 	ml->ml_reg_addr = PLT_PTR_ADD(ml->pci_dev->mem_resource[0].addr, ML_MLAB_BLK_OFFSET);
597*dfcf9474SSrikanth Yalavarthi 	ml->ml_mlr_base = 0;
598*dfcf9474SSrikanth Yalavarthi 	ml->ml_mlr_base_saved = false;
599*dfcf9474SSrikanth Yalavarthi 
600*dfcf9474SSrikanth Yalavarthi 	plt_spinlock_init(&roc_ml->sp_spinlock);
601*dfcf9474SSrikanth Yalavarthi 	plt_spinlock_init(&roc_ml->fp_spinlock);
602*dfcf9474SSrikanth Yalavarthi 
603*dfcf9474SSrikanth Yalavarthi 	return 0;
604*dfcf9474SSrikanth Yalavarthi }
605*dfcf9474SSrikanth Yalavarthi 
606*dfcf9474SSrikanth Yalavarthi int
roc_ml_blk_fini(struct roc_bphy * roc_bphy,struct roc_ml * roc_ml)607*dfcf9474SSrikanth Yalavarthi roc_ml_blk_fini(struct roc_bphy *roc_bphy, struct roc_ml *roc_ml)
608*dfcf9474SSrikanth Yalavarthi {
609*dfcf9474SSrikanth Yalavarthi 	struct ml *ml;
610*dfcf9474SSrikanth Yalavarthi 
611*dfcf9474SSrikanth Yalavarthi 	if ((roc_ml == NULL) || (roc_bphy == NULL))
612*dfcf9474SSrikanth Yalavarthi 		return -EINVAL;
613*dfcf9474SSrikanth Yalavarthi 
614*dfcf9474SSrikanth Yalavarthi 	ml = roc_ml_to_ml_priv(roc_ml);
615*dfcf9474SSrikanth Yalavarthi 
616*dfcf9474SSrikanth Yalavarthi 	if (ml == NULL)
617*dfcf9474SSrikanth Yalavarthi 		return -EINVAL;
618*dfcf9474SSrikanth Yalavarthi 
619*dfcf9474SSrikanth Yalavarthi 	return 0;
620*dfcf9474SSrikanth Yalavarthi }
621*dfcf9474SSrikanth Yalavarthi 
622*dfcf9474SSrikanth Yalavarthi uint16_t
roc_ml_sso_pf_func_get(void)623*dfcf9474SSrikanth Yalavarthi roc_ml_sso_pf_func_get(void)
624*dfcf9474SSrikanth Yalavarthi {
625*dfcf9474SSrikanth Yalavarthi 	return idev_sso_pffunc_get();
626*dfcf9474SSrikanth Yalavarthi }
627