[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH V7 10/11] xen/arm: translate virtual PCI bus topology for guests
 
 
On 26.07.22 18:16, Jan Beulich wrote:
Hello Jan
 
On 19.07.2022 19:42, Oleksandr Tyshchenko wrote:
 
--- a/xen/arch/arm/vpci.c
+++ b/xen/arch/arm/vpci.c
@@ -41,6 +41,16 @@ static int vpci_mmio_read(struct vcpu *v, mmio_info_t *info,
      /* data is needed to prevent a pointer cast on 32bit */
      unsigned long data;
  
+    /*
+     * For the passed through devices we need to map their virtual SBDF
+     * to the physical PCI device being passed through.
+     */
+    if ( !bridge && !vpci_translate_virtual_device(v->domain, &sbdf) )
+    {
+        *r = ~0ul;
+        return 1;
+    }
 
I'm probably simply lacking specific Arm-side knowledge, but it strikes
me as odd that the need for translation would be dependent upon "bridge".
 
 
I am afraid I cannot answer immediately.
I will analyze that question and provide an answer later on.
 
 
--- a/xen/drivers/vpci/vpci.c
+++ b/xen/drivers/vpci/vpci.c
@@ -158,6 +158,32 @@ static void vpci_remove_virtual_device(const struct 
pci_dev *pdev)
      }
  }
  
+/*
+ * Find the physical device which is mapped to the virtual device
+ * and translate virtual SBDF to the physical one.
+ */
+bool vpci_translate_virtual_device(struct domain *d, pci_sbdf_t *sbdf)
+{
+    struct pci_dev *pdev;
 
const wherever possible please (i.e. likely also for the first function
parameter).
 
 
ok, will do
 
 
--- a/xen/include/xen/vpci.h
+++ b/xen/include/xen/vpci.h
@@ -276,6 +276,7 @@ static inline bool __must_check vpci_process_pending(struct 
vcpu *v)
  /* Notify vPCI that device is assigned/de-assigned to/from guest. */
  int vpci_assign_device(struct pci_dev *pdev);
  void vpci_deassign_device(struct pci_dev *pdev);
+bool vpci_translate_virtual_device(struct domain *d, pci_sbdf_t *sbdf);
  #else
  static inline int vpci_assign_device(struct pci_dev *pdev)
  {
@@ -285,6 +286,12 @@ static inline int vpci_assign_device(struct pci_dev *pdev)
  static inline void vpci_deassign_device(struct pci_dev *pdev)
  {
  };
+
+static inline bool vpci_translate_virtual_device(struct domain *d,
+                                                 pci_sbdf_t *sbdf)
+{
+    return false;
+}
 
Please don't add stubs which aren't really needed (which, afaict, is the
case for this one).
 
 
 I assume, this is needed if HAS_VPCI is present, but 
HAS_VPCI_GUEST_SUPPORT is not. And the author added that stub 
specifically to drop a few "#ifdef CONFIG_HAS_VPCI_GUEST_SUPPORT" from 
Arm's code.
Or I really missed something?
 
Jan
 
 
--
Regards,
Oleksandr Tyshchenko
 
 
    
     |