Message ID | 20240515071057.33990-21-clement.mathieu--drif@eviden.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ATS support for VT-d | expand |
>-----Original Message----- >From: CLEMENT MATHIEU--DRIF <clement.mathieu--drif@eviden.com> >Subject: [PATCH ats_vtd v2 20/25] intel_iommu: fill the PASID field when >creating an instance of IOMMUTLBEntry > >Signed-off-by: Clément Mathieu--Drif <clement.mathieu--drif@eviden.com> >--- > hw/i386/intel_iommu.c | 7 +++++++ > 1 file changed, 7 insertions(+) > >diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c >index 53f17d66c0..c4ebd4569e 100644 >--- a/hw/i386/intel_iommu.c >+++ b/hw/i386/intel_iommu.c >@@ -2299,6 +2299,7 @@ out: > entry->translated_addr = vtd_get_slpte_addr(pte, s->aw_bits) & >page_mask; > entry->addr_mask = ~page_mask; > entry->perm = access_flags; >+ entry->pasid = pasid; For PCI_NO_PASID, do we want to assign PCI_NO_PASID or rid2pasid? Thanks Zhenzhong > return true; > > error: >@@ -2307,6 +2308,7 @@ error: > entry->translated_addr = 0; > entry->addr_mask = 0; > entry->perm = IOMMU_NONE; >+ entry->pasid = PCI_NO_PASID; > return false; > } > >@@ -3497,6 +3499,7 @@ static void >vtd_piotlb_pasid_invalidate_notify(IntelIOMMUState *s, > event.entry.target_as = &address_space_memory; > event.entry.iova = notifier->start; > event.entry.perm = IOMMU_NONE; >+ event.entry.pasid = pasid; > event.entry.addr_mask = notifier->end - notifier->start; > event.entry.translated_addr = 0; > >@@ -3678,6 +3681,7 @@ static void >vtd_piotlb_page_invalidate(IntelIOMMUState *s, uint16_t domain_id, > event.entry.target_as = &address_space_memory; > event.entry.iova = addr; > event.entry.perm = IOMMU_NONE; >+ event.entry.pasid = pasid; > event.entry.addr_mask = size - 1; > event.entry.translated_addr = 0; > >@@ -4335,6 +4339,7 @@ static void >do_invalidate_device_tlb(VTDAddressSpace *vtd_dev_as, > event.entry.iova = addr; > event.entry.perm = IOMMU_NONE; > event.entry.translated_addr = 0; >+ event.entry.pasid = vtd_dev_as->pasid; > memory_region_notify_iommu(&vtd_dev_as->iommu, 0, event); > } > >@@ -4911,6 +4916,7 @@ static IOMMUTLBEntry >vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, > IOMMUTLBEntry iotlb = { > /* We'll fill in the rest later. */ > .target_as = &address_space_memory, >+ .pasid = vtd_as->pasid, > }; > bool success; > >@@ -4923,6 +4929,7 @@ static IOMMUTLBEntry >vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, > iotlb.translated_addr = addr & VTD_PAGE_MASK_4K; > iotlb.addr_mask = ~VTD_PAGE_MASK_4K; > iotlb.perm = IOMMU_RW; >+ iotlb.pasid = PCI_NO_PASID; > success = true; > } > >-- >2.44.0
On 17/05/2024 12:40, Duan, Zhenzhong wrote: > Caution: External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe. > > >> -----Original Message----- >> From: CLEMENT MATHIEU--DRIF <clement.mathieu--drif@eviden.com> >> Subject: [PATCH ats_vtd v2 20/25] intel_iommu: fill the PASID field when >> creating an instance of IOMMUTLBEntry >> >> Signed-off-by: Clément Mathieu--Drif <clement.mathieu--drif@eviden.com> >> --- >> hw/i386/intel_iommu.c | 7 +++++++ >> 1 file changed, 7 insertions(+) >> >> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c >> index 53f17d66c0..c4ebd4569e 100644 >> --- a/hw/i386/intel_iommu.c >> +++ b/hw/i386/intel_iommu.c >> @@ -2299,6 +2299,7 @@ out: >> entry->translated_addr = vtd_get_slpte_addr(pte, s->aw_bits) & >> page_mask; >> entry->addr_mask = ~page_mask; >> entry->perm = access_flags; >> + entry->pasid = pasid; > For PCI_NO_PASID, do we want to assign PCI_NO_PASID or rid2pasid? we have the following statement a few lines above : if (rid2pasid) { pasid = VTD_CE_GET_RID2PASID(&ce); } so we store rid2pasid if the feature is enabled. But maybe we should store PCI_NO_PASID because the rest of the world is not supposed to be aware of what we are doing with rid2pasid. Does it look good to you? > > Thanks > Zhenzhong > >> return true; >> >> error: >> @@ -2307,6 +2308,7 @@ error: >> entry->translated_addr = 0; >> entry->addr_mask = 0; >> entry->perm = IOMMU_NONE; >> + entry->pasid = PCI_NO_PASID; >> return false; >> } >> >> @@ -3497,6 +3499,7 @@ static void >> vtd_piotlb_pasid_invalidate_notify(IntelIOMMUState *s, >> event.entry.target_as = &address_space_memory; >> event.entry.iova = notifier->start; >> event.entry.perm = IOMMU_NONE; >> + event.entry.pasid = pasid; >> event.entry.addr_mask = notifier->end - notifier->start; >> event.entry.translated_addr = 0; >> >> @@ -3678,6 +3681,7 @@ static void >> vtd_piotlb_page_invalidate(IntelIOMMUState *s, uint16_t domain_id, >> event.entry.target_as = &address_space_memory; >> event.entry.iova = addr; >> event.entry.perm = IOMMU_NONE; >> + event.entry.pasid = pasid; >> event.entry.addr_mask = size - 1; >> event.entry.translated_addr = 0; >> >> @@ -4335,6 +4339,7 @@ static void >> do_invalidate_device_tlb(VTDAddressSpace *vtd_dev_as, >> event.entry.iova = addr; >> event.entry.perm = IOMMU_NONE; >> event.entry.translated_addr = 0; >> + event.entry.pasid = vtd_dev_as->pasid; >> memory_region_notify_iommu(&vtd_dev_as->iommu, 0, event); >> } >> >> @@ -4911,6 +4916,7 @@ static IOMMUTLBEntry >> vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, >> IOMMUTLBEntry iotlb = { >> /* We'll fill in the rest later. */ >> .target_as = &address_space_memory, >> + .pasid = vtd_as->pasid, >> }; >> bool success; >> >> @@ -4923,6 +4929,7 @@ static IOMMUTLBEntry >> vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, >> iotlb.translated_addr = addr & VTD_PAGE_MASK_4K; >> iotlb.addr_mask = ~VTD_PAGE_MASK_4K; >> iotlb.perm = IOMMU_RW; >> + iotlb.pasid = PCI_NO_PASID; >> success = true; >> } >> >> -- >> 2.44.0
>-----Original Message----- >From: CLEMENT MATHIEU--DRIF <clement.mathieu--drif@eviden.com> >Subject: Re: [PATCH ats_vtd v2 20/25] intel_iommu: fill the PASID field when >creating an instance of IOMMUTLBEntry > > >On 17/05/2024 12:40, Duan, Zhenzhong wrote: >> Caution: External email. Do not open attachments or click links, unless this >email comes from a known sender and you know the content is safe. >> >> >>> -----Original Message----- >>> From: CLEMENT MATHIEU--DRIF <clement.mathieu--drif@eviden.com> >>> Subject: [PATCH ats_vtd v2 20/25] intel_iommu: fill the PASID field when >>> creating an instance of IOMMUTLBEntry >>> >>> Signed-off-by: Clément Mathieu--Drif <clement.mathieu-- >drif@eviden.com> >>> --- >>> hw/i386/intel_iommu.c | 7 +++++++ >>> 1 file changed, 7 insertions(+) >>> >>> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c >>> index 53f17d66c0..c4ebd4569e 100644 >>> --- a/hw/i386/intel_iommu.c >>> +++ b/hw/i386/intel_iommu.c >>> @@ -2299,6 +2299,7 @@ out: >>> entry->translated_addr = vtd_get_slpte_addr(pte, s->aw_bits) & >>> page_mask; >>> entry->addr_mask = ~page_mask; >>> entry->perm = access_flags; >>> + entry->pasid = pasid; >> For PCI_NO_PASID, do we want to assign PCI_NO_PASID or rid2pasid? >we have the following statement a few lines above : >if (rid2pasid) { > pasid = VTD_CE_GET_RID2PASID(&ce); >} > >so we store rid2pasid if the feature is enabled. > >But maybe we should store PCI_NO_PASID because the rest of the world is >not supposed to be aware of what we are doing with rid2pasid. > >Does it look good to you? Yes, that make sense. >> >> Thanks >> Zhenzhong >> >>> return true; >>> >>> error: >>> @@ -2307,6 +2308,7 @@ error: >>> entry->translated_addr = 0; >>> entry->addr_mask = 0; >>> entry->perm = IOMMU_NONE; >>> + entry->pasid = PCI_NO_PASID; >>> return false; >>> } >>> >>> @@ -3497,6 +3499,7 @@ static void >>> vtd_piotlb_pasid_invalidate_notify(IntelIOMMUState *s, >>> event.entry.target_as = &address_space_memory; >>> event.entry.iova = notifier->start; >>> event.entry.perm = IOMMU_NONE; >>> + event.entry.pasid = pasid; >>> event.entry.addr_mask = notifier->end - notifier->start; >>> event.entry.translated_addr = 0; >>> >>> @@ -3678,6 +3681,7 @@ static void >>> vtd_piotlb_page_invalidate(IntelIOMMUState *s, uint16_t domain_id, >>> event.entry.target_as = &address_space_memory; >>> event.entry.iova = addr; >>> event.entry.perm = IOMMU_NONE; >>> + event.entry.pasid = pasid; >>> event.entry.addr_mask = size - 1; >>> event.entry.translated_addr = 0; >>> >>> @@ -4335,6 +4339,7 @@ static void >>> do_invalidate_device_tlb(VTDAddressSpace *vtd_dev_as, >>> event.entry.iova = addr; >>> event.entry.perm = IOMMU_NONE; >>> event.entry.translated_addr = 0; >>> + event.entry.pasid = vtd_dev_as->pasid; >>> memory_region_notify_iommu(&vtd_dev_as->iommu, 0, event); >>> } >>> >>> @@ -4911,6 +4916,7 @@ static IOMMUTLBEntry >>> vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, >>> IOMMUTLBEntry iotlb = { >>> /* We'll fill in the rest later. */ >>> .target_as = &address_space_memory, >>> + .pasid = vtd_as->pasid, >>> }; >>> bool success; >>> >>> @@ -4923,6 +4929,7 @@ static IOMMUTLBEntry >>> vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, >>> iotlb.translated_addr = addr & VTD_PAGE_MASK_4K; >>> iotlb.addr_mask = ~VTD_PAGE_MASK_4K; >>> iotlb.perm = IOMMU_RW; >>> + iotlb.pasid = PCI_NO_PASID; >>> success = true; >>> } >>> >>> -- >>> 2.44.0
On 21/05/2024 05:11, Duan, Zhenzhong wrote: > Caution: External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe. > > >> -----Original Message----- >> From: CLEMENT MATHIEU--DRIF <clement.mathieu--drif@eviden.com> >> Subject: Re: [PATCH ats_vtd v2 20/25] intel_iommu: fill the PASID field when >> creating an instance of IOMMUTLBEntry >> >> >> On 17/05/2024 12:40, Duan, Zhenzhong wrote: >>> Caution: External email. Do not open attachments or click links, unless this >> email comes from a known sender and you know the content is safe. >>> >>>> -----Original Message----- >>>> From: CLEMENT MATHIEU--DRIF <clement.mathieu--drif@eviden.com> >>>> Subject: [PATCH ats_vtd v2 20/25] intel_iommu: fill the PASID field when >>>> creating an instance of IOMMUTLBEntry >>>> >>>> Signed-off-by: Clément Mathieu--Drif <clement.mathieu-- >> drif@eviden.com> >>>> --- >>>> hw/i386/intel_iommu.c | 7 +++++++ >>>> 1 file changed, 7 insertions(+) >>>> >>>> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c >>>> index 53f17d66c0..c4ebd4569e 100644 >>>> --- a/hw/i386/intel_iommu.c >>>> +++ b/hw/i386/intel_iommu.c >>>> @@ -2299,6 +2299,7 @@ out: >>>> entry->translated_addr = vtd_get_slpte_addr(pte, s->aw_bits) & >>>> page_mask; >>>> entry->addr_mask = ~page_mask; >>>> entry->perm = access_flags; >>>> + entry->pasid = pasid; >>> For PCI_NO_PASID, do we want to assign PCI_NO_PASID or rid2pasid? >> we have the following statement a few lines above : >> if (rid2pasid) { >> pasid = VTD_CE_GET_RID2PASID(&ce); >> } >> >> so we store rid2pasid if the feature is enabled. >> >> But maybe we should store PCI_NO_PASID because the rest of the world is >> not supposed to be aware of what we are doing with rid2pasid. >> >> Does it look good to you? > Yes, that make sense. ok, will do > >>> Thanks >>> Zhenzhong >>> >>>> return true; >>>> >>>> error: >>>> @@ -2307,6 +2308,7 @@ error: >>>> entry->translated_addr = 0; >>>> entry->addr_mask = 0; >>>> entry->perm = IOMMU_NONE; >>>> + entry->pasid = PCI_NO_PASID; >>>> return false; >>>> } >>>> >>>> @@ -3497,6 +3499,7 @@ static void >>>> vtd_piotlb_pasid_invalidate_notify(IntelIOMMUState *s, >>>> event.entry.target_as = &address_space_memory; >>>> event.entry.iova = notifier->start; >>>> event.entry.perm = IOMMU_NONE; >>>> + event.entry.pasid = pasid; >>>> event.entry.addr_mask = notifier->end - notifier->start; >>>> event.entry.translated_addr = 0; >>>> >>>> @@ -3678,6 +3681,7 @@ static void >>>> vtd_piotlb_page_invalidate(IntelIOMMUState *s, uint16_t domain_id, >>>> event.entry.target_as = &address_space_memory; >>>> event.entry.iova = addr; >>>> event.entry.perm = IOMMU_NONE; >>>> + event.entry.pasid = pasid; >>>> event.entry.addr_mask = size - 1; >>>> event.entry.translated_addr = 0; >>>> >>>> @@ -4335,6 +4339,7 @@ static void >>>> do_invalidate_device_tlb(VTDAddressSpace *vtd_dev_as, >>>> event.entry.iova = addr; >>>> event.entry.perm = IOMMU_NONE; >>>> event.entry.translated_addr = 0; >>>> + event.entry.pasid = vtd_dev_as->pasid; >>>> memory_region_notify_iommu(&vtd_dev_as->iommu, 0, event); >>>> } >>>> >>>> @@ -4911,6 +4916,7 @@ static IOMMUTLBEntry >>>> vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, >>>> IOMMUTLBEntry iotlb = { >>>> /* We'll fill in the rest later. */ >>>> .target_as = &address_space_memory, >>>> + .pasid = vtd_as->pasid, >>>> }; >>>> bool success; >>>> >>>> @@ -4923,6 +4929,7 @@ static IOMMUTLBEntry >>>> vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, >>>> iotlb.translated_addr = addr & VTD_PAGE_MASK_4K; >>>> iotlb.addr_mask = ~VTD_PAGE_MASK_4K; >>>> iotlb.perm = IOMMU_RW; >>>> + iotlb.pasid = PCI_NO_PASID; >>>> success = true; >>>> } >>>> >>>> -- >>>> 2.44.0
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index 53f17d66c0..c4ebd4569e 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -2299,6 +2299,7 @@ out: entry->translated_addr = vtd_get_slpte_addr(pte, s->aw_bits) & page_mask; entry->addr_mask = ~page_mask; entry->perm = access_flags; + entry->pasid = pasid; return true; error: @@ -2307,6 +2308,7 @@ error: entry->translated_addr = 0; entry->addr_mask = 0; entry->perm = IOMMU_NONE; + entry->pasid = PCI_NO_PASID; return false; } @@ -3497,6 +3499,7 @@ static void vtd_piotlb_pasid_invalidate_notify(IntelIOMMUState *s, event.entry.target_as = &address_space_memory; event.entry.iova = notifier->start; event.entry.perm = IOMMU_NONE; + event.entry.pasid = pasid; event.entry.addr_mask = notifier->end - notifier->start; event.entry.translated_addr = 0; @@ -3678,6 +3681,7 @@ static void vtd_piotlb_page_invalidate(IntelIOMMUState *s, uint16_t domain_id, event.entry.target_as = &address_space_memory; event.entry.iova = addr; event.entry.perm = IOMMU_NONE; + event.entry.pasid = pasid; event.entry.addr_mask = size - 1; event.entry.translated_addr = 0; @@ -4335,6 +4339,7 @@ static void do_invalidate_device_tlb(VTDAddressSpace *vtd_dev_as, event.entry.iova = addr; event.entry.perm = IOMMU_NONE; event.entry.translated_addr = 0; + event.entry.pasid = vtd_dev_as->pasid; memory_region_notify_iommu(&vtd_dev_as->iommu, 0, event); } @@ -4911,6 +4916,7 @@ static IOMMUTLBEntry vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, IOMMUTLBEntry iotlb = { /* We'll fill in the rest later. */ .target_as = &address_space_memory, + .pasid = vtd_as->pasid, }; bool success; @@ -4923,6 +4929,7 @@ static IOMMUTLBEntry vtd_iommu_translate(IOMMUMemoryRegion *iommu, hwaddr addr, iotlb.translated_addr = addr & VTD_PAGE_MASK_4K; iotlb.addr_mask = ~VTD_PAGE_MASK_4K; iotlb.perm = IOMMU_RW; + iotlb.pasid = PCI_NO_PASID; success = true; }
Signed-off-by: Clément Mathieu--Drif <clement.mathieu--drif@eviden.com> --- hw/i386/intel_iommu.c | 7 +++++++ 1 file changed, 7 insertions(+)