@@ -137,11 +137,13 @@ static void free_sub_pt(u64 *root, int mode, struct list_head *freelist)
137
137
* another level increases the size of the address space by 9 bits to a size up
138
138
* to 64 bits.
139
139
*/
140
- static bool increase_address_space (struct protection_domain * domain ,
140
+ static bool increase_address_space (struct amd_io_pgtable * pgtable ,
141
141
unsigned long address ,
142
142
gfp_t gfp )
143
143
{
144
- struct io_pgtable_cfg * cfg = & domain -> iop .pgtbl .cfg ;
144
+ struct io_pgtable_cfg * cfg = & pgtable -> pgtbl .cfg ;
145
+ struct protection_domain * domain =
146
+ container_of (pgtable , struct protection_domain , iop );
145
147
unsigned long flags ;
146
148
bool ret = true;
147
149
u64 * pte ;
@@ -152,17 +154,17 @@ static bool increase_address_space(struct protection_domain *domain,
152
154
153
155
spin_lock_irqsave (& domain -> lock , flags );
154
156
155
- if (address <= PM_LEVEL_SIZE (domain -> iop . mode ))
157
+ if (address <= PM_LEVEL_SIZE (pgtable -> mode ))
156
158
goto out ;
157
159
158
160
ret = false;
159
- if (WARN_ON_ONCE (domain -> iop . mode == PAGE_MODE_6_LEVEL ))
161
+ if (WARN_ON_ONCE (pgtable -> mode == PAGE_MODE_6_LEVEL ))
160
162
goto out ;
161
163
162
- * pte = PM_LEVEL_PDE (domain -> iop . mode , iommu_virt_to_phys (domain -> iop . root ));
164
+ * pte = PM_LEVEL_PDE (pgtable -> mode , iommu_virt_to_phys (pgtable -> root ));
163
165
164
- domain -> iop . root = pte ;
165
- domain -> iop . mode += 1 ;
166
+ pgtable -> root = pte ;
167
+ pgtable -> mode += 1 ;
166
168
amd_iommu_update_and_flush_device_table (domain );
167
169
168
170
pte = NULL ;
@@ -175,31 +177,31 @@ static bool increase_address_space(struct protection_domain *domain,
175
177
return ret ;
176
178
}
177
179
178
- static u64 * alloc_pte (struct protection_domain * domain ,
180
+ static u64 * alloc_pte (struct amd_io_pgtable * pgtable ,
179
181
unsigned long address ,
180
182
unsigned long page_size ,
181
183
u64 * * pte_page ,
182
184
gfp_t gfp ,
183
185
bool * updated )
184
186
{
185
- struct io_pgtable_cfg * cfg = & domain -> iop . pgtbl .cfg ;
187
+ struct io_pgtable_cfg * cfg = & pgtable -> pgtbl .cfg ;
186
188
int level , end_lvl ;
187
189
u64 * pte , * page ;
188
190
189
191
BUG_ON (!is_power_of_2 (page_size ));
190
192
191
- while (address > PM_LEVEL_SIZE (domain -> iop . mode )) {
193
+ while (address > PM_LEVEL_SIZE (pgtable -> mode )) {
192
194
/*
193
195
* Return an error if there is no memory to update the
194
196
* page-table.
195
197
*/
196
- if (!increase_address_space (domain , address , gfp ))
198
+ if (!increase_address_space (pgtable , address , gfp ))
197
199
return NULL ;
198
200
}
199
201
200
202
201
- level = domain -> iop . mode - 1 ;
202
- pte = & domain -> iop . root [PM_LEVEL_INDEX (level , address )];
203
+ level = pgtable -> mode - 1 ;
204
+ pte = & pgtable -> root [PM_LEVEL_INDEX (level , address )];
203
205
address = PAGE_SIZE_ALIGN (address , page_size );
204
206
end_lvl = PAGE_SIZE_LEVEL (page_size );
205
207
@@ -348,7 +350,7 @@ static int iommu_v1_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
348
350
phys_addr_t paddr , size_t pgsize , size_t pgcount ,
349
351
int prot , gfp_t gfp , size_t * mapped )
350
352
{
351
- struct protection_domain * dom = io_pgtable_ops_to_domain (ops );
353
+ struct amd_io_pgtable * pgtable = io_pgtable_ops_to_data (ops );
352
354
LIST_HEAD (freelist );
353
355
bool updated = false;
354
356
u64 __pte , * pte ;
@@ -365,7 +367,7 @@ static int iommu_v1_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
365
367
366
368
while (pgcount > 0 ) {
367
369
count = PAGE_SIZE_PTE_COUNT (pgsize );
368
- pte = alloc_pte (dom , iova , pgsize , NULL , gfp , & updated );
370
+ pte = alloc_pte (pgtable , iova , pgsize , NULL , gfp , & updated );
369
371
370
372
ret = - ENOMEM ;
371
373
if (!pte )
@@ -402,6 +404,7 @@ static int iommu_v1_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
402
404
403
405
out :
404
406
if (updated ) {
407
+ struct protection_domain * dom = io_pgtable_ops_to_domain (ops );
405
408
unsigned long flags ;
406
409
407
410
spin_lock_irqsave (& dom -> lock , flags );
0 commit comments