Skip to content

Commit

Permalink
crypto: ccree - add custom cache params from DT file
Browse files Browse the repository at this point in the history
Add optinal ability to customize DMA transactions cache parameters and
ACE bus sharability properties and set new defaults.

Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
  • Loading branch information
gby authored and intel-lab-lkp committed Sep 16, 2020
1 parent 3743c93 commit 3c84102
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 18 deletions.
89 changes: 73 additions & 16 deletions drivers/crypto/ccree/cc_driver.c
Expand Up @@ -100,6 +100,71 @@ static const struct of_device_id arm_ccree_dev_of_match[] = {
};
MODULE_DEVICE_TABLE(of, arm_ccree_dev_of_match);

static void init_cc_dt_params(struct cc_drvdata *drvdata)
{
struct device *dev = drvdata_to_dev(drvdata);
struct device_node *np = dev->of_node;
u32 cache_params, ace_const, val, mask;
int rc;

/* register CC_AXIM_CACHE_PARAMS */
cache_params = cc_ioread(drvdata, CC_REG(AXIM_CACHE_PARAMS));
dev_dbg(dev, "Cache params previous: 0x%08X\n", cache_params);

rc = of_property_read_u32(np, "awcache", &val);
if (rc)
val = (drvdata->coherent ? 0xb : 0x2);

mask = CC_GENMASK(CC_AXIM_CACHE_PARAMS_AWCACHE);
cache_params &= ~mask;
cache_params |= FIELD_PREP(mask, val);

/* write AWCACHE also to AWCACHE_LAST */
mask = CC_GENMASK(CC_AXIM_CACHE_PARAMS_AWCACHE_LAST);
cache_params &= ~mask;
cache_params |= FIELD_PREP(mask, val);

rc = of_property_read_u32(np, "arcache", &val);
if (rc)
val = (drvdata->coherent ? 0xb : 0x2);

mask = CC_GENMASK(CC_AXIM_CACHE_PARAMS_ARCACHE);
cache_params &= ~mask;
cache_params |= FIELD_PREP(mask, val);

drvdata->cache_params = cache_params;

dev_dbg(dev, "Cache params current: 0x%08X\n", cache_params);

if (drvdata->hw_rev <= CC_HW_REV_710)
return;

/* register CC_AXIM_ACE_CONST */
ace_const = cc_ioread(drvdata, CC_REG(AXIM_ACE_CONST));
dev_dbg(dev, "ACE-const previous: 0x%08X\n", ace_const);

rc = of_property_read_u32(np, "ardomain", &val);
ace_const = cc_ioread(drvdata, CC_REG(AXIM_ACE_CONST));
if (rc)
val = (drvdata->coherent ? 0x2 : 0x3);

mask = CC_GENMASK(CC_AXIM_ACE_CONST_ARDOMAIN);
ace_const &= ~mask;
ace_const |= FIELD_PREP(mask, val);

rc = of_property_read_u32(np, "awdomain", &val);
if (rc)
val = (drvdata->coherent ? 0x2 : 0x3);

mask = CC_GENMASK(CC_AXIM_ACE_CONST_AWDOMAIN);
ace_const &= ~mask;
ace_const |= FIELD_PREP(mask, val);

dev_dbg(dev, "ACE-const current: 0x%08X\n", ace_const);

drvdata->ace_const = ace_const;
}

static u32 cc_read_idr(struct cc_drvdata *drvdata, const u32 *idr_offsets)
{
int i;
Expand Down Expand Up @@ -218,9 +283,9 @@ bool cc_wait_for_reset_completion(struct cc_drvdata *drvdata)
return false;
}

int init_cc_regs(struct cc_drvdata *drvdata, bool is_probe)
int init_cc_regs(struct cc_drvdata *drvdata)
{
unsigned int val, cache_params;
unsigned int val;
struct device *dev = drvdata_to_dev(drvdata);

/* Unmask all AXI interrupt sources AXI_CFG1 register */
Expand All @@ -245,19 +310,9 @@ int init_cc_regs(struct cc_drvdata *drvdata, bool is_probe)

cc_iowrite(drvdata, CC_REG(HOST_IMR), ~val);

cache_params = (drvdata->coherent ? CC_COHERENT_CACHE_PARAMS : 0x0);

val = cc_ioread(drvdata, CC_REG(AXIM_CACHE_PARAMS));

if (is_probe)
dev_dbg(dev, "Cache params previous: 0x%08X\n", val);

cc_iowrite(drvdata, CC_REG(AXIM_CACHE_PARAMS), cache_params);
val = cc_ioread(drvdata, CC_REG(AXIM_CACHE_PARAMS));

if (is_probe)
dev_dbg(dev, "Cache params current: 0x%08X (expect: 0x%08X)\n",
val, cache_params);
cc_iowrite(drvdata, CC_REG(AXIM_CACHE_PARAMS), drvdata->cache_params);
if (drvdata->hw_rev >= CC_HW_REV_712)
cc_iowrite(drvdata, CC_REG(AXIM_ACE_CONST), drvdata->ace_const);

return 0;
}
Expand Down Expand Up @@ -445,7 +500,9 @@ static int init_cc_resources(struct platform_device *plat_dev)
}
dev_dbg(dev, "Registered to IRQ: %d\n", irq);

rc = init_cc_regs(new_drvdata, true);
init_cc_dt_params(new_drvdata);

rc = init_cc_regs(new_drvdata);
if (rc) {
dev_err(dev, "init_cc_regs failed\n");
goto post_pm_err;
Expand Down
4 changes: 3 additions & 1 deletion drivers/crypto/ccree/cc_driver.h
Expand Up @@ -155,6 +155,8 @@ struct cc_drvdata {
int std_bodies;
bool sec_disabled;
u32 comp_mask;
u32 cache_params;
u32 ace_const;
};

struct cc_crypto_alg {
Expand Down Expand Up @@ -205,7 +207,7 @@ static inline void dump_byte_array(const char *name, const u8 *the_array,
}

bool cc_wait_for_reset_completion(struct cc_drvdata *drvdata);
int init_cc_regs(struct cc_drvdata *drvdata, bool is_probe);
int init_cc_regs(struct cc_drvdata *drvdata);
void fini_cc_regs(struct cc_drvdata *drvdata);
unsigned int cc_get_default_hash_len(struct cc_drvdata *drvdata);

Expand Down
2 changes: 1 addition & 1 deletion drivers/crypto/ccree/cc_pm.c
Expand Up @@ -45,7 +45,7 @@ static int cc_pm_resume(struct device *dev)
}

cc_iowrite(drvdata, CC_REG(HOST_POWER_DOWN_EN), POWER_DOWN_DISABLE);
rc = init_cc_regs(drvdata, false);
rc = init_cc_regs(drvdata);
if (rc) {
dev_err(dev, "init_cc_regs (%x)\n", rc);
return rc;
Expand Down

0 comments on commit 3c84102

Please sign in to comment.