From 782040a627d0c3a44a9259a9055610e25c1f44fe Mon Sep 17 00:00:00 2001 From: Wu Binfeng Date: Mon, 25 Apr 2022 15:17:48 +0800 Subject: [PATCH] vfio/pci: Ascend710 change to bar2 quirk Change Ascend710's quirk regions to bar2 for internal causes. And support Ascend710 2P format now. --- hw/vfio/pci-quirks.c | 64 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c index ba4d8f020c..a71ebe26b4 100644 --- a/hw/vfio/pci-quirks.c +++ b/hw/vfio/pci-quirks.c @@ -1213,10 +1213,17 @@ int vfio_pci_igd_opregion_init(VFIOPCIDevice *vdev, #define PCI_DEVICE_ID_ASCEND910 0xd801 #define PCI_DEVICE_ID_ASCEND710 0xd500 #define PCI_DEVICE_ID_ASCEND310 0xd100 +#define PCI_SUB_DEVICE_ID_ASCEND710_1P_MIN 0x100 +#define PCI_SUB_DEVICE_ID_ASCEND710_1P_MAX 0x10f +#define PCI_SUB_DEVICE_ID_ASCEND710_2P_MIN 0x110 +#define PCI_SUB_DEVICE_ID_ASCEND710_2P_MAX 0x11f #define ASCEND910_XLOADER_SIZE 4 #define ASCEND910_XLOADER_OFFSET 0x80400 +#define ASCEND710_2P_BASE (128 * 1024 * 1024) +#define ASCEND710_1P_DEVNUM 1 +#define ASCEND710_2P_DEVNUM 2 #define ASCEND710_XLOADER_SIZE 4 -#define ASCEND710_XLOADER_OFFSET 0x20430 +#define ASCEND710_XLOADER_OFFSET 0x100430 #define ASCEND310_XLOADER_SIZE 4 #define ASCEND310_XLOADER_OFFSET 0x400 @@ -1289,23 +1296,38 @@ static void vfio_probe_ascend910_bar0_quirk(VFIOPCIDevice *vdev, int nr) QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); } -static void vfio_probe_ascend710_bar0_quirk(VFIOPCIDevice *vdev, int nr) +static void vfio_probe_ascend710_bar2_quirk(VFIOPCIDevice *vdev, int nr) { VFIOQuirk *quirk; - VFIOAscendBarQuirk *bar0_quirk; + VFIOAscendBarQuirk *bar2_quirk; + int sub_device_id; + int devnum = 0; - if (vdev->vendor_id != PCI_VENDOR_ID_HUAWEI || nr != 0 || + if (vdev->vendor_id != PCI_VENDOR_ID_HUAWEI || nr != 2 || vdev->device_id != PCI_DEVICE_ID_ASCEND710) { return; } + sub_device_id = pci_get_word(vdev->pdev.config + PCI_SUBSYSTEM_ID); + if (sub_device_id >= PCI_SUB_DEVICE_ID_ASCEND710_1P_MIN && + sub_device_id <= PCI_SUB_DEVICE_ID_ASCEND710_1P_MAX) { + devnum = ASCEND710_1P_DEVNUM; + } else if (sub_device_id >= PCI_SUB_DEVICE_ID_ASCEND710_2P_MIN && + sub_device_id <= PCI_SUB_DEVICE_ID_ASCEND710_2P_MAX) { + devnum = ASCEND710_2P_DEVNUM; + } + + if (devnum != ASCEND710_1P_DEVNUM && devnum != ASCEND710_2P_DEVNUM) { + return; + } + quirk = g_malloc0(sizeof(*quirk)); - quirk->nr_mem = 1; + quirk->nr_mem = devnum; quirk->mem = g_new0(MemoryRegion, quirk->nr_mem); - bar0_quirk = quirk->data = g_new0(typeof(*bar0_quirk), quirk->nr_mem); - bar0_quirk[0].vdev = vdev; - bar0_quirk[0].offset = ASCEND710_XLOADER_OFFSET; - bar0_quirk[0].bar = nr; + bar2_quirk = quirk->data = g_new0(typeof(*bar2_quirk), quirk->nr_mem); + bar2_quirk[0].vdev = vdev; + bar2_quirk[0].offset = ASCEND710_XLOADER_OFFSET; + bar2_quirk[0].bar = nr; /* * intercept w/r to the xloader-updating register, @@ -1313,12 +1335,28 @@ static void vfio_probe_ascend710_bar0_quirk(VFIOPCIDevice *vdev, int nr) */ memory_region_init_io(&quirk->mem[0], OBJECT(vdev), &vfio_ascend_intercept_regs_quirk, - &bar0_quirk[0], - "vfio-ascend710-bar0-intercept-regs-quirk", + &bar2_quirk[0], + "vfio-ascend710-bar2-1p-intercept-regs-quirk", ASCEND710_XLOADER_SIZE); memory_region_add_subregion_overlap(vdev->bars[nr].region.mem, - bar0_quirk[0].offset, + bar2_quirk[0].offset, &quirk->mem[0], 1); + + if (devnum == ASCEND710_2P_DEVNUM) { + bar2_quirk[1].vdev = vdev; + bar2_quirk[1].offset = (ASCEND710_2P_BASE + ASCEND710_XLOADER_OFFSET); + bar2_quirk[1].bar = nr; + + memory_region_init_io(&quirk->mem[1], OBJECT(vdev), + &vfio_ascend_intercept_regs_quirk, + &bar2_quirk[1], + "vfio-ascend710-bar2-2p-intercept-regs-quirk", + ASCEND710_XLOADER_SIZE); + memory_region_add_subregion_overlap(vdev->bars[nr].region.mem, + bar2_quirk[1].offset, + &quirk->mem[1], 1); + } + QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); } @@ -1408,7 +1446,7 @@ void vfio_bar_quirk_setup(VFIOPCIDevice *vdev, int nr) vfio_probe_igd_bar4_quirk(vdev, nr); #endif vfio_probe_ascend910_bar0_quirk(vdev, nr); - vfio_probe_ascend710_bar0_quirk(vdev, nr); + vfio_probe_ascend710_bar2_quirk(vdev, nr); vfio_probe_ascend310_bar4_quirk(vdev, nr); } -- 2.27.0