mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-21 13:08:42 +00:00
dm:derive the prefetch property of PCI bar for pass-through device
Now the PCI bar uses the hardcoded prefetch property for the pass-through device. This doesn't work when trying to load windows GPU driver for the pass-through GPU device. For pass-through devices, set the bar prefetchable property the same as physical bar. Tracked-On: #4282 Signed-off-by: Junming Liu <junming.liu@intel.com> Reviewed-by: Zhao Yakui <yakui.zhao@intel.com> Reviewed-by: Shuo A Liu <shuo.a.liu@intel.com> Acked-by: Yu Wang <yu1.wang@intel.com>
This commit is contained in:
parent
ceb197c993
commit
03f5c639a0
@ -527,6 +527,7 @@ cfginitbar(struct vmctx *ctx, struct passthru_dev *ptdev)
|
|||||||
struct pci_bar_io bar;
|
struct pci_bar_io bar;
|
||||||
enum pcibar_type bartype;
|
enum pcibar_type bartype;
|
||||||
uint64_t base, size;
|
uint64_t base, size;
|
||||||
|
uint32_t vbar_lo32;
|
||||||
|
|
||||||
dev = ptdev->dev;
|
dev = ptdev->dev;
|
||||||
|
|
||||||
@ -590,6 +591,24 @@ cfginitbar(struct vmctx *ctx, struct passthru_dev *ptdev)
|
|||||||
if (error)
|
if (error)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For pass-thru devices,
|
||||||
|
* set the bar prefetchable property the same as physical bar.
|
||||||
|
*
|
||||||
|
* the pci bar prefetchable property has set by pci_emul_alloc_pbar,
|
||||||
|
* here, override the prefetchable property according to the physical bar.
|
||||||
|
*/
|
||||||
|
if (bartype == PCIBAR_MEM32 || bartype == PCIBAR_MEM64) {
|
||||||
|
vbar_lo32 = pci_get_cfgdata32(dev, PCIR_BAR(i));
|
||||||
|
|
||||||
|
if (bar.base & PCIM_BAR_MEM_PREFETCH)
|
||||||
|
vbar_lo32 |= PCIM_BAR_MEM_PREFETCH;
|
||||||
|
else
|
||||||
|
vbar_lo32 &= ~PCIM_BAR_MEM_PREFETCH;
|
||||||
|
|
||||||
|
pci_set_cfgdata32(dev, PCIR_BAR(i), vbar_lo32);
|
||||||
|
}
|
||||||
|
|
||||||
/* The MSI-X table needs special handling */
|
/* The MSI-X table needs special handling */
|
||||||
if (i == ptdev_msix_table_bar(ptdev)) {
|
if (i == ptdev_msix_table_bar(ptdev)) {
|
||||||
error = init_msix_table(ctx, ptdev, base);
|
error = init_msix_table(ctx, ptdev, base);
|
||||||
|
Loading…
Reference in New Issue
Block a user