These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / crypto / caam / caamrng.c
index 5095337..9b92af2 100644 (file)
@@ -108,6 +108,10 @@ static void rng_done(struct device *jrdev, u32 *desc, u32 err, void *context)
 
        atomic_set(&bd->empty, BUF_NOT_EMPTY);
        complete(&bd->filled);
+
+       /* Buffer refilled, invalidate cache */
+       dma_sync_single_for_cpu(jrdev, bd->addr, RN_BUF_SIZE, DMA_FROM_DEVICE);
+
 #ifdef DEBUG
        print_hex_dump(KERN_ERR, "rng refreshed buf@: ",
                       DUMP_PREFIX_ADDRESS, 16, 4, bd->buf, RN_BUF_SIZE, 1);
@@ -311,7 +315,7 @@ static int __init caam_rng_init(void)
        struct device_node *dev_node;
        struct platform_device *pdev;
        struct device *ctrldev;
-       void *priv;
+       struct caam_drv_private *priv;
        int err;
 
        dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0");
@@ -338,20 +342,32 @@ static int __init caam_rng_init(void)
        if (!priv)
                return -ENODEV;
 
+       /* Check for an instantiated RNG before registration */
+       if (!(rd_reg32(&priv->ctrl->perfmon.cha_num_ls) & CHA_ID_LS_RNG_MASK))
+               return -ENODEV;
+
        dev = caam_jr_alloc();
        if (IS_ERR(dev)) {
                pr_err("Job Ring Device allocation for transform failed\n");
                return PTR_ERR(dev);
        }
-       rng_ctx = kmalloc(sizeof(struct caam_rng_ctx), GFP_DMA);
-       if (!rng_ctx)
-               return -ENOMEM;
+       rng_ctx = kmalloc(sizeof(*rng_ctx), GFP_DMA);
+       if (!rng_ctx) {
+               err = -ENOMEM;
+               goto free_caam_alloc;
+       }
        err = caam_init_rng(rng_ctx, dev);
        if (err)
-               return err;
+               goto free_rng_ctx;
 
        dev_info(dev, "registering rng-caam\n");
        return hwrng_register(&caam_rng);
+
+free_rng_ctx:
+       kfree(rng_ctx);
+free_caam_alloc:
+       caam_jr_free(dev);
+       return err;
 }
 
 module_init(caam_rng_init);