>-----Original Message-----
>From: Liu, Yi L <yi.l....@intel.com>
>Sent: Friday, October 25, 2024 5:51 PM
>Subject: Re: [PATCH v4] intel_iommu: Introduce property "stale-tm" to control
>Transient Mapping (TM) field
>
>On 2024/10/23 15:57, Zhenzhong Duan wrote:
>> VT-d spec removed Transient Mapping (TM) field from second-level page-tables
>> and treat the field as Reserved(0) since revision 3.2.
>>
>> Changing the field as reserved(0) will break backward compatibility, so
>> introduce a property "stale-tm" to allow user to control the setting.
>>
>> Use hw_compat_9_1 to handle the compatibility for machines before 9.2 which
>
>is hw_compat_9_1 a typo? Looks to be pc_compat_9_1. :)

Good catch! Yes, will fix.

Thanks
Zhenzhong

>
>Otherwise I think it is good.
>
>Reviewed-by: Yi Liu <yi.l....@intel.com>
>
>> allow guest to set the field. Starting from 9.2, this field is reserved(0)
>> by default to match spec. Of course, user can force it on command line.
>>
>> This doesn't impact function of vIOMMU as there was no logic to emulate
>> Transient Mapping.
>>
>> Suggested-by: Yi Liu <yi.l....@intel.com>
>> Suggested-by: Jason Wang <jasow...@redhat.com>
>> Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com>
>> ---
>> v4: s/x-stale-tm/stale-tm (Jason)
>> v3: still need to check x86_iommu->dt_supported
>> v2: introcude "x-stale-tm" to handle migration compatibility (Jason)
>>
>>   hw/i386/intel_iommu_internal.h | 12 ++++++------
>>   include/hw/i386/intel_iommu.h  |  3 +++
>>   hw/i386/intel_iommu.c          |  7 ++++---
>>   hw/i386/pc.c                   |  1 +
>>   4 files changed, 14 insertions(+), 9 deletions(-)
>>
>> diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
>> index 13d5d129ae..2f9bc0147d 100644
>> --- a/hw/i386/intel_iommu_internal.h
>> +++ b/hw/i386/intel_iommu_internal.h
>> @@ -412,8 +412,8 @@ typedef union VTDInvDesc VTDInvDesc;
>>   /* Rsvd field masks for spte */
>>   #define VTD_SPTE_SNP 0x800ULL
>>
>> -#define VTD_SPTE_PAGE_L1_RSVD_MASK(aw, dt_supported) \
>> -        dt_supported ? \
>> +#define VTD_SPTE_PAGE_L1_RSVD_MASK(aw, stale_tm) \
>> +        stale_tm ? \
>>           (0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM | VTD_SL_TM)) :
>\
>>           (0x800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM))
>>   #define VTD_SPTE_PAGE_L2_RSVD_MASK(aw) \
>> @@ -423,12 +423,12 @@ typedef union VTDInvDesc VTDInvDesc;
>>   #define VTD_SPTE_PAGE_L4_RSVD_MASK(aw) \
>>           (0x880ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM))
>>
>> -#define VTD_SPTE_LPAGE_L2_RSVD_MASK(aw, dt_supported) \
>> -        dt_supported ? \
>> +#define VTD_SPTE_LPAGE_L2_RSVD_MASK(aw, stale_tm) \
>> +        stale_tm ? \
>>           (0x1ff800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM |
>VTD_SL_TM)) : \
>>           (0x1ff800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM))
>> -#define VTD_SPTE_LPAGE_L3_RSVD_MASK(aw, dt_supported) \
>> -        dt_supported ? \
>> +#define VTD_SPTE_LPAGE_L3_RSVD_MASK(aw, stale_tm) \
>> +        stale_tm ? \
>>           (0x3ffff800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM |
>VTD_SL_TM)) : \
>>           (0x3ffff800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM))
>>
>> diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h
>> index 1eb05c29fc..d372cd396b 100644
>> --- a/include/hw/i386/intel_iommu.h
>> +++ b/include/hw/i386/intel_iommu.h
>> @@ -306,6 +306,9 @@ struct IntelIOMMUState {
>>       bool dma_translation;           /* Whether DMA translation supported */
>>       bool pasid;                     /* Whether to support PASID */
>>
>> +    /* Transient Mapping, Reserved(0) since VTD spec revision 3.2 */
>> +    bool stale_tm;
>> +
>>       /*
>>        * Protects IOMMU states in general.  Currently it protects the
>>        * per-IOMMU IOTLB cache, and context entry cache in VTDAddressSpace.
>> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
>> index 08fe218935..8612d0917b 100644
>> --- a/hw/i386/intel_iommu.c
>> +++ b/hw/i386/intel_iommu.c
>> @@ -3372,6 +3372,7 @@ static Property vtd_properties[] = {
>>       DEFINE_PROP_BOOL("x-pasid-mode", IntelIOMMUState, pasid, false),
>>       DEFINE_PROP_BOOL("dma-drain", IntelIOMMUState, dma_drain, true),
>>       DEFINE_PROP_BOOL("dma-translation", IntelIOMMUState, dma_translation,
>true),
>> +    DEFINE_PROP_BOOL("stale-tm", IntelIOMMUState, stale_tm, false),
>>       DEFINE_PROP_END_OF_LIST(),
>>   };
>>
>> @@ -4138,15 +4139,15 @@ static void vtd_init(IntelIOMMUState *s)
>>        */
>>       vtd_spte_rsvd[0] = ~0ULL;
>>       vtd_spte_rsvd[1] = VTD_SPTE_PAGE_L1_RSVD_MASK(s->aw_bits,
>> -                                                  x86_iommu->dt_supported);
>> +                                        x86_iommu->dt_supported && 
>> s->stale_tm);
>>       vtd_spte_rsvd[2] = VTD_SPTE_PAGE_L2_RSVD_MASK(s->aw_bits);
>>       vtd_spte_rsvd[3] = VTD_SPTE_PAGE_L3_RSVD_MASK(s->aw_bits);
>>       vtd_spte_rsvd[4] = VTD_SPTE_PAGE_L4_RSVD_MASK(s->aw_bits);
>>
>>       vtd_spte_rsvd_large[2] = VTD_SPTE_LPAGE_L2_RSVD_MASK(s->aw_bits,
>> -                                                    
>> x86_iommu->dt_supported);
>> +                                        x86_iommu->dt_supported && 
>> s->stale_tm);
>>       vtd_spte_rsvd_large[3] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits,
>> -                                                    
>> x86_iommu->dt_supported);
>> +                                        x86_iommu->dt_supported && 
>> s->stale_tm);
>>
>>       if (s->scalable_mode || s->snoop_control) {
>>           vtd_spte_rsvd[1] &= ~VTD_SPTE_SNP;
>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> index 2047633e4c..830614d930 100644
>> --- a/hw/i386/pc.c
>> +++ b/hw/i386/pc.c
>> @@ -82,6 +82,7 @@
>>   GlobalProperty pc_compat_9_1[] = {
>>       { "ICH9-LPC", "x-smi-swsmi-timer", "off" },
>>       { "ICH9-LPC", "x-smi-periodic-timer", "off" },
>> +    { TYPE_INTEL_IOMMU_DEVICE, "stale-tm", "on" },
>>   };
>>   const size_t pc_compat_9_1_len = G_N_ELEMENTS(pc_compat_9_1);
>>
>
>--
>Regards,
>Yi Liu

Reply via email to