|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] AMD/IOMMU: Improve register_iommu_exclusion_range()
On 19.06.2024 18:22, Andrew Cooper wrote:
> On 19/06/2024 8:45 am, Jan Beulich wrote:
>> On 18.06.2024 20:31, Andrew Cooper wrote:
>>> * Use 64bit accesses instead of 32bit accesses
>>> * Simplify the constant names
>>> * Pull base into a local variable to avoid it being reloaded because of the
>>> memory clobber in writeq().
>>>
>>> No functional change.
>>>
>>> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>>> ---
>>> CC: Jan Beulich <JBeulich@xxxxxxxx>
>>> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
>>>
>>> RFC. This is my proposed way of cleaning up the whole IOMMU file. The
>>> diffstat speaks for itself.
>> Absolutely.
>>
>>> I've finally found the bit in the AMD IOMMU spec which says 64bit accesses
>>> are
>>> permitted:
>>>
>>> 3.4 IOMMU MMIO Registers:
>>>
>>> Software access to IOMMU registers may not be larger than 64 bits.
>>> Accesses
>>> must be aligned to the size of the access and the size in bytes must be a
>>> power of two. Software may use accesses as small as one byte.
>> I take it that the use of 32-bit writes was because of the past need
>> also work in a 32-bit hypervisor, not because of perceived restrictions
>> by the spec.
>
> I recall having problems getting writeq() acked in the past, even after
> we'd dropped 32bit.
That's odd, as per my subsequent reply.
> But this is the first time that I've positively found anything in the
> spec saying that 64bit accesses are ok.
>
>>> --- a/xen/drivers/passthrough/amd/iommu-defs.h
>>> +++ b/xen/drivers/passthrough/amd/iommu-defs.h
>>> @@ -338,22 +338,10 @@ union amd_iommu_control {
>>> };
>>>
>>> /* Exclusion Register */
>>> -#define IOMMU_EXCLUSION_BASE_LOW_OFFSET 0x20
>>> -#define IOMMU_EXCLUSION_BASE_HIGH_OFFSET 0x24
>>> -#define IOMMU_EXCLUSION_LIMIT_LOW_OFFSET 0x28
>>> -#define IOMMU_EXCLUSION_LIMIT_HIGH_OFFSET 0x2C
>>> -#define IOMMU_EXCLUSION_BASE_LOW_MASK 0xFFFFF000U
>>> -#define IOMMU_EXCLUSION_BASE_LOW_SHIFT 12
>>> -#define IOMMU_EXCLUSION_BASE_HIGH_MASK 0xFFFFFFFFU
>>> -#define IOMMU_EXCLUSION_BASE_HIGH_SHIFT 0
>>> -#define IOMMU_EXCLUSION_RANGE_ENABLE_MASK 0x00000001U
>>> -#define IOMMU_EXCLUSION_RANGE_ENABLE_SHIFT 0
>>> -#define IOMMU_EXCLUSION_ALLOW_ALL_MASK 0x00000002U
>>> -#define IOMMU_EXCLUSION_ALLOW_ALL_SHIFT 1
>>> -#define IOMMU_EXCLUSION_LIMIT_LOW_MASK 0xFFFFF000U
>>> -#define IOMMU_EXCLUSION_LIMIT_LOW_SHIFT 12
>>> -#define IOMMU_EXCLUSION_LIMIT_HIGH_MASK 0xFFFFFFFFU
>>> -#define IOMMU_EXCLUSION_LIMIT_HIGH_SHIFT 0
>>> +#define IOMMU_MMIO_EXCLUSION_BASE 0x20
>>> +#define EXCLUSION_RANGE_ENABLE (1 << 0)
>>> +#define EXCLUSION_ALLOW_ALL (1 << 1)
>>> +#define IOMMU_MMIO_EXCLUSION_LIMIT 0x28
>> Just one question here: Previously you suggested we switch to bitfields
>> for anything like this, and we've already done so with e.g.
>> union amd_iommu_control and union amd_iommu_ext_features. IOW I wonder
>> if we wouldn't better strive to be consistent in this regard. Or if not,
>> what the (written or unwritten) guidelines are when to use which
>> approach.
>
> We've got two very different kinds of things here.
>
> The device table/etc are in-memory WB datastructure which we're
> interpreting and editing routinely. It's completely full of bits and
> small fields, and letting the compiler do the hard work there is
> preferable; certainly in terms of legibility.
And it was specifically not the DTE I used as example in my reply, ...
> This example is an MMIO register (in a bar on the IOMMU PCI device, even
> though we find the address in the IVRS). We set it up once at boot and
> don't touch it afterwards.
... but other MMIO registers.
> So while we could make a struct for it, we'd still need to get it into a
> form that we can writeq(), and that's more code than the single case
> were we need to put two metadata bits into an address.
See those other examples, which are usable with writeq() by way of their
"raw" fields.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |