Commit 3bf17472 authored by Thomas Gleixner's avatar Thomas Gleixner

iommu: dmar: Extend struct irte for VT-d Posted-Interrupts

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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarFeng Wu <feng.wu@intel.com>
Acked-by: default avatarJoerg 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.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 6f281923
...@@ -185,33 +185,73 @@ static inline int dmar_device_remove(void *handle) ...@@ -185,33 +185,73 @@ static inline int dmar_device_remove(void *handle)
struct irte { struct irte {
union { union {
/* Shared between remapped and posted mode*/
struct { struct {
__u64 present : 1, __u64 present : 1, /* 0 */
fpd : 1, fpd : 1, /* 1 */
dst_mode : 1, __res0 : 6, /* 2 - 6 */
redir_hint : 1, avail : 4, /* 8 - 11 */
trigger_mode : 1, __res1 : 3, /* 12 - 14 */
dlvry_mode : 3, pst : 1, /* 15 */
avail : 4, vector : 8, /* 16 - 23 */
__reserved_1 : 4, __res2 : 40; /* 24 - 63 */
vector : 8, };
__reserved_2 : 8,
dest_id : 32; /* 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; __u64 low;
}; };
union { union {
/* Shared between remapped and posted mode*/
struct { struct {
__u64 sid : 16, __u64 sid : 16, /* 64 - 79 */
sq : 2, sq : 2, /* 80 - 81 */
svt : 2, svt : 2, /* 82 - 83 */
__reserved_3 : 44; __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; __u64 high;
}; };
}; };
#define PDA_LOW_BIT 26
#define PDA_HIGH_BIT 32
enum { enum {
IRQ_REMAP_XAPIC_MODE, IRQ_REMAP_XAPIC_MODE,
IRQ_REMAP_X2APIC_MODE, IRQ_REMAP_X2APIC_MODE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment