@@ -418,8 +418,7 @@ struct page_req_dsc {
418
418
struct {
419
419
u64 type :8 ;
420
420
u64 pasid_present :1 ;
421
- u64 priv_data_present :1 ;
422
- u64 rsvd :6 ;
421
+ u64 rsvd :7 ;
423
422
u64 rid :16 ;
424
423
u64 pasid :20 ;
425
424
u64 exe_req :1 ;
@@ -438,7 +437,8 @@ struct page_req_dsc {
438
437
};
439
438
u64 qw_1 ;
440
439
};
441
- u64 priv_data [2 ];
440
+ u64 qw_2 ;
441
+ u64 qw_3 ;
442
442
};
443
443
444
444
static bool is_canonical_address (u64 addr )
@@ -572,58 +572,30 @@ static void intel_svm_prq_report(struct intel_iommu *iommu, struct device *dev,
572
572
event .fault .prm .flags |= IOMMU_FAULT_PAGE_REQUEST_PASID_VALID ;
573
573
event .fault .prm .flags |= IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID ;
574
574
}
575
- if (desc -> priv_data_present ) {
576
- /*
577
- * Set last page in group bit if private data is present,
578
- * page response is required as it does for LPIG.
579
- * iommu_report_device_fault() doesn't understand this vendor
580
- * specific requirement thus we set last_page as a workaround.
581
- */
582
- event .fault .prm .flags |= IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE ;
583
- event .fault .prm .flags |= IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA ;
584
- event .fault .prm .private_data [0 ] = desc -> priv_data [0 ];
585
- event .fault .prm .private_data [1 ] = desc -> priv_data [1 ];
586
- }
587
575
588
576
iommu_report_device_fault (dev , & event );
589
577
}
590
578
591
579
static void handle_bad_prq_event (struct intel_iommu * iommu ,
592
580
struct page_req_dsc * req , int result )
593
581
{
594
- struct qi_desc desc ;
582
+ struct qi_desc desc = { } ;
595
583
596
584
pr_err ("%s: Invalid page request: %08llx %08llx\n" ,
597
585
iommu -> name , ((unsigned long long * )req )[0 ],
598
586
((unsigned long long * )req )[1 ]);
599
587
600
- /*
601
- * Per VT-d spec. v3.0 ch7.7, system software must
602
- * respond with page group response if private data
603
- * is present (PDP) or last page in group (LPIG) bit
604
- * is set. This is an additional VT-d feature beyond
605
- * PCI ATS spec.
606
- */
607
- if (!req -> lpig && !req -> priv_data_present )
588
+ if (!req -> lpig )
608
589
return ;
609
590
610
591
desc .qw0 = QI_PGRP_PASID (req -> pasid ) |
611
592
QI_PGRP_DID (req -> rid ) |
612
593
QI_PGRP_PASID_P (req -> pasid_present ) |
613
- QI_PGRP_PDP (req -> priv_data_present ) |
614
594
QI_PGRP_RESP_CODE (result ) |
615
595
QI_PGRP_RESP_TYPE ;
616
596
desc .qw1 = QI_PGRP_IDX (req -> prg_index ) |
617
597
QI_PGRP_LPIG (req -> lpig );
618
598
619
- if (req -> priv_data_present ) {
620
- desc .qw2 = req -> priv_data [0 ];
621
- desc .qw3 = req -> priv_data [1 ];
622
- } else {
623
- desc .qw2 = 0 ;
624
- desc .qw3 = 0 ;
625
- }
626
-
627
599
qi_submit_sync (iommu , & desc , 1 , 0 );
628
600
}
629
601
@@ -691,7 +663,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
691
663
692
664
intel_svm_prq_report (iommu , dev , req );
693
665
trace_prq_report (iommu , dev , req -> qw_0 , req -> qw_1 ,
694
- req -> priv_data [ 0 ] , req -> priv_data [ 1 ] ,
666
+ req -> qw_2 , req -> qw_3 ,
695
667
iommu -> prq_seq_number ++ );
696
668
mutex_unlock (& iommu -> iopf_lock );
697
669
prq_advance :
@@ -730,42 +702,25 @@ void intel_svm_page_response(struct device *dev, struct iopf_fault *evt,
730
702
struct intel_iommu * iommu = info -> iommu ;
731
703
u8 bus = info -> bus , devfn = info -> devfn ;
732
704
struct iommu_fault_page_request * prm ;
733
- bool private_present ;
705
+ struct qi_desc desc ;
734
706
bool pasid_present ;
735
707
bool last_page ;
736
708
u16 sid ;
737
709
738
710
prm = & evt -> fault .prm ;
739
711
sid = PCI_DEVID (bus , devfn );
740
712
pasid_present = prm -> flags & IOMMU_FAULT_PAGE_REQUEST_PASID_VALID ;
741
- private_present = prm -> flags & IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA ;
742
713
last_page = prm -> flags & IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE ;
743
714
744
- /*
745
- * Per VT-d spec. v3.0 ch7.7, system software must respond
746
- * with page group response if private data is present (PDP)
747
- * or last page in group (LPIG) bit is set. This is an
748
- * additional VT-d requirement beyond PCI ATS spec.
749
- */
750
- if (last_page || private_present ) {
751
- struct qi_desc desc ;
752
-
753
- desc .qw0 = QI_PGRP_PASID (prm -> pasid ) | QI_PGRP_DID (sid ) |
754
- QI_PGRP_PASID_P (pasid_present ) |
755
- QI_PGRP_PDP (private_present ) |
756
- QI_PGRP_RESP_CODE (msg -> code ) |
757
- QI_PGRP_RESP_TYPE ;
758
- desc .qw1 = QI_PGRP_IDX (prm -> grpid ) | QI_PGRP_LPIG (last_page );
759
- desc .qw2 = 0 ;
760
- desc .qw3 = 0 ;
761
-
762
- if (private_present ) {
763
- desc .qw2 = prm -> private_data [0 ];
764
- desc .qw3 = prm -> private_data [1 ];
765
- }
715
+ desc .qw0 = QI_PGRP_PASID (prm -> pasid ) | QI_PGRP_DID (sid ) |
716
+ QI_PGRP_PASID_P (pasid_present ) |
717
+ QI_PGRP_RESP_CODE (msg -> code ) |
718
+ QI_PGRP_RESP_TYPE ;
719
+ desc .qw1 = QI_PGRP_IDX (prm -> grpid ) | QI_PGRP_LPIG (last_page );
720
+ desc .qw2 = 0 ;
721
+ desc .qw3 = 0 ;
766
722
767
- qi_submit_sync (iommu , & desc , 1 , 0 );
768
- }
723
+ qi_submit_sync (iommu , & desc , 1 , 0 );
769
724
}
770
725
771
726
static void intel_svm_domain_free (struct iommu_domain * domain )
0 commit comments