static int ss_rng_start(ss_aes_ctx_t *ctx, u8 *rdata, unsigned int dlen) { int ret = 0; int flow = ctx->comm.flow; ss_pending_clear(flow); ss_irq_enable(flow); ss_flow_enable(flow); #ifdef SS_TRNG_ENABLE if (ctx->comm.flags & SS_FLAG_TRNG) { ss_method_set(SS_DIR_ENCRYPT, SS_METHOD_TRNG); ss_trng_osc_enable(); } else #endif ss_method_set(SS_DIR_ENCRYPT, SS_METHOD_PRNG); ss_rng_mode_set(SS_RNG_MODE_CONTINUE); ss_data_dst_set(ss_dev->flows[flow].buf_dst_dma); #ifdef SS_TRNG_ENABLE ss_data_len_set(DIV_ROUND_UP(dlen, 32)*(32>>2)); /* align with 32 Bytes */ #else ss_data_len_set(DIV_ROUND_UP(dlen, 20)*(20>>2)); /* align with 20 Bytes */ #endif SS_DBG("Flow: %d, Request: %d, Aligned: %d \n", flow, dlen, DIV_ROUND_UP(dlen, 20)*5); dma_map_single(&ss_dev->pdev->dev, ss_dev->flows[flow].buf_dst, SS_DMA_BUF_SIZE, DMA_DEV_TO_MEM); ss_ctrl_start(); ret = wait_for_completion_timeout(&ss_dev->flows[flow].done, msecs_to_jiffies(SS_WAIT_TIME)); if (ret == 0) { SS_ERR("Timed out\n"); ss_reset(); return -ETIMEDOUT; } memcpy(rdata, ss_dev->flows[flow].buf_dst, dlen); dma_unmap_single(&ss_dev->pdev->dev, ss_dev->flows[flow].buf_dst_dma, SS_DMA_BUF_SIZE, DMA_DEV_TO_MEM); ss_irq_disable(flow); ret = dlen; #ifdef SS_TRNG_ENABLE if (ctx->comm.flags & SS_FLAG_TRNG) ss_trng_osc_disable(); #endif ss_ctrl_stop(); return ret; }
static int ss_rng_start(ss_aes_ctx_t *ctx, u8 *rdata, unsigned int dlen) { int ret = 0; int flow = ctx->comm.flow; ss_pending_clear(flow); ss_dma_disable(flow); ss_method_set(SS_DIR_ENCRYPT, SS_METHOD_PRNG); ss_rng_mode_set(SS_RNG_MODE_CONTINUE); ss_ctrl_start(); ret = ss_random_rd(rdata, dlen); ss_ctrl_stop(); return ret; }