drivers/interrupt_controller: Add VT-D context cache invalidation

Not sure this is requered as we do not mangle with domains, but let's
make sure this cache is clear.

Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit is contained in:
Tomasz Bursztyka 2021-03-12 15:00:48 +01:00 committed by Anas Nashif
commit 92884ba44a
2 changed files with 35 additions and 0 deletions

View file

@ -171,6 +171,16 @@ static int vtd_qi_send(const struct device *dev,
return 0;
}
static int vtd_global_cc_invalidate(const struct device *dev)
{
union qi_icc_descriptor iec_desc = { 0 };
iec_desc.icc.type = QI_TYPE_ICC;
iec_desc.icc.granularity = 1; /* Global Invalidation requested */
return vtd_qi_send(dev, &iec_desc.desc);
}
static int vtd_global_iec_invalidate(const struct device *dev)
{
union qi_iec_descriptor iec_desc = { 0 };
@ -462,6 +472,12 @@ static int vtd_ictl_init(const struct device *dev)
vtd_qi_init(dev);
if (vtd_global_cc_invalidate(dev) != 0) {
printk("Could not perform ICC invalidation\n");
ret = -EIO;
goto out;
}
if (IS_ENABLED(CONFIG_X2APIC)) {
eime = VTD_IRTA_EIME;
}

View file

@ -57,6 +57,25 @@ struct qi_descriptor {
uint64_t high;
};
#define QI_TYPE_ICC 0x1UL
union qi_icc_descriptor {
struct qi_descriptor desc;
struct icc_bits {
uint64_t type : 4;
uint64_t granularity : 2;
uint64_t _reserved_0 : 3;
uint64_t zero : 3;
uint64_t _reserved_1 : 4;
uint64_t domain_id : 16;
uint64_t source_id : 16;
uint64_t function_mask : 2;
uint64_t _reserved_2 : 14;
uint64_t reserved;
} icc __packed;
};
#define QI_TYPE_IEC 0x4UL
union qi_iec_descriptor {