Commit 62d95512 authored by Eric Auger's avatar Eric Auger Committed by Alex Williamson
Browse files

hw/vfio/platform: amd-xgbe device



This patch introduces the amd-xgbe VFIO platform device. It
allows the guest to do passthrough on a device exposing an
"amd,xgbe-seattle-v1a" compat string.

Signed-off-by: default avatarEric Auger <eric.auger@linaro.org>
Reviewed-by: default avatarAlex Bennée <alex.bennee@linaro.org>
Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 3fc1c182
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3,4 +3,5 @@ obj-$(CONFIG_SOFTMMU) += common.o
obj-$(CONFIG_PCI) += pci.o pci-quirks.o
obj-$(CONFIG_SOFTMMU) += platform.o
obj-$(CONFIG_SOFTMMU) += calxeda-xgmac.o
obj-$(CONFIG_SOFTMMU) += amd-xgbe.o
endif

hw/vfio/amd-xgbe.c

0 → 100644
+55 −0
Original line number Diff line number Diff line
/*
 * AMD XGBE VFIO device
 *
 * Copyright Linaro Limited, 2015
 *
 * Authors:
 *  Eric Auger <eric.auger@linaro.org>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 */

#include "hw/vfio/vfio-amd-xgbe.h"

static void amd_xgbe_realize(DeviceState *dev, Error **errp)
{
    VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(dev);
    VFIOAmdXgbeDeviceClass *k = VFIO_AMD_XGBE_DEVICE_GET_CLASS(dev);

    vdev->compat = g_strdup("amd,xgbe-seattle-v1a");

    k->parent_realize(dev, errp);
}

static const VMStateDescription vfio_platform_amd_xgbe_vmstate = {
    .name = TYPE_VFIO_AMD_XGBE,
    .unmigratable = 1,
};

static void vfio_amd_xgbe_class_init(ObjectClass *klass, void *data)
{
    DeviceClass *dc = DEVICE_CLASS(klass);
    VFIOAmdXgbeDeviceClass *vcxc =
        VFIO_AMD_XGBE_DEVICE_CLASS(klass);
    vcxc->parent_realize = dc->realize;
    dc->realize = amd_xgbe_realize;
    dc->desc = "VFIO AMD XGBE";
    dc->vmsd = &vfio_platform_amd_xgbe_vmstate;
}

static const TypeInfo vfio_amd_xgbe_dev_info = {
    .name = TYPE_VFIO_AMD_XGBE,
    .parent = TYPE_VFIO_PLATFORM,
    .instance_size = sizeof(VFIOAmdXgbeDevice),
    .class_init = vfio_amd_xgbe_class_init,
    .class_size = sizeof(VFIOAmdXgbeDeviceClass),
};

static void register_amd_xgbe_dev_type(void)
{
    type_register_static(&vfio_amd_xgbe_dev_info);
}

type_init(register_amd_xgbe_dev_type)
+51 −0
Original line number Diff line number Diff line
/*
 * VFIO AMD XGBE device
 *
 * Copyright Linaro Limited, 2015
 *
 * Authors:
 *  Eric Auger <eric.auger@linaro.org>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 */

#ifndef HW_VFIO_VFIO_AMD_XGBE_H
#define HW_VFIO_VFIO_AMD_XGBE_H

#include "hw/vfio/vfio-platform.h"

#define TYPE_VFIO_AMD_XGBE "vfio-amd-xgbe"

/**
 * This device exposes:
 * - 5 MMIO regions: MAC, PCS, SerDes Rx/Tx regs,
     SerDes Integration Registers 1/2 & 2/2
 * - 2 level sensitive IRQs and optional DMA channel IRQs
 */
struct VFIOAmdXgbeDevice {
    VFIOPlatformDevice vdev;
};

typedef struct VFIOAmdXgbeDevice VFIOAmdXgbeDevice;

struct VFIOAmdXgbeDeviceClass {
    /*< private >*/
    VFIOPlatformDeviceClass parent_class;
    /*< public >*/
    DeviceRealize parent_realize;
};

typedef struct VFIOAmdXgbeDeviceClass VFIOAmdXgbeDeviceClass;

#define VFIO_AMD_XGBE_DEVICE(obj) \
     OBJECT_CHECK(VFIOAmdXgbeDevice, (obj), TYPE_VFIO_AMD_XGBE)
#define VFIO_AMD_XGBE_DEVICE_CLASS(klass) \
     OBJECT_CLASS_CHECK(VFIOAmdXgbeDeviceClass, (klass), \
                        TYPE_VFIO_AMD_XGBE)
#define VFIO_AMD_XGBE_DEVICE_GET_CLASS(obj) \
     OBJECT_GET_CLASS(VFIOAmdXgbeDeviceClass, (obj), \
                      TYPE_VFIO_AMD_XGBE)

#endif