crypto/fsl: i.MX8: Enable Job ring driver model.

i.MX8(QM/QXP) - added support for JR driver model.
sec is initialized based on job ring information processed
from device tree.

Signed-off-by: Gaurav Jain <gaurav.jain@nxp.com>
Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
Reviewed-by: Ye Li <ye.li@nxp.com>
This commit is contained in:
Gaurav Jain
2022-03-24 11:50:33 +05:30
committed by Stefano Babic
parent 0b9c444559
commit cb5d0419f5
10 changed files with 91 additions and 16 deletions

View File

@@ -12,7 +12,7 @@ config FSL_CAAM
config CAAM_64BIT
bool
default y if PHYS_64BIT && !ARCH_IMX8M
default y if PHYS_64BIT && !ARCH_IMX8M && !ARCH_IMX8
help
Select Crypto driver for 64 bits CAAM version

View File

@@ -11,6 +11,7 @@
#include <linux/kernel.h>
#include <log.h>
#include <malloc.h>
#include <power-domain.h>
#include "jr.h"
#include "jobdesc.h"
#include "desc_constr.h"
@@ -113,7 +114,9 @@ static void jr_initregs(uint8_t sec_idx, struct caam_regs *caam)
static int jr_init(uint8_t sec_idx, struct caam_regs *caam)
{
struct jobring *jr = &caam->jr[sec_idx];
#if CONFIG_IS_ENABLED(OF_CONTROL)
ofnode scu_node = ofnode_by_compatible(ofnode_null(), "fsl,imx8-mu");
#endif
memset(jr, 0, sizeof(struct jobring));
jr->jq_id = caam->jrid;
@@ -138,7 +141,11 @@ static int jr_init(uint8_t sec_idx, struct caam_regs *caam)
memset(jr->input_ring, 0, JR_SIZE * sizeof(caam_dma_addr_t));
memset(jr->output_ring, 0, jr->op_size);
#if CONFIG_IS_ENABLED(OF_CONTROL)
if (!ofnode_valid(scu_node))
#endif
start_jr(caam);
jr_initregs(sec_idx, caam);
return 0;
@@ -673,6 +680,13 @@ int sec_init_idx(uint8_t sec_idx)
caam_st.jrid = 0;
caam = &caam_st;
#endif
#if CONFIG_IS_ENABLED(OF_CONTROL)
ofnode scu_node = ofnode_by_compatible(ofnode_null(), "fsl,imx8-mu");
if (ofnode_valid(scu_node))
goto init;
#endif
ccsr_sec_t *sec = caam->sec;
uint32_t mcr = sec_in32(&sec->mcfgr);
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_IMX8M)
@@ -734,12 +748,19 @@ int sec_init_idx(uint8_t sec_idx)
liodn_ns = (liodnr & JRNSLIODN_MASK) >> JRNSLIODN_SHIFT;
liodn_s = (liodnr & JRSLIODN_MASK) >> JRSLIODN_SHIFT;
#endif
#endif
#if CONFIG_IS_ENABLED(OF_CONTROL)
init:
#endif
ret = jr_init(sec_idx, caam);
if (ret < 0) {
printf("SEC%u: initialization failed\n", sec_idx);
return -1;
}
#if CONFIG_IS_ENABLED(OF_CONTROL)
if (ofnode_valid(scu_node))
return ret;
#endif
#ifdef CONFIG_FSL_CORENET
ret = sec_config_pamu_table(liodn_ns, liodn_s);
@@ -773,6 +794,23 @@ int sec_init(void)
}
#if CONFIG_IS_ENABLED(DM)
static int jr_power_on(ofnode node)
{
#if CONFIG_IS_ENABLED(POWER_DOMAIN)
struct udevice __maybe_unused jr_dev;
struct power_domain pd;
dev_set_ofnode(&jr_dev, node);
/* Power on Job Ring before access it */
if (!power_domain_get(&jr_dev, &pd)) {
if (power_domain_on(&pd))
return -EINVAL;
}
#endif
return 0;
}
static int caam_jr_ioctl(struct udevice *dev, unsigned long request, void *buf)
{
if (request != CAAM_JR_RUN_DESC)
@@ -785,7 +823,7 @@ static int caam_jr_probe(struct udevice *dev)
{
struct caam_regs *caam = dev_get_priv(dev);
fdt_addr_t addr;
ofnode node;
ofnode node, scu_node;
unsigned int jr_node = 0;
caam_dev = dev;
@@ -810,6 +848,11 @@ static int caam_jr_probe(struct udevice *dev)
jr_node = jr_node >> 4;
caam->jrid = jr_node - 1;
scu_node = ofnode_by_compatible(ofnode_null(), "fsl,imx8-mu");
if (ofnode_valid(scu_node)) {
if (jr_power_on(node))
return -EINVAL;
}
break;
}
}