iommu: dmar: Extend struct irte for VT-d Posted-Interrupts
authorThomas Gleixner <tglx@linutronix.de>
Tue, 9 Jun 2015 05:20:29 +0000 (13:20 +0800)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 12 Jun 2015 09:33:51 +0000 (11:33 +0200)
The IRTE (Interrupt Remapping Table Entry) is either an entry for
remapped or for posted interrupts. The hardware distiguishes between
remapped and posted entries by bit 15 in the low 64 bit of the
IRTE. If cleared the entry is remapped, if set it's posted.

The entries have common fields and dependent on the posted bit fields
with different meanings.

Extend struct irte to handle the differences between remap and posted
mode by having three structs in the unions:

        - Shared
        - Remapped
        - Posted

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Feng Wu <feng.wu@intel.com>
Acked-by: Joerg Roedel <joro@8bytes.org>
Cc: jiang.liu@linux.intel.com
Cc: iommu@lists.linux-foundation.org
Cc: dwmw2@infradead.org
Link: http://lkml.kernel.org/r/1433827237-3382-3-git-send-email-feng.wu@intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
include/linux/dmar.h

index 84737565c1fd959f8bcf8c52faca836db15fe9c2..0dbcabcb5f0dbdc33b5a187d88fd625ce078cc70 100644 (file)
@@ -185,33 +185,73 @@ static inline int dmar_device_remove(void *handle)
 
 struct irte {
        union {
+               /* Shared between remapped and posted mode*/
                struct {
-                       __u64   present         : 1,
-                               fpd             : 1,
-                               dst_mode        : 1,
-                               redir_hint      : 1,
-                               trigger_mode    : 1,
-                               dlvry_mode      : 3,
-                               avail           : 4,
-                               __reserved_1    : 4,
-                               vector          : 8,
-                               __reserved_2    : 8,
-                               dest_id         : 32;
+                       __u64   present         : 1,  /*  0      */
+                               fpd             : 1,  /*  1      */
+                               __res0          : 6,  /*  2 -  6 */
+                               avail           : 4,  /*  8 - 11 */
+                               __res1          : 3,  /* 12 - 14 */
+                               pst             : 1,  /* 15      */
+                               vector          : 8,  /* 16 - 23 */
+                               __res2          : 40; /* 24 - 63 */
+               };
+
+               /* Remapped mode */
+               struct {
+                       __u64   r_present       : 1,  /*  0      */
+                               r_fpd           : 1,  /*  1      */
+                               dst_mode        : 1,  /*  2      */
+                               redir_hint      : 1,  /*  3      */
+                               trigger_mode    : 1,  /*  4      */
+                               dlvry_mode      : 3,  /*  5 -  7 */
+                               r_avail         : 4,  /*  8 - 11 */
+                               r_res0          : 4,  /* 12 - 15 */
+                               r_vector        : 8,  /* 16 - 23 */
+                               r_res1          : 8,  /* 24 - 31 */
+                               dest_id         : 32; /* 32 - 63 */
+               };
+
+               /* Posted mode */
+               struct {
+                       __u64   p_present       : 1,  /*  0      */
+                               p_fpd           : 1,  /*  1      */
+                               p_res0          : 6,  /*  2 -  7 */
+                               p_avail         : 4,  /*  8 - 11 */
+                               p_res1          : 2,  /* 12 - 13 */
+                               p_urgent        : 1,  /* 14      */
+                               p_pst           : 1,  /* 15      */
+                               p_vector        : 8,  /* 16 - 23 */
+                               p_res2          : 14, /* 24 - 37 */
+                               pda_l           : 26; /* 38 - 63 */
                };
                __u64 low;
        };
 
        union {
+               /* Shared between remapped and posted mode*/
                struct {
-                       __u64   sid             : 16,
-                               sq              : 2,
-                               svt             : 2,
-                               __reserved_3    : 44;
+                       __u64   sid             : 16,  /* 64 - 79  */
+                               sq              : 2,   /* 80 - 81  */
+                               svt             : 2,   /* 82 - 83  */
+                               __res3          : 44;  /* 84 - 127 */
+               };
+
+               /* Posted mode*/
+               struct {
+                       __u64   p_sid           : 16,  /* 64 - 79  */
+                               p_sq            : 2,   /* 80 - 81  */
+                               p_svt           : 2,   /* 82 - 83  */
+                               p_res3          : 12,  /* 84 - 95  */
+                               pda_h           : 32;  /* 96 - 127 */
                };
                __u64 high;
        };
 };
 
+#define PDA_LOW_BIT    26
+#define PDA_HIGH_BIT   32
+
 enum {
        IRQ_REMAP_XAPIC_MODE,
        IRQ_REMAP_X2APIC_MODE,