[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] vpci: Add resizable bar support


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: "Chen, Jiqian" <Jiqian.Chen@xxxxxxx>
  • Date: Wed, 20 Nov 2024 02:26:31 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=0MSe6sa1RvT6UfK+OdO7ZXPRNAP9Igyyd6U3Ooo+X2Q=; b=tnk9nIHypUpRqT6uFVEoETMHZU9Bk4RzE6zd4JVRwpGeM9TAptE9lEc2kXjeww82U0q+02LzmUwIh7CwYOaPJiU85VBe8LKCwET5zqESevgBow5VldEVY08itZdUEK/zEoix8j8Q8zLlN1SXi3JM92YVnN+j4JMfTaBoe+f8ntwc3ftssvJK8QiD3DvAiVMN8IwY2HVLLSRjzxTWBNT6KIjFx7yr6GlUka6XfBO21AoQGAejhoUsMnHG3qkG/YoEsgLO8NvXqfinAqZVj2oZRJn5fus+rpolydkC8/v3xcTmNRUfqT6C8aewjz9fTYKi9Gx0ueHwig5Wb9SzrFYr+Q==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ytpnHX0A3Y7ZaRY0Bq+c50kQ+njQ8Ix8hWgHRMsM1zPzL8aecKYJoHBD+xdL6kPLr4r+Fn5bRqBg4k2Xc2i/JTmU5JZh+jKIHUHsy405CnhcevAbeRUAaNZYqeH49q5AkzVY2OjbfQpvcFtBQQykZJ4J+9moCBogjVS9zd5vrQD+dFqv6mJTtQI+4spv0CbPyDCdvM4sfr1mkvjdrPuSJRY/wJvp7BVbSxd1RxeytMux7xIiSPjfSYSg0jqq6+5wVtcF9dD5h8I6TBANPEvyRiDEfFURXWVOA/3TchWeXGgUimz2e8jXQ3bVJE5YoyBsFUTmgDRDc52yEE0j6V5/Tg==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, "Chen, Jiqian" <Jiqian.Chen@xxxxxxx>
  • Delivery-date: Wed, 20 Nov 2024 02:26:57 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHbNaIlMxf8mJcywkeNRFmHEai1qbK82tSAgAHkIwD//4OCAIABvicA
  • Thread-topic: [PATCH] vpci: Add resizable bar support

On 2024/11/19 15:44, Jan Beulich wrote:
> On 19.11.2024 08:31, Chen, Jiqian wrote:
>> On 2024/11/18 18:17, Roger Pau Monné wrote:
>>> On Wed, Nov 13, 2024 at 04:00:27PM +0800, Jiqian Chen wrote:
>>>> +static void cf_check rebar_ctrl_write(const struct pci_dev *pdev,
>>>> +                                      unsigned int reg,
>>>> +                                      uint32_t val,
>>>> +                                      void *data)
>>>> +{
>>>> +    uint32_t ctrl, index;
>>>
>>> index should better be unsigned int, as it's the BAR index [0, 5], and
>>> so fits perfectly in an unsigned int.
>>>
>>>> +    struct vpci_bar *bars = pdev->vpci->header.bars;
>>>
>>> You could pass bars as the data parameter.
>>>
>>> Additionally you need to check that memory decoding is not enabled for
>>> the device, otherwise attempting to change the BAR size will lead to
>>> the active p2m mappings getting out of sync w.r.t. the new BAR size.
>>>
>>>> +
>>>> +    ctrl = pci_conf_read32(pdev->sbdf, reg);
>>>> +    if ( ctrl == val )
>>>> +        return;
>>>
>>> I would still carry out the write in this case, as that's what the
>>> owner of the device requested.
>>>
>>>> +
>>>> +    ctrl &= ~PCI_REBAR_CTRL_BAR_SIZE;
>>>> +    if ( ctrl != ( val & ~PCI_REBAR_CTRL_BAR_SIZE ) )
>>>                      ^ extra space here and         ^ here
>>>> +        return;
>>>
>>> The feature only being exposed to dom0 ATM, I would suggest we allow
>>> it to write any bits it wants in the control register, as that would
>>> be what the OS would do when not running as a guest.
>> But only PCI_REBAR_CTRL_BAR_SIZE bits of REBAR_CTRL register are RW, others 
>> are RO.
>> Is removing the check here fine?
> 
> A native kernel would write the full register (with r/o bits simply not
> getting updated). Hence for Dom0 we ought to do the same, just in case
> e.g. some future spec declares some other bit(s) writable.
Got it, thanks for explaining.

> 
>>>> +
>>>> +    index = ctrl & PCI_REBAR_CTRL_BAR_IDX;
>>>
>>> Some sanity checking of the BAR index might be good.  At least a check
>>> that the BAR is of type VPCI_BAR_MEM64_LO or VPCI_BAR_MEM32.
>> But the information of the BAR that support resizing is from hardware(when 
>> init_rebar), that shouldn't have any problems and doesn't need to check the 
>> BAR's info.
> 
> Right, but also better to avoid confusing ourselves over bogus hardware.
OK, will add some check for the index range and the bar's type.

> 
>>>> +    bars[index].size = (1 << ((val & PCI_REBAR_CTRL_BAR_SIZE) >>
>>>> +                              PCI_REBAR_CTRL_BAR_SHIFT)) *
>>>> +                       PCI_REBAR_CTRL_BAR_UNIT;
>>>
>>> This would better be a macro in pci_regs.h I think, and you need to
>>> use 1UL, plus using MASK_EXTR() simplifies it:
>>>
>>> PCI_REBAR_CTRL_SIZE(v) (1UL << (MASK_EXTR(v, PCI_REBAR_CTRL_BAR_SIZE) + 20))
>> OK, another question: Should I need to check the size is allowed by 
>> hardware(the PCI_REBAR_CAP_SIZES bits in PCI_REBAR_CAP)?
> 
> Probably better to do so, yes. Whether to reject bogus attempts or
> merely warn about them I'm less certain: It's (see above) Dom0, after
> all.
I would like to if the new size is allowed by hardware, then update the size, 
otherwise do nothing.

> 
> Jan

-- 
Best regards,
Jiqian Chen.

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.