kernel: bump 5.4 to 5.4.40
[openwrt/staging/wigyori.git] / target / linux / layerscape / patches-5.4 / 804-crypto-0041-LF-292-2-crypto-caam-add-power-management.patch
1 From e8aeb8bbd925b50555c70ad4be86cf7d8e8767a6 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Horia=20Geant=C4=83?= <horia.geanta@nxp.com>
3 Date: Fri, 21 Feb 2020 11:48:40 +0100
4 Subject: [PATCH] LF-292-2 crypto: caam - add power management
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 Add support for suspend and resume operation for PM in CAAM driver.
10
11 When the CAAM goes in suspend, the hardware is considered to do nothing.
12
13 On some platforms, the power of the CAAM is not turned off so it keeps
14 its configuration.
15
16 On other platforms, it doesn't so it is necessary to save the state of
17 the CAAM:
18 - JRs MID
19 - Address of input and output rings
20
21 Limitation:
22 When the CAAM is powered OFF, it is resetted so the JDKEK and TDKEK
23 changes. This impacts crypto transforms using MDHA split-keys
24 which are kept over suspend as they are encrypted with the JDKEK:
25 - hmac(*) from caamhash.c
26 - authenc(hmac(*),*) from caamalg.c
27 - echainiv(authenc(hmac(*),*)) from caamalg.c
28 The issue was already present in current code so this patch does not
29 add a regression in this regard.
30
31 Reviewed-by: Horia Geantă <horia.geanta@nxp.com>
32 Signed-off-by: Franck LENORMAND <franck.lenormand@nxp.com>
33 (cherry picked from commit c151af80cfda82eae533a80fb2bb0158dffe556d)
34
35 Differences vs. i.MX BSP:
36 -RNG re-initialization done in ctrl, not in jr
37
38 The fix for MLK-22518 (drivers: crypto: caam: jr: Allow quiesce when quiesced)
39 is integrated in this patch.
40
41 Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
42 Signed-off-by: Franck LENORMAND <franck.lenormand@nxp.com>
43 Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
44 Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
45 ---
46 drivers/crypto/caam/ctrl.c | 116 +++++++++++++++++++++++
47 drivers/crypto/caam/intern.h | 31 ++++++
48 drivers/crypto/caam/jr.c | 219 ++++++++++++++++++++++++++++++++++++-------
49 drivers/crypto/caam/regs.h | 3 +-
50 4 files changed, 333 insertions(+), 36 deletions(-)
51
52 --- a/drivers/crypto/caam/ctrl.c
53 +++ b/drivers/crypto/caam/ctrl.c
54 @@ -665,6 +665,115 @@ static int caam_ctrl_rng_init(struct dev
55 return 0;
56 }
57
58 +#ifdef CONFIG_PM_SLEEP
59 +
60 +/* Indicate if the internal state of the CAAM is lost during PM */
61 +static int caam_off_during_pm(void)
62 +{
63 + bool not_off_during_pm = of_machine_is_compatible("fsl,imx6q") ||
64 + of_machine_is_compatible("fsl,imx6qp") ||
65 + of_machine_is_compatible("fsl,imx6dl");
66 +
67 + return not_off_during_pm ? 0 : 1;
68 +}
69 +
70 +static void caam_state_save(struct device *dev)
71 +{
72 + struct caam_drv_private *ctrlpriv = dev_get_drvdata(dev);
73 + struct caam_ctl_state *state = &ctrlpriv->state;
74 + struct caam_ctrl __iomem *ctrl = ctrlpriv->ctrl;
75 + u32 deco_inst, jr_inst;
76 + int i;
77 +
78 + state->mcr = rd_reg32(&ctrl->mcr);
79 + state->scfgr = rd_reg32(&ctrl->scfgr);
80 +
81 + deco_inst = (rd_reg32(&ctrl->perfmon.cha_num_ms) &
82 + CHA_ID_MS_DECO_MASK) >> CHA_ID_MS_DECO_SHIFT;
83 + for (i = 0; i < deco_inst; i++) {
84 + state->deco_mid[i].liodn_ms =
85 + rd_reg32(&ctrl->deco_mid[i].liodn_ms);
86 + state->deco_mid[i].liodn_ls =
87 + rd_reg32(&ctrl->deco_mid[i].liodn_ls);
88 + }
89 +
90 + jr_inst = (rd_reg32(&ctrl->perfmon.cha_num_ms) &
91 + CHA_ID_MS_JR_MASK) >> CHA_ID_MS_JR_SHIFT;
92 + for (i = 0; i < jr_inst; i++) {
93 + state->jr_mid[i].liodn_ms =
94 + rd_reg32(&ctrl->jr_mid[i].liodn_ms);
95 + state->jr_mid[i].liodn_ls =
96 + rd_reg32(&ctrl->jr_mid[i].liodn_ls);
97 + }
98 +}
99 +
100 +static void caam_state_restore(const struct device *dev)
101 +{
102 + const struct caam_drv_private *ctrlpriv = dev_get_drvdata(dev);
103 + const struct caam_ctl_state *state = &ctrlpriv->state;
104 + struct caam_ctrl __iomem *ctrl = ctrlpriv->ctrl;
105 + u32 deco_inst, jr_inst;
106 + int i;
107 +
108 + wr_reg32(&ctrl->mcr, state->mcr);
109 + wr_reg32(&ctrl->scfgr, state->scfgr);
110 +
111 + deco_inst = (rd_reg32(&ctrl->perfmon.cha_num_ms) &
112 + CHA_ID_MS_DECO_MASK) >> CHA_ID_MS_DECO_SHIFT;
113 + for (i = 0; i < deco_inst; i++) {
114 + wr_reg32(&ctrl->deco_mid[i].liodn_ms,
115 + state->deco_mid[i].liodn_ms);
116 + wr_reg32(&ctrl->deco_mid[i].liodn_ls,
117 + state->deco_mid[i].liodn_ls);
118 + }
119 +
120 + jr_inst = (rd_reg32(&ctrl->perfmon.cha_num_ms) &
121 + CHA_ID_MS_JR_MASK) >> CHA_ID_MS_JR_SHIFT;
122 + for (i = 0; i < ctrlpriv->total_jobrs; i++) {
123 + wr_reg32(&ctrl->jr_mid[i].liodn_ms,
124 + state->jr_mid[i].liodn_ms);
125 + wr_reg32(&ctrl->jr_mid[i].liodn_ls,
126 + state->jr_mid[i].liodn_ls);
127 + }
128 +
129 + if (ctrlpriv->virt_en == 1)
130 + clrsetbits_32(&ctrl->jrstart, 0, JRSTART_JR0_START |
131 + JRSTART_JR1_START | JRSTART_JR2_START |
132 + JRSTART_JR3_START);
133 +}
134 +
135 +static int caam_ctrl_suspend(struct device *dev)
136 +{
137 + const struct caam_drv_private *ctrlpriv = dev_get_drvdata(dev);
138 +
139 + if (ctrlpriv->caam_off_during_pm && !ctrlpriv->scu_en &&
140 + !ctrlpriv->optee_en)
141 + caam_state_save(dev);
142 +
143 + return 0;
144 +}
145 +
146 +static int caam_ctrl_resume(struct device *dev)
147 +{
148 + struct caam_drv_private *ctrlpriv = dev_get_drvdata(dev);
149 + int ret = 0;
150 +
151 + if (ctrlpriv->caam_off_during_pm && !ctrlpriv->scu_en &&
152 + !ctrlpriv->optee_en) {
153 + caam_state_restore(dev);
154 +
155 + /* HW and rng will be reset so deinstantiation can be removed */
156 + devm_remove_action(dev, devm_deinstantiate_rng, dev);
157 + ret = caam_ctrl_rng_init(dev);
158 + }
159 +
160 + return ret;
161 +}
162 +
163 +SIMPLE_DEV_PM_OPS(caam_ctrl_pm_ops, caam_ctrl_suspend, caam_ctrl_resume);
164 +
165 +#endif /* CONFIG_PM_SLEEP */
166 +
167 /* Probe routine for CAAM top (controller) level */
168 static int caam_probe(struct platform_device *pdev)
169 {
170 @@ -701,6 +810,10 @@ static int caam_probe(struct platform_de
171 imx_soc_match = soc_device_match(caam_imx_soc_table);
172 caam_imx = (bool)imx_soc_match;
173
174 +#ifdef CONFIG_PM_SLEEP
175 + ctrlpriv->caam_off_during_pm = caam_imx && caam_off_during_pm();
176 +#endif
177 +
178 if (imx_soc_match) {
179 np = of_find_compatible_node(NULL, NULL, "fsl,imx-scu");
180 ctrlpriv->scu_en = !!np;
181 @@ -1049,6 +1162,9 @@ static struct platform_driver caam_drive
182 .driver = {
183 .name = "caam",
184 .of_match_table = caam_match,
185 +#ifdef CONFIG_PM_SLEEP
186 + .pm = &caam_ctrl_pm_ops,
187 +#endif
188 },
189 .probe = caam_probe,
190 };
191 --- a/drivers/crypto/caam/intern.h
192 +++ b/drivers/crypto/caam/intern.h
193 @@ -38,6 +38,18 @@ struct caam_jrentry_info {
194 u32 desc_size; /* Stored size for postprocessing, header derived */
195 };
196
197 +#ifdef CONFIG_PM_SLEEP
198 +struct caam_jr_state {
199 + dma_addr_t inpbusaddr;
200 + dma_addr_t outbusaddr;
201 +};
202 +#endif
203 +
204 +struct caam_jr_dequeue_params {
205 + struct device *dev;
206 + int enable_itr;
207 +};
208 +
209 /* Private sub-storage for a single JobR */
210 struct caam_drv_private_jr {
211 struct list_head list_node; /* Job Ring device list */
212 @@ -45,6 +57,7 @@ struct caam_drv_private_jr {
213 int ridx;
214 struct caam_job_ring __iomem *rregs; /* JobR's register space */
215 struct tasklet_struct irqtask;
216 + struct caam_jr_dequeue_params tasklet_params;
217 int irq; /* One per queue */
218
219 /* Number of scatterlist crypt transforms active on the JobR */
220 @@ -60,7 +73,20 @@ struct caam_drv_private_jr {
221 int out_ring_read_index; /* Output index "tail" */
222 int tail; /* entinfo (s/w ring) tail index */
223 void *outring; /* Base of output ring, DMA-safe */
224 +
225 +#ifdef CONFIG_PM_SLEEP
226 + struct caam_jr_state state; /* State of the JR during PM */
227 +#endif
228 +};
229 +
230 +#ifdef CONFIG_PM_SLEEP
231 +struct caam_ctl_state {
232 + struct masterid deco_mid[16];
233 + struct masterid jr_mid[4];
234 + u32 mcr;
235 + u32 scfgr;
236 };
237 +#endif
238
239 /*
240 * Driver-private storage for a single CAAM block instance
241 @@ -109,6 +135,11 @@ struct caam_drv_private {
242 struct dentry *ctl; /* controller dir */
243 struct debugfs_blob_wrapper ctl_kek_wrap, ctl_tkek_wrap, ctl_tdsk_wrap;
244 #endif
245 +
246 +#ifdef CONFIG_PM_SLEEP
247 + int caam_off_during_pm; /* If the CAAM is reset after suspend */
248 + struct caam_ctl_state state; /* State of the CTL during PM */
249 +#endif
250 };
251
252 #ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API
253 --- a/drivers/crypto/caam/jr.c
254 +++ b/drivers/crypto/caam/jr.c
255 @@ -72,19 +72,27 @@ int caam_jr_driver_probed(void)
256 }
257 EXPORT_SYMBOL(caam_jr_driver_probed);
258
259 -static int caam_reset_hw_jr(struct device *dev)
260 +/*
261 + * Put the CAAM in quiesce, ie stop
262 + *
263 + * Must be called with itr disabled
264 + */
265 +static int caam_jr_stop_processing(struct device *dev, u32 jrcr_bits)
266 {
267 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
268 unsigned int timeout = 100000;
269
270 - /*
271 - * mask interrupts since we are going to poll
272 - * for reset completion status
273 - */
274 - clrsetbits_32(&jrp->rregs->rconfig_lo, 0, JRCFG_IMSK);
275 + /* Check the current status */
276 + if (rd_reg32(&jrp->rregs->jrintstatus) & JRINT_ERR_HALT_INPROGRESS)
277 + goto wait_quiesce_completion;
278
279 - /* initiate flush (required prior to reset) */
280 - wr_reg32(&jrp->rregs->jrcommand, JRCR_RESET);
281 + /* Reset the field */
282 + clrsetbits_32(&jrp->rregs->jrintstatus, JRINT_ERR_HALT_MASK, 0);
283 +
284 + /* initiate flush / park (required prior to reset) */
285 + wr_reg32(&jrp->rregs->jrcommand, jrcr_bits);
286 +
287 +wait_quiesce_completion:
288 while (((rd_reg32(&jrp->rregs->jrintstatus) & JRINT_ERR_HALT_MASK) ==
289 JRINT_ERR_HALT_INPROGRESS) && --timeout)
290 cpu_relax();
291 @@ -95,8 +103,56 @@ static int caam_reset_hw_jr(struct devic
292 return -EIO;
293 }
294
295 + return 0;
296 +}
297 +
298 +/*
299 + * Flush the job ring, so the jobs running will be stopped, jobs queued will be
300 + * invalidated and the CAAM will no longer fetch fron input ring.
301 + *
302 + * Must be called with itr disabled
303 + */
304 +static int caam_jr_flush(struct device *dev)
305 +{
306 + return caam_jr_stop_processing(dev, JRCR_RESET);
307 +}
308 +
309 +#ifdef CONFIG_PM_SLEEP
310 +/* The resume can be used after a park or a flush if CAAM has not been reset */
311 +static int caam_jr_restart_processing(struct device *dev)
312 +{
313 + struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
314 + u32 halt_status = rd_reg32(&jrp->rregs->jrintstatus) &
315 + JRINT_ERR_HALT_MASK;
316 +
317 + /* Check that the flush/park is completed */
318 + if (halt_status != JRINT_ERR_HALT_COMPLETE)
319 + return -1;
320 +
321 + /* Resume processing of jobs */
322 + clrsetbits_32(&jrp->rregs->jrintstatus, 0, JRINT_ERR_HALT_COMPLETE);
323 +
324 + return 0;
325 +}
326 +#endif /* CONFIG_PM_SLEEP */
327 +
328 +static int caam_reset_hw_jr(struct device *dev)
329 +{
330 + struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
331 + unsigned int timeout = 100000;
332 + int err;
333 +
334 + /*
335 + * mask interrupts since we are going to poll
336 + * for reset completion status
337 + */
338 + clrsetbits_32(&jrp->rregs->rconfig_lo, 0, JRCFG_IMSK);
339 +
340 + err = caam_jr_flush(dev);
341 + if (err)
342 + return err;
343 +
344 /* initiate reset */
345 - timeout = 100000;
346 wr_reg32(&jrp->rregs->jrcommand, JRCR_RESET);
347 while ((rd_reg32(&jrp->rregs->jrcommand) & JRCR_RESET) && --timeout)
348 cpu_relax();
349 @@ -204,7 +260,8 @@ static irqreturn_t caam_jr_interrupt(int
350 static void caam_jr_dequeue(unsigned long devarg)
351 {
352 int hw_idx, sw_idx, i, head, tail;
353 - struct device *dev = (struct device *)devarg;
354 + struct caam_jr_dequeue_params *params = (void *)devarg;
355 + struct device *dev = params->dev;
356 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
357 void (*usercall)(struct device *dev, u32 *desc, u32 status, void *arg);
358 u32 *userdesc, userstatus;
359 @@ -278,8 +335,9 @@ static void caam_jr_dequeue(unsigned lon
360 outring_used--;
361 }
362
363 - /* reenable / unmask IRQs */
364 - clrsetbits_32(&jrp->rregs->rconfig_lo, JRCFG_IMSK, 0);
365 + if (params->enable_itr)
366 + /* reenable / unmask IRQs */
367 + clrsetbits_32(&jrp->rregs->rconfig_lo, JRCFG_IMSK, 0);
368 }
369
370 /**
371 @@ -467,6 +525,29 @@ int caam_jr_enqueue(struct device *dev,
372 }
373 EXPORT_SYMBOL(caam_jr_enqueue);
374
375 +static void caam_jr_init_hw(struct device *dev, dma_addr_t inpbusaddr,
376 + dma_addr_t outbusaddr)
377 +{
378 + struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
379 +
380 + wr_reg64(&jrp->rregs->inpring_base, inpbusaddr);
381 + wr_reg64(&jrp->rregs->outring_base, outbusaddr);
382 + wr_reg32(&jrp->rregs->inpring_size, JOBR_DEPTH);
383 + wr_reg32(&jrp->rregs->outring_size, JOBR_DEPTH);
384 +
385 + /* Select interrupt coalescing parameters */
386 + clrsetbits_32(&jrp->rregs->rconfig_lo, 0, JOBR_INTC |
387 + (JOBR_INTC_COUNT_THLD << JRCFG_ICDCT_SHIFT) |
388 + (JOBR_INTC_TIME_THLD << JRCFG_ICTT_SHIFT));
389 +}
390 +
391 +static void caam_jr_reset_index(struct caam_drv_private_jr *jrp)
392 +{
393 + jrp->out_ring_read_index = 0;
394 + jrp->head = 0;
395 + jrp->tail = 0;
396 +}
397 +
398 /*
399 * Init JobR independent of platform property detection
400 */
401 @@ -503,25 +584,16 @@ static int caam_jr_init(struct device *d
402 jrp->entinfo[i].desc_addr_dma = !0;
403
404 /* Setup rings */
405 - jrp->out_ring_read_index = 0;
406 - jrp->head = 0;
407 - jrp->tail = 0;
408 -
409 - wr_reg64(&jrp->rregs->inpring_base, inpbusaddr);
410 - wr_reg64(&jrp->rregs->outring_base, outbusaddr);
411 - wr_reg32(&jrp->rregs->inpring_size, JOBR_DEPTH);
412 - wr_reg32(&jrp->rregs->outring_size, JOBR_DEPTH);
413 -
414 + caam_jr_reset_index(jrp);
415 jrp->inpring_avail = JOBR_DEPTH;
416 + caam_jr_init_hw(dev, inpbusaddr, outbusaddr);
417
418 spin_lock_init(&jrp->inplock);
419
420 - /* Select interrupt coalescing parameters */
421 - clrsetbits_32(&jrp->rregs->rconfig_lo, 0, JOBR_INTC |
422 - (JOBR_INTC_COUNT_THLD << JRCFG_ICDCT_SHIFT) |
423 - (JOBR_INTC_TIME_THLD << JRCFG_ICTT_SHIFT));
424 -
425 - tasklet_init(&jrp->irqtask, caam_jr_dequeue, (unsigned long)dev);
426 + jrp->tasklet_params.dev = dev;
427 + jrp->tasklet_params.enable_itr = 1;
428 + tasklet_init(&jrp->irqtask, caam_jr_dequeue,
429 + (unsigned long)&jrp->tasklet_params);
430
431 /* Connect job ring interrupt handler. */
432 error = devm_request_irq(dev, jrp->irq, caam_jr_interrupt, IRQF_SHARED,
433 @@ -620,14 +692,48 @@ static int caam_jr_probe(struct platform
434 return 0;
435 }
436
437 -#ifdef CONFIG_PM
438 +#ifdef CONFIG_PM_SLEEP
439 +static void caam_jr_get_hw_state(struct device *dev)
440 +{
441 + struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
442 +
443 + jrp->state.inpbusaddr = rd_reg64(&jrp->rregs->inpring_base);
444 + jrp->state.outbusaddr = rd_reg64(&jrp->rregs->outring_base);
445 +}
446 +
447 static int caam_jr_suspend(struct device *dev)
448 {
449 struct platform_device *pdev = to_platform_device(dev);
450 struct caam_drv_private_jr *jrpriv = platform_get_drvdata(pdev);
451 + struct caam_drv_private *ctrlpriv = dev_get_drvdata(dev->parent);
452 + struct caam_jr_dequeue_params suspend_params = {
453 + .dev = dev,
454 + .enable_itr = 0,
455 + };
456 +
457 + if (ctrlpriv->caam_off_during_pm) {
458 + int err;
459 +
460 + tasklet_disable(&jrpriv->irqtask);
461 +
462 + /* mask itr to call flush */
463 + clrsetbits_32(&jrpriv->rregs->rconfig_lo, 0, JRCFG_IMSK);
464 +
465 + /* Invalid job in process */
466 + err = caam_jr_flush(dev);
467 + if (err) {
468 + dev_err(dev, "Failed to flush\n");
469 + return err;
470 + }
471 +
472 + /* Dequeing jobs flushed */
473 + caam_jr_dequeue((unsigned long)&suspend_params);
474
475 - if (device_may_wakeup(&pdev->dev))
476 + /* Save state */
477 + caam_jr_get_hw_state(dev);
478 + } else if (device_may_wakeup(&pdev->dev)) {
479 enable_irq_wake(jrpriv->irq);
480 + }
481
482 return 0;
483 }
484 @@ -636,16 +742,61 @@ static int caam_jr_resume(struct device
485 {
486 struct platform_device *pdev = to_platform_device(dev);
487 struct caam_drv_private_jr *jrpriv = platform_get_drvdata(pdev);
488 + struct caam_drv_private *ctrlpriv = dev_get_drvdata(dev->parent);
489
490 - if (device_may_wakeup(&pdev->dev))
491 + if (ctrlpriv->caam_off_during_pm) {
492 + u64 inp_addr;
493 + int err;
494 +
495 + /*
496 + * Check if the CAAM has been resetted checking the address of
497 + * the input ring
498 + */
499 + inp_addr = rd_reg64(&jrpriv->rregs->inpring_base);
500 + if (inp_addr != 0) {
501 + /* JR still has some configuration */
502 + if (inp_addr == jrpriv->state.inpbusaddr) {
503 + /* JR has not been resetted */
504 + err = caam_jr_restart_processing(dev);
505 + if (err) {
506 + dev_err(dev,
507 + "Restart processing failed\n");
508 + return err;
509 + }
510 +
511 + tasklet_enable(&jrpriv->irqtask);
512 +
513 + clrsetbits_32(&jrpriv->rregs->rconfig_lo,
514 + JRCFG_IMSK, 0);
515 +
516 + return 0;
517 + } else if (ctrlpriv->optee_en) {
518 + /* JR has been used by OPTEE, reset it */
519 + err = caam_reset_hw_jr(dev);
520 + if (err) {
521 + dev_err(dev, "Failed to reset JR\n");
522 + return err;
523 + }
524 + } else {
525 + /* No explanation, return error */
526 + return -EIO;
527 + }
528 + }
529 +
530 + caam_jr_reset_index(jrpriv);
531 + caam_jr_init_hw(dev, jrpriv->state.inpbusaddr,
532 + jrpriv->state.outbusaddr);
533 +
534 + tasklet_enable(&jrpriv->irqtask);
535 + } else if (device_may_wakeup(&pdev->dev)) {
536 disable_irq_wake(jrpriv->irq);
537 + }
538
539 return 0;
540 }
541
542 -static SIMPLE_DEV_PM_OPS(caam_jr_pm_ops, caam_jr_suspend,
543 - caam_jr_resume);
544 -#endif
545 +SIMPLE_DEV_PM_OPS(caam_jr_pm_ops, caam_jr_suspend, caam_jr_resume);
546 +#endif /* CONFIG_PM_SLEEP */
547
548 static const struct of_device_id caam_jr_match[] = {
549 {
550 @@ -662,7 +813,7 @@ static struct platform_driver caam_jr_dr
551 .driver = {
552 .name = "caam_jr",
553 .of_match_table = caam_jr_match,
554 -#ifdef CONFIG_PM
555 +#ifdef CONFIG_PM_SLEEP
556 .pm = &caam_jr_pm_ops,
557 #endif
558 },
559 --- a/drivers/crypto/caam/regs.h
560 +++ b/drivers/crypto/caam/regs.h
561 @@ -631,8 +631,7 @@ struct caam_ctrl {
562 u32 deco_rsr; /* DECORSR - Deco Request Source */
563 u32 rsvd11;
564 u32 deco_rq; /* DECORR - DECO Request */
565 - struct masterid deco_mid[5]; /* DECOxLIODNR - 1 per DECO */
566 - u32 rsvd5[22];
567 + struct masterid deco_mid[16]; /* DECOxLIODNR - 1 per DECO */
568
569 /* DECO Availability/Reset Section 120-3ff */
570 u32 deco_avail; /* DAR - DECO availability */