Coverage Report

Created: 2017-10-25 09:10

/root/src/xen/xen/drivers/passthrough/vtd/dmar.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2006, Intel Corporation.
3
 *
4
 * This program is free software; you can redistribute it and/or modify it
5
 * under the terms and conditions of the GNU General Public License,
6
 * version 2, as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11
 * more details.
12
 *
13
 * You should have received a copy of the GNU General Public License along with
14
 * this program; If not, see <http://www.gnu.org/licenses/>.
15
 *
16
 * Copyright (C) Ashok Raj <ashok.raj@intel.com>
17
 * Copyright (C) Shaohua Li <shaohua.li@intel.com>
18
 */
19
20
#ifndef _DMAR_H_
21
#define _DMAR_H_
22
23
#include <xen/list.h>
24
#include <xen/iommu.h>
25
#include <xen/kexec.h>
26
27
/* This one is for interrupt remapping */
28
struct acpi_ioapic_unit {
29
    struct list_head list;
30
    int apic_id;
31
    union {
32
        u16 info;
33
        struct {
34
            u16 func: 3,
35
                dev:  5,
36
                bus:  8;
37
        }bdf;
38
    }ioapic;
39
};
40
41
struct acpi_hpet_unit {
42
    struct list_head list;
43
    unsigned int id;
44
    union {
45
        u16 bdf;
46
        struct {
47
            u16 func: 3,
48
                dev:  5,
49
                bus:  8;
50
        };
51
    };
52
};
53
54
struct dmar_scope {
55
    DECLARE_BITMAP(buses, 256);         /* buses owned by this unit */
56
    u16    *devices;                    /* devices owned by this unit */
57
    int    devices_cnt;
58
};
59
60
struct acpi_drhd_unit {
61
    struct dmar_scope scope;
62
    struct list_head list;
63
    u64    address;                     /* register base address of the unit */
64
    u16    segment;
65
    u8     include_all:1;
66
    struct iommu *iommu;
67
    struct list_head ioapic_list;
68
    struct list_head hpet_list;
69
};
70
71
struct acpi_rmrr_unit {
72
    struct dmar_scope scope;
73
    struct list_head list;
74
    u64    base_address;
75
    u64    end_address;
76
    u16    segment;
77
    u8     allow_all:1;
78
};
79
80
struct acpi_atsr_unit {
81
    struct dmar_scope scope;
82
    struct list_head list;
83
    u16    segment;
84
    u8     all_ports:1;
85
};
86
87
struct acpi_rhsa_unit {
88
    struct list_head list;
89
    u64    address;
90
    u32    proximity_domain;
91
};
92
93
#define for_each_drhd_unit(drhd) \
94
4.56M
    list_for_each_entry(drhd, &acpi_drhd_units, list)
95
96
#define for_each_rmrr_device(rmrr, bdf, idx)            \
97
1
    list_for_each_entry(rmrr, &acpi_rmrr_units, list)   \
98
0
        /* assume there never is a bdf == 0 */          \
99
3
        for (idx = 0; (bdf = rmrr->scope.devices[idx]) && \
100
2
                 idx < rmrr->scope.devices_cnt; idx++)
101
102
struct acpi_drhd_unit *acpi_find_matched_drhd_unit(const struct pci_dev *);
103
struct acpi_atsr_unit *acpi_find_matched_atsr_unit(const struct pci_dev *);
104
105
4
#define DMAR_TYPE 1
106
1
#define RMRR_TYPE 2
107
1
#define ATSR_TYPE 3
108
109
0
#define DMAR_OPERATION_TIMEOUT MILLISECS(1000)
110
111
5
#define IOMMU_WAIT_OP(iommu, offset, op, cond, sts) \
112
5
do {                                                \
113
5
    s_time_t start_time = NOW();                    \
114
5
    while (1) {                                     \
115
5
        sts = op(iommu->reg, offset);               \
116
5
        if ( cond )                                 \
117
5
            break;                                  \
118
0
        if ( NOW() > start_time + DMAR_OPERATION_TIMEOUT ) {    \
119
0
            if ( !kexecing )                                    \
120
0
                panic("%s:%d:%s: DMAR hardware is malfunctional",\
121
0
                      __FILE__, __LINE__, __func__);            \
122
0
            else                                                \
123
0
                break;                                          \
124
0
        }                                                       \
125
0
        cpu_relax();                                            \
126
0
    }                                                           \
127
5
} while (0)
128
129
int vtd_hw_check(void);
130
void disable_pmr(struct iommu *iommu);
131
int is_igd_drhd(struct acpi_drhd_unit *drhd);
132
133
#endif /* _DMAR_H_ */