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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'irq_urgent_for_v6.13_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq fixes from Borislav Petkov:

- Move the ->select callback to the correct ops structure in
irq-mvebu-sei to fix some Marvell Armada platforms

- Add a workaround for Hisilicon ITS erratum 162100801 which can cause
some virtual interrupts to get lost

- More platform_driver::remove() conversion

* tag 'irq_urgent_for_v6.13_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
irqchip: Switch back to struct platform_driver::remove()
irqchip/gicv3-its: Add workaround for hip09 ITS erratum 162100801
irqchip/irq-mvebu-sei: Move misplaced select() callback to SEI CP domain

+65 -24
+2
Documentation/arch/arm64/silicon-errata.rst
··· 258 258 | Hisilicon | Hip{08,09,10,10C| #162001900 | N/A | 259 259 | | ,11} SMMU PMCG | | | 260 260 +----------------+-----------------+-----------------+-----------------------------+ 261 + | Hisilicon | Hip09 | #162100801 | HISILICON_ERRATUM_162100801 | 262 + +----------------+-----------------+-----------------+-----------------------------+ 261 263 +----------------+-----------------+-----------------+-----------------------------+ 262 264 | Qualcomm Tech. | Kryo/Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 | 263 265 +----------------+-----------------+-----------------+-----------------------------+
+11
arch/arm64/Kconfig
··· 1235 1235 1236 1236 If unsure, say Y. 1237 1237 1238 + config HISILICON_ERRATUM_162100801 1239 + bool "Hip09 162100801 erratum support" 1240 + default y 1241 + help 1242 + When enabling GICv4.1 in hip09, VMAPP will fail to clear some caches 1243 + during unmapping operation, which will cause some vSGIs lost. 1244 + To fix the issue, invalidate related vPE cache through GICR_INVALLR 1245 + after VMOVP. 1246 + 1247 + If unsure, say Y. 1248 + 1238 1249 config QCOM_FALKOR_ERRATUM_1003 1239 1250 bool "Falkor E1003: Incorrect translation due to ASID change" 1240 1251 default y
+39 -11
drivers/irqchip/irq-gic-v3-its.c
··· 47 47 #define ITS_FLAGS_WORKAROUND_CAVIUM_22375 (1ULL << 1) 48 48 #define ITS_FLAGS_WORKAROUND_CAVIUM_23144 (1ULL << 2) 49 49 #define ITS_FLAGS_FORCE_NON_SHAREABLE (1ULL << 3) 50 + #define ITS_FLAGS_WORKAROUND_HISILICON_162100801 (1ULL << 4) 50 51 51 52 #define RD_LOCAL_LPI_ENABLED BIT(0) 52 53 #define RD_LOCAL_PENDTABLE_PREALLOCATED BIT(1) ··· 65 64 #define LPI_PENDBASE_SZ ALIGN(BIT(LPI_NRBITS) / 8, SZ_64K) 66 65 67 66 static u8 __ro_after_init lpi_prop_prio; 67 + static struct its_node *find_4_1_its(void); 68 68 69 69 /* 70 70 * Collection structure - just an ID, and a redistributor address to ··· 3885 3883 raw_spin_unlock_irqrestore(&vpe_proxy.lock, flags); 3886 3884 } 3887 3885 3886 + static void its_vpe_4_1_invall_locked(int cpu, struct its_vpe *vpe) 3887 + { 3888 + void __iomem *rdbase; 3889 + u64 val; 3890 + 3891 + val = GICR_INVALLR_V; 3892 + val |= FIELD_PREP(GICR_INVALLR_VPEID, vpe->vpe_id); 3893 + 3894 + guard(raw_spinlock)(&gic_data_rdist_cpu(cpu)->rd_lock); 3895 + rdbase = per_cpu_ptr(gic_rdists->rdist, cpu)->rd_base; 3896 + gic_write_lpir(val, rdbase + GICR_INVALLR); 3897 + wait_for_syncr(rdbase); 3898 + } 3899 + 3888 3900 static int its_vpe_set_affinity(struct irq_data *d, 3889 3901 const struct cpumask *mask_val, 3890 3902 bool force) ··· 3906 3890 struct its_vpe *vpe = irq_data_get_irq_chip_data(d); 3907 3891 unsigned int from, cpu = nr_cpu_ids; 3908 3892 struct cpumask *table_mask; 3893 + struct its_node *its; 3909 3894 unsigned long flags; 3910 3895 3911 3896 /* ··· 3969 3952 vpe->col_idx = cpu; 3970 3953 3971 3954 its_send_vmovp(vpe); 3955 + 3956 + its = find_4_1_its(); 3957 + if (its && its->flags & ITS_FLAGS_WORKAROUND_HISILICON_162100801) 3958 + its_vpe_4_1_invall_locked(cpu, vpe); 3959 + 3972 3960 its_vpe_db_proxy_move(vpe, from, cpu); 3973 3961 3974 3962 out: ··· 4281 4259 4282 4260 static void its_vpe_4_1_invall(struct its_vpe *vpe) 4283 4261 { 4284 - void __iomem *rdbase; 4285 4262 unsigned long flags; 4286 - u64 val; 4287 4263 int cpu; 4288 - 4289 - val = GICR_INVALLR_V; 4290 - val |= FIELD_PREP(GICR_INVALLR_VPEID, vpe->vpe_id); 4291 4264 4292 4265 /* Target the redistributor this vPE is currently known on */ 4293 4266 cpu = vpe_to_cpuid_lock(vpe, &flags); 4294 - raw_spin_lock(&gic_data_rdist_cpu(cpu)->rd_lock); 4295 - rdbase = per_cpu_ptr(gic_rdists->rdist, cpu)->rd_base; 4296 - gic_write_lpir(val, rdbase + GICR_INVALLR); 4297 - 4298 - wait_for_syncr(rdbase); 4299 - raw_spin_unlock(&gic_data_rdist_cpu(cpu)->rd_lock); 4267 + its_vpe_4_1_invall_locked(cpu, vpe); 4300 4268 vpe_to_cpuid_unlock(vpe, flags); 4301 4269 } 4302 4270 ··· 4879 4867 return true; 4880 4868 } 4881 4869 4870 + static bool __maybe_unused its_enable_quirk_hip09_162100801(void *data) 4871 + { 4872 + struct its_node *its = data; 4873 + 4874 + its->flags |= ITS_FLAGS_WORKAROUND_HISILICON_162100801; 4875 + return true; 4876 + } 4877 + 4882 4878 static const struct gic_quirk its_quirks[] = { 4883 4879 #ifdef CONFIG_CAVIUM_ERRATUM_22375 4884 4880 { ··· 4931 4911 .iidr = 0x00000004, 4932 4912 .mask = 0xffffffff, 4933 4913 .init = its_enable_quirk_hip07_161600802, 4914 + }, 4915 + #endif 4916 + #ifdef CONFIG_HISILICON_ERRATUM_162100801 4917 + { 4918 + .desc = "ITS: Hip09 erratum 162100801", 4919 + .iidr = 0x00051736, 4920 + .mask = 0xffffffff, 4921 + .init = its_enable_quirk_hip09_162100801, 4934 4922 }, 4935 4923 #endif 4936 4924 #ifdef CONFIG_ROCKCHIP_ERRATUM_3588001
+1 -1
drivers/irqchip/irq-imgpdc.c
··· 479 479 .of_match_table = pdc_intc_match, 480 480 }, 481 481 .probe = pdc_intc_probe, 482 - .remove_new = pdc_intc_remove, 482 + .remove = pdc_intc_remove, 483 483 }; 484 484 485 485 static int __init pdc_intc_init(void)
+1 -1
drivers/irqchip/irq-imx-intmux.c
··· 361 361 .pm = &imx_intmux_pm_ops, 362 362 }, 363 363 .probe = imx_intmux_probe, 364 - .remove_new = imx_intmux_remove, 364 + .remove = imx_intmux_remove, 365 365 }; 366 366 builtin_platform_driver(imx_intmux_driver);
+1 -1
drivers/irqchip/irq-imx-irqsteer.c
··· 328 328 .pm = &imx_irqsteer_pm_ops, 329 329 }, 330 330 .probe = imx_irqsteer_probe, 331 - .remove_new = imx_irqsteer_remove, 331 + .remove = imx_irqsteer_remove, 332 332 }; 333 333 builtin_platform_driver(imx_irqsteer_driver);
+1 -1
drivers/irqchip/irq-keystone.c
··· 211 211 212 212 static struct platform_driver keystone_irq_device_driver = { 213 213 .probe = keystone_irq_probe, 214 - .remove_new = keystone_irq_remove, 214 + .remove = keystone_irq_remove, 215 215 .driver = { 216 216 .name = "keystone_irq", 217 217 .of_match_table = of_match_ptr(keystone_irq_dt_ids),
+1 -1
drivers/irqchip/irq-ls-scfg-msi.c
··· 418 418 .of_match_table = ls_scfg_msi_id, 419 419 }, 420 420 .probe = ls_scfg_msi_probe, 421 - .remove_new = ls_scfg_msi_remove, 421 + .remove = ls_scfg_msi_remove, 422 422 }; 423 423 424 424 module_platform_driver(ls_scfg_msi_driver);
+1 -1
drivers/irqchip/irq-madera.c
··· 236 236 237 237 static struct platform_driver madera_irq_driver = { 238 238 .probe = madera_irq_probe, 239 - .remove_new = madera_irq_remove, 239 + .remove = madera_irq_remove, 240 240 .driver = { 241 241 .name = "madera-irq", 242 242 .pm = &madera_irq_pm_ops,
+1 -1
drivers/irqchip/irq-mvebu-pic.c
··· 183 183 184 184 static struct platform_driver mvebu_pic_driver = { 185 185 .probe = mvebu_pic_probe, 186 - .remove_new = mvebu_pic_remove, 186 + .remove = mvebu_pic_remove, 187 187 .driver = { 188 188 .name = "mvebu-pic", 189 189 .of_match_table = mvebu_pic_of_match,
+1 -1
drivers/irqchip/irq-mvebu-sei.c
··· 192 192 } 193 193 194 194 static const struct irq_domain_ops mvebu_sei_domain_ops = { 195 - .select = msi_lib_irq_domain_select, 196 195 .alloc = mvebu_sei_domain_alloc, 197 196 .free = mvebu_sei_domain_free, 198 197 }; ··· 305 306 } 306 307 307 308 static const struct irq_domain_ops mvebu_sei_cp_domain_ops = { 309 + .select = msi_lib_irq_domain_select, 308 310 .alloc = mvebu_sei_cp_domain_alloc, 309 311 .free = mvebu_sei_cp_domain_free, 310 312 };
+1 -1
drivers/irqchip/irq-pruss-intc.c
··· 648 648 .suppress_bind_attrs = true, 649 649 }, 650 650 .probe = pruss_intc_probe, 651 - .remove_new = pruss_intc_remove, 651 + .remove = pruss_intc_remove, 652 652 }; 653 653 module_platform_driver(pruss_intc_driver); 654 654
+1 -1
drivers/irqchip/irq-renesas-intc-irqpin.c
··· 584 584 585 585 static struct platform_driver intc_irqpin_device_driver = { 586 586 .probe = intc_irqpin_probe, 587 - .remove_new = intc_irqpin_remove, 587 + .remove = intc_irqpin_remove, 588 588 .driver = { 589 589 .name = "renesas_intc_irqpin", 590 590 .of_match_table = intc_irqpin_dt_ids,
+1 -1
drivers/irqchip/irq-renesas-irqc.c
··· 247 247 248 248 static struct platform_driver irqc_device_driver = { 249 249 .probe = irqc_probe, 250 - .remove_new = irqc_remove, 250 + .remove = irqc_remove, 251 251 .driver = { 252 252 .name = "renesas_irqc", 253 253 .of_match_table = irqc_dt_ids,
+1 -1
drivers/irqchip/irq-renesas-rza1.c
··· 259 259 260 260 static struct platform_driver rza1_irqc_device_driver = { 261 261 .probe = rza1_irqc_probe, 262 - .remove_new = rza1_irqc_remove, 262 + .remove = rza1_irqc_remove, 263 263 .driver = { 264 264 .name = "renesas_rza1_irqc", 265 265 .of_match_table = rza1_irqc_dt_ids,
+1 -1
drivers/irqchip/irq-ts4800.c
··· 154 154 155 155 static struct platform_driver ts4800_ic_driver = { 156 156 .probe = ts4800_ic_probe, 157 - .remove_new = ts4800_ic_remove, 157 + .remove = ts4800_ic_remove, 158 158 .driver = { 159 159 .name = "ts4800-irqc", 160 160 .of_match_table = ts4800_ic_of_match,