Blame view

include/linux/amd-iommu.h 5.7 KB
c6da992e1   Joerg Roedel   x86, AMD IOMMU: a...
1
  /*
5d0d71569   Joerg Roedel   x86/amd-iommu: Up...
2
   * Copyright (C) 2007-2010 Advanced Micro Devices, Inc.
c6da992e1   Joerg Roedel   x86, AMD IOMMU: a...
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   * Author: Joerg Roedel <joerg.roedel@amd.com>
   *         Leo Duran <leo.duran@amd.com>
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 as published
   * by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
   */
1965aae3c   H. Peter Anvin   x86: Fix ASM_X86_...
19
20
  #ifndef _ASM_X86_AMD_IOMMU_H
  #define _ASM_X86_AMD_IOMMU_H
c6da992e1   Joerg Roedel   x86, AMD IOMMU: a...
21

ed96f228b   Joerg Roedel   iommu/amd: Implem...
22
  #include <linux/types.h>
c6da992e1   Joerg Roedel   x86, AMD IOMMU: a...
23
24
  
  #ifdef CONFIG_AMD_IOMMU
6a9401a7a   Joerg Roedel   x86/amd-iommu: Se...
25

2d5503b62   Joerg Roedel   iommu/amd: Add ro...
26
  struct task_struct;
ed96f228b   Joerg Roedel   iommu/amd: Implem...
27
  struct pci_dev;
480125ba4   Konrad Rzeszutek Wilk   x86, iommu: Make ...
28
  extern int amd_iommu_detect(void);
6a9401a7a   Joerg Roedel   x86/amd-iommu: Se...
29

6a113ddc0   Joerg Roedel   iommu/amd: Add de...
30
31
32
33
34
35
36
  
  /**
   * amd_iommu_enable_device_erratum() - Enable erratum workaround for device
   *				       in the IOMMUv2 driver
   * @pdev: The PCI device the workaround is necessary for
   * @erratum: The erratum workaround to enable
   *
ed96f228b   Joerg Roedel   iommu/amd: Implem...
37
   * The function needs to be called before amd_iommu_init_device().
6a113ddc0   Joerg Roedel   iommu/amd: Add de...
38
39
40
41
42
43
44
45
46
47
   * Possible values for the erratum number are for now:
   * - AMD_PRI_DEV_ERRATUM_ENABLE_RESET - Reset PRI capability when PRI
   *					is enabled
   * - AMD_PRI_DEV_ERRATUM_LIMIT_REQ_ONE - Limit number of outstanding PRI
   *					 requests to one
   */
  #define AMD_PRI_DEV_ERRATUM_ENABLE_RESET		0
  #define AMD_PRI_DEV_ERRATUM_LIMIT_REQ_ONE		1
  
  extern void amd_iommu_enable_device_erratum(struct pci_dev *pdev, u32 erratum);
ed96f228b   Joerg Roedel   iommu/amd: Implem...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  /**
   * amd_iommu_init_device() - Init device for use with IOMMUv2 driver
   * @pdev: The PCI device to initialize
   * @pasids: Number of PASIDs to support for this device
   *
   * This function does all setup for the device pdev so that it can be
   * used with IOMMUv2.
   * Returns 0 on success or negative value on error.
   */
  extern int amd_iommu_init_device(struct pci_dev *pdev, int pasids);
  
  /**
   * amd_iommu_free_device() - Free all IOMMUv2 related device resources
   *			     and disable IOMMUv2 usage for this device
   * @pdev: The PCI device to disable IOMMUv2 usage for'
   */
  extern void amd_iommu_free_device(struct pci_dev *pdev);
2d5503b62   Joerg Roedel   iommu/amd: Add ro...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  /**
   * amd_iommu_bind_pasid() - Bind a given task to a PASID on a device
   * @pdev: The PCI device to bind the task to
   * @pasid: The PASID on the device the task should be bound to
   * @task: the task to bind
   *
   * The function returns 0 on success or a negative value on error.
   */
  extern int amd_iommu_bind_pasid(struct pci_dev *pdev, int pasid,
  				struct task_struct *task);
  
  /**
   * amd_iommu_unbind_pasid() - Unbind a PASID from its task on
   *			      a device
   * @pdev: The device of the PASID
   * @pasid: The PASID to unbind
   *
   * When this function returns the device is no longer using the PASID
   * and the PASID is no longer bound to its task.
   */
  extern void amd_iommu_unbind_pasid(struct pci_dev *pdev, int pasid);
