All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: Cornelia Huck <cornelia.huck@de.ibm.com>, qemu-devel@nongnu.org
Cc: gleb@kernel.org, borntraeger@de.ibm.com, pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH v4 3/5] s390x: Add I/O adapter registration.
Date: Wed, 09 Apr 2014 16:05:00 +0200	[thread overview]
Message-ID: <5345538C.9060709@suse.de> (raw)
In-Reply-To: <1397043298-25755-4-git-send-email-cornelia.huck@de.ibm.com>


On 09.04.14 13:34, Cornelia Huck wrote:
> Register an I/O adapter interrupt source for when virtio-ccw devices start
> using adapter interrupts.
>
> Reviewed-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> ---
>   hw/intc/s390_flic.c   |   59 +++++++++++++++++++++++++++++++++++++++++++++++++
>   hw/s390x/css.c        |   51 ++++++++++++++++++++++++++++++++++++++++++
>   hw/s390x/css.h        |    4 ++++
>   hw/s390x/virtio-ccw.c |    4 ++++
>   hw/s390x/virtio-ccw.h |    1 +
>   target-s390x/cpu.h    |   33 +++++++++++++++++++++++++++
>   6 files changed, 152 insertions(+)
>
> diff --git a/hw/intc/s390_flic.c b/hw/intc/s390_flic.c
> index b2ef3e3..c033c8a 100644
> --- a/hw/intc/s390_flic.c
> +++ b/hw/intc/s390_flic.c
> @@ -21,6 +21,11 @@
>   #define FLIC_FAILED (-1UL)
>   #define FLIC_SAVEVM_VERSION 1
>   
> +static KVMS390FLICState *s390_get_flic(void)
> +{
> +    return KVM_S390_FLIC(object_resolve_path("/machine/s390-flic", NULL));
> +}
> +
>   void s390_flic_init(void)
>   {
>       DeviceState *dev;
> @@ -148,6 +153,60 @@ static int __get_all_irqs(KVMS390FLICState *flic,
>       return r;
>   }
>   
> +int kvm_s390_register_io_adapter(uint32_t id, uint8_t isc, bool swap,
> +                                 bool is_maskable)
> +{
> +    struct kvm_s390_io_adapter adapter = {
> +        .id = id,
> +        .isc = isc,
> +        .maskable = is_maskable,
> +        .swap = swap,
> +    };
> +    KVMS390FLICState *flic = s390_get_flic();
> +    int r, ret;
> +    struct kvm_device_attr attr = {
> +        .group = KVM_DEV_FLIC_ADAPTER_REGISTER,
> +        .addr = (uint64_t)&adapter,
> +    };
> +
> +    if (!flic) {
> +        return -ENOSYS;
> +    }
> +    if (!kvm_check_extension(kvm_state, KVM_CAP_IRQ_ROUTING)) {
> +        return -ENOSYS;
> +    }
> +
> +    r = ioctl(flic->fd, KVM_SET_DEVICE_ATTR, &attr);
> +
> +    ret = r ? -errno : 0;
> +    return ret;
> +}
> +
> +int kvm_s390_io_adapter_map(uint32_t id, uint64_t map_addr, bool do_map)
> +{
> +    struct kvm_s390_io_adapter_req req = {
> +        .id = id,
> +        .type = do_map ? KVM_S390_IO_ADAPTER_MAP : KVM_S390_IO_ADAPTER_UNMAP,
> +        .addr = map_addr,
> +    };
> +    KVMS390FLICState *flic = s390_get_flic();
> +    struct kvm_device_attr attr = {
> +        .group = KVM_DEV_FLIC_ADAPTER_MODIFY,
> +        .addr = (uint64_t)&req,
> +    };
> +    int r;
> +
> +    if (!flic) {
> +        return -ENOSYS;
> +    }
> +    if (!kvm_check_extension(kvm_state, KVM_CAP_IRQ_ROUTING)) {
> +        return -ENOSYS;
> +    }
> +
> +    r = ioctl(flic->fd, KVM_SET_DEVICE_ATTR, &attr);
> +    return r ? -errno : 0;
> +}
> +
>   /**
>    * kvm_flic_save - Save pending floating interrupts
>    * @f: QEMUFile containing migration state
> diff --git a/hw/s390x/css.c b/hw/s390x/css.c
> index 7074d2b..a6d173f 100644
> --- a/hw/s390x/css.c
> +++ b/hw/s390x/css.c
> @@ -39,6 +39,13 @@ typedef struct CssImage {
>       ChpInfo chpids[MAX_CHPID + 1];
>   } CssImage;
>   
> +typedef struct IoAdapter {
> +    uint32_t id;
> +    uint8_t type;
> +    uint8_t isc;
> +    QTAILQ_ENTRY(IoAdapter) sibling;
> +} IoAdapter;
> +
>   typedef struct ChannelSubSys {
>       QTAILQ_HEAD(, CrwContainer) pending_crws;
>       bool do_crw_mchk;
> @@ -49,6 +56,7 @@ typedef struct ChannelSubSys {
>       uint64_t chnmon_area;
>       CssImage *css[MAX_CSSID + 1];
>       uint8_t default_cssid;
> +    QTAILQ_HEAD(, IoAdapter) io_adapters;
>   } ChannelSubSys;
>   
>   static ChannelSubSys *channel_subsys;
> @@ -69,6 +77,48 @@ int css_create_css_image(uint8_t cssid, bool default_image)
>       return 0;
>   }
>   
> +int css_register_io_adapter(uint8_t type, uint8_t isc, bool swap,
> +                            bool maskable, uint32_t *id)
> +{
> +    IoAdapter *adapter;
> +    bool found = false;
> +    int ret;
> +
> +    *id = 0;
> +    QTAILQ_FOREACH(adapter, &channel_subsys->io_adapters, sibling) {
> +        if ((adapter->type == type) && (adapter->isc == isc)) {
> +            *id = adapter->id;
> +            found = true;
> +            ret = 0;
> +            break;
> +        }
> +        if (adapter->id >= *id) {
> +            *id = adapter->id + 1;
> +        }
> +    }
> +    if (found) {
> +        goto out;
> +    }
> +    adapter = g_new0(IoAdapter, 1);
> +    ret = s390_register_io_adapter(*id, isc, swap, maskable);
> +    if (ret == -ENOSYS) {
> +        /* Keep adapter even if we didn't register it anywhere. */
> +        ret = 0;
> +    }
> +    if (ret == 0) {
> +        adapter->id = *id;
> +        adapter->isc = isc;
> +        adapter->type = type;
> +        QTAILQ_INSERT_TAIL(&channel_subsys->io_adapters, adapter, sibling);
> +    } else {
> +        g_free(adapter);
> +        fprintf(stderr, "Unexpected error %d when registering adapter %d\n",
> +                ret, *id);
> +    }
> +out:
> +    return ret;
> +}
> +
>   uint16_t css_build_subchannel_id(SubchDev *sch)
>   {
>       if (channel_subsys->max_cssid > 0) {
> @@ -1239,6 +1289,7 @@ static void css_init(void)
>       channel_subsys->do_crw_mchk = true;
>       channel_subsys->crws_lost = false;
>       channel_subsys->chnmon_active = false;
> +    QTAILQ_INIT(&channel_subsys->io_adapters);
>   }
>   machine_init(css_init);
>   
> diff --git a/hw/s390x/css.h b/hw/s390x/css.h
> index e9b4405..380e8e7 100644
> --- a/hw/s390x/css.h
> +++ b/hw/s390x/css.h
> @@ -99,4 +99,8 @@ void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid,
>                              int hotplugged, int add);
>   void css_generate_chp_crws(uint8_t cssid, uint8_t chpid);
>   void css_adapter_interrupt(uint8_t isc);
> +
> +#define CSS_IO_ADAPTER_VIRTIO 1
> +int css_register_io_adapter(uint8_t type, uint8_t isc, bool swap,
> +                            bool maskable, uint32_t *id);
>   #endif
> diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
> index 2bf0af8..1193682 100644
> --- a/hw/s390x/virtio-ccw.c
> +++ b/hw/s390x/virtio-ccw.c
> @@ -522,6 +522,10 @@ static int virtio_ccw_cb(SubchDev *sch, CCW1 ccw)
>                   dev->thinint_isc = thinint->isc;
>                   dev->ind_bit = thinint->ind_bit;
>                   cpu_physical_memory_unmap(thinint, hw_len, 0, hw_len);
> +                ret = css_register_io_adapter(CSS_IO_ADAPTER_VIRTIO,
> +                                              dev->thinint_isc, true, false,
> +                                              &dev->adapter_id);

