@@ -4371,8 +4371,10 @@ static int __init caam_algapi_init(void)
43714371 struct device_node * dev_node ;
43724372 struct platform_device * pdev ;
43734373 struct device * ctrldev ;
4374- void * priv ;
4374+ struct caam_drv_private * priv ;
43754375 int i = 0 , err = 0 ;
4376+ u32 cha_vid , cha_inst , des_inst , aes_inst , md_inst ;
4377+ unsigned int md_limit = SHA512_DIGEST_SIZE ;
43764378 bool registered = false;
43774379
43784380 dev_node = of_find_compatible_node (NULL , NULL , "fsl,sec-v4.0" );
@@ -4402,16 +4404,39 @@ static int __init caam_algapi_init(void)
44024404
44034405 INIT_LIST_HEAD (& alg_list );
44044406
4405- /* register crypto algorithms the device supports */
4407+ /*
4408+ * Register crypto algorithms the device supports.
4409+ * First, detect presence and attributes of DES, AES, and MD blocks.
4410+ */
4411+ cha_vid = rd_reg32 (& priv -> ctrl -> perfmon .cha_id_ls );
4412+ cha_inst = rd_reg32 (& priv -> ctrl -> perfmon .cha_num_ls );
4413+ des_inst = (cha_inst & CHA_ID_LS_DES_MASK ) >> CHA_ID_LS_DES_SHIFT ;
4414+ aes_inst = (cha_inst & CHA_ID_LS_AES_MASK ) >> CHA_ID_LS_AES_SHIFT ;
4415+ md_inst = (cha_inst & CHA_ID_LS_MD_MASK ) >> CHA_ID_LS_MD_SHIFT ;
4416+
4417+ /* If MD is present, limit digest size based on LP256 */
4418+ if (md_inst && ((cha_vid & CHA_ID_LS_MD_MASK ) == CHA_ID_LS_MD_LP256 ))
4419+ md_limit = SHA256_DIGEST_SIZE ;
4420+
44064421 for (i = 0 ; i < ARRAY_SIZE (driver_algs ); i ++ ) {
4407- /* TODO: check if h/w supports alg */
44084422 struct caam_crypto_alg * t_alg ;
4423+ struct caam_alg_template * alg = driver_algs + i ;
4424+ u32 alg_sel = alg -> class1_alg_type & OP_ALG_ALGSEL_MASK ;
4425+
4426+ /* Skip DES algorithms if not supported by device */
4427+ if (!des_inst &&
4428+ ((alg_sel == OP_ALG_ALGSEL_3DES ) ||
4429+ (alg_sel == OP_ALG_ALGSEL_DES )))
4430+ continue ;
4431+
4432+ /* Skip AES algorithms if not supported by device */
4433+ if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES ))
4434+ continue ;
44094435
4410- t_alg = caam_alg_alloc (& driver_algs [ i ] );
4436+ t_alg = caam_alg_alloc (alg );
44114437 if (IS_ERR (t_alg )) {
44124438 err = PTR_ERR (t_alg );
4413- pr_warn ("%s alg allocation failed\n" ,
4414- driver_algs [i ].driver_name );
4439+ pr_warn ("%s alg allocation failed\n" , alg -> driver_name );
44154440 continue ;
44164441 }
44174442
@@ -4429,6 +4454,37 @@ static int __init caam_algapi_init(void)
44294454
44304455 for (i = 0 ; i < ARRAY_SIZE (driver_aeads ); i ++ ) {
44314456 struct caam_aead_alg * t_alg = driver_aeads + i ;
4457+ u32 c1_alg_sel = t_alg -> caam .class1_alg_type &
4458+ OP_ALG_ALGSEL_MASK ;
4459+ u32 c2_alg_sel = t_alg -> caam .class2_alg_type &
4460+ OP_ALG_ALGSEL_MASK ;
4461+ u32 alg_aai = t_alg -> caam .class1_alg_type & OP_ALG_AAI_MASK ;
4462+
4463+ /* Skip DES algorithms if not supported by device */
4464+ if (!des_inst &&
4465+ ((c1_alg_sel == OP_ALG_ALGSEL_3DES ) ||
4466+ (c1_alg_sel == OP_ALG_ALGSEL_DES )))
4467+ continue ;
4468+
4469+ /* Skip AES algorithms if not supported by device */
4470+ if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES ))
4471+ continue ;
4472+
4473+ /*
4474+ * Check support for AES algorithms not available
4475+ * on LP devices.
4476+ */
4477+ if ((cha_vid & CHA_ID_LS_AES_MASK ) == CHA_ID_LS_AES_LP )
4478+ if (alg_aai == OP_ALG_AAI_GCM )
4479+ continue ;
4480+
4481+ /*
4482+ * Skip algorithms requiring message digests
4483+ * if MD or MD size is not supported by device.
4484+ */
4485+ if (c2_alg_sel &&
4486+ (!md_inst || (t_alg -> aead .maxauthsize > md_limit )))
4487+ continue ;
44324488
44334489 caam_aead_alg_init (t_alg );
44344490
0 commit comments