drivers/interrupt_controller: Make VT-D remap generic and handle flags
This will not only be used by MSI remapping but by all relevant interrupts. Fix also IRTE settings: - handle x2apic for destination id - destination mode is always logical (as for IOAPIC) Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit is contained in:
parent
2b1cbcbddc
commit
1a1bc0d242
4 changed files with 23 additions and 8 deletions
|
@ -19,6 +19,7 @@
|
|||
|
||||
#include <arch/x86/intel_vtd.h>
|
||||
#include <drivers/interrupt_controller/intel_vtd.h>
|
||||
#include <drivers/interrupt_controller/ioapic.h>
|
||||
|
||||
#include "intc_intel_vtd.h"
|
||||
|
||||
|
@ -76,14 +77,15 @@ static uint32_t vtd_ictl_remap_msi(const struct device *dev,
|
|||
}
|
||||
|
||||
static int vtd_ictl_remap(const struct device *dev,
|
||||
msi_vector_t *vector)
|
||||
uint8_t irte_idx,
|
||||
uint16_t vector,
|
||||
uint32_t flags)
|
||||
{
|
||||
struct vtd_ictl_data *data = dev->data;
|
||||
uint8_t irte_idx = vector->arch.irte;
|
||||
|
||||
memset(&data->irte[irte_idx], 0, sizeof(struct vtd_irte));
|
||||
|
||||
data->irte[irte_idx].l.vector = vector->arch.vector;
|
||||
data->irte[irte_idx].l.vector = vector;
|
||||
|
||||
if (IS_ENABLED(CONFIG_X2APIC)) {
|
||||
data->irte[irte_idx].l.dst_id = arch_curr_cpu()->id;
|
||||
|
@ -91,6 +93,12 @@ static int vtd_ictl_remap(const struct device *dev,
|
|||
data->irte[irte_idx].l.dst_id = arch_curr_cpu()->id << 8;
|
||||
}
|
||||
|
||||
data->irte[irte_idx].l.trigger_mode =
|
||||
(flags & IOAPIC_TRIGGER_MASK) >> 15;
|
||||
data->irte[irte_idx].l.delivery_mode =
|
||||
(flags & IOAPIC_DELIVERY_MODE_MASK) >> 8;
|
||||
data->irte[irte_idx].l.dst_mode = 1;
|
||||
data->irte[irte_idx].l.redirection_hint = 1;
|
||||
data->irte[irte_idx].l.present = 1;
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue