linux/drivers/virtio/virtio_pci_modern.c
<<
>>
Prefs
   1/*
   2 * Virtio PCI driver - modern (virtio 1.0) device support
   3 *
   4 * This module allows virtio devices to be used over a virtual PCI device.
   5 * This can be used with QEMU based VMMs like KVM or Xen.
   6 *
   7 * Copyright IBM Corp. 2007
   8 * Copyright Red Hat, Inc. 2014
   9 *
  10 * Authors:
  11 *  Anthony Liguori  <aliguori@us.ibm.com>
  12 *  Rusty Russell <rusty@rustcorp.com.au>
  13 *  Michael S. Tsirkin <mst@redhat.com>
  14 *
  15 * This work is licensed under the terms of the GNU GPL, version 2 or later.
  16 * See the COPYING file in the top-level directory.
  17 *
  18 */
  19
  20#include <linux/delay.h>
  21#define VIRTIO_PCI_NO_LEGACY
  22#include "virtio_pci_common.h"
  23
  24/*
  25 * Type-safe wrappers for io accesses.
  26 * Use these to enforce at compile time the following spec requirement:
  27 *
  28 * The driver MUST access each field using the “natural” access
  29 * method, i.e. 32-bit accesses for 32-bit fields, 16-bit accesses
  30 * for 16-bit fields and 8-bit accesses for 8-bit fields.
  31 */
  32static inline u8 vp_ioread8(u8 __iomem *addr)
  33{
  34        return ioread8(addr);
  35}
  36static inline u16 vp_ioread16 (u16 __iomem *addr)
  37{
  38        return ioread16(addr);
  39}
  40
  41static inline u32 vp_ioread32(u32 __iomem *addr)
  42{
  43        return ioread32(addr);
  44}
  45
  46static inline void vp_iowrite8(u8 value, u8 __iomem *addr)
  47{
  48        iowrite8(value, addr);
  49}
  50
  51static inline void vp_iowrite16(u16 value, u16 __iomem *addr)
  52{
  53        iowrite16(value, addr);
  54}
  55
  56static inline void vp_iowrite32(u32 value, u32 __iomem *addr)
  57{
  58        iowrite32(value, addr);
  59}
  60
  61static void vp_iowrite64_twopart(u64 val,
  62                                 __le32 __iomem *lo, __le32 __iomem *hi)
  63{
  64        vp_iowrite32((u32)val, lo);
  65        vp_iowrite32(val >> 32, hi);
  66}
  67
  68static void __iomem *map_capability(struct pci_dev *dev, int off,
  69                                    size_t minlen,
  70                                    u32 align,
  71                                    u32 start, u32 size,
  72                                    size_t *len)
  73{
  74        u8 bar;
  75        u32 offset, length;
  76        void __iomem *p;
  77
  78        pci_read_config_byte(dev, off + offsetof(struct virtio_pci_cap,
  79                                                 bar),
  80                             &bar);
  81        pci_read_config_dword(dev, off + offsetof(struct virtio_pci_cap, offset),
  82                             &offset);
  83        pci_read_config_dword(dev, off + offsetof(struct virtio_pci_cap, length),
  84                              &length);
  85
  86        if (length <= start) {
  87                dev_err(&dev->dev,
  88                        "virtio_pci: bad capability len %u (>%u expected)\n",
  89                        length, start);
  90                return NULL;
  91        }
  92
  93        if (length - start < minlen) {
  94                dev_err(&dev->dev,
  95                        "virtio_pci: bad capability len %u (>=%zu expected)\n",
  96                        length, minlen);
  97                return NULL;
  98        }
  99
 100        length -= start;
 101
 102        if (start + offset < offset) {
 103                dev_err(&dev->dev,
 104                        "virtio_pci: map wrap-around %u+%u\n",
 105                        start, offset);
 106                return NULL;
 107        }
 108
 109        offset += start;
 110
 111        if (offset & (align - 1)) {
 112                dev_err(&dev->dev,
 113                        "virtio_pci: offset %u not aligned to %u\n",
 114                        offset, align);
 115                return NULL;
 116        }
 117
 118        if (length > size)
 119                length = size;
 120
 121        if (len)
 122                *len = length;
 123
 124        if (minlen + offset < minlen ||
 125            minlen + offset > pci_resource_len(dev, bar)) {
 126                dev_err(&dev->dev,
 127                        "virtio_pci: map virtio %zu@%u "
 128                        "out of range on bar %i length %lu\n",
 129                        minlen, offset,
 130                        bar, (unsigned long)pci_resource_len(dev, bar));
 131                return NULL;
 132        }
 133
 134        p = pci_iomap_range(dev, bar, offset, length);
 135        if (!p)
 136                dev_err(&dev->dev,
 137                        "virtio_pci: unable to map virtio %u@%u on bar %i\n",
 138                        length, offset, bar);
 139        return p;
 140}
 141
 142/* virtio config->get_features() implementation */
 143static u64 vp_get_features(struct virtio_device *vdev)
 144{
 145        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 146        u64 features;
 147
 148        vp_iowrite32(0, &vp_dev->common->device_feature_select);
 149        features = vp_ioread32(&vp_dev->common->device_feature);
 150        vp_iowrite32(1, &vp_dev->common->device_feature_select);
 151        features |= ((u64)vp_ioread32(&vp_dev->common->device_feature) << 32);
 152
 153        return features;
 154}
 155
 156/* virtio config->finalize_features() implementation */
 157static int vp_finalize_features(struct virtio_device *vdev)
 158{
 159        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 160
 161        /* Give virtio_ring a chance to accept features. */
 162        vring_transport_features(vdev);
 163
 164        if (!__virtio_test_bit(vdev, VIRTIO_F_VERSION_1)) {
 165                dev_err(&vdev->dev, "virtio: device uses modern interface "
 166                        "but does not have VIRTIO_F_VERSION_1\n");
 167                return -EINVAL;
 168        }
 169
 170        vp_iowrite32(0, &vp_dev->common->guest_feature_select);
 171        vp_iowrite32((u32)vdev->features, &vp_dev->common->guest_feature);
 172        vp_iowrite32(1, &vp_dev->common->guest_feature_select);
 173        vp_iowrite32(vdev->features >> 32, &vp_dev->common->guest_feature);
 174
 175        return 0;
 176}
 177
 178/* virtio config->get() implementation */
 179static void vp_get(struct virtio_device *vdev, unsigned offset,
 180                   void *buf, unsigned len)
 181{
 182        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 183        u8 b;
 184        __le16 w;
 185        __le32 l;
 186
 187        BUG_ON(offset + len > vp_dev->device_len);
 188
 189        switch (len) {
 190        case 1:
 191                b = ioread8(vp_dev->device + offset);
 192                memcpy(buf, &b, sizeof b);
 193                break;
 194        case 2:
 195                w = cpu_to_le16(ioread16(vp_dev->device + offset));
 196                memcpy(buf, &w, sizeof w);
 197                break;
 198        case 4:
 199                l = cpu_to_le32(ioread32(vp_dev->device + offset));
 200                memcpy(buf, &l, sizeof l);
 201                break;
 202        case 8:
 203                l = cpu_to_le32(ioread32(vp_dev->device + offset));
 204                memcpy(buf, &l, sizeof l);
 205                l = cpu_to_le32(ioread32(vp_dev->device + offset + sizeof l));
 206                memcpy(buf + sizeof l, &l, sizeof l);
 207                break;
 208        default:
 209                BUG();
 210        }
 211}
 212
 213/* the config->set() implementation.  it's symmetric to the config->get()
 214 * implementation */
 215static void vp_set(struct virtio_device *vdev, unsigned offset,
 216                   const void *buf, unsigned len)
 217{
 218        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 219        u8 b;
 220        __le16 w;
 221        __le32 l;
 222
 223        BUG_ON(offset + len > vp_dev->device_len);
 224
 225        switch (len) {
 226        case 1:
 227                memcpy(&b, buf, sizeof b);
 228                iowrite8(b, vp_dev->device + offset);
 229                break;
 230        case 2:
 231                memcpy(&w, buf, sizeof w);
 232                iowrite16(le16_to_cpu(w), vp_dev->device + offset);
 233                break;
 234        case 4:
 235                memcpy(&l, buf, sizeof l);
 236                iowrite32(le32_to_cpu(l), vp_dev->device + offset);
 237                break;
 238        case 8:
 239                memcpy(&l, buf, sizeof l);
 240                iowrite32(le32_to_cpu(l), vp_dev->device + offset);
 241                memcpy(&l, buf + sizeof l, sizeof l);
 242                iowrite32(le32_to_cpu(l), vp_dev->device + offset + sizeof l);
 243                break;
 244        default:
 245                BUG();
 246        }
 247}
 248
 249static u32 vp_generation(struct virtio_device *vdev)
 250{
 251        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 252        return vp_ioread8(&vp_dev->common->config_generation);
 253}
 254
 255/* config->{get,set}_status() implementations */
 256static u8 vp_get_status(struct virtio_device *vdev)
 257{
 258        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 259        return vp_ioread8(&vp_dev->common->device_status);
 260}
 261
 262static void vp_set_status(struct virtio_device *vdev, u8 status)
 263{
 264        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 265        /* We should never be setting status to 0. */
 266        BUG_ON(status == 0);
 267        vp_iowrite8(status, &vp_dev->common->device_status);
 268}
 269
 270static void vp_reset(struct virtio_device *vdev)
 271{
 272        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 273        /* 0 status means a reset. */
 274        vp_iowrite8(0, &vp_dev->common->device_status);
 275        /* After writing 0 to device_status, the driver MUST wait for a read of
 276         * device_status to return 0 before reinitializing the device.
 277         * This will flush out the status write, and flush in device writes,
 278         * including MSI-X interrupts, if any.
 279         */
 280        while (vp_ioread8(&vp_dev->common->device_status))
 281                msleep(1);
 282        /* Flush pending VQ/configuration callbacks. */
 283        vp_synchronize_vectors(vdev);
 284}
 285
 286static u16 vp_config_vector(struct virtio_pci_device *vp_dev, u16 vector)
 287{
 288        /* Setup the vector used for configuration events */
 289        vp_iowrite16(vector, &vp_dev->common->msix_config);
 290        /* Verify we had enough resources to assign the vector */
 291        /* Will also flush the write out to device */
 292        return vp_ioread16(&vp_dev->common->msix_config);
 293}
 294
 295static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
 296                                  struct virtio_pci_vq_info *info,
 297                                  unsigned index,
 298                                  void (*callback)(struct virtqueue *vq),
 299                                  const char *name,
 300                                  u16 msix_vec)
 301{
 302        struct virtio_pci_common_cfg __iomem *cfg = vp_dev->common;
 303        struct virtqueue *vq;
 304        u16 num, off;
 305        int err;
 306
 307        if (index >= vp_ioread16(&cfg->num_queues))
 308                return ERR_PTR(-ENOENT);
 309
 310        /* Select the queue we're interested in */
 311        vp_iowrite16(index, &cfg->queue_select);
 312
 313        /* Check if queue is either not available or already active. */
 314        num = vp_ioread16(&cfg->queue_size);
 315        if (!num || vp_ioread16(&cfg->queue_enable))
 316                return ERR_PTR(-ENOENT);
 317
 318        if (num & (num - 1)) {
 319                dev_warn(&vp_dev->pci_dev->dev, "bad queue size %u", num);
 320                return ERR_PTR(-EINVAL);
 321        }
 322
 323        /* get offset of notification word for this vq */
 324        off = vp_ioread16(&cfg->queue_notify_off);
 325
 326        info->msix_vector = msix_vec;
 327
 328        /* create the vring */
 329        vq = vring_create_virtqueue(index, num,
 330                                    SMP_CACHE_BYTES, &vp_dev->vdev,
 331                                    true, true, vp_notify, callback, name);
 332        if (!vq)
 333                return ERR_PTR(-ENOMEM);
 334
 335        /* activate the queue */
 336        vp_iowrite16(virtqueue_get_vring_size(vq), &cfg->queue_size);
 337        vp_iowrite64_twopart(virtqueue_get_desc_addr(vq),
 338                             &cfg->queue_desc_lo, &cfg->queue_desc_hi);
 339        vp_iowrite64_twopart(virtqueue_get_avail_addr(vq),
 340                             &cfg->queue_avail_lo, &cfg->queue_avail_hi);
 341        vp_iowrite64_twopart(virtqueue_get_used_addr(vq),
 342                             &cfg->queue_used_lo, &cfg->queue_used_hi);
 343
 344        if (vp_dev->notify_base) {
 345                /* offset should not wrap */
 346                if ((u64)off * vp_dev->notify_offset_multiplier + 2
 347                    > vp_dev->notify_len) {
 348                        dev_warn(&vp_dev->pci_dev->dev,
 349                                 "bad notification offset %u (x %u) "
 350                                 "for queue %u > %zd",
 351                                 off, vp_dev->notify_offset_multiplier,
 352                                 index, vp_dev->notify_len);
 353                        err = -EINVAL;
 354                        goto err_map_notify;
 355                }
 356                vq->priv = (void __force *)vp_dev->notify_base +
 357                        off * vp_dev->notify_offset_multiplier;
 358        } else {
 359                vq->priv = (void __force *)map_capability(vp_dev->pci_dev,
 360                                          vp_dev->notify_map_cap, 2, 2,
 361                                          off * vp_dev->notify_offset_multiplier, 2,
 362                                          NULL);
 363        }
 364
 365        if (!vq->priv) {
 366                err = -ENOMEM;
 367                goto err_map_notify;
 368        }
 369
 370        if (msix_vec != VIRTIO_MSI_NO_VECTOR) {
 371                vp_iowrite16(msix_vec, &cfg->queue_msix_vector);
 372                msix_vec = vp_ioread16(&cfg->queue_msix_vector);
 373                if (msix_vec == VIRTIO_MSI_NO_VECTOR) {
 374                        err = -EBUSY;
 375                        goto err_assign_vector;
 376                }
 377        }
 378
 379        return vq;
 380
 381err_assign_vector:
 382        if (!vp_dev->notify_base)
 383                pci_iounmap(vp_dev->pci_dev, (void __iomem __force *)vq->priv);
 384err_map_notify:
 385        vring_del_virtqueue(vq);
 386        return ERR_PTR(err);
 387}
 388
 389static int vp_modern_find_vqs(struct virtio_device *vdev, unsigned nvqs,
 390                              struct virtqueue *vqs[],
 391                              vq_callback_t *callbacks[],
 392                              const char * const names[])
 393{
 394        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 395        struct virtqueue *vq;
 396        int rc = vp_find_vqs(vdev, nvqs, vqs, callbacks, names);
 397
 398        if (rc)
 399                return rc;
 400
 401        /* Select and activate all queues. Has to be done last: once we do
 402         * this, there's no way to go back except reset.
 403         */
 404        list_for_each_entry(vq, &vdev->vqs, list) {
 405                vp_iowrite16(vq->index, &vp_dev->common->queue_select);
 406                vp_iowrite16(1, &vp_dev->common->queue_enable);
 407        }
 408
 409        return 0;
 410}
 411
 412static void del_vq(struct virtio_pci_vq_info *info)
 413{
 414        struct virtqueue *vq = info->vq;
 415        struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
 416
 417        vp_iowrite16(vq->index, &vp_dev->common->queue_select);
 418
 419        if (vp_dev->msix_enabled) {
 420                vp_iowrite16(VIRTIO_MSI_NO_VECTOR,
 421                             &vp_dev->common->queue_msix_vector);
 422                /* Flush the write out to device */
 423                vp_ioread16(&vp_dev->common->queue_msix_vector);
 424        }
 425
 426        if (!vp_dev->notify_base)
 427                pci_iounmap(vp_dev->pci_dev, (void __force __iomem *)vq->priv);
 428
 429        vring_del_virtqueue(vq);
 430}
 431
 432static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
 433        .get            = NULL,
 434        .set            = NULL,
 435        .generation     = vp_generation,
 436        .get_status     = vp_get_status,
 437        .set_status     = vp_set_status,
 438        .reset          = vp_reset,
 439        .find_vqs       = vp_modern_find_vqs,
 440        .del_vqs        = vp_del_vqs,
 441        .get_features   = vp_get_features,
 442        .finalize_features = vp_finalize_features,
 443        .bus_name       = vp_bus_name,
 444        .set_vq_affinity = vp_set_vq_affinity,
 445};
 446
 447static const struct virtio_config_ops virtio_pci_config_ops = {
 448        .get            = vp_get,
 449        .set            = vp_set,
 450        .generation     = vp_generation,
 451        .get_status     = vp_get_status,
 452        .set_status     = vp_set_status,
 453        .reset          = vp_reset,
 454        .find_vqs       = vp_modern_find_vqs,
 455        .del_vqs        = vp_del_vqs,
 456        .get_features   = vp_get_features,
 457        .finalize_features = vp_finalize_features,
 458        .bus_name       = vp_bus_name,
 459        .set_vq_affinity = vp_set_vq_affinity,
 460};
 461
 462/**
 463 * virtio_pci_find_capability - walk capabilities to find device info.
 464 * @dev: the pci device
 465 * @cfg_type: the VIRTIO_PCI_CAP_* value we seek
 466 * @ioresource_types: IORESOURCE_MEM and/or IORESOURCE_IO.
 467 *
 468 * Returns offset of the capability, or 0.
 469 */
 470static inline int virtio_pci_find_capability(struct pci_dev *dev, u8 cfg_type,
 471                                             u32 ioresource_types, int *bars)
 472{
 473        int pos;
 474
 475        for (pos = pci_find_capability(dev, PCI_CAP_ID_VNDR);
 476             pos > 0;
 477             pos = pci_find_next_capability(dev, pos, PCI_CAP_ID_VNDR)) {
 478                u8 type, bar;
 479                pci_read_config_byte(dev, pos + offsetof(struct virtio_pci_cap,
 480                                                         cfg_type),
 481                                     &type);
 482                pci_read_config_byte(dev, pos + offsetof(struct virtio_pci_cap,
 483                                                         bar),
 484                                     &bar);
 485
 486                /* Ignore structures with reserved BAR values */
 487                if (bar > 0x5)
 488                        continue;
 489
 490                if (type == cfg_type) {
 491                        if (pci_resource_len(dev, bar) &&
 492                            pci_resource_flags(dev, bar) & ioresource_types) {
 493                                *bars |= (1 << bar);
 494                                return pos;
 495                        }
 496                }
 497        }
 498        return 0;
 499}
 500
 501/* This is part of the ABI.  Don't screw with it. */
 502static inline void check_offsets(void)
 503{
 504        /* Note: disk space was harmed in compilation of this function. */
 505        BUILD_BUG_ON(VIRTIO_PCI_CAP_VNDR !=
 506                     offsetof(struct virtio_pci_cap, cap_vndr));
 507        BUILD_BUG_ON(VIRTIO_PCI_CAP_NEXT !=
 508                     offsetof(struct virtio_pci_cap, cap_next));
 509        BUILD_BUG_ON(VIRTIO_PCI_CAP_LEN !=
 510                     offsetof(struct virtio_pci_cap, cap_len));
 511        BUILD_BUG_ON(VIRTIO_PCI_CAP_CFG_TYPE !=
 512                     offsetof(struct virtio_pci_cap, cfg_type));
 513        BUILD_BUG_ON(VIRTIO_PCI_CAP_BAR !=
 514                     offsetof(struct virtio_pci_cap, bar));
 515        BUILD_BUG_ON(VIRTIO_PCI_CAP_OFFSET !=
 516                     offsetof(struct virtio_pci_cap, offset));
 517        BUILD_BUG_ON(VIRTIO_PCI_CAP_LENGTH !=
 518                     offsetof(struct virtio_pci_cap, length));
 519        BUILD_BUG_ON(VIRTIO_PCI_NOTIFY_CAP_MULT !=
 520                     offsetof(struct virtio_pci_notify_cap,
 521                              notify_off_multiplier));
 522        BUILD_BUG_ON(VIRTIO_PCI_COMMON_DFSELECT !=
 523                     offsetof(struct virtio_pci_common_cfg,
 524                              device_feature_select));
 525        BUILD_BUG_ON(VIRTIO_PCI_COMMON_DF !=
 526                     offsetof(struct virtio_pci_common_cfg, device_feature));
 527        BUILD_BUG_ON(VIRTIO_PCI_COMMON_GFSELECT !=
 528                     offsetof(struct virtio_pci_common_cfg,
 529                              guest_feature_select));
 530        BUILD_BUG_ON(VIRTIO_PCI_COMMON_GF !=
 531                     offsetof(struct virtio_pci_common_cfg, guest_feature));
 532        BUILD_BUG_ON(VIRTIO_PCI_COMMON_MSIX !=
 533                     offsetof(struct virtio_pci_common_cfg, msix_config));
 534        BUILD_BUG_ON(VIRTIO_PCI_COMMON_NUMQ !=
 535                     offsetof(struct virtio_pci_common_cfg, num_queues));
 536        BUILD_BUG_ON(VIRTIO_PCI_COMMON_STATUS !=
 537                     offsetof(struct virtio_pci_common_cfg, device_status));
 538        BUILD_BUG_ON(VIRTIO_PCI_COMMON_CFGGENERATION !=
 539                     offsetof(struct virtio_pci_common_cfg, config_generation));
 540        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_SELECT !=
 541                     offsetof(struct virtio_pci_common_cfg, queue_select));
 542        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_SIZE !=
 543                     offsetof(struct virtio_pci_common_cfg, queue_size));
 544        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_MSIX !=
 545                     offsetof(struct virtio_pci_common_cfg, queue_msix_vector));
 546        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_ENABLE !=
 547                     offsetof(struct virtio_pci_common_cfg, queue_enable));
 548        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_NOFF !=
 549                     offsetof(struct virtio_pci_common_cfg, queue_notify_off));
 550        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_DESCLO !=
 551                     offsetof(struct virtio_pci_common_cfg, queue_desc_lo));
 552        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_DESCHI !=
 553                     offsetof(struct virtio_pci_common_cfg, queue_desc_hi));
 554        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_AVAILLO !=
 555                     offsetof(struct virtio_pci_common_cfg, queue_avail_lo));
 556        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_AVAILHI !=
 557                     offsetof(struct virtio_pci_common_cfg, queue_avail_hi));
 558        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_USEDLO !=
 559                     offsetof(struct virtio_pci_common_cfg, queue_used_lo));
 560        BUILD_BUG_ON(VIRTIO_PCI_COMMON_Q_USEDHI !=
 561                     offsetof(struct virtio_pci_common_cfg, queue_used_hi));
 562}
 563
 564/* the PCI probing function */
 565int virtio_pci_modern_probe(struct virtio_pci_device *vp_dev)
 566{
 567        struct pci_dev *pci_dev = vp_dev->pci_dev;
 568        int err, common, isr, notify, device;
 569        u32 notify_length;
 570        u32 notify_offset;
 571
 572        check_offsets();
 573
 574        /* We only own devices >= 0x1000 and <= 0x107f: leave the rest. */
 575        if (pci_dev->device < 0x1000 || pci_dev->device > 0x107f)
 576                return -ENODEV;
 577
 578        if (pci_dev->device < 0x1040) {
 579                /* Transitional devices: use the PCI subsystem device id as
 580                 * virtio device id, same as legacy driver always did.
 581                 */
 582                vp_dev->vdev.id.device = pci_dev->subsystem_device;
 583        } else {
 584                /* Modern devices: simply use PCI device id, but start from 0x1040. */
 585                vp_dev->vdev.id.device = pci_dev->device - 0x1040;
 586        }
 587        vp_dev->vdev.id.vendor = pci_dev->subsystem_vendor;
 588
 589        /* check for a common config: if not, use legacy mode (bar 0). */
 590        common = virtio_pci_find_capability(pci_dev, VIRTIO_PCI_CAP_COMMON_CFG,
 591                                            IORESOURCE_IO | IORESOURCE_MEM,
 592                                            &vp_dev->modern_bars);
 593        if (!common) {
 594                dev_info(&pci_dev->dev,
 595                         "virtio_pci: leaving for legacy driver\n");
 596                return -ENODEV;
 597        }
 598
 599        /* If common is there, these should be too... */
 600        isr = virtio_pci_find_capability(pci_dev, VIRTIO_PCI_CAP_ISR_CFG,
 601                                         IORESOURCE_IO | IORESOURCE_MEM,
 602                                         &vp_dev->modern_bars);
 603        notify = virtio_pci_find_capability(pci_dev, VIRTIO_PCI_CAP_NOTIFY_CFG,
 604                                            IORESOURCE_IO | IORESOURCE_MEM,
 605                                            &vp_dev->modern_bars);
 606        if (!isr || !notify) {
 607                dev_err(&pci_dev->dev,
 608                        "virtio_pci: missing capabilities %i/%i/%i\n",
 609                        common, isr, notify);
 610                return -EINVAL;
 611        }
 612
 613        err = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64));
 614        if (err)
 615                err = dma_set_mask_and_coherent(&pci_dev->dev,
 616                                                DMA_BIT_MASK(32));
 617        if (err)
 618                dev_warn(&pci_dev->dev, "Failed to enable 64-bit or 32-bit DMA.  Trying to continue, but this might not work.\n");
 619
 620        /* Device capability is only mandatory for devices that have
 621         * device-specific configuration.
 622         */
 623        device = virtio_pci_find_capability(pci_dev, VIRTIO_PCI_CAP_DEVICE_CFG,
 624                                            IORESOURCE_IO | IORESOURCE_MEM,
 625                                            &vp_dev->modern_bars);
 626
 627        err = pci_request_selected_regions(pci_dev, vp_dev->modern_bars,
 628                                           "virtio-pci-modern");
 629        if (err)
 630                return err;
 631
 632        err = -EINVAL;
 633        vp_dev->common = map_capability(pci_dev, common,
 634                                        sizeof(struct virtio_pci_common_cfg), 4,
 635                                        0, sizeof(struct virtio_pci_common_cfg),
 636                                        NULL);
 637        if (!vp_dev->common)
 638                goto err_map_common;
 639        vp_dev->isr = map_capability(pci_dev, isr, sizeof(u8), 1,
 640                                     0, 1,
 641                                     NULL);
 642        if (!vp_dev->isr)
 643                goto err_map_isr;
 644
 645        /* Read notify_off_multiplier from config space. */
 646        pci_read_config_dword(pci_dev,
 647                              notify + offsetof(struct virtio_pci_notify_cap,
 648                                                notify_off_multiplier),
 649                              &vp_dev->notify_offset_multiplier);
 650        /* Read notify length and offset from config space. */
 651        pci_read_config_dword(pci_dev,
 652                              notify + offsetof(struct virtio_pci_notify_cap,
 653                                                cap.length),
 654                              &notify_length);
 655
 656        pci_read_config_dword(pci_dev,
 657                              notify + offsetof(struct virtio_pci_notify_cap,
 658                                                cap.offset),
 659                              &notify_offset);
 660
 661        /* We don't know how many VQs we'll map, ahead of the time.
 662         * If notify length is small, map it all now.
 663         * Otherwise, map each VQ individually later.
 664         */
 665        if ((u64)notify_length + (notify_offset % PAGE_SIZE) <= PAGE_SIZE) {
 666                vp_dev->notify_base = map_capability(pci_dev, notify, 2, 2,
 667                                                     0, notify_length,
 668                                                     &vp_dev->notify_len);
 669                if (!vp_dev->notify_base)
 670                        goto err_map_notify;
 671        } else {
 672                vp_dev->notify_map_cap = notify;
 673        }
 674
 675        /* Again, we don't know how much we should map, but PAGE_SIZE
 676         * is more than enough for all existing devices.
 677         */
 678        if (device) {
 679                vp_dev->device = map_capability(pci_dev, device, 0, 4,
 680                                                0, PAGE_SIZE,
 681                                                &vp_dev->device_len);
 682                if (!vp_dev->device)
 683                        goto err_map_device;
 684
 685                vp_dev->vdev.config = &virtio_pci_config_ops;
 686        } else {
 687                vp_dev->vdev.config = &virtio_pci_config_nodev_ops;
 688        }
 689
 690        vp_dev->config_vector = vp_config_vector;
 691        vp_dev->setup_vq = setup_vq;
 692        vp_dev->del_vq = del_vq;
 693
 694        return 0;
 695
 696err_map_device:
 697        if (vp_dev->notify_base)
 698                pci_iounmap(pci_dev, vp_dev->notify_base);
 699err_map_notify:
 700        pci_iounmap(pci_dev, vp_dev->isr);
 701err_map_isr:
 702        pci_iounmap(pci_dev, vp_dev->common);
 703err_map_common:
 704        return err;
 705}
 706
 707void virtio_pci_modern_remove(struct virtio_pci_device *vp_dev)
 708{
 709        struct pci_dev *pci_dev = vp_dev->pci_dev;
 710
 711        if (vp_dev->device)
 712                pci_iounmap(pci_dev, vp_dev->device);
 713        if (vp_dev->notify_base)
 714                pci_iounmap(pci_dev, vp_dev->notify_base);
 715        pci_iounmap(pci_dev, vp_dev->isr);
 716        pci_iounmap(pci_dev, vp_dev->common);
 717        pci_release_selected_regions(pci_dev, vp_dev->modern_bars);
 718}
 719