drivers/interrupt_controller: Generate proper MSI address on VT-D

SHV bit depends on the number of vectors allocated.
If it's facing a multi-vector MSI array, it will set the bit.
If not the bit must be 0.

Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
diff --git a/arch/x86/core/pcie.c b/arch/x86/core/pcie.c
index cf503d4..f08be52 100644
--- a/arch/x86/core/pcie.c
+++ b/arch/x86/core/pcie.c
@@ -187,7 +187,7 @@
 	ARG_UNUSED(irq);
 
 #if defined(CONFIG_INTEL_VTD_ICTL)
-	return vtd_remap_msi(vtd, vector);
+	return vtd_remap_msi(vtd, vector, n_vector);
 #else
 	return 0xFEE00000U; /* standard delivery to BSP local APIC */
 #endif
diff --git a/drivers/interrupt_controller/intc_intel_vtd.c b/drivers/interrupt_controller/intc_intel_vtd.c
index 7e307d0..898c732 100644
--- a/drivers/interrupt_controller/intc_intel_vtd.c
+++ b/drivers/interrupt_controller/intc_intel_vtd.c
@@ -68,9 +68,12 @@
 }
 
 static uint32_t vtd_ictl_remap_msi(const struct device *dev,
-				   msi_vector_t *vector)
+				   msi_vector_t *vector,
+				   uint8_t n_vector)
 {
-	return VTD_MSI_MAP(vector->arch.irte);
+	uint32_t shv = (n_vector > 1) ? VTD_INT_SHV : 0;
+
+	return VTD_MSI_MAP(vector->arch.irte, shv);
 }
 
 static int vtd_ictl_remap(const struct device *dev,
diff --git a/drivers/interrupt_controller/intc_intel_vtd.h b/drivers/interrupt_controller/intc_intel_vtd.h
index 912ec1e..353d828 100644
--- a/drivers/interrupt_controller/intc_intel_vtd.h
+++ b/drivers/interrupt_controller/intc_intel_vtd.h
@@ -12,8 +12,8 @@
 /* We don't care about int_idx[15], since the size is fixed to 256,
  * it's always 0
  */
-#define VTD_MSI_MAP(int_idx) \
-	((0x0FEE << 20) | (int_idx << 5) | VTD_INT_SHV | VTD_INT_FORMAT)
+#define VTD_MSI_MAP(int_idx, shv)					\
+	((0x0FEE00000U) | (int_idx << 5) | shv | VTD_INT_FORMAT)
 
 /* Interrupt Remapping Table Entry (IRTE) for Remapped Interrupts */
 struct vtd_irte {
diff --git a/include/drivers/interrupt_controller/intel_vtd.h b/include/drivers/interrupt_controller/intel_vtd.h
index 08c3e4a..7eadef0 100644
--- a/include/drivers/interrupt_controller/intel_vtd.h
+++ b/include/drivers/interrupt_controller/intel_vtd.h
@@ -12,7 +12,8 @@
 				   uint8_t n_entries);
 
 typedef uint32_t (*vtd_remap_msi_f)(const struct device *dev,
-				    msi_vector_t *vector);
+				    msi_vector_t *vector,
+				    uint8_t n_vector);
 
 typedef int (*vtd_remap_f)(const struct device *dev,
 			   msi_vector_t *vector);
@@ -46,17 +47,19 @@
  * @brief Generate the MSI Message Address data for the given vector
  *
  * @param dev Pointer to the device structure for the driver instance
- * @param vector A valid allocated MSI vector
+ * @param vector A valid allocated MSI vector array
+ * @param n_vector the size of the vector array
  *
  * @return The MSI Message Address value
  */
 static inline uint32_t vtd_remap_msi(const struct device *dev,
-				     msi_vector_t *vector)
+				     msi_vector_t *vector,
+				     uint8_t n_vector)
 {
 	const struct vtd_driver_api *api =
 		(const struct vtd_driver_api *)dev->api;
 
-	return api->remap_msi(dev, vector);
+	return api->remap_msi(dev, vector, n_vector);
 }
 
 /**