@@ -4313,13 +4313,62 @@ static const struct irq_domain_ops amd_ir_domain_ops = {
4313
4313
.deactivate = irq_remapping_deactivate ,
4314
4314
};
4315
4315
4316
+ int amd_iommu_activate_guest_mode (void * data )
4317
+ {
4318
+ struct amd_ir_data * ir_data = (struct amd_ir_data * )data ;
4319
+ struct irte_ga * entry = (struct irte_ga * ) ir_data -> entry ;
4320
+
4321
+ if (!AMD_IOMMU_GUEST_IR_VAPIC (amd_iommu_guest_ir ) ||
4322
+ !entry || entry -> lo .fields_vapic .guest_mode )
4323
+ return 0 ;
4324
+
4325
+ entry -> lo .val = 0 ;
4326
+ entry -> hi .val = 0 ;
4327
+
4328
+ entry -> lo .fields_vapic .guest_mode = 1 ;
4329
+ entry -> lo .fields_vapic .ga_log_intr = 1 ;
4330
+ entry -> hi .fields .ga_root_ptr = ir_data -> ga_root_ptr ;
4331
+ entry -> hi .fields .vector = ir_data -> ga_vector ;
4332
+ entry -> lo .fields_vapic .ga_tag = ir_data -> ga_tag ;
4333
+
4334
+ return modify_irte_ga (ir_data -> irq_2_irte .devid ,
4335
+ ir_data -> irq_2_irte .index , entry , NULL );
4336
+ }
4337
+ EXPORT_SYMBOL (amd_iommu_activate_guest_mode );
4338
+
4339
+ int amd_iommu_deactivate_guest_mode (void * data )
4340
+ {
4341
+ struct amd_ir_data * ir_data = (struct amd_ir_data * )data ;
4342
+ struct irte_ga * entry = (struct irte_ga * ) ir_data -> entry ;
4343
+ struct irq_cfg * cfg = ir_data -> cfg ;
4344
+
4345
+ if (!AMD_IOMMU_GUEST_IR_VAPIC (amd_iommu_guest_ir ) ||
4346
+ !entry || !entry -> lo .fields_vapic .guest_mode )
4347
+ return 0 ;
4348
+
4349
+ entry -> lo .val = 0 ;
4350
+ entry -> hi .val = 0 ;
4351
+
4352
+ entry -> lo .fields_remap .dm = apic -> irq_dest_mode ;
4353
+ entry -> lo .fields_remap .int_type = apic -> irq_delivery_mode ;
4354
+ entry -> hi .fields .vector = cfg -> vector ;
4355
+ entry -> lo .fields_remap .destination =
4356
+ APICID_TO_IRTE_DEST_LO (cfg -> dest_apicid );
4357
+ entry -> hi .fields .destination =
4358
+ APICID_TO_IRTE_DEST_HI (cfg -> dest_apicid );
4359
+
4360
+ return modify_irte_ga (ir_data -> irq_2_irte .devid ,
4361
+ ir_data -> irq_2_irte .index , entry , NULL );
4362
+ }
4363
+ EXPORT_SYMBOL (amd_iommu_deactivate_guest_mode );
4364
+
4316
4365
static int amd_ir_set_vcpu_affinity (struct irq_data * data , void * vcpu_info )
4317
4366
{
4367
+ int ret ;
4318
4368
struct amd_iommu * iommu ;
4319
4369
struct amd_iommu_pi_data * pi_data = vcpu_info ;
4320
4370
struct vcpu_data * vcpu_pi_info = pi_data -> vcpu_data ;
4321
4371
struct amd_ir_data * ir_data = data -> chip_data ;
4322
- struct irte_ga * irte = (struct irte_ga * ) ir_data -> entry ;
4323
4372
struct irq_2_irte * irte_info = & ir_data -> irq_2_irte ;
4324
4373
struct iommu_dev_data * dev_data = search_dev_data (irte_info -> devid );
4325
4374
@@ -4330,6 +4379,7 @@ static int amd_ir_set_vcpu_affinity(struct irq_data *data, void *vcpu_info)
4330
4379
if (!dev_data || !dev_data -> use_vapic )
4331
4380
return 0 ;
4332
4381
4382
+ ir_data -> cfg = irqd_cfg (data );
4333
4383
pi_data -> ir_data = ir_data ;
4334
4384
4335
4385
/* Note:
@@ -4348,37 +4398,24 @@ static int amd_ir_set_vcpu_affinity(struct irq_data *data, void *vcpu_info)
4348
4398
4349
4399
pi_data -> prev_ga_tag = ir_data -> cached_ga_tag ;
4350
4400
if (pi_data -> is_guest_mode ) {
4351
- /* Setting */
4352
- irte -> hi .fields .ga_root_ptr = (pi_data -> base >> 12 );
4353
- irte -> hi .fields .vector = vcpu_pi_info -> vector ;
4354
- irte -> lo .fields_vapic .ga_log_intr = 1 ;
4355
- irte -> lo .fields_vapic .guest_mode = 1 ;
4356
- irte -> lo .fields_vapic .ga_tag = pi_data -> ga_tag ;
4357
-
4358
- ir_data -> cached_ga_tag = pi_data -> ga_tag ;
4401
+ ir_data -> ga_root_ptr = (pi_data -> base >> 12 );
4402
+ ir_data -> ga_vector = vcpu_pi_info -> vector ;
4403
+ ir_data -> ga_tag = pi_data -> ga_tag ;
4404
+ ret = amd_iommu_activate_guest_mode (ir_data );
4405
+ if (!ret )
4406
+ ir_data -> cached_ga_tag = pi_data -> ga_tag ;
4359
4407
} else {
4360
- /* Un-Setting */
4361
- struct irq_cfg * cfg = irqd_cfg (data );
4362
-
4363
- irte -> hi .val = 0 ;
4364
- irte -> lo .val = 0 ;
4365
- irte -> hi .fields .vector = cfg -> vector ;
4366
- irte -> lo .fields_remap .guest_mode = 0 ;
4367
- irte -> lo .fields_remap .destination =
4368
- APICID_TO_IRTE_DEST_LO (cfg -> dest_apicid );
4369
- irte -> hi .fields .destination =
4370
- APICID_TO_IRTE_DEST_HI (cfg -> dest_apicid );
4371
- irte -> lo .fields_remap .int_type = apic -> irq_delivery_mode ;
4372
- irte -> lo .fields_remap .dm = apic -> irq_dest_mode ;
4408
+ ret = amd_iommu_deactivate_guest_mode (ir_data );
4373
4409
4374
4410
/*
4375
4411
* This communicates the ga_tag back to the caller
4376
4412
* so that it can do all the necessary clean up.
4377
4413
*/
4378
- ir_data -> cached_ga_tag = 0 ;
4414
+ if (!ret )
4415
+ ir_data -> cached_ga_tag = 0 ;
4379
4416
}
4380
4417
4381
- return modify_irte_ga ( irte_info -> devid , irte_info -> index , irte , ir_data ) ;
4418
+ return ret ;
4382
4419
}
4383
4420
4384
4421
0 commit comments