aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/irqchip
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2019-10-25 08:25:15 -0400
committerThomas Gleixner <tglx@linutronix.de>2019-10-25 08:25:15 -0400
commit1486b7b42bd79799cc62aa2c65af03e103802b40 (patch)
tree76d4a60f02fe62c37b89dc489bf9655500dcde77 /drivers/irqchip
parent7d194c2100ad2a6dded545887d02754948ca5241 (diff)
parent41860cc447045c811ce6d5a92f93a065a691fe8e (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.c21
-rw-r--r--drivers/irqchip/irq-sifive-plic.c4
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
178static 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
178static struct its_collection *dev_event_to_col(struct its_device *its_dev, 194static 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
977static void its_send_vmovp(struct its_vpe *vpe) 993static 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);