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>
diff --git a/drivers/interrupt_controller/intc_intel_vtd.c b/drivers/interrupt_controller/intc_intel_vtd.c
index 77c036f..2631ae3 100644
--- a/drivers/interrupt_controller/intc_intel_vtd.c
+++ b/drivers/interrupt_controller/intc_intel_vtd.c
@@ -171,6 +171,16 @@
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 @@
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;
}
diff --git a/drivers/interrupt_controller/intc_intel_vtd.h b/drivers/interrupt_controller/intc_intel_vtd.h
index ad7aeed..94c04bf 100644
--- a/drivers/interrupt_controller/intc_intel_vtd.h
+++ b/drivers/interrupt_controller/intc_intel_vtd.h
@@ -57,6 +57,25 @@
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 {