Skip to content

Commit 67c2315

Browse files
horiagherbertx
authored andcommitted
crypto: caam - add Queue Interface (QI) backend support
CAAM engine supports two interfaces for crypto job submission: -job ring interface - already existing caam/jr driver -Queue Interface (QI) - caam/qi driver added in current patch QI is present in CAAM engines found on DPAA platforms. QI gets its I/O (frame descriptors) from QMan (Queue Manager) queues. This patch adds a platform device for accessing CAAM's queue interface. The requests are submitted to CAAM using one frame queue per cryptographic context. Each crypto context has one shared descriptor. This shared descriptor is attached to frame queue associated with corresponding driver context using context_a. The driver hides the mechanics of FQ creation, initialisation from its applications. Each cryptographic context needs to be associated with driver context which houses the FQ to be used to transport the job to CAAM. The driver provides API for: (a) Context creation (b) Job submission (c) Context deletion (d) Congestion indication - whether path to/from CAAM is congested The driver supports affining its context to a particular CPU. This means that any responses from CAAM for the context in question would arrive at the given CPU. This helps in implementing one CPU per packet round trip in IPsec application. The driver processes CAAM responses under NAPI contexts. NAPI contexts are instantiated only on cores with affined portals since only cores having their own portal can receive responses from DQRR. The responses from CAAM for all cryptographic contexts ride on a fixed set of FQs. We use one response FQ per portal owning core. The response FQ is configured in each core's and thus portal's dedicated channel. This gives the flexibility to direct CAAM's responses for a crypto context on a given core. Signed-off-by: Vakul Garg <vakul.garg@nxp.com> Signed-off-by: Alex Porosanu <alexandru.porosanu@nxp.com> Signed-off-by: Horia Geantă <horia.geanta@nxp.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent cd37369 commit 67c2315

File tree

5 files changed

+1064
-28
lines changed

5 files changed

+1064
-28
lines changed

drivers/crypto/caam/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,7 @@ obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_PKC_API) += caam_pkc.o
1616
caam-objs := ctrl.o
1717
caam_jr-objs := jr.o key_gen.o error.o
1818
caam_pkc-y := caampkc.o pkc_desc.o
19+
ifneq ($(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_QI),)
20+
ccflags-y += -DCONFIG_CAAM_QI
21+
caam-objs += qi.o
22+
endif

drivers/crypto/caam/ctrl.c

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
bool caam_little_end;
1919
EXPORT_SYMBOL(caam_little_end);
2020

21+
#ifdef CONFIG_CAAM_QI
22+
#include "qi.h"
23+
#endif
24+
2125
/*
2226
* i.MX targets tend to have clock control subsystems that can
2327
* enable/disable clocking to our device.
@@ -311,6 +315,11 @@ static int caam_remove(struct platform_device *pdev)
311315
for (ring = 0; ring < ctrlpriv->total_jobrs; ring++)
312316
of_device_unregister(ctrlpriv->jrpdev[ring]);
313317

318+
#ifdef CONFIG_CAAM_QI
319+
if (ctrlpriv->qidev)
320+
caam_qi_shutdown(ctrlpriv->qidev);
321+
#endif
322+
314323
/* De-initialize RNG state handles initialized by this driver. */
315324
if (ctrlpriv->rng4_sh_init)
316325
deinstantiate_rng(ctrldev, ctrlpriv->rng4_sh_init);
@@ -401,23 +410,6 @@ int caam_get_era(void)
401410
}
402411
EXPORT_SYMBOL(caam_get_era);
403412

404-
#ifdef CONFIG_DEBUG_FS
405-
static int caam_debugfs_u64_get(void *data, u64 *val)
406-
{
407-
*val = caam64_to_cpu(*(u64 *)data);
408-
return 0;
409-
}
410-
411-
static int caam_debugfs_u32_get(void *data, u64 *val)
412-
{
413-
*val = caam32_to_cpu(*(u32 *)data);
414-
return 0;
415-
}
416-
417-
DEFINE_SIMPLE_ATTRIBUTE(caam_fops_u32_ro, caam_debugfs_u32_get, NULL, "%llu\n");
418-
DEFINE_SIMPLE_ATTRIBUTE(caam_fops_u64_ro, caam_debugfs_u64_get, NULL, "%llu\n");
419-
#endif
420-
421413
/* Probe routine for CAAM top (controller) level */
422414
static int caam_probe(struct platform_device *pdev)
423415
{
@@ -615,6 +607,17 @@ static int caam_probe(struct platform_device *pdev)
615607
goto iounmap_ctrl;
616608
}
617609

