Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: hisilicon/zip - support zip capability

Add function 'hisi_zip_alg_support' to get device configuration
information from capability registers, instead of determining whether
to register an algorithm based on hardware platform's version.

Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Weili Qian and committed by
Herbert Xu
db700974 b1be70a8

+128 -42
+1
drivers/crypto/hisilicon/zip/zip.h
··· 84 84 int zip_create_qps(struct hisi_qp **qps, int qp_num, int node); 85 85 int hisi_zip_register_to_crypto(struct hisi_qm *qm); 86 86 void hisi_zip_unregister_from_crypto(struct hisi_qm *qm); 87 + bool hisi_zip_alg_support(struct hisi_qm *qm, u32 alg); 87 88 #endif
+55 -12
drivers/crypto/hisilicon/zip/zip_crypto.c
··· 39 39 #define HZIP_ALG_PRIORITY 300 40 40 #define HZIP_SGL_SGE_NR 10 41 41 42 + #define HZIP_ALG_ZLIB GENMASK(1, 0) 43 + #define HZIP_ALG_GZIP GENMASK(3, 2) 44 + 42 45 static const u8 zlib_head[HZIP_ZLIB_HEAD_SIZE] = {0x78, 0x9c}; 43 46 static const u8 gzip_head[HZIP_GZIP_HEAD_SIZE] = { 44 47 0x1f, 0x8b, 0x08, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x03 ··· 759 756 } 760 757 }; 761 758 759 + static int hisi_zip_register_zlib(struct hisi_qm *qm) 760 + { 761 + int ret; 762 + 763 + if (!hisi_zip_alg_support(qm, HZIP_ALG_ZLIB)) 764 + return 0; 765 + 766 + ret = crypto_register_acomp(&hisi_zip_acomp_zlib); 767 + if (ret) 768 + dev_err(&qm->pdev->dev, "failed to register to zlib (%d)!\n", ret); 769 + 770 + return ret; 771 + } 772 + 773 + static void hisi_zip_unregister_zlib(struct hisi_qm *qm) 774 + { 775 + if (!hisi_zip_alg_support(qm, HZIP_ALG_ZLIB)) 776 + return; 777 + 778 + crypto_unregister_acomp(&hisi_zip_acomp_zlib); 779 + } 780 + 762 781 static struct acomp_alg hisi_zip_acomp_gzip = { 763 782 .init = hisi_zip_acomp_init, 764 783 .exit = hisi_zip_acomp_exit, ··· 795 770 } 796 771 }; 797 772 798 - int hisi_zip_register_to_crypto(struct hisi_qm *qm) 773 + static int hisi_zip_register_gzip(struct hisi_qm *qm) 799 774 { 800 775 int ret; 801 776 802 - ret = crypto_register_acomp(&hisi_zip_acomp_zlib); 803 - if (ret) { 804 - pr_err("failed to register to zlib (%d)!\n", ret); 805 - return ret; 806 - } 777 + if (!hisi_zip_alg_support(qm, HZIP_ALG_GZIP)) 778 + return 0; 807 779 808 780 ret = crypto_register_acomp(&hisi_zip_acomp_gzip); 809 - if (ret) { 810 - pr_err("failed to register to gzip (%d)!\n", ret); 811 - crypto_unregister_acomp(&hisi_zip_acomp_zlib); 812 - } 781 + if (ret) 782 + dev_err(&qm->pdev->dev, "failed to register to gzip (%d)!\n", ret); 783 + 784 + return ret; 785 + } 786 + 787 + static void hisi_zip_unregister_gzip(struct hisi_qm *qm) 788 + { 789 + if (!hisi_zip_alg_support(qm, HZIP_ALG_GZIP)) 790 + return; 791 + 792 + crypto_unregister_acomp(&hisi_zip_acomp_gzip); 793 + } 794 + 795 + int hisi_zip_register_to_crypto(struct hisi_qm *qm) 796 + { 797 + int ret = 0; 798 + 799 + ret = hisi_zip_register_zlib(qm); 800 + if (ret) 801 + return ret; 802 + 803 + ret = hisi_zip_register_gzip(qm); 804 + if (ret) 805 + hisi_zip_unregister_zlib(qm); 813 806 814 807 return ret; 815 808 } 816 809 817 810 void hisi_zip_unregister_from_crypto(struct hisi_qm *qm) 818 811 { 819 - crypto_unregister_acomp(&hisi_zip_acomp_gzip); 820 - crypto_unregister_acomp(&hisi_zip_acomp_zlib); 812 + hisi_zip_unregister_zlib(qm); 813 + hisi_zip_unregister_gzip(qm); 821 814 }
+72 -30
drivers/crypto/hisilicon/zip/zip_main.c
··· 20 20 #define HZIP_QUEUE_NUM_V1 4096 21 21 22 22 #define HZIP_CLOCK_GATE_CTRL 0x301004 23 - #define COMP0_ENABLE BIT(0) 24 - #define COMP1_ENABLE BIT(1) 25 - #define DECOMP0_ENABLE BIT(2) 26 - #define DECOMP1_ENABLE BIT(3) 27 - #define DECOMP2_ENABLE BIT(4) 28 - #define DECOMP3_ENABLE BIT(5) 29 - #define DECOMP4_ENABLE BIT(6) 30 - #define DECOMP5_ENABLE BIT(7) 31 - #define HZIP_ALL_COMP_DECOMP_EN (COMP0_ENABLE | COMP1_ENABLE | \ 32 - DECOMP0_ENABLE | DECOMP1_ENABLE | \ 33 - DECOMP2_ENABLE | DECOMP3_ENABLE | \ 34 - DECOMP4_ENABLE | DECOMP5_ENABLE) 35 23 #define HZIP_DECOMP_CHECK_ENABLE BIT(16) 36 24 #define HZIP_FSM_MAX_CNT 0x301008 37 25 ··· 64 76 #define HZIP_SRAM_ECC_ERR_NUM_SHIFT 16 65 77 #define HZIP_SRAM_ECC_ERR_ADDR_SHIFT 24 66 78 #define HZIP_CORE_INT_MASK_ALL GENMASK(12, 0) 67 - #define HZIP_COMP_CORE_NUM 2 68 - #define HZIP_DECOMP_CORE_NUM 6 69 - #define HZIP_CORE_NUM (HZIP_COMP_CORE_NUM + \ 70 - HZIP_DECOMP_CORE_NUM) 71 79 #define HZIP_SQE_SIZE 128 72 80 #define HZIP_PF_DEF_Q_NUM 64 73 81 #define HZIP_PF_DEF_Q_BASE 0 ··· 178 194 ZIP_RESET_MASK_CAP, 179 195 ZIP_OOO_SHUTDOWN_MASK_CAP, 180 196 ZIP_CE_MASK_CAP, 197 + ZIP_CLUSTER_NUM_CAP, 198 + ZIP_CORE_TYPE_NUM_CAP, 199 + ZIP_CORE_NUM_CAP, 200 + ZIP_CLUSTER_COMP_NUM_CAP, 201 + ZIP_CLUSTER_DECOMP_NUM_CAP, 202 + ZIP_DECOMP_ENABLE_BITMAP, 203 + ZIP_COMP_ENABLE_BITMAP, 204 + ZIP_DRV_ALG_BITMAP, 205 + ZIP_DEV_ALG_BITMAP, 206 + ZIP_CORE1_ALG_BITMAP, 207 + ZIP_CORE2_ALG_BITMAP, 208 + ZIP_CORE3_ALG_BITMAP, 209 + ZIP_CORE4_ALG_BITMAP, 210 + ZIP_CORE5_ALG_BITMAP, 211 + ZIP_CAP_MAX 181 212 }; 182 213 183 214 static struct hisi_qm_cap_info zip_basic_cap_info[] = { ··· 204 205 {ZIP_RESET_MASK_CAP, 0x3134, 0, GENMASK(31, 0), 0x0, 0x7FE, 0x7FE}, 205 206 {ZIP_OOO_SHUTDOWN_MASK_CAP, 0x3134, 0, GENMASK(31, 0), 0x0, 0x2, 0x7FE}, 206 207 {ZIP_CE_MASK_CAP, 0x3138, 0, GENMASK(31, 0), 0x0, 0x1, 0x1}, 208 + {ZIP_CLUSTER_NUM_CAP, 0x313C, 28, GENMASK(3, 0), 0x1, 0x1, 0x1}, 209 + {ZIP_CORE_TYPE_NUM_CAP, 0x313C, 24, GENMASK(3, 0), 0x2, 0x2, 0x2}, 210 + {ZIP_CORE_NUM_CAP, 0x313C, 16, GENMASK(7, 0), 0x8, 0x8, 0x5}, 211 + {ZIP_CLUSTER_COMP_NUM_CAP, 0x313C, 8, GENMASK(7, 0), 0x2, 0x2, 0x2}, 212 + {ZIP_CLUSTER_DECOMP_NUM_CAP, 0x313C, 0, GENMASK(7, 0), 0x6, 0x6, 0x3}, 213 + {ZIP_DECOMP_ENABLE_BITMAP, 0x3140, 16, GENMASK(15, 0), 0xFC, 0xFC, 0x1C}, 214 + {ZIP_COMP_ENABLE_BITMAP, 0x3140, 0, GENMASK(15, 0), 0x3, 0x3, 0x3}, 215 + {ZIP_DRV_ALG_BITMAP, 0x3144, 0, GENMASK(31, 0), 0xF, 0xF, 0xF}, 216 + {ZIP_DEV_ALG_BITMAP, 0x3148, 0, GENMASK(31, 0), 0xF, 0xF, 0xFF}, 217 + {ZIP_CORE1_ALG_BITMAP, 0x314C, 0, GENMASK(31, 0), 0x5, 0x5, 0xD5}, 218 + {ZIP_CORE2_ALG_BITMAP, 0x3150, 0, GENMASK(31, 0), 0x5, 0x5, 0xD5}, 219 + {ZIP_CORE3_ALG_BITMAP, 0x3154, 0, GENMASK(31, 0), 0xA, 0xA, 0x2A}, 220 + {ZIP_CORE4_ALG_BITMAP, 0x3158, 0, GENMASK(31, 0), 0xA, 0xA, 0x2A}, 221 + {ZIP_CORE5_ALG_BITMAP, 0x315C, 0, GENMASK(31, 0), 0xA, 0xA, 0x2A}, 222 + {ZIP_CAP_MAX, 0x317c, 0, GENMASK(0, 0), 0x0, 0x0, 0x0} 207 223 }; 208 224 209 225 enum { ··· 377 363 return hisi_qm_alloc_qps_node(&zip_devices, qp_num, 0, node, qps); 378 364 } 379 365 366 + bool hisi_zip_alg_support(struct hisi_qm *qm, u32 alg) 367 + { 368 + u32 cap_val; 369 + 370 + cap_val = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_DRV_ALG_BITMAP, qm->cap_ver); 371 + if ((alg & cap_val) == alg) 372 + return true; 373 + 374 + return false; 375 + } 376 + 380 377 static void hisi_zip_open_sva_prefetch(struct hisi_qm *qm) 381 378 { 382 379 u32 val; ··· 446 421 static int hisi_zip_set_user_domain_and_cache(struct hisi_qm *qm) 447 422 { 448 423 void __iomem *base = qm->io_base; 424 + u32 dcomp_bm, comp_bm; 449 425 450 426 /* qm user domain */ 451 427 writel(AXUSER_BASE, base + QM_ARUSER_M_CFG_1); ··· 484 458 } 485 459 486 460 /* let's open all compression/decompression cores */ 487 - writel(HZIP_DECOMP_CHECK_ENABLE | HZIP_ALL_COMP_DECOMP_EN, 488 - base + HZIP_CLOCK_GATE_CTRL); 461 + dcomp_bm = hisi_qm_get_hw_info(qm, zip_basic_cap_info, 462 + ZIP_DECOMP_ENABLE_BITMAP, qm->cap_ver); 463 + comp_bm = hisi_qm_get_hw_info(qm, zip_basic_cap_info, 464 + ZIP_COMP_ENABLE_BITMAP, qm->cap_ver); 465 + writel(HZIP_DECOMP_CHECK_ENABLE | dcomp_bm | comp_bm, base + HZIP_CLOCK_GATE_CTRL); 489 466 490 467 /* enable sqc,cqc writeback */ 491 468 writel(SQC_CACHE_ENABLE | CQC_CACHE_ENABLE | SQC_CACHE_WB_ENABLE | ··· 707 678 708 679 static int hisi_zip_core_debug_init(struct hisi_qm *qm) 709 680 { 681 + u32 zip_core_num, zip_comp_core_num; 710 682 struct device *dev = &qm->pdev->dev; 711 683 struct debugfs_regset32 *regset; 712 684 struct dentry *tmp_d; 713 685 char buf[HZIP_BUF_SIZE]; 714 686 int i; 715 687 716 - for (i = 0; i < HZIP_CORE_NUM; i++) { 717 - if (i < HZIP_COMP_CORE_NUM) 688 + zip_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CORE_NUM_CAP, qm->cap_ver); 689 + zip_comp_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CLUSTER_COMP_NUM_CAP, 690 + qm->cap_ver); 691 + 692 + for (i = 0; i < zip_core_num; i++) { 693 + if (i < zip_comp_core_num) 718 694 scnprintf(buf, sizeof(buf), "comp_core%d", i); 719 695 else 720 696 scnprintf(buf, sizeof(buf), "decomp_core%d", 721 - i - HZIP_COMP_CORE_NUM); 697 + i - zip_comp_core_num); 722 698 723 699 regset = devm_kzalloc(dev, sizeof(*regset), GFP_KERNEL); 724 700 if (!regset) ··· 736 702 737 703 tmp_d = debugfs_create_dir(buf, qm->debug.debug_root); 738 704 debugfs_create_file("regs", 0444, tmp_d, regset, 739 - &hisi_zip_regs_fops); 705 + &hisi_zip_regs_fops); 740 706 } 741 707 742 708 return 0; ··· 856 822 int com_dfx_regs_num = ARRAY_SIZE(hzip_com_dfx_regs); 857 823 struct qm_debug *debug = &qm->debug; 858 824 void __iomem *io_base; 825 + u32 zip_core_num; 859 826 int i, j, idx; 860 827 861 - debug->last_words = kcalloc(core_dfx_regs_num * HZIP_CORE_NUM + 862 - com_dfx_regs_num, sizeof(unsigned int), GFP_KERNEL); 828 + zip_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CORE_NUM_CAP, qm->cap_ver); 829 + 830 + debug->last_words = kcalloc(core_dfx_regs_num * zip_core_num + com_dfx_regs_num, 831 + sizeof(unsigned int), GFP_KERNEL); 863 832 if (!debug->last_words) 864 833 return -ENOMEM; 865 834 ··· 871 834 debug->last_words[i] = readl_relaxed(io_base); 872 835 } 873 836 874 - for (i = 0; i < HZIP_CORE_NUM; i++) { 837 + for (i = 0; i < zip_core_num; i++) { 875 838 io_base = qm->io_base + core_offsets[i]; 876 839 for (j = 0; j < core_dfx_regs_num; j++) { 877 840 idx = com_dfx_regs_num + i * core_dfx_regs_num + j; ··· 898 861 { 899 862 int core_dfx_regs_num = ARRAY_SIZE(hzip_dump_dfx_regs); 900 863 int com_dfx_regs_num = ARRAY_SIZE(hzip_com_dfx_regs); 864 + u32 zip_core_num, zip_comp_core_num; 901 865 struct qm_debug *debug = &qm->debug; 902 866 char buf[HZIP_BUF_SIZE]; 903 867 void __iomem *base; ··· 912 874 val = readl_relaxed(qm->io_base + hzip_com_dfx_regs[i].offset); 913 875 if (debug->last_words[i] != val) 914 876 pci_info(qm->pdev, "com_dfx: %s \t= 0x%08x => 0x%08x\n", 915 - hzip_com_dfx_regs[i].name, debug->last_words[i], val); 877 + hzip_com_dfx_regs[i].name, debug->last_words[i], val); 916 878 } 917 879 918 - for (i = 0; i < HZIP_CORE_NUM; i++) { 919 - if (i < HZIP_COMP_CORE_NUM) 880 + zip_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CORE_NUM_CAP, qm->cap_ver); 881 + zip_comp_core_num = hisi_qm_get_hw_info(qm, zip_basic_cap_info, ZIP_CLUSTER_COMP_NUM_CAP, 882 + qm->cap_ver); 883 + for (i = 0; i < zip_core_num; i++) { 884 + if (i < zip_comp_core_num) 920 885 scnprintf(buf, sizeof(buf), "Comp_core-%d", i); 921 886 else 922 887 scnprintf(buf, sizeof(buf), "Decomp_core-%d", 923 - i - HZIP_COMP_CORE_NUM); 888 + i - zip_comp_core_num); 924 889 base = qm->io_base + core_offsets[i]; 925 890 926 891 pci_info(qm->pdev, "==>%s:\n", buf); ··· 933 892 val = readl_relaxed(base + hzip_dump_dfx_regs[j].offset); 934 893 if (debug->last_words[idx] != val) 935 894 pci_info(qm->pdev, "%s \t= 0x%08x => 0x%08x\n", 936 - hzip_dump_dfx_regs[j].name, debug->last_words[idx], val); 895 + hzip_dump_dfx_regs[j].name, 896 + debug->last_words[idx], val); 937 897 } 938 898 } 939 899 }