175d61467   Joerg Roedel   iommu/amd: Add in...
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  /**
   * amd_iommu_set_invalid_ppr_cb() - Register a call-back for failed
   *				    PRI requests
   * @pdev: The PCI device the call-back should be registered for
   * @cb: The call-back function
   *
   * The IOMMUv2 driver invokes this call-back when it is unable to
   * successfully handle a PRI request. The device driver can then decide
   * which PRI response the device should see. Possible return values for
   * the call-back are:
   *
   * - AMD_IOMMU_INV_PRI_RSP_SUCCESS - Send SUCCESS back to the device
   * - AMD_IOMMU_INV_PRI_RSP_INVALID - Send INVALID back to the device
   * - AMD_IOMMU_INV_PRI_RSP_FAIL    - Send Failure back to the device,
   *				     the device is required to disable
   *				     PRI when it receives this response
   *
   * The function returns 0 on success or negative value on error.
   */
  #define AMD_IOMMU_INV_PRI_RSP_SUCCESS	0
  #define AMD_IOMMU_INV_PRI_RSP_INVALID	1
  #define AMD_IOMMU_INV_PRI_RSP_FAIL	2
  
  typedef int (*amd_iommu_invalid_ppr_cb)(struct pci_dev *pdev,
  					int pasid,
  					unsigned long address,
  					u16);
  
  extern int amd_iommu_set_invalid_ppr_cb(struct pci_dev *pdev,
  					amd_iommu_invalid_ppr_cb cb);
52efdb89d   Joerg Roedel   iommu/amd: Add am...
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  /**
   * amd_iommu_device_info() - Get information about IOMMUv2 support of a
   *			     PCI device
   * @pdev: PCI device to query information from
   * @info: A pointer to an amd_iommu_device_info structure which will contain
   *	  the information about the PCI device
   *
   * Returns 0 on success, negative value on error
   */
  
  #define AMD_IOMMU_DEVICE_FLAG_ATS_SUP     0x1    /* ATS feature supported */
  #define AMD_IOMMU_DEVICE_FLAG_PRI_SUP     0x2    /* PRI feature supported */
  #define AMD_IOMMU_DEVICE_FLAG_PASID_SUP   0x4    /* PASID context supported */
  #define AMD_IOMMU_DEVICE_FLAG_EXEC_SUP    0x8    /* Device may request execution
  						    on memory pages */
  #define AMD_IOMMU_DEVICE_FLAG_PRIV_SUP   0x10    /* Device may request
  						    super-user privileges */
  
  struct amd_iommu_device_info {
  	int max_pasids;
  	u32 flags;
  };
  
  extern int amd_iommu_device_info(struct pci_dev *pdev,
  				 struct amd_iommu_device_info *info);
bc21662f7   Joerg Roedel   iommu/amd: Add in...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  /**
   * amd_iommu_set_invalidate_ctx_cb() - Register a call-back for invalidating
   *				       a pasid context. This call-back is
   *				       invoked when the IOMMUv2 driver needs to
   *				       invalidate a PASID context, for example
   *				       because the task that is bound to that
   *				       context is about to exit.
   *
   * @pdev: The PCI device the call-back should be registered for
   * @cb: The call-back function
   */
  
  typedef void (*amd_iommu_invalidate_ctx)(struct pci_dev *pdev, int pasid);
  
  extern int amd_iommu_set_invalidate_ctx_cb(struct pci_dev *pdev,
  					   amd_iommu_invalidate_ctx cb);
c6da992e1   Joerg Roedel   x86, AMD IOMMU: a...
157
  #else
6a9401a7a   Joerg Roedel   x86/amd-iommu: Se...
158

480125ba4   Konrad Rzeszutek Wilk   x86, iommu: Make ...
159
  static inline int amd_iommu_detect(void) { return -ENODEV; }
6a9401a7a   Joerg Roedel   x86/amd-iommu: Se...
160

c6da992e1   Joerg Roedel   x86, AMD IOMMU: a...
161
  #endif
1965aae3c   H. Peter Anvin   x86: Fix ASM_X86_...
162
  #endif /* _ASM_X86_AMD_IOMMU_H */