Skip to content
Permalink
Browse files
crypto: ccree - add custom cache params from DT file
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 3c84102e6f9ba61d7efbadd1ed836eab947106c1
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 18 deletions.
@@ -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;
@@ -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 */
@@ -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;
}
@@ -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;
@@ -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 {
@@ -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);

@@ -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;

0 comments on commit 3c84102

Please sign in to comment.