In all other machines the machine file is the one creating the link 
between a device and the interrupt controller. Can we do something 
similar for s390?


Alex

  reply	other threads:[~2014-04-09 14:05 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-09 11:34 [Qemu-devel] [PATCH v4 0/5] qemu: irqfds for s390x Cornelia Huck
2014-04-09 11:34 ` [Qemu-devel] [PATCH v4 1/5] linux-headers: update Cornelia Huck
2014-04-09 11:34 ` [Qemu-devel] [PATCH v4 2/5] kvm: add kvm_enable_cap_{vm,vcpu} Cornelia Huck
2014-04-09 13:58   ` Alexander Graf
2014-04-09 14:16     ` Cornelia Huck
2014-04-09 11:34 ` [Qemu-devel] [PATCH v4 3/5] s390x: Add I/O adapter registration Cornelia Huck
2014-04-09 14:05   ` Alexander Graf [this message]
2014-04-09 14:24     ` Cornelia Huck
2014-04-09 14:30       ` Alexander Graf
2014-04-09 15:35         ` Cornelia Huck
2014-04-09 15:53           ` Alexander Graf
2014-04-09 16:20             ` Cornelia Huck
2014-04-09 11:34 ` [Qemu-devel] [PATCH v4 4/5] s390x/virtio-ccw: reference-counted indicators Cornelia Huck
2014-04-09 11:34 ` [Qemu-devel] [PATCH v4 5/5] s390x/virtio-ccw: Wire up irq routing and irqfds Cornelia Huck

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=5345538C.9060709@suse.de \
    --to=agraf@suse.de \
    --cc=borntraeger@de.ibm.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=gleb@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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.