diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2019-10-25 08:25:15 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2019-10-25 08:25:15 -0400 |
commit | 1486b7b42bd79799cc62aa2c65af03e103802b40 (patch) | |
tree | 76d4a60f02fe62c37b89dc489bf9655500dcde77 /drivers/irqchip | |
parent | 7d194c2100ad2a6dded545887d02754948ca5241 (diff) | |
parent | 41860cc447045c811ce6d5a92f93a065a691fe8e (diff) |
Merge tag 'irqchip-fixes-5.4-2' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/urgent
Pull the second lot of irqchip updates for 5.4 from Marc Zyngier:
- Sifive PLIC: force driver to skip non-relevant contexts
- GICv4: Don't send VMOVP commands to ITSs that don't have
this vPE mapped
Diffstat (limited to 'drivers/irqchip')
-rw-r--r-- | drivers/irqchip/irq-gic-v3-its.c | 21 | ||||
-rw-r--r-- | drivers/irqchip/irq-sifive-plic.c | 4 |
2 files changed, 20 insertions, 5 deletions
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 62e54f1a248b..787e8eec9a7f 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c | |||
@@ -175,6 +175,22 @@ static DEFINE_IDA(its_vpeid_ida); | |||
175 | #define gic_data_rdist_rd_base() (gic_data_rdist()->rd_base) | 175 | #define gic_data_rdist_rd_base() (gic_data_rdist()->rd_base) |
176 | #define gic_data_rdist_vlpi_base() (gic_data_rdist_rd_base() + SZ_128K) | 176 | #define gic_data_rdist_vlpi_base() (gic_data_rdist_rd_base() + SZ_128K) |
177 | 177 | ||
178 | static u16 get_its_list(struct its_vm *vm) | ||
179 | { | ||
180 | struct its_node *its; | ||
181 | unsigned long its_list = 0; | ||
182 | |||
183 | list_for_each_entry(its, &its_nodes, entry) { | ||
184 | if (!its->is_v4) | ||
185 | continue; | ||
186 | |||
187 | if (vm->vlpi_count[its->list_nr]) | ||
188 | __set_bit(its->list_nr, &its_list); | ||
189 | } | ||
190 | |||
191 | return (u16)its_list; | ||
192 | } | ||
193 | |||
178 | static struct its_collection *dev_event_to_col(struct its_device *its_dev, | 194 | static struct its_collection *dev_event_to_col(struct its_device *its_dev, |
179 | u32 event) | 195 | u32 event) |
180 | { | 196 | { |
@@ -976,17 +992,15 @@ static void its_send_vmapp(struct its_node *its, | |||
976 | 992 | ||
977 | static void its_send_vmovp(struct its_vpe *vpe) | 993 | static void its_send_vmovp(struct its_vpe *vpe) |
978 | { | 994 | { |
979 | struct its_cmd_desc desc; | 995 | struct its_cmd_desc desc = {}; |
980 | struct its_node *its; | 996 | struct its_node *its; |
981 | unsigned long flags; | 997 | unsigned long flags; |
982 | int col_id = vpe->col_idx; | 998 | int col_id = vpe->col_idx; |
983 | 999 | ||
984 | desc.its_vmovp_cmd.vpe = vpe; | 1000 | desc.its_vmovp_cmd.vpe = vpe; |
985 | desc.its_vmovp_cmd.its_list = (u16)its_list_map; | ||
986 | 1001 | ||
987 | if (!its_list_map) { | 1002 | if (!its_list_map) { |
988 | its = list_first_entry(&its_nodes, struct its_node, entry); | 1003 | its = list_first_entry(&its_nodes, struct its_node, entry); |
989 | desc.its_vmovp_cmd.seq_num = 0; | ||
990 | desc.its_vmovp_cmd.col = &its->collections[col_id]; | 1004 | desc.its_vmovp_cmd.col = &its->collections[col_id]; |
991 | its_send_single_vcommand(its, its_build_vmovp_cmd, &desc); | 1005 | its_send_single_vcommand(its, its_build_vmovp_cmd, &desc); |
992 | return; | 1006 | return; |
@@ -1003,6 +1017,7 @@ static void its_send_vmovp(struct its_vpe *vpe) | |||
1003 | raw_spin_lock_irqsave(&vmovp_lock, flags); | 1017 | raw_spin_lock_irqsave(&vmovp_lock, flags); |
1004 | 1018 | ||
1005 | desc.its_vmovp_cmd.seq_num = vmovp_seq_num++; | 1019 | desc.its_vmovp_cmd.seq_num = vmovp_seq_num++; |
1020 | desc.its_vmovp_cmd.its_list = get_its_list(vpe->its_vm); | ||
1006 | 1021 | ||
1007 | /* Emit VMOVPs */ | 1022 | /* Emit VMOVPs */ |
1008 | list_for_each_entry(its, &its_nodes, entry) { | 1023 | list_for_each_entry(its, &its_nodes, entry) { |
diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c index daefc52b0ec5..7d0a12fe2714 100644 --- a/drivers/irqchip/irq-sifive-plic.c +++ b/drivers/irqchip/irq-sifive-plic.c | |||
@@ -252,8 +252,8 @@ static int __init plic_init(struct device_node *node, | |||
252 | continue; | 252 | continue; |
253 | } | 253 | } |
254 | 254 | ||
255 | /* skip context holes */ | 255 | /* skip contexts other than supervisor external interrupt */ |
256 | if (parent.args[0] == -1) | 256 | if (parent.args[0] != IRQ_S_EXT) |
257 | continue; | 257 | continue; |
258 | 258 | ||
259 | hartid = plic_find_hart_id(parent.np); | 259 | hartid = plic_find_hart_id(parent.np); |