xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Oleksandr <olekstysh@gmail.com>
To: Julien Grall <julien.grall@arm.com>, xen-devel@lists.xenproject.org
Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>,
	sstabellini@kernel.org, Volodymyr_Babchuk@epam.com
Subject: Re: [Xen-devel] [PATCH] [RFC V2] xen/arm: Restrict "p2m_ipa_bits" according to the IOMMU requirements
Date: Wed, 11 Sep 2019 19:34:26 +0300	[thread overview]
Message-ID: <ca7a004d-9e3c-575f-bded-7a0fd5c7ef63@gmail.com> (raw)
In-Reply-To: <cec380f6-daf6-242f-3b57-2b08b3140248@arm.com>


On 10.09.19 21:55, Julien Grall wrote:
> Hi,

Hi Julien


>
> On 9/10/19 5:24 PM, Oleksandr wrote:
>>
>> On 10.09.19 18:11, Julien Grall wrote:
>>> Hi Oleksandr,
>>
>> Hi, Julien
>>
>>
>>>
>>> On 8/23/19 8:34 PM, Oleksandr Tyshchenko wrote:
>>>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
>>>>
>>>> There is a strict requirement for the IOMMU which wants to share
>>>> the P2M table with the CPU. The IOMMU's Stage-2 input size must be 
>>>> equal
>>>> to the P2M IPA size. It is not a problem when the IOMMU can support
>>>> all values the CPU supports. In that case, the IOMMU driver would just
>>>> use any "p2m_ipa_bits" value as is. But, there are cases when not.
>>>>
>>>> In order to make P2M sharing possible on the platforms which
>>>> IPMMUs have a limitation in maximum Stage-2 input size introduce
>>>> the following logic.
>>>>
>>>> First initialize the IOMMU subsystem and gather requirements regarding
>>>> the maximum IPA bits supported by each IOMMU device to figure out
>>>> the minimum value among them. In the P2M code, take into the account
>>>> the IOMMU requirements and choose suitable "pa_range" according
>>>> to the restricted "p2m_ipa_bits".
>>>
>>> As I pointed in the previous version, all the code you modify is 
>>> arm64 specific. For arm32, the number of IPA bits is
>>> hardcoded. So if you modify p2m_ipa_bits, you would end up to 
>>> misconfigure VTCR.
>>> In other words, for Arm32, you need to check p2m_ipa_bits is at 
>>> least 40-bits before overriding it.
>>
>> But, all modifications with p2m_ipa_bits are done before 
>> setup_virt_paging(), where, actually, the p2m_ipa_bits is hard-coded 
>> to 40 bits. How can we end up misconfiguring VTCR for ARM32? Or I 
>> really missed something?
>
> Sorry if I wasn't cleared, I meant the VTCR for the IOMMU. You would 
> end up to configure with a value that is bigger than what it can support.
> I am ok if you don't restrict the p2m_ipa_bits and just fail. The 
> point is to notify the user ASAP rather than allowing to continue.
>
> This would make the behavior similar to the current implementation 
> (although the error would be different).

So, in IOMMU driver we should check if IOMMU is able to support at least 
40-bit IPA before trying to restrict. If yes, then go ahead, but if no, 
then just fail. Correct?


>>>> +{
>>>> +    /*
>>>> +     * Calculate the minimum of the maximum IPA bits that any IOMMU
>>>> +     * can support.
>>>> +     */
>>>> +    if ( iommu_ipa_bits < p2m_ipa_bits )
>>>> +        p2m_ipa_bits = iommu_ipa_bits;
>>>> +}
>>>> +
>>>>   /* VTCR value to be configured by all CPUs. Set only once by the 
>>>> boot CPU */
>>>>   static uint32_t __read_mostly vtcr;
>>>>   @@ -1966,10 +1977,28 @@ void __init setup_virt_paging(void)
>>>>           [7] = { 0 }  /* Invalid */
>>>>       };
>>>>   -    unsigned int cpu;
>>>> +    unsigned int i, cpu;
>>>>       unsigned int pa_range = 0x10; /* Larger than any possible 
>>>> value */
>>>>       bool vmid_8_bit = false;
>>>>   +    if ( iommu_enabled )
>>>
>>> Could we make this IOMMU-agnostic? The main reason to convert from 
>>> p2m_ipa_bits to pa_range is to cater the rest of the code.
>>>
>>> But we could rework the code to do the computation with p2m_ipa_bits 
>>> and then look-up for the pa_range. 
>>
>> I am afraid, I don't completely understand your idea of making this 
>> IOMMU-agnostic and what I should do...
>
> Roughly what you are doing today is:
>
> if ( iommu_enabled )
>    pa_range = find_pa_range_from_p2m_bits().
>
> for_each_cpu()
>    if ( cpu.pa_range < pa_range )
>      pa_range = cpu.pa_range
>
> ....
>
> What you could do is:

Thank you for the clarification. I think I understand your idea.

But ...

>
> for_ech_cpu()
>    if ( p2m_ipa_bits < pa_range_info[cpu.pa_range].pabits )

Probably you meant ">" here?


> p2m_ipa_bits = pa_range_info[cpu.pa_range].pabits;
>
> pa_range = find_pa_range_from_p2m_bits();
> /* Check validity */


-- 
Regards,

Oleksandr Tyshchenko


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  reply	other threads:[~2019-09-11 16:35 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-23 19:34 [Xen-devel] [PATCH] [RFC V2] xen/arm: Restrict "p2m_ipa_bits" according to the IOMMU requirements Oleksandr Tyshchenko
2019-09-10 15:11 ` Julien Grall
2019-09-10 16:24   ` Oleksandr
2019-09-10 18:55     ` Julien Grall
2019-09-11 16:34       ` Oleksandr [this message]
2019-09-11 16:44         ` Julien Grall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ca7a004d-9e3c-575f-bded-7a0fd5c7ef63@gmail.com \
    --to=olekstysh@gmail.com \
    --cc=Volodymyr_Babchuk@epam.com \
    --cc=julien.grall@arm.com \
    --cc=oleksandr_tyshchenko@epam.com \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).