diff options
Diffstat (limited to 'drivers/crypto/caam/ctrl.c')
-rw-r--r-- | drivers/crypto/caam/ctrl.c | 87 |
1 files changed, 46 insertions, 41 deletions
diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c index 8ce9a859e1..0baddf733e 100644 --- a/drivers/crypto/caam/ctrl.c +++ b/drivers/crypto/caam/ctrl.c @@ -20,6 +20,9 @@ #include "error.h" #include "ctrl.h" +bool caam_little_end; +EXPORT_SYMBOL(caam_little_end); + /* * Descriptor to instantiate RNG State Handle 0 in normal mode and * load the JDKEK, TDKEK and TDSK registers @@ -83,10 +86,10 @@ static inline int run_descriptor_deco0(struct device_d *ctrldev, u32 *desc, deco = ctrlpriv->deco; if (ctrlpriv->virt_en == 1) { - setbits32(&ctrl->deco_rsr, DECORSR_JR0); + clrsetbits_32(&ctrl->deco_rsr, 0, DECORSR_JR0); start = get_time_ns(); - while (!(readl(&ctrl->deco_rsr) & DECORSR_VALID)) { + while (!(rd_reg32(&ctrl->deco_rsr) & DECORSR_VALID)) { if (is_timeout(start, 100 * MSECOND)) { dev_err(ctrldev, "DECO timed out\n"); return -ETIMEDOUT; @@ -94,19 +97,19 @@ static inline int run_descriptor_deco0(struct device_d *ctrldev, u32 *desc, } } - setbits32(&ctrl->deco_rq, DECORR_RQD0ENABLE); + clrsetbits_32(&ctrl->deco_rq, 0, DECORR_RQD0ENABLE); start = get_time_ns(); - while (!(readl(&ctrl->deco_rq) & DECORR_DEN0)) { + while (!(rd_reg32(&ctrl->deco_rq) & DECORR_DEN0)) { if (is_timeout(start, 100 * MSECOND)) { dev_err(ctrldev, "failed to acquire DECO 0\n"); - clrbits32(&ctrl->deco_rq, DECORR_RQD0ENABLE); + clrsetbits_32(&ctrl->deco_rq, DECORR_RQD0ENABLE, 0); return -ETIMEDOUT; } } for (i = 0; i < desc_len(desc); i++) - writel(*(desc + i), &deco->descbuf[i]); + wr_reg32(&deco->descbuf[i], caam32_to_cpu(*(desc + i))); flags = DECO_JQCR_WHL; /* @@ -117,10 +120,10 @@ static inline int run_descriptor_deco0(struct device_d *ctrldev, u32 *desc, flags |= DECO_JQCR_FOUR; /* Instruct the DECO to execute it */ - setbits32(&deco->jr_ctl_hi, flags); + clrsetbits_32(&deco->jr_ctl_hi, 0, flags); start = get_time_ns(); - while ((deco_dbg_reg = readl(&deco->desc_dbg)) & + while ((deco_dbg_reg = rd_reg32(&deco->desc_dbg)) & DESC_DBG_DECO_STAT_VALID) { /* * If an error occured in the descriptor, then @@ -131,14 +134,14 @@ static inline int run_descriptor_deco0(struct device_d *ctrldev, u32 *desc, break; } - *status = readl(&deco->op_status_hi) & + *status = rd_reg32(&deco->op_status_hi) & DECO_OP_STATUS_HI_ERR_MASK; if (ctrlpriv->virt_en == 1) - clrbits32(&ctrl->deco_rsr, DECORSR_JR0); + clrsetbits_32(&ctrl->deco_rsr, DECORSR_JR0, 0); /* Mark the DECO as free */ - clrbits32(&ctrl->deco_rq, DECORR_RQD0ENABLE); + clrsetbits_32(&ctrl->deco_rq, DECORR_RQD0ENABLE, 0); if (is_timeout(start, 100 * MSECOND)) return -EAGAIN; @@ -199,7 +202,7 @@ static int instantiate_rng(struct device_d *ctrldev, int state_handle_mask, * without any error (HW optimizations for later * CAAM eras), then try again. */ - rdsta_val = readl(&ctrl->r4tst[0].rdsta) & RDSTA_IFMASK; + rdsta_val = rd_reg32(&ctrl->r4tst[0].rdsta) & RDSTA_IFMASK; if ((status && status != JRSTA_SSRC_JUMP_HALT_CC) || !(rdsta_val & (1 << sh_idx))) ret = -EAGAIN; @@ -241,7 +244,7 @@ static void kick_trng(struct device_d *ctrldev, int ent_delay) r4tst = &ctrl->r4tst[0]; /* put RNG4 into program mode */ - setbits32(&r4tst->rtmctl, RTMCTL_PRGM); + clrsetbits_32(&r4tst->rtmctl, 0, RTMCTL_PRGM); /* * Performance-wise, it does not make sense to @@ -251,33 +254,33 @@ static void kick_trng(struct device_d *ctrldev, int ent_delay) * time trying to set the values controlling the sample * frequency, the function simply returns. */ - val = (readl(&r4tst->rtsdctl) & RTSDCTL_ENT_DLY_MASK) + val = (rd_reg32(&r4tst->rtsdctl) & RTSDCTL_ENT_DLY_MASK) >> RTSDCTL_ENT_DLY_SHIFT; if (ent_delay <= val) { /* put RNG4 into run mode */ - clrbits32(&r4tst->rtmctl, RTMCTL_PRGM); + clrsetbits_32(&r4tst->rtmctl, RTMCTL_PRGM, 0); return; } - val = readl(&r4tst->rtsdctl); + val = rd_reg32(&r4tst->rtsdctl); val = (val & ~RTSDCTL_ENT_DLY_MASK) | (ent_delay << RTSDCTL_ENT_DLY_SHIFT); - writel(val, &r4tst->rtsdctl); + wr_reg32(&r4tst->rtsdctl, val); /* min. freq. count, equal to 1/4 of the entropy sample length */ - writel(ent_delay >> 2, &r4tst->rtfrqmin); + wr_reg32(&r4tst->rtfrqmin, ent_delay >> 2); /* disable maximum frequency count */ - writel(RTFRQMAX_DISABLE, &r4tst->rtfrqmax); + wr_reg32(&r4tst->rtfrqmax, RTFRQMAX_DISABLE); /* read the control register */ - val = readl(&r4tst->rtmctl); + val = rd_reg32(&r4tst->rtmctl); /* * select raw sampling in both entropy shifter * and statistical checker */ - setbits32(&val, RTMCTL_SAMP_MODE_RAW_ES_SC); + clrsetbits_32(&val, 0, RTMCTL_SAMP_MODE_RAW_ES_SC); /* put RNG4 into run mode */ - clrbits32(&val, RTMCTL_PRGM); + clrsetbits_32(&val, RTMCTL_PRGM, 0); /* write back the control register */ - writel(val, &r4tst->rtmctl); + wr_reg32(&r4tst->rtmctl, val); } /** @@ -379,8 +382,12 @@ static int caam_probe(struct device_d *dev) dev_err(dev, "caam: of_iomap() failed\n"); return -ENOMEM; } + + caam_little_end = !(bool)(rd_reg32(&ctrl->perfmon.status) & + (CSTA_PLEND | CSTA_ALT_PLEND)); + /* Finding the page size for using the CTPR_MS register */ - comp_params = readl(&ctrl->perfmon.comp_parms_ms); + comp_params = rd_reg32(&ctrl->perfmon.comp_parms_ms); pg_size = (comp_params & CTPR_MS_PG_SZ_MASK) >> CTPR_MS_PG_SZ_SHIFT; /* Allocating the BLOCK_OFFSET based on the supported page size on @@ -403,7 +410,7 @@ static int caam_probe(struct device_d *dev) * Enable DECO watchdogs and, if this is a PHYS_ADDR_T_64BIT kernel, * long pointers in master configuration register */ - clrsetbits_be32(&ctrl->mcr, MCFGR_AWCACHE_MASK | MCFGR_ARCACHE_MASK, + clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK | MCFGR_ARCACHE_MASK, MCFGR_AWCACHE_CACH | MCFGR_ARCACHE_MASK | MCFGR_WDENABLE | (sizeof(dma_addr_t) == sizeof(u64) ? MCFGR_LONG_PTR : 0)); @@ -412,7 +419,7 @@ static int caam_probe(struct device_d *dev) * Read the Compile Time paramters and SCFGR to determine * if Virtualization is enabled for this platform */ - scfgr = readl(&ctrl->scfgr); + scfgr = rd_reg32(&ctrl->scfgr); ctrlpriv->virt_en = 0; if (comp_params & CTPR_MS_VIRT_EN_INCL) { @@ -430,9 +437,9 @@ static int caam_probe(struct device_d *dev) } if (ctrlpriv->virt_en == 1) - setbits32(&ctrl->jrstart, JRSTART_JR0_START | - JRSTART_JR1_START | JRSTART_JR2_START | - JRSTART_JR3_START); + clrsetbits_32(&ctrl->jrstart, 0, JRSTART_JR0_START | + JRSTART_JR1_START | JRSTART_JR2_START | + JRSTART_JR3_START); /* * ERRATA: mx6 devices have an issue wherein AXI bus transactions @@ -443,8 +450,8 @@ static int caam_probe(struct device_d *dev) * to a depth of 1 (from it's default of 4) to preclude this situation * from occurring. */ - writel((readl(&ctrl->mcr) & ~(MCFGR_AXIPIPE_MASK)) | - ((1 << MCFGR_AXIPIPE_SHIFT) & MCFGR_AXIPIPE_MASK), &ctrl->mcr); + wr_reg32(&ctrl->mcr, (rd_reg32(&ctrl->mcr) & ~(MCFGR_AXIPIPE_MASK)) | + ((1 << MCFGR_AXIPIPE_SHIFT) & MCFGR_AXIPIPE_MASK)); /* * Detect and enable JobRs @@ -487,15 +494,13 @@ static int caam_probe(struct device_d *dev) } /* Check to see if QI present. If so, enable */ - ctrlpriv->qi_present = - !!(readl(&ctrl->perfmon.comp_parms_ms) & - CTPR_MS_QI_MASK); + ctrlpriv->qi_present = !!(comp_params & CTPR_MS_QI_MASK); if (ctrlpriv->qi_present) { ctrlpriv->qi = (struct caam_queue_if __force *) ((uint8_t *)ctrl + BLOCK_OFFSET * QI_BLOCK_NUMBER); /* This is all that's required to physically enable QI */ - writel(QICTL_DQEN, &ctrlpriv->qi->qi_control_lo); + wr_reg32(&ctrlpriv->qi->qi_control_lo, QICTL_DQEN); } /* If no QI and no rings specified, quit and go home */ @@ -505,7 +510,7 @@ static int caam_probe(struct device_d *dev) return -ENOMEM; } - cha_vid_ls = readl(&ctrl->perfmon.cha_id_ls); + cha_vid_ls = rd_reg32(&ctrl->perfmon.cha_id_ls); /* * If SEC has RNG version >= 4 and RNG state handle has not been @@ -513,7 +518,7 @@ static int caam_probe(struct device_d *dev) */ if ((cha_vid_ls & CHA_ID_LS_RNG_MASK) >> CHA_ID_LS_RNG_SHIFT >= 4) { ctrlpriv->rng4_sh_init = - readl(&ctrl->r4tst[0].rdsta); + rd_reg32(&ctrl->r4tst[0].rdsta); /* * If the secure keys (TDKEK, JDKEK, TDSK), were already * generated, signal this to the function that is instantiating @@ -524,7 +529,7 @@ static int caam_probe(struct device_d *dev) ctrlpriv->rng4_sh_init &= RDSTA_IFMASK; do { int inst_handles = - readl(&ctrl->r4tst[0].rdsta) & RDSTA_IFMASK; + rd_reg32(&ctrl->r4tst[0].rdsta) & RDSTA_IFMASK; /* * If either SH were instantiated by somebody else * (e.g. u-boot) then it is assumed that the entropy @@ -560,7 +565,7 @@ static int caam_probe(struct device_d *dev) ctrlpriv->rng4_sh_init = ~ctrlpriv->rng4_sh_init & RDSTA_IFMASK; /* Enable RDB bit so that RNG works faster */ - setbits32(&ctrl->scfgr, SCFGR_RDBENABLE); + clrsetbits_32(&ctrl->scfgr, 0, SCFGR_RDBENABLE); } if (IS_ENABLED(CONFIG_CRYPTO_DEV_FSL_CAAM_RNG)) { @@ -573,8 +578,8 @@ static int caam_probe(struct device_d *dev) } /* NOTE: RTIC detection ought to go here, around Si time */ - caam_id = (u64)readl(&ctrl->perfmon.caam_id_ms) << 32 | - (u64)readl(&ctrl->perfmon.caam_id_ls); + caam_id = (u64)rd_reg32(&ctrl->perfmon.caam_id_ms) << 32 | + (u64)rd_reg32(&ctrl->perfmon.caam_id_ls); /* Report "alive" for developer to see */ dev_dbg(dev, "device ID = 0x%016llx (Era %d)\n", caam_id, |