Skip to content

Commit

Permalink
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/l…
Browse files Browse the repository at this point in the history
…inux/kernel/git/tip/tip

Pull irq fixes from Thomas Gleixner:
 "Two fixes for interrupt controller drivers:

   - Skip IRQ_M_EXT entries in the device tree when initializing the
     RISCV PLIC controller to avoid a double init attempt.

   - Use the correct ITS list when issuing the VMOVP synchronization
     command so the operation works only on the ITS instances which are
     associated to a VM"

* 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  irqchip/sifive-plic: Skip contexts except supervisor in plic_init()
  irqchip/gic-v3-its: Use the exact ITSList for VMOVP
  • Loading branch information
Linus Torvalds committed Oct 27, 2019
2 parents c9a2e4a + 1486b7b commit 1e1ac1c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
21 changes: 18 additions & 3 deletions drivers/irqchip/irq-gic-v3-its.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,22 @@ static DEFINE_IDA(its_vpeid_ida);
#define gic_data_rdist_rd_base() (gic_data_rdist()->rd_base)
#define gic_data_rdist_vlpi_base() (gic_data_rdist_rd_base() + SZ_128K)

static u16 get_its_list(struct its_vm *vm)
{
struct its_node *its;
unsigned long its_list = 0;

list_for_each_entry(its, &its_nodes, entry) {
if (!its->is_v4)
continue;

if (vm->vlpi_count[its->list_nr])
__set_bit(its->list_nr, &its_list);
}

return (u16)its_list;
}

static struct its_collection *dev_event_to_col(struct its_device *its_dev,
u32 event)
{
Expand Down Expand Up @@ -976,17 +992,15 @@ static void its_send_vmapp(struct its_node *its,

static void its_send_vmovp(struct its_vpe *vpe)
{
struct its_cmd_desc desc;
struct its_cmd_desc desc = {};
struct its_node *its;
unsigned long flags;
int col_id = vpe->col_idx;

desc.its_vmovp_cmd.vpe = vpe;
desc.its_vmovp_cmd.its_list = (u16)its_list_map;

if (!its_list_map) {
its = list_first_entry(&its_nodes, struct its_node, entry);
desc.its_vmovp_cmd.seq_num = 0;
desc.its_vmovp_cmd.col = &its->collections[col_id];
its_send_single_vcommand(its, its_build_vmovp_cmd, &desc);
return;
Expand All @@ -1003,6 +1017,7 @@ static void its_send_vmovp(struct its_vpe *vpe)
raw_spin_lock_irqsave(&vmovp_lock, flags);

desc.its_vmovp_cmd.seq_num = vmovp_seq_num++;
desc.its_vmovp_cmd.its_list = get_its_list(vpe->its_vm);

/* Emit VMOVPs */
list_for_each_entry(its, &its_nodes, entry) {
Expand Down
4 changes: 2 additions & 2 deletions drivers/irqchip/irq-sifive-plic.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,8 +252,8 @@ static int __init plic_init(struct device_node *node,
continue;
}

/* skip context holes */
if (parent.args[0] == -1)
/* skip contexts other than supervisor external interrupt */
if (parent.args[0] != IRQ_S_EXT)
continue;

hartid = plic_find_hart_id(parent.np);
Expand Down

0 comments on commit 1e1ac1c

Please sign in to comment.