All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Isaku Yamahata <yamahata@valinux.co.jp>
Cc: skandasa@cisco.com, etmartin@cisco.com, qemu-devel@nongnu.org,
	wexu2@cisco.com
Subject: [Qemu-devel] Re: [PATCH v3 09/13] pcie upstream port: pci express switch upstream port.
Date: Wed, 22 Sep 2010 13:22:15 +0200	[thread overview]
Message-ID: <20100922112215.GA16423@redhat.com> (raw)
In-Reply-To: <20f3a880461c743e3db1c43758be83accb4474cd.1284528424.git.yamahata@valinux.co.jp>

On Wed, Sep 15, 2010 at 02:38:22PM +0900, Isaku Yamahata wrote:
> pci express switch upstream port.
> 
> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> ---
> Changes v2 -> v3:
> - compilation adjustment.


This is in fact a specific upstream port, isn't it?
If so rename all PCIE names here to specific port model?
Also, this is small enough to avoid splitting it out
from the switch code: if we don't, we won't have
APIs like pcie_upstream_init which is only useful
as part of switch.

> ---
>  Makefile.objs      |    2 +-
>  hw/pcie_upstream.c |  200 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  hw/pcie_upstream.h |   32 ++++++++
>  3 files changed, 233 insertions(+), 1 deletions(-)
>  create mode 100644 hw/pcie_upstream.c
>  create mode 100644 hw/pcie_upstream.h
> 
> diff --git a/Makefile.objs b/Makefile.objs
> index 7e81b57..72ca8be 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -139,7 +139,7 @@ user-obj-y += cutils.o cache-utils.o
>  hw-obj-y =
>  hw-obj-y += vl.o loader.o
>  hw-obj-y += virtio.o virtio-console.o
> -hw-obj-y += fw_cfg.o pci.o pci_host.o pcie_host.o pci_bridge.o
> +hw-obj-y += fw_cfg.o pci.o pci_host.o pcie_host.o pci_bridge.o pcie_upstream.o
>  hw-obj-y += watchdog.o
>  hw-obj-$(CONFIG_ISA_MMIO) += isa_mmio.o
>  hw-obj-$(CONFIG_ECC) += ecc.o
> diff --git a/hw/pcie_upstream.c b/hw/pcie_upstream.c
> new file mode 100644
> index 0000000..a08fce1
> --- /dev/null
> +++ b/hw/pcie_upstream.c
> @@ -0,0 +1,200 @@
> +/*
> + * pcie_upstream.c
> + *
> + * Copyright (c) 2010 Isaku Yamahata <yamahata at valinux co jp>
> + *                    VA Linux Systems Japan K.K.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "pci_ids.h"
> +#include "msi.h"
> +#include "pcie.h"
> +#include "pcie_upstream.h"
> +
> +/* For now, TI XIO3130 is borrowed. need to get its own id? */
> +#define PCI_DEVICE_ID_TI_XIO3130U       0x8232  /* upstream port */
> +#define XIO3130_REVISION                0x2
> +#define XIO3130_MSI_OFFSET              0x70
> +#define XIO3130_MSI_SUPPORTED_FLAGS     PCI_MSI_FLAGS_64BIT
> +#define XIO3130_MSI_NR_VECTOR           1
> +#define XIO3130_SSVID_OFFSET            0x80
> +#define XIO3130_SSVID_SVID              0
> +#define XIO3130_SSVID_SSID              0
> +#define XIO3130_EXP_OFFSET              0x90
> +#define XIO3130_AER_OFFSET              0x100
> +
> +#define PCIE_UPSTREAM_VID               PCI_VENDOR_ID_TI
> +#define PCIE_UPSTREAM_DID               PCI_DEVICE_ID_TI_XIO3130U
> +#define PCIE_UPSTREAM_REVISION          XIO3130_REVISION
> +#define PCIE_UPSTREAM_MSI_SUPPORTED_FLAGS       XIO3130_MSI_SUPPORTED_FLAGS
> +#define PCIE_UPSTREAM_MSI_NR_VECTOR     XIO3130_MSI_NR_VECTOR
> +#define PCIE_UPSTREAM_MSI_OFFSET        XIO3130_MSI_OFFSET
> +#define PCIE_UPSTREAM_SSVID_OFFSET      XIO3130_SSVID_OFFSET
> +#define PCIE_UPSTREAM_SVID              XIO3130_SSVID_SVID
> +#define PCIE_UPSTREAM_SSID              XIO3130_SSVID_SSID
> +#define PCIE_UPSTREAM_EXP_OFFSET        XIO3130_EXP_OFFSET
> +#define PCIE_UPSTREAM_AER_OFFSET        XIO3130_AER_OFFSET
> +
> +static void pcie_upstream_write_config(PCIDevice *d,
> +                                       uint32_t address, uint32_t val, int len)
> +{
> +    uint32_t uncorsta =
> +        pci_get_long(d->config + pcie_aer_cap(d) + PCI_ERR_UNCOR_STATUS);
> +
> +    pci_bridge_write_config(d, address, val, len);
> +    pcie_cap_flr_write_config(d, address, val, len);
> +    msi_write_config(d, address, val, len);
> +    pcie_aer_write_config(d, address, val, len, uncorsta);
> +}
> +
> +static void pcie_upstream_reset(DeviceState *qdev)
> +{
> +    PCIDevice *d = DO_UPCAST(PCIDevice, qdev, qdev);
> +    msi_reset(d);
> +    pci_bridge_reset(qdev);
> +    pcie_cap_deverr_reset(d);
> +}
> +
> +static void pcie_upstream_flr(PCIDevice *d)
> +{
> +    /* TODO: not enabled until qdev reset clean up
> +       waiting for Anthony's qdev cealn up */
> +#if 0
> +    /* So far, sticky bit registers or register which must be preserved
> +       over FLR aren't emulated. So just reset this device. */
> +    pci_device_reset(d);
> +#endif
> +}
> +
> +static int pcie_upstream_initfn(PCIDevice *d)
> +{
> +    PCIBridge* br = DO_UPCAST(PCIBridge, dev, d);
> +    PCIEPort *p = DO_UPCAST(PCIEPort, br, br);
> +    int rc;
> +
> +    rc = pci_bridge_initfn(d);
> +    if (rc < 0) {
> +        return rc;
> +    }
> +
> +    pcie_port_init_reg(d);
> +    pci_config_set_vendor_id(d->config, PCIE_UPSTREAM_VID);
> +    pci_config_set_device_id(d->config, PCIE_UPSTREAM_DID);
> +    d->config[PCI_REVISION_ID] = PCIE_UPSTREAM_REVISION;
> +
> +    rc = msi_init(d, PCIE_UPSTREAM_MSI_OFFSET, PCIE_UPSTREAM_MSI_NR_VECTOR,
> +                  PCIE_UPSTREAM_MSI_SUPPORTED_FLAGS & PCI_MSI_FLAGS_64BIT,
> +                  PCIE_UPSTREAM_MSI_SUPPORTED_FLAGS & PCI_MSI_FLAGS_MASKBIT);
> +    if (rc < 0) {
> +        return rc;
> +    }
> +    rc = pci_bridge_ssvid_init(d, PCIE_UPSTREAM_SSVID_OFFSET,
> +                               PCIE_UPSTREAM_SVID, PCIE_UPSTREAM_SSID);
> +    if (rc < 0) {
> +        return rc;
> +    }
> +    rc = pcie_cap_init(d, PCIE_UPSTREAM_EXP_OFFSET, PCI_EXP_TYPE_UPSTREAM,
> +                       p->port);
> +    if (rc < 0) {
> +        return rc;
> +    }
> +    pcie_cap_flr_init(d, &pcie_upstream_flr);
> +    pcie_cap_deverr_init(d);
> +    pcie_aer_init(d, PCIE_UPSTREAM_AER_OFFSET);
> +
> +    return 0;
> +}
> +
> +static int pcie_upstream_exitfn(PCIDevice *d)
> +{
> +    pcie_aer_exit(d);
> +    msi_uninit(d);
> +    pcie_cap_exit(d);
> +    return pci_bridge_exitfn(d);
> +}
> +
> +PCIEPort *pcie_upstream_init(PCIBus *bus, int devfn, bool multifunction,
> +                             const char *bus_name, pci_map_irq_fn map_irq,
> +                             uint8_t port)
> +{
> +    PCIDevice *d;
> +    PCIBridge *br;
> +    DeviceState *qdev;
> +
> +    d = pci_create_multifunction(bus, devfn, multifunction,
> +                                 PCIE_UPSTREAM_PORT);
> +    if (!d) {
> +        return NULL;
> +    }
> +    br = DO_UPCAST(PCIBridge, dev, d);
> +
> +    qdev = &br->dev.qdev;
> +    pci_bridge_map_irq(br, bus_name, map_irq);
> +    qdev_prop_set_uint8(qdev, "port", port);
> +    qdev_init_nofail(qdev);
> +
> +    return DO_UPCAST(PCIEPort, br, br);
> +}
> +
> +static const VMStateDescription vmstate_pcie_upstream = {
> +    .name = "pcie-upstream-port",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .minimum_version_id_old = 1,
> +    .fields = (VMStateField[]) {
> +        VMSTATE_PCIE_DEVICE(br.dev, PCIEPort),
> +        VMSTATE_STRUCT(br.dev.exp.aer_log, PCIEPort, 0, vmstate_pcie_aer_log,
> +                       PCIE_AERLog),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
> +static PCIDeviceInfo pcie_upstream_info = {
> +    .qdev.name = PCIE_UPSTREAM_PORT,
> +    .qdev.desc = "Upstream Port of PCI Express Switch",
> +    .qdev.size = sizeof(PCIEPort),
> +    .qdev.reset = pcie_upstream_reset,
> +    .qdev.vmsd = &vmstate_pcie_upstream,
> +
> +    .is_express = 1,
> +    .is_bridge = 1,
> +    .config_write = pcie_upstream_write_config,
> +    .init = pcie_upstream_initfn,
> +    .exit = pcie_upstream_exitfn,
> +
> +    .qdev.props = (Property[]) {
> +        DEFINE_PROP_UINT8("port", PCIEPort, port, 0),
> +        DEFINE_PROP_UINT16("aer_log_max", PCIEPort, br.dev.exp.aer_log.log_max,
> +                           PCIE_AER_LOG_MAX_DEFAULT),
> +        DEFINE_PROP_END_OF_LIST(),
> +    }
> +};
> +
> +static void pcie_upstream_register(void)
> +{
> +    pci_qdev_register(&pcie_upstream_info);
> +}
> +
> +device_init(pcie_upstream_register);
> +
> +
> +/*
> + * Local variables:
> + *  c-indent-level: 4
> + *  c-basic-offset: 4
> + *  tab-width: 8
> + *  indent-tab-mode: nil
> + * End:
> + */
> diff --git a/hw/pcie_upstream.h b/hw/pcie_upstream.h
> new file mode 100644
> index 0000000..1d36317
> --- /dev/null
> +++ b/hw/pcie_upstream.h
> @@ -0,0 +1,32 @@
> +/*
> + * pcie_upstream.h
> + *
> + * Copyright (c) 2010 Isaku Yamahata <yamahata at valinux co jp>
> + *                    VA Linux Systems Japan K.K.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, see <http://www.gnu.org/licenses/>.
> + */

There's nothing 

> +
> +#ifndef QEMU_PCIE_UPSTREAM_H
> +#define QEMU_PCIE_UPSTREAM_H
> +
> +#include "pcie_port.h"
> +
> +#define PCIE_UPSTREAM_PORT      "pcie-upstream-port"
> +
> +PCIEPort *pcie_upstream_init(PCIBus *bus, int devfn, bool multifunction,
> +                             const char *bus_name, pci_map_irq_fn map_irq,
> +                             uint8_t port);
> +
> +#endif /* QEMU_PCIE_UPSTREAM_H */
> -- 
> 1.7.1.1

  reply	other threads:[~2010-09-22 11:28 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-15  5:38 [Qemu-devel] [PATCH v3 00/13] pcie port switch emulators Isaku Yamahata
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 01/13] msi: implemented msi Isaku Yamahata
2010-09-15 13:03   ` [Qemu-devel] " Michael S. Tsirkin
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 02/13] pci: implement RW1C register framework Isaku Yamahata
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 03/13] pci: introduce helper function pci_shift_word/long which returns shifted value Isaku Yamahata
2010-09-15 12:49   ` [Qemu-devel] " Michael S. Tsirkin
2010-09-19  4:13     ` Isaku Yamahata
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 04/13] pcie: add pcie constants to pcie_regs.h Isaku Yamahata
2010-09-20 18:14   ` [Qemu-devel] " Michael S. Tsirkin
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 05/13] pcie: helper functions for pcie capability and extended capability Isaku Yamahata
2010-09-15 12:43   ` [Qemu-devel] " Michael S. Tsirkin
2010-09-19  4:56     ` Isaku Yamahata
2010-09-19 11:45       ` Michael S. Tsirkin
2010-09-24  2:24         ` Isaku Yamahata
2010-09-26 12:32           ` Michael S. Tsirkin
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 06/13] pcie/aer: helper functions for pcie aer capability Isaku Yamahata
2010-09-22 11:50   ` [Qemu-devel] " Michael S. Tsirkin
2010-09-24  2:50     ` Isaku Yamahata
2010-09-26 12:46       ` Michael S. Tsirkin
2010-09-27  6:03         ` Isaku Yamahata
2010-09-27 10:36           ` Michael S. Tsirkin
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 07/13] pcie port: define struct PCIEPort/PCIESlot and helper functions Isaku Yamahata
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 08/13] pcie root port: implement pcie root port Isaku Yamahata
2010-09-22 11:25   ` [Qemu-devel] " Michael S. Tsirkin
2010-09-24  5:38     ` Isaku Yamahata
2010-09-26 12:49       ` Michael S. Tsirkin
2010-09-27  6:36         ` Isaku Yamahata
2010-09-26 12:50       ` Michael S. Tsirkin
2010-09-27  6:22         ` Isaku Yamahata
2010-09-27 10:40           ` Michael S. Tsirkin
2010-09-27 23:01             ` Isaku Yamahata
2010-09-28  9:27               ` Michael S. Tsirkin
2010-09-28 10:38                 ` Michael S. Tsirkin
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 09/13] pcie upstream port: pci express switch upstream port Isaku Yamahata
2010-09-22 11:22   ` Michael S. Tsirkin [this message]
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 10/13] pcie downstream port: pci express switch downstream port Isaku Yamahata
2010-09-22 11:22   ` [Qemu-devel] " Michael S. Tsirkin
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 11/13] pcie/hotplug: glue pushing attention button command. pcie_abp Isaku Yamahata
2010-09-22 11:30   ` [Qemu-devel] " Michael S. Tsirkin
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 12/13] pcie/aer: glue aer error injection into qemu monitor Isaku Yamahata
2010-09-15  5:38 ` [Qemu-devel] [PATCH v3 13/13] msix: clear not only INTA, but all INTx when MSI-X is enabled Isaku Yamahata
2010-09-20 18:18 ` [Qemu-devel] Re: [PATCH v3 00/13] pcie port switch emulators Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100922112215.GA16423@redhat.com \
    --to=mst@redhat.com \
    --cc=etmartin@cisco.com \
    --cc=qemu-devel@nongnu.org \
    --cc=skandasa@cisco.com \
    --cc=wexu2@cisco.com \
    --cc=yamahata@valinux.co.jp \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.