610+
#ifdef CONFIG_DEBUG_FS
611+
/*
612+
* FIXME: needs better naming distinction, as some amalgamation of
613+
* "caam" and nprop->full_name. The OF name isn't distinctive,
614+
* but does separate instances
615+
*/
616+
perfmon = (struct caam_perfmon __force *)&ctrl->perfmon;
617+
618+
ctrlpriv->dfs_root = debugfs_create_dir(dev_name(dev), NULL);
619+
ctrlpriv->ctl = debugfs_create_dir("ctl", ctrlpriv->dfs_root);
620+
#endif
618621
ring = 0;
619622
ridx = 0;
620623
ctrlpriv->total_jobrs = 0;
@@ -650,6 +653,13 @@ static int caam_probe(struct platform_device *pdev)
650653
);
651654
/* This is all that's required to physically enable QI */
652655
wr_reg32(&ctrlpriv->qi->qi_control_lo, QICTL_DQEN);
656+
657+
/* If QMAN driver is present, init CAAM-QI backend */
658+
#ifdef CONFIG_CAAM_QI
659+
ret = caam_qi_init(pdev);
660+
if (ret)
661+
dev_err(dev, "caam qi i/f init failed: %d\n", ret);
662+
#endif
653663
}
654664

655665
/* If no QI and no rings specified, quit and go home */
@@ -737,17 +747,6 @@ static int caam_probe(struct platform_device *pdev)
737747
ctrlpriv->total_jobrs, ctrlpriv->qi_present);
738748

739749
#ifdef CONFIG_DEBUG_FS
740-
/*
741-
* FIXME: needs better naming distinction, as some amalgamation of
742-
* "caam" and nprop->full_name. The OF name isn't distinctive,
743-
* but does separate instances
744-
*/
745-
perfmon = (struct caam_perfmon __force *)&ctrl->perfmon;
746-
747-
ctrlpriv->dfs_root = debugfs_create_dir(dev_name(dev), NULL);
748-
ctrlpriv->ctl = debugfs_create_dir("ctl", ctrlpriv->dfs_root);
749-
750-
/* Controller-level - performance monitor counters */
751750

752751
ctrlpriv->ctl_rq_dequeued =
753752
debugfs_create_file("rq_dequeued",
@@ -830,6 +829,9 @@ static int caam_probe(struct platform_device *pdev)
830829
return 0;
831830

832831
caam_remove:
832+
#ifdef CONFIG_DEBUG_FS
833+
debugfs_remove_recursive(ctrlpriv->dfs_root);
834+
#endif
833835
caam_remove(pdev);
834836
return ret;
835837

drivers/crypto/caam/intern.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ struct caam_drv_private {
6767

6868
struct device *dev;
6969
struct platform_device **jrpdev; /* Alloc'ed array per sub-device */
70+
#ifdef CONFIG_CAAM_QI
71+
struct device *qidev;
72+
#endif
7073
struct platform_device *pdev;
7174

7275
/* Physical-presence section */
@@ -110,9 +113,30 @@ struct caam_drv_private {
110113

111114
struct debugfs_blob_wrapper ctl_kek_wrap, ctl_tkek_wrap, ctl_tdsk_wrap;
112115
struct dentry *ctl_kek, *ctl_tkek, *ctl_tdsk;
116+
#ifdef CONFIG_CAAM_QI
117+
struct dentry *qi_congested;
118+
#endif
113119
#endif
114120
};
115121

116122
void caam_jr_algapi_init(struct device *dev);
117123
void caam_jr_algapi_remove(struct device *dev);
124+
125+
#ifdef CONFIG_DEBUG_FS
126+
static int caam_debugfs_u64_get(void *data, u64 *val)
127+
{
128+
*val = caam64_to_cpu(*(u64 *)data);
129+
return 0;
130+
}
131+
132+
static int caam_debugfs_u32_get(void *data, u64 *val)
133+
{
134+
*val = caam32_to_cpu(*(u32 *)data);
135+
return 0;
136+
}
137+
138+
DEFINE_SIMPLE_ATTRIBUTE(caam_fops_u32_ro, caam_debugfs_u32_get, NULL, "%llu\n");
139+
DEFINE_SIMPLE_ATTRIBUTE(caam_fops_u64_ro, caam_debugfs_u64_get, NULL, "%llu\n");
140+
#endif
141+
118142
#endif /* INTERN_H */

0 commit comments

Comments
 (0)