Commit 344475e7 authored by Mao Zhongyi's avatar Mao Zhongyi Committed by Michael S. Tsirkin
Browse files

pci: Convert shpc_init() to Error



In order to propagate error message better, convert shpc_init() to
Error also convert the pci_bridge_dev_initfn() to realize.

Cc: mst@redhat.com
Cc: marcel@redhat.com
Cc: armbru@redhat.com
Signed-off-by: default avatarMao Zhongyi <maozy.fnst@cn.fujitsu.com>
Reviewed-by: default avatarMarcel Apfelbaum <marcel@redhat.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent f8cd1b02
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ struct PCIBridgeDev {
};
typedef struct PCIBridgeDev PCIBridgeDev;

static int pci_bridge_dev_initfn(PCIDevice *dev)
static void pci_bridge_dev_realize(PCIDevice *dev, Error **errp)
{
    PCIBridge *br = PCI_BRIDGE(dev);
    PCIBridgeDev *bridge_dev = PCI_BRIDGE_DEV(dev);
@@ -62,7 +62,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
        dev->config[PCI_INTERRUPT_PIN] = 0x1;
        memory_region_init(&bridge_dev->bar, OBJECT(dev), "shpc-bar",
                           shpc_bar_size(dev));
        err = shpc_init(dev, &br->sec_bus, &bridge_dev->bar, 0);
        err = shpc_init(dev, &br->sec_bus, &bridge_dev->bar, 0, errp);
        if (err) {
            goto shpc_error;
        }
@@ -71,7 +71,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
        bridge_dev->msi = ON_OFF_AUTO_OFF;
    }

    err = slotid_cap_init(dev, 0, bridge_dev->chassis_nr, 0);
    err = slotid_cap_init(dev, 0, bridge_dev->chassis_nr, 0, errp);
    if (err) {
        goto slotid_error;
    }
@@ -87,7 +87,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
            /* Can't satisfy user's explicit msi=on request, fail */
            error_append_hint(&local_err, "You have to use msi=auto (default) "
                    "or msi=off with this machine type.\n");
            error_report_err(local_err);
            error_propagate(errp, local_err);
            goto msi_error;
        }
        assert(!local_err || bridge_dev->msi == ON_OFF_AUTO_AUTO);
@@ -101,7 +101,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
        pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY |
                         PCI_BASE_ADDRESS_MEM_TYPE_64, &bridge_dev->bar);
    }
    return 0;
    return;

msi_error:
    slotid_cap_cleanup(dev);
@@ -111,8 +111,6 @@ slotid_error:
    }
shpc_error:
    pci_bridge_exitfn(dev);

    return err;
}

static void pci_bridge_dev_exitfn(PCIDevice *dev)
@@ -216,7 +214,7 @@ static void pci_bridge_dev_class_init(ObjectClass *klass, void *data)
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);

    k->init = pci_bridge_dev_initfn;
    k->realize = pci_bridge_dev_realize;
    k->exit = pci_bridge_dev_exitfn;
    k->config_write = pci_bridge_dev_write_config;
    k->vendor_id = PCI_VENDOR_ID_REDHAT;
+5 −6
Original line number Diff line number Diff line
@@ -446,16 +446,14 @@ static void shpc_cap_update_dword(PCIDevice *d)
}

/* Add SHPC capability to the config space for the device. */
static int shpc_cap_add_config(PCIDevice *d)
static int shpc_cap_add_config(PCIDevice *d, Error **errp)
{
    uint8_t *config;
    int config_offset;
    Error *local_err = NULL;
    config_offset = pci_add_capability(d, PCI_CAP_ID_SHPC,
                                       0, SHPC_CAP_LENGTH,
                                       &local_err);
                                       errp);
    if (config_offset < 0) {
        error_report_err(local_err);
        return config_offset;
    }
    config = d->config + config_offset;
@@ -584,13 +582,14 @@ void shpc_device_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
}

/* Initialize the SHPC structure in bridge's BAR. */
int shpc_init(PCIDevice *d, PCIBus *sec_bus, MemoryRegion *bar, unsigned offset)
int shpc_init(PCIDevice *d, PCIBus *sec_bus, MemoryRegion *bar,
              unsigned offset, Error **errp)
{
    int i, ret;
    int nslots = SHPC_MAX_SLOTS; /* TODO: qdev property? */
    SHPCDevice *shpc = d->shpc = g_malloc0(sizeof(*d->shpc));
    shpc->sec_bus = sec_bus;
    ret = shpc_cap_add_config(d);
    ret = shpc_cap_add_config(d, errp);
    if (ret) {
        g_free(d->shpc);
        return ret;
+5 −6
Original line number Diff line number Diff line
@@ -9,13 +9,13 @@

int slotid_cap_init(PCIDevice *d, int nslots,
                    uint8_t chassis,
                    unsigned offset)
                    unsigned offset,
                    Error **errp)
{
    int cap;
    Error *local_err = NULL;

    if (!chassis) {
        error_report("Bridge chassis not specified. Each bridge is required "
        error_setg(errp, "Bridge chassis not specified. Each bridge is required"
                   " to be assigned a unique chassis id > 0.");
        return -EINVAL;
    }
@@ -25,9 +25,8 @@ int slotid_cap_init(PCIDevice *d, int nslots,
    }

    cap = pci_add_capability(d, PCI_CAP_ID_SLOTID, offset,
                             SLOTID_CAP_LENGTH, &local_err);
                             SLOTID_CAP_LENGTH, errp);
    if (cap < 0) {
        error_report_err(local_err);
        return cap;
    }
    /* We make each chassis unique, this way each bridge is First in Chassis */
+2 −1
Original line number Diff line number Diff line
@@ -38,7 +38,8 @@ struct SHPCDevice {

void shpc_reset(PCIDevice *d);
int shpc_bar_size(PCIDevice *dev);
int shpc_init(PCIDevice *dev, PCIBus *sec_bus, MemoryRegion *bar, unsigned off);
int shpc_init(PCIDevice *dev, PCIBus *sec_bus, MemoryRegion *bar,
              unsigned off, Error **errp);
void shpc_cleanup(PCIDevice *dev, MemoryRegion *bar);
void shpc_free(PCIDevice *dev);
void shpc_cap_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int len);
+2 −1
Original line number Diff line number Diff line
@@ -5,7 +5,8 @@

int slotid_cap_init(PCIDevice *dev, int nslots,
                    uint8_t chassis,
                    unsigned offset);
                    unsigned offset,
                    Error **errp);
void slotid_cap_cleanup(PCIDevice *dev);

#endif