[avpatel:riscv_aia_v1 16/18] drivers/irqchip/irq-riscv-imsic.c:851 imsic_init() warn: possible memory leak of 'priv'

From: Dan Carpenter
Date: Thu Jul 08 2021 - 08:19:55 EST


tree: https://github.com/avpatel/linux.git riscv_aia_v1
head: e4b6f153340e5471c82603f7b08226ba6e2c6249
commit: d180bb1147b8790d605daf66388a2a827806b2ed [16/18] irqchip: Add RISC-V incoming MSI controller driver
config: riscv-randconfig-m031-20210707 (attached as .config)
compiler: riscv64-linux-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>
Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>

smatch warnings:
drivers/irqchip/irq-riscv-imsic.c:851 imsic_init() warn: possible memory leak of 'priv'

vim +/priv +851 drivers/irqchip/irq-riscv-imsic.c

d180bb1147b879 Anup Patel 2021-04-26 827 static int __init imsic_init(struct device_node *node,
d180bb1147b879 Anup Patel 2021-04-26 828 struct device_node *parent)
d180bb1147b879 Anup Patel 2021-04-26 829 {
d180bb1147b879 Anup Patel 2021-04-26 830 struct resource res;
d180bb1147b879 Anup Patel 2021-04-26 831 phys_addr_t base_addr;
d180bb1147b879 Anup Patel 2021-04-26 832 int rc, nr_parent_irqs;
d180bb1147b879 Anup Patel 2021-04-26 833 struct imsic_mmio *mmio;
d180bb1147b879 Anup Patel 2021-04-26 834 struct imsic_priv *priv;
d180bb1147b879 Anup Patel 2021-04-26 835 struct imsic_handler *handler;
d180bb1147b879 Anup Patel 2021-04-26 836 u32 i, tmp, nr_handlers = 0;
d180bb1147b879 Anup Patel 2021-04-26 837
d180bb1147b879 Anup Patel 2021-04-26 838 if (imsic_init_done) {
d180bb1147b879 Anup Patel 2021-04-26 839 pr_err("%pOFP: already initialized hence ignoring\n", node);
d180bb1147b879 Anup Patel 2021-04-26 840 return -ENODEV;
d180bb1147b879 Anup Patel 2021-04-26 841 }
d180bb1147b879 Anup Patel 2021-04-26 842
d180bb1147b879 Anup Patel 2021-04-26 843 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
d180bb1147b879 Anup Patel 2021-04-26 844 if (!priv)
d180bb1147b879 Anup Patel 2021-04-26 845 return -ENOMEM;
d180bb1147b879 Anup Patel 2021-04-26 846
d180bb1147b879 Anup Patel 2021-04-26 847 /* Find number of parent interrupts */
d180bb1147b879 Anup Patel 2021-04-26 848 nr_parent_irqs = of_irq_count(node);
d180bb1147b879 Anup Patel 2021-04-26 849 if (!nr_parent_irqs) {
d180bb1147b879 Anup Patel 2021-04-26 850 pr_err("%pOFP: no parent irqs available\n", node);
d180bb1147b879 Anup Patel 2021-04-26 @851 return -EINVAL;

goto out_free_priv? Same for a bunch of other error paths as well.

d180bb1147b879 Anup Patel 2021-04-26 852 }
d180bb1147b879 Anup Patel 2021-04-26 853
d180bb1147b879 Anup Patel 2021-04-26 854 /* Find number of guest index bits in MSI address */
d180bb1147b879 Anup Patel 2021-04-26 855 rc = of_property_read_u32(node, "imsic,guest-index-bits",
d180bb1147b879 Anup Patel 2021-04-26 856 &priv->guest_index_bits);
d180bb1147b879 Anup Patel 2021-04-26 857 if (rc)
d180bb1147b879 Anup Patel 2021-04-26 858 priv->guest_index_bits = 0;
d180bb1147b879 Anup Patel 2021-04-26 859 tmp = BITS_PER_LONG - IMSIC_MMIO_PAGE_SHIFT;
d180bb1147b879 Anup Patel 2021-04-26 860 if (tmp < priv->guest_index_bits) {
d180bb1147b879 Anup Patel 2021-04-26 861 pr_err("%pOFP: guest index bits too big\n", node);
d180bb1147b879 Anup Patel 2021-04-26 862 return -EINVAL;
d180bb1147b879 Anup Patel 2021-04-26 863 }
d180bb1147b879 Anup Patel 2021-04-26 864
d180bb1147b879 Anup Patel 2021-04-26 865 /* Find number of HART index bits */
d180bb1147b879 Anup Patel 2021-04-26 866 rc = of_property_read_u32(node, "imsic,hart-index-bits",
d180bb1147b879 Anup Patel 2021-04-26 867 &priv->hart_index_bits);
d180bb1147b879 Anup Patel 2021-04-26 868 if (rc) {
d180bb1147b879 Anup Patel 2021-04-26 869 /* Assume default value */
d180bb1147b879 Anup Patel 2021-04-26 870 priv->hart_index_bits = __fls(nr_parent_irqs);
d180bb1147b879 Anup Patel 2021-04-26 871 if (BIT(priv->hart_index_bits) < nr_parent_irqs)
d180bb1147b879 Anup Patel 2021-04-26 872 priv->hart_index_bits++;
d180bb1147b879 Anup Patel 2021-04-26 873 }
d180bb1147b879 Anup Patel 2021-04-26 874 tmp = BITS_PER_LONG - IMSIC_MMIO_PAGE_SHIFT -
d180bb1147b879 Anup Patel 2021-04-26 875 priv->guest_index_bits;
d180bb1147b879 Anup Patel 2021-04-26 876 if (tmp < priv->hart_index_bits) {
d180bb1147b879 Anup Patel 2021-04-26 877 pr_err("%pOFP: HART index bits too big\n", node);
d180bb1147b879 Anup Patel 2021-04-26 878 return -EINVAL;
d180bb1147b879 Anup Patel 2021-04-26 879 }
d180bb1147b879 Anup Patel 2021-04-26 880
d180bb1147b879 Anup Patel 2021-04-26 881 /* Find number of group index bits */
d180bb1147b879 Anup Patel 2021-04-26 882 rc = of_property_read_u32(node, "imsic,group-index-bits",
d180bb1147b879 Anup Patel 2021-04-26 883 &priv->group_index_bits);
d180bb1147b879 Anup Patel 2021-04-26 884 if (rc)
d180bb1147b879 Anup Patel 2021-04-26 885 priv->group_index_bits = 0;
d180bb1147b879 Anup Patel 2021-04-26 886 tmp = BITS_PER_LONG - IMSIC_MMIO_PAGE_SHIFT -
d180bb1147b879 Anup Patel 2021-04-26 887 priv->guest_index_bits - priv->hart_index_bits;
d180bb1147b879 Anup Patel 2021-04-26 888 if (tmp < priv->group_index_bits) {
d180bb1147b879 Anup Patel 2021-04-26 889 pr_err("%pOFP: group index bits too big\n", node);
d180bb1147b879 Anup Patel 2021-04-26 890 return -EINVAL;
d180bb1147b879 Anup Patel 2021-04-26 891 }
d180bb1147b879 Anup Patel 2021-04-26 892
d180bb1147b879 Anup Patel 2021-04-26 893 /* Find first bit position of group index */
d180bb1147b879 Anup Patel 2021-04-26 894 tmp = IMSIC_MMIO_PAGE_SHIFT + priv->guest_index_bits +
d180bb1147b879 Anup Patel 2021-04-26 895 priv->hart_index_bits;
d180bb1147b879 Anup Patel 2021-04-26 896 rc = of_property_read_u32(node, "imsic,group-index-shift",
d180bb1147b879 Anup Patel 2021-04-26 897 &priv->group_index_shift);
d180bb1147b879 Anup Patel 2021-04-26 898 if (rc)
d180bb1147b879 Anup Patel 2021-04-26 899 priv->group_index_shift = tmp;
d180bb1147b879 Anup Patel 2021-04-26 900 if (priv->group_index_shift < tmp) {
d180bb1147b879 Anup Patel 2021-04-26 901 pr_err("%pOFP: group index shift too small\n", node);
d180bb1147b879 Anup Patel 2021-04-26 902 return -EINVAL;
d180bb1147b879 Anup Patel 2021-04-26 903 }
d180bb1147b879 Anup Patel 2021-04-26 904 tmp = priv->group_index_bits + priv->group_index_shift - 1;
d180bb1147b879 Anup Patel 2021-04-26 905 if (tmp >= BITS_PER_LONG) {
d180bb1147b879 Anup Patel 2021-04-26 906 pr_err("%pOFP: group index shift too big\n", node);
d180bb1147b879 Anup Patel 2021-04-26 907 return -EINVAL;
d180bb1147b879 Anup Patel 2021-04-26 908 }
d180bb1147b879 Anup Patel 2021-04-26 909
d180bb1147b879 Anup Patel 2021-04-26 910 /* Find number of interrupt identities */
d180bb1147b879 Anup Patel 2021-04-26 911 rc = of_property_read_u32(node, "imsic,num-ids", &priv->nr_ids);
d180bb1147b879 Anup Patel 2021-04-26 912 if (rc) {
d180bb1147b879 Anup Patel 2021-04-26 913 pr_err("%pOFP: number of interrupt identities not found\n",
d180bb1147b879 Anup Patel 2021-04-26 914 node);
d180bb1147b879 Anup Patel 2021-04-26 915 return rc;
d180bb1147b879 Anup Patel 2021-04-26 916 }
d180bb1147b879 Anup Patel 2021-04-26 917 if ((priv->nr_ids < IMSIC_MIN_ID) ||
d180bb1147b879 Anup Patel 2021-04-26 918 (priv->nr_ids >= IMSIC_MAX_ID) ||
d180bb1147b879 Anup Patel 2021-04-26 919 ((priv->nr_ids & IMSIC_MIN_ID) != IMSIC_MIN_ID)) {
d180bb1147b879 Anup Patel 2021-04-26 920 pr_err("%pOFP: invalid number of interrupt identities\n",
d180bb1147b879 Anup Patel 2021-04-26 921 node);
d180bb1147b879 Anup Patel 2021-04-26 922 return -EINVAL;
d180bb1147b879 Anup Patel 2021-04-26 923 }
d180bb1147b879 Anup Patel 2021-04-26 924
d180bb1147b879 Anup Patel 2021-04-26 925 /* Compute base address */
d180bb1147b879 Anup Patel 2021-04-26 926 rc = of_address_to_resource(node, 0, &res);
d180bb1147b879 Anup Patel 2021-04-26 927 if (rc) {
d180bb1147b879 Anup Patel 2021-04-26 928 pr_err("%pOFP: first MMIO resource not found\n", node);
d180bb1147b879 Anup Patel 2021-04-26 929 return -EINVAL;
d180bb1147b879 Anup Patel 2021-04-26 930 }
d180bb1147b879 Anup Patel 2021-04-26 931 priv->base_addr = res.start;
d180bb1147b879 Anup Patel 2021-04-26 932 priv->base_addr &= ~(BIT(priv->guest_index_bits +
d180bb1147b879 Anup Patel 2021-04-26 933 priv->hart_index_bits +
d180bb1147b879 Anup Patel 2021-04-26 934 IMSIC_MMIO_PAGE_SHIFT) - 1);
d180bb1147b879 Anup Patel 2021-04-26 935 priv->base_addr &= ~((BIT(priv->group_index_bits) - 1) <<
d180bb1147b879 Anup Patel 2021-04-26 936 priv->group_index_shift);
d180bb1147b879 Anup Patel 2021-04-26 937
d180bb1147b879 Anup Patel 2021-04-26 938 /* Find number of MMIO register sets */
d180bb1147b879 Anup Patel 2021-04-26 939 while (!of_address_to_resource(node, priv->num_mmios, &res))
d180bb1147b879 Anup Patel 2021-04-26 940 priv->num_mmios++;
d180bb1147b879 Anup Patel 2021-04-26 941
d180bb1147b879 Anup Patel 2021-04-26 942 /* Allocate MMIO register sets */
d180bb1147b879 Anup Patel 2021-04-26 943 priv->mmios = kcalloc(priv->num_mmios, sizeof(*mmio), GFP_KERNEL);
d180bb1147b879 Anup Patel 2021-04-26 944 if (!priv->mmios) {
d180bb1147b879 Anup Patel 2021-04-26 945 rc = -ENOMEM;
d180bb1147b879 Anup Patel 2021-04-26 946 goto out_free_priv;
d180bb1147b879 Anup Patel 2021-04-26 947 }
d180bb1147b879 Anup Patel 2021-04-26 948
d180bb1147b879 Anup Patel 2021-04-26 949 /* Parse and map MMIO register sets */
d180bb1147b879 Anup Patel 2021-04-26 950 for (i = 0; i < priv->num_mmios; i++) {
d180bb1147b879 Anup Patel 2021-04-26 951 mmio = &priv->mmios[i];
d180bb1147b879 Anup Patel 2021-04-26 952 rc = of_address_to_resource(node, i, &res);
d180bb1147b879 Anup Patel 2021-04-26 953 if (rc) {
d180bb1147b879 Anup Patel 2021-04-26 954 pr_err("%pOFP: unable to parse MMIO regset %d\n",
d180bb1147b879 Anup Patel 2021-04-26 955 node, i);
d180bb1147b879 Anup Patel 2021-04-26 956 goto out_iounmap;
d180bb1147b879 Anup Patel 2021-04-26 957 }
d180bb1147b879 Anup Patel 2021-04-26 958 mmio->pa = res.start;
d180bb1147b879 Anup Patel 2021-04-26 959 mmio->size = res.end - res.start + 1;
d180bb1147b879 Anup Patel 2021-04-26 960
d180bb1147b879 Anup Patel 2021-04-26 961 base_addr = mmio->pa;
d180bb1147b879 Anup Patel 2021-04-26 962 base_addr &= ~(BIT(priv->guest_index_bits +
d180bb1147b879 Anup Patel 2021-04-26 963 priv->hart_index_bits +
d180bb1147b879 Anup Patel 2021-04-26 964 IMSIC_MMIO_PAGE_SHIFT) - 1);
d180bb1147b879 Anup Patel 2021-04-26 965 base_addr &= ~((BIT(priv->group_index_bits) - 1) <<
d180bb1147b879 Anup Patel 2021-04-26 966 priv->group_index_shift);
d180bb1147b879 Anup Patel 2021-04-26 967 if (base_addr != priv->base_addr) {
d180bb1147b879 Anup Patel 2021-04-26 968 rc = -EINVAL;
d180bb1147b879 Anup Patel 2021-04-26 969 pr_err("%pOFP: address mismatch for regset %d\n",
d180bb1147b879 Anup Patel 2021-04-26 970 node, i);
d180bb1147b879 Anup Patel 2021-04-26 971 goto out_iounmap;
d180bb1147b879 Anup Patel 2021-04-26 972 }
d180bb1147b879 Anup Patel 2021-04-26 973
d180bb1147b879 Anup Patel 2021-04-26 974 tmp = BIT(priv->guest_index_bits) - 1;
d180bb1147b879 Anup Patel 2021-04-26 975 if ((mmio->size / IMSIC_MMIO_PAGE_SZ) & tmp) {
d180bb1147b879 Anup Patel 2021-04-26 976 rc = -EINVAL;
d180bb1147b879 Anup Patel 2021-04-26 977 pr_err("%pOFP: size mismatch for regset %d\n",
d180bb1147b879 Anup Patel 2021-04-26 978 node, i);
d180bb1147b879 Anup Patel 2021-04-26 979 goto out_iounmap;
d180bb1147b879 Anup Patel 2021-04-26 980 }
d180bb1147b879 Anup Patel 2021-04-26 981
d180bb1147b879 Anup Patel 2021-04-26 982 mmio->va = of_iomap(node, i);
d180bb1147b879 Anup Patel 2021-04-26 983 if (!mmio->va) {
d180bb1147b879 Anup Patel 2021-04-26 984 rc = -EIO;
d180bb1147b879 Anup Patel 2021-04-26 985 pr_err("%pOFP: unable to map MMIO regset %d\n",
d180bb1147b879 Anup Patel 2021-04-26 986 node, i);
d180bb1147b879 Anup Patel 2021-04-26 987 goto out_iounmap;
d180bb1147b879 Anup Patel 2021-04-26 988 }
d180bb1147b879 Anup Patel 2021-04-26 989 }
d180bb1147b879 Anup Patel 2021-04-26 990
d180bb1147b879 Anup Patel 2021-04-26 991 /* Initialize interrupt identity management */
d180bb1147b879 Anup Patel 2021-04-26 992 rc = imsic_ids_init(priv);
d180bb1147b879 Anup Patel 2021-04-26 993 if (rc) {
d180bb1147b879 Anup Patel 2021-04-26 994 pr_err("%pOFP: failed to initialize interrupt management\n",
d180bb1147b879 Anup Patel 2021-04-26 995 node);
d180bb1147b879 Anup Patel 2021-04-26 996 goto out_iounmap;
d180bb1147b879 Anup Patel 2021-04-26 997 }
d180bb1147b879 Anup Patel 2021-04-26 998
d180bb1147b879 Anup Patel 2021-04-26 999 /* Configure handlers for target CPUs */
d180bb1147b879 Anup Patel 2021-04-26 1000 for (i = 0; i < nr_parent_irqs; i++) {
d180bb1147b879 Anup Patel 2021-04-26 1001 struct of_phandle_args parent;
d180bb1147b879 Anup Patel 2021-04-26 1002 unsigned long reloff;
d180bb1147b879 Anup Patel 2021-04-26 1003 int j, cpu, hartid;
d180bb1147b879 Anup Patel 2021-04-26 1004
d180bb1147b879 Anup Patel 2021-04-26 1005 if (of_irq_parse_one(node, i, &parent)) {
d180bb1147b879 Anup Patel 2021-04-26 1006 pr_warn("%pOFP: failed to parse parent irq%d\n",
d180bb1147b879 Anup Patel 2021-04-26 1007 node, i);
d180bb1147b879 Anup Patel 2021-04-26 1008 continue;
d180bb1147b879 Anup Patel 2021-04-26 1009 }
d180bb1147b879 Anup Patel 2021-04-26 1010
d180bb1147b879 Anup Patel 2021-04-26 1011 /*
d180bb1147b879 Anup Patel 2021-04-26 1012 * Skip interrupt pages other than external interrupts for
d180bb1147b879 Anup Patel 2021-04-26 1013 * out privilege level.
d180bb1147b879 Anup Patel 2021-04-26 1014 */
d180bb1147b879 Anup Patel 2021-04-26 1015 if (parent.args[0] != RV_IRQ_EXT) {
d180bb1147b879 Anup Patel 2021-04-26 1016 pr_warn("%pOFP: invalid hwirq for parent irq%d\n",
d180bb1147b879 Anup Patel 2021-04-26 1017 node, i);
d180bb1147b879 Anup Patel 2021-04-26 1018 continue;
d180bb1147b879 Anup Patel 2021-04-26 1019 }
d180bb1147b879 Anup Patel 2021-04-26 1020
d180bb1147b879 Anup Patel 2021-04-26 1021 hartid = riscv_of_parent_hartid(parent.np);
d180bb1147b879 Anup Patel 2021-04-26 1022 if (hartid < 0) {
d180bb1147b879 Anup Patel 2021-04-26 1023 pr_warn("%pOFP: hart ID for parent irq%d not found\n",
d180bb1147b879 Anup Patel 2021-04-26 1024 node, i);
d180bb1147b879 Anup Patel 2021-04-26 1025 continue;
d180bb1147b879 Anup Patel 2021-04-26 1026 }
d180bb1147b879 Anup Patel 2021-04-26 1027
d180bb1147b879 Anup Patel 2021-04-26 1028 cpu = riscv_hartid_to_cpuid(hartid);
d180bb1147b879 Anup Patel 2021-04-26 1029 if (cpu < 0) {
d180bb1147b879 Anup Patel 2021-04-26 1030 pr_warn("%pOFP: invalid cpuid for parent irq%d\n",
d180bb1147b879 Anup Patel 2021-04-26 1031 node, i);
d180bb1147b879 Anup Patel 2021-04-26 1032 continue;
d180bb1147b879 Anup Patel 2021-04-26 1033 }
d180bb1147b879 Anup Patel 2021-04-26 1034
d180bb1147b879 Anup Patel 2021-04-26 1035 /* Find parent domain and register chained handler */
d180bb1147b879 Anup Patel 2021-04-26 1036 if (!imsic_parent_irq && irq_find_host(parent.np)) {
d180bb1147b879 Anup Patel 2021-04-26 1037 imsic_parent_irq = irq_of_parse_and_map(node, i);
d180bb1147b879 Anup Patel 2021-04-26 1038 if (imsic_parent_irq)
d180bb1147b879 Anup Patel 2021-04-26 1039 irq_set_chained_handler(imsic_parent_irq,
d180bb1147b879 Anup Patel 2021-04-26 1040 imsic_handle_irq);
d180bb1147b879 Anup Patel 2021-04-26 1041 }
d180bb1147b879 Anup Patel 2021-04-26 1042
d180bb1147b879 Anup Patel 2021-04-26 1043 /* Find MMIO location of MSI page */
d180bb1147b879 Anup Patel 2021-04-26 1044 mmio = NULL;
d180bb1147b879 Anup Patel 2021-04-26 1045 reloff = i * BIT(priv->guest_index_bits) *
d180bb1147b879 Anup Patel 2021-04-26 1046 IMSIC_MMIO_PAGE_SZ;
d180bb1147b879 Anup Patel 2021-04-26 1047 for (j = 0; priv->num_mmios; j++) {
d180bb1147b879 Anup Patel 2021-04-26 1048 if (reloff < priv->mmios[j].size) {
d180bb1147b879 Anup Patel 2021-04-26 1049 mmio = &priv->mmios[j];
d180bb1147b879 Anup Patel 2021-04-26 1050 break;
d180bb1147b879 Anup Patel 2021-04-26 1051 }
d180bb1147b879 Anup Patel 2021-04-26 1052
d180bb1147b879 Anup Patel 2021-04-26 1053 reloff -= priv->mmios[j].size;
d180bb1147b879 Anup Patel 2021-04-26 1054 }
d180bb1147b879 Anup Patel 2021-04-26 1055 if (!mmio) {
d180bb1147b879 Anup Patel 2021-04-26 1056 pr_warn("%pOFP: MMIO not found for parent irq%d\n",
d180bb1147b879 Anup Patel 2021-04-26 1057 node, i);
d180bb1147b879 Anup Patel 2021-04-26 1058 continue;
d180bb1147b879 Anup Patel 2021-04-26 1059 }
d180bb1147b879 Anup Patel 2021-04-26 1060
d180bb1147b879 Anup Patel 2021-04-26 1061 handler = per_cpu_ptr(&imsic_handlers, cpu);
d180bb1147b879 Anup Patel 2021-04-26 1062 if (handler->priv) {
d180bb1147b879 Anup Patel 2021-04-26 1063 pr_warn("%pOFP: CPU%d handler already configured.\n",
d180bb1147b879 Anup Patel 2021-04-26 1064 node, cpu);
d180bb1147b879 Anup Patel 2021-04-26 1065 goto done;
d180bb1147b879 Anup Patel 2021-04-26 1066 }
d180bb1147b879 Anup Patel 2021-04-26 1067
d180bb1147b879 Anup Patel 2021-04-26 1068 cpumask_set_cpu(cpu, &priv->lmask);
d180bb1147b879 Anup Patel 2021-04-26 1069 handler->msi_pa = mmio->pa + reloff;
d180bb1147b879 Anup Patel 2021-04-26 1070 handler->msi_va = mmio->va + reloff;
d180bb1147b879 Anup Patel 2021-04-26 1071 handler->priv = priv;
d180bb1147b879 Anup Patel 2021-04-26 1072
d180bb1147b879 Anup Patel 2021-04-26 1073 done:
d180bb1147b879 Anup Patel 2021-04-26 1074 nr_handlers++;
d180bb1147b879 Anup Patel 2021-04-26 1075 }
d180bb1147b879 Anup Patel 2021-04-26 1076
d180bb1147b879 Anup Patel 2021-04-26 1077 /* Initialize IPI domain */
d180bb1147b879 Anup Patel 2021-04-26 1078 rc = imsic_ipi_domain_init(priv, node);
d180bb1147b879 Anup Patel 2021-04-26 1079 if (rc) {
d180bb1147b879 Anup Patel 2021-04-26 1080 pr_err("%pOFP: Failed to initialize IPI domain\n", node);
d180bb1147b879 Anup Patel 2021-04-26 1081 goto out_ids_cleanup;
d180bb1147b879 Anup Patel 2021-04-26 1082 }
d180bb1147b879 Anup Patel 2021-04-26 1083
d180bb1147b879 Anup Patel 2021-04-26 1084 /* Initialize IRQ and MSI domains */
d180bb1147b879 Anup Patel 2021-04-26 1085 rc = imsic_irq_domains_init(priv, node);
d180bb1147b879 Anup Patel 2021-04-26 1086 if (rc) {
d180bb1147b879 Anup Patel 2021-04-26 1087 pr_err("%pOFP: Failed to initialize IRQ and MSI domains\n",
d180bb1147b879 Anup Patel 2021-04-26 1088 node);
d180bb1147b879 Anup Patel 2021-04-26 1089 goto out_ipi_domain_cleanup;
d180bb1147b879 Anup Patel 2021-04-26 1090 }
d180bb1147b879 Anup Patel 2021-04-26 1091
d180bb1147b879 Anup Patel 2021-04-26 1092 /* Setup cpuhp state */
d180bb1147b879 Anup Patel 2021-04-26 1093 cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
d180bb1147b879 Anup Patel 2021-04-26 1094 "irqchip/riscv/imsic:starting",
d180bb1147b879 Anup Patel 2021-04-26 1095 imsic_starting_cpu, imsic_dying_cpu);
d180bb1147b879 Anup Patel 2021-04-26 1096
d180bb1147b879 Anup Patel 2021-04-26 1097 /*
d180bb1147b879 Anup Patel 2021-04-26 1098 * Only one IMSIC instance allowed in a platform for clean
d180bb1147b879 Anup Patel 2021-04-26 1099 * implementation of SMP IRQ affinity and per-CPU IPIs.
d180bb1147b879 Anup Patel 2021-04-26 1100 *
d180bb1147b879 Anup Patel 2021-04-26 1101 * This means on a multi-socket (or multi-die) platform we
d180bb1147b879 Anup Patel 2021-04-26 1102 * will have multiple MMIO regions for one IMSIC instance.
d180bb1147b879 Anup Patel 2021-04-26 1103 */
d180bb1147b879 Anup Patel 2021-04-26 1104 imsic_init_done = true;
d180bb1147b879 Anup Patel 2021-04-26 1105
d180bb1147b879 Anup Patel 2021-04-26 1106 pr_info("%pOFP: mapped %d interrupts using %d handlers\n",
d180bb1147b879 Anup Patel 2021-04-26 1107 node, priv->nr_ids, nr_handlers);
d180bb1147b879 Anup Patel 2021-04-26 1108
d180bb1147b879 Anup Patel 2021-04-26 1109 return 0;
d180bb1147b879 Anup Patel 2021-04-26 1110
d180bb1147b879 Anup Patel 2021-04-26 1111 out_ipi_domain_cleanup:
d180bb1147b879 Anup Patel 2021-04-26 1112 imsic_ipi_domain_cleanup(priv);
d180bb1147b879 Anup Patel 2021-04-26 1113 out_ids_cleanup:
d180bb1147b879 Anup Patel 2021-04-26 1114 imsic_ids_cleanup(priv);
d180bb1147b879 Anup Patel 2021-04-26 1115 out_iounmap:
d180bb1147b879 Anup Patel 2021-04-26 1116 for (i = 0; i < priv->num_mmios; i++) {
d180bb1147b879 Anup Patel 2021-04-26 1117 if (priv->mmios[i].va)
d180bb1147b879 Anup Patel 2021-04-26 1118 iounmap(priv->mmios[i].va);
d180bb1147b879 Anup Patel 2021-04-26 1119 }
d180bb1147b879 Anup Patel 2021-04-26 1120 kfree(priv->mmios);
d180bb1147b879 Anup Patel 2021-04-26 1121 out_free_priv:
d180bb1147b879 Anup Patel 2021-04-26 1122 kfree(priv);
d180bb1147b879 Anup Patel 2021-04-26 1123 return rc;
d180bb1147b879 Anup Patel 2021-04-26 1124 }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx