linux/drivers/pci/pci-sysfs.c
<<
>>
Prefs
   1/*
   2 * drivers/pci/pci-sysfs.c
   3 *
   4 * (C) Copyright 2002-2004 Greg Kroah-Hartman <greg@kroah.com>
   5 * (C) Copyright 2002-2004 IBM Corp.
   6 * (C) Copyright 2003 Matthew Wilcox
   7 * (C) Copyright 2003 Hewlett-Packard
   8 * (C) Copyright 2004 Jon Smirl <jonsmirl@yahoo.com>
   9 * (C) Copyright 2004 Silicon Graphics, Inc. Jesse Barnes <jbarnes@sgi.com>
  10 *
  11 * File attributes for PCI devices
  12 *
  13 * Modeled after usb's driverfs.c
  14 *
  15 */
  16
  17
  18#include <linux/kernel.h>
  19#include <linux/sched.h>
  20#include <linux/pci.h>
  21#include <linux/stat.h>
  22#include <linux/export.h>
  23#include <linux/topology.h>
  24#include <linux/mm.h>
  25#include <linux/fs.h>
  26#include <linux/capability.h>
  27#include <linux/security.h>
  28#include <linux/pci-aspm.h>
  29#include <linux/slab.h>
  30#include <linux/vgaarb.h>
  31#include <linux/pm_runtime.h>
  32#include <linux/of.h>
  33#include "pci.h"
  34
  35static int sysfs_initialized;   /* = 0 */
  36
  37/* show configuration fields */
  38#define pci_config_attr(field, format_string)                           \
  39static ssize_t                                                          \
  40field##_show(struct device *dev, struct device_attribute *attr, char *buf)                              \
  41{                                                                       \
  42        struct pci_dev *pdev;                                           \
  43                                                                        \
  44        pdev = to_pci_dev(dev);                                         \
  45        return sprintf(buf, format_string, pdev->field);                \
  46}                                                                       \
  47static DEVICE_ATTR_RO(field)
  48
  49pci_config_attr(vendor, "0x%04x\n");
  50pci_config_attr(device, "0x%04x\n");
  51pci_config_attr(subsystem_vendor, "0x%04x\n");
  52pci_config_attr(subsystem_device, "0x%04x\n");
  53pci_config_attr(revision, "0x%02x\n");
  54pci_config_attr(class, "0x%06x\n");
  55pci_config_attr(irq, "%u\n");
  56
  57static ssize_t broken_parity_status_show(struct device *dev,
  58                                         struct device_attribute *attr,
  59                                         char *buf)
  60{
  61        struct pci_dev *pdev = to_pci_dev(dev);
  62        return sprintf(buf, "%u\n", pdev->broken_parity_status);
  63}
  64
  65static ssize_t broken_parity_status_store(struct device *dev,
  66                                          struct device_attribute *attr,
  67                                          const char *buf, size_t count)
  68{
  69        struct pci_dev *pdev = to_pci_dev(dev);
  70        unsigned long val;
  71
  72        if (kstrtoul(buf, 0, &val) < 0)
  73                return -EINVAL;
  74
  75        pdev->broken_parity_status = !!val;
  76
  77        return count;
  78}
  79static DEVICE_ATTR_RW(broken_parity_status);
  80
  81static ssize_t pci_dev_show_local_cpu(struct device *dev, bool list,
  82                                      struct device_attribute *attr, char *buf)
  83{
  84        const struct cpumask *mask;
  85
  86#ifdef CONFIG_NUMA
  87        mask = (dev_to_node(dev) == -1) ? cpu_online_mask :
  88                                          cpumask_of_node(dev_to_node(dev));
  89#else
  90        mask = cpumask_of_pcibus(to_pci_dev(dev)->bus);
  91#endif
  92        return cpumap_print_to_pagebuf(list, buf, mask);
  93}
  94
  95static ssize_t local_cpus_show(struct device *dev,
  96                               struct device_attribute *attr, char *buf)
  97{
  98        return pci_dev_show_local_cpu(dev, false, attr, buf);
  99}
 100static DEVICE_ATTR_RO(local_cpus);
 101
 102static ssize_t local_cpulist_show(struct device *dev,
 103                                  struct device_attribute *attr, char *buf)
 104{
 105        return pci_dev_show_local_cpu(dev, true, attr, buf);
 106}
 107static DEVICE_ATTR_RO(local_cpulist);
 108
 109/*
 110 * PCI Bus Class Devices
 111 */
 112static ssize_t cpuaffinity_show(struct device *dev,
 113                                struct device_attribute *attr, char *buf)
 114{
 115        const struct cpumask *cpumask = cpumask_of_pcibus(to_pci_bus(dev));
 116
 117        return cpumap_print_to_pagebuf(false, buf, cpumask);
 118}
 119static DEVICE_ATTR_RO(cpuaffinity);
 120
 121static ssize_t cpulistaffinity_show(struct device *dev,
 122                                    struct device_attribute *attr, char *buf)
 123{
 124        const struct cpumask *cpumask = cpumask_of_pcibus(to_pci_bus(dev));
 125
 126        return cpumap_print_to_pagebuf(true, buf, cpumask);
 127}
 128static DEVICE_ATTR_RO(cpulistaffinity);
 129
 130/* show resources */
 131static ssize_t resource_show(struct device *dev, struct device_attribute *attr,
 132                             char *buf)
 133{
 134        struct pci_dev *pci_dev = to_pci_dev(dev);
 135        char *str = buf;
 136        int i;
 137        int max;
 138        resource_size_t start, end;
 139
 140        if (pci_dev->subordinate)
 141                max = DEVICE_COUNT_RESOURCE;
 142        else
 143                max = PCI_BRIDGE_RESOURCES;
 144
 145        for (i = 0; i < max; i++) {
 146                struct resource *res =  &pci_dev->resource[i];
 147                pci_resource_to_user(pci_dev, i, res, &start, &end);
 148                str += sprintf(str, "0x%016llx 0x%016llx 0x%016llx\n",
 149                               (unsigned long long)start,
 150                               (unsigned long long)end,
 151                               (unsigned long long)res->flags);
 152        }
 153        return (str - buf);
 154}
 155static DEVICE_ATTR_RO(resource);
 156
 157static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
 158                             char *buf)
 159{
 160        struct pci_dev *pci_dev = to_pci_dev(dev);
 161
 162        return sprintf(buf, "pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02X\n",
 163                       pci_dev->vendor, pci_dev->device,
 164                       pci_dev->subsystem_vendor, pci_dev->subsystem_device,
 165                       (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8),
 166                       (u8)(pci_dev->class));
 167}
 168static DEVICE_ATTR_RO(modalias);
 169
 170static ssize_t enable_store(struct device *dev, struct device_attribute *attr,
 171                             const char *buf, size_t count)
 172{
 173        struct pci_dev *pdev = to_pci_dev(dev);
 174        unsigned long val;
 175        ssize_t result = kstrtoul(buf, 0, &val);
 176
 177        if (result < 0)
 178                return result;
 179
 180        /* this can crash the machine when done on the "wrong" device */
 181        if (!capable(CAP_SYS_ADMIN))
 182                return -EPERM;
 183
 184        if (!val) {
 185                if (pci_is_enabled(pdev))
 186                        pci_disable_device(pdev);
 187                else
 188                        result = -EIO;
 189        } else
 190                result = pci_enable_device(pdev);
 191
 192        return result < 0 ? result : count;
 193}
 194
 195static ssize_t enable_show(struct device *dev, struct device_attribute *attr,
 196                            char *buf)
 197{
 198        struct pci_dev *pdev;
 199
 200        pdev = to_pci_dev(dev);
 201        return sprintf(buf, "%u\n", atomic_read(&pdev->enable_cnt));
 202}
 203static DEVICE_ATTR_RW(enable);
 204
 205#ifdef CONFIG_NUMA
 206static ssize_t numa_node_store(struct device *dev,
 207                               struct device_attribute *attr, const char *buf,
 208                               size_t count)
 209{
 210        struct pci_dev *pdev = to_pci_dev(dev);
 211        int node, ret;
 212
 213        if (!capable(CAP_SYS_ADMIN))
 214                return -EPERM;
 215
 216        ret = kstrtoint(buf, 0, &node);
 217        if (ret)
 218                return ret;
 219
 220        if ((node < 0 && node != NUMA_NO_NODE) || node >= MAX_NUMNODES)
 221                return -EINVAL;
 222
 223        if (node != NUMA_NO_NODE && !node_online(node))
 224                return -EINVAL;
 225
 226        add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
 227        dev_alert(&pdev->dev, FW_BUG "Overriding NUMA node to %d.  Contact your vendor for updates.",
 228                  node);
 229
 230        dev->numa_node = node;
 231        return count;
 232}
 233
 234static ssize_t numa_node_show(struct device *dev, struct device_attribute *attr,
 235                              char *buf)
 236{
 237        return sprintf(buf, "%d\n", dev->numa_node);
 238}
 239static DEVICE_ATTR_RW(numa_node);
 240#endif
 241
 242static ssize_t dma_mask_bits_show(struct device *dev,
 243                                  struct device_attribute *attr, char *buf)
 244{
 245        struct pci_dev *pdev = to_pci_dev(dev);
 246
 247        return sprintf(buf, "%d\n", fls64(pdev->dma_mask));
 248}
 249static DEVICE_ATTR_RO(dma_mask_bits);
 250
 251static ssize_t consistent_dma_mask_bits_show(struct device *dev,
 252                                             struct device_attribute *attr,
 253                                             char *buf)
 254{
 255        return sprintf(buf, "%d\n", fls64(dev->coherent_dma_mask));
 256}
 257static DEVICE_ATTR_RO(consistent_dma_mask_bits);
 258
 259static ssize_t msi_bus_show(struct device *dev, struct device_attribute *attr,
 260                            char *buf)
 261{
 262        struct pci_dev *pdev = to_pci_dev(dev);
 263        struct pci_bus *subordinate = pdev->subordinate;
 264
 265        return sprintf(buf, "%u\n", subordinate ?
 266                       !(subordinate->bus_flags & PCI_BUS_FLAGS_NO_MSI)
 267                           : !pdev->no_msi);
 268}
 269
 270static ssize_t msi_bus_store(struct device *dev, struct device_attribute *attr,
 271                             const char *buf, size_t count)
 272{
 273        struct pci_dev *pdev = to_pci_dev(dev);
 274        struct pci_bus *subordinate = pdev->subordinate;
 275        unsigned long val;
 276
 277        if (kstrtoul(buf, 0, &val) < 0)
 278                return -EINVAL;
 279
 280        if (!capable(CAP_SYS_ADMIN))
 281                return -EPERM;
 282
 283        /*
 284         * "no_msi" and "bus_flags" only affect what happens when a driver
 285         * requests MSI or MSI-X.  They don't affect any drivers that have
 286         * already requested MSI or MSI-X.
 287         */
 288        if (!subordinate) {
 289                pdev->no_msi = !val;
 290                dev_info(&pdev->dev, "MSI/MSI-X %s for future drivers\n",
 291                         val ? "allowed" : "disallowed");
 292                return count;
 293        }
 294
 295        if (val)
 296                subordinate->bus_flags &= ~PCI_BUS_FLAGS_NO_MSI;
 297        else
 298                subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
 299
 300        dev_info(&subordinate->dev, "MSI/MSI-X %s for future drivers of devices on this bus\n",
 301                 val ? "allowed" : "disallowed");
 302        return count;
 303}
 304static DEVICE_ATTR_RW(msi_bus);
 305
 306static ssize_t bus_rescan_store(struct bus_type *bus, const char *buf,
 307                                size_t count)
 308{
 309        unsigned long val;
 310        struct pci_bus *b = NULL;
 311
 312        if (kstrtoul(buf, 0, &val) < 0)
 313                return -EINVAL;
 314
 315        if (val) {
 316                pci_lock_rescan_remove();
 317                while ((b = pci_find_next_bus(b)) != NULL)
 318                        pci_rescan_bus(b);
 319                pci_unlock_rescan_remove();
 320        }
 321        return count;
 322}
 323static BUS_ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, bus_rescan_store);
 324
 325static struct attribute *pci_bus_attrs[] = {
 326        &bus_attr_rescan.attr,
 327        NULL,
 328};
 329
 330static const struct attribute_group pci_bus_group = {
 331        .attrs = pci_bus_attrs,
 332};
 333
 334const struct attribute_group *pci_bus_groups[] = {
 335        &pci_bus_group,
 336        NULL,
 337};
 338
 339static ssize_t dev_rescan_store(struct device *dev,
 340                                struct device_attribute *attr, const char *buf,
 341                                size_t count)
 342{
 343        unsigned long val;
 344        struct pci_dev *pdev = to_pci_dev(dev);
 345
 346        if (kstrtoul(buf, 0, &val) < 0)
 347                return -EINVAL;
 348
 349        if (val) {
 350                pci_lock_rescan_remove();
 351                pci_rescan_bus(pdev->bus);
 352                pci_unlock_rescan_remove();
 353        }
 354        return count;
 355}
 356static struct device_attribute dev_rescan_attr = __ATTR(rescan,
 357                                                        (S_IWUSR|S_IWGRP),
 358                                                        NULL, dev_rescan_store);
 359
 360static ssize_t remove_store(struct device *dev, struct device_attribute *attr,
 361                            const char *buf, size_t count)
 362{
 363        unsigned long val;
 364
 365        if (kstrtoul(buf, 0, &val) < 0)
 366                return -EINVAL;
 367
 368        if (val && device_remove_file_self(dev, attr))
 369                pci_stop_and_remove_bus_device_locked(to_pci_dev(dev));
 370        return count;
 371}
 372static struct device_attribute dev_remove_attr = __ATTR(remove,
 373                                                        (S_IWUSR|S_IWGRP),
 374                                                        NULL, remove_store);
 375
 376static ssize_t dev_bus_rescan_store(struct device *dev,
 377                                    struct device_attribute *attr,
 378                                    const char *buf, size_t count)
 379{
 380        unsigned long val;
 381        struct pci_bus *bus = to_pci_bus(dev);
 382
 383        if (kstrtoul(buf, 0, &val) < 0)
 384                return -EINVAL;
 385
 386        if (val) {
 387                pci_lock_rescan_remove();
 388                if (!pci_is_root_bus(bus) && list_empty(&bus->devices))
 389                        pci_rescan_bus_bridge_resize(bus->self);
 390                else
 391                        pci_rescan_bus(bus);
 392                pci_unlock_rescan_remove();
 393        }
 394        return count;
 395}
 396static DEVICE_ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_bus_rescan_store);
 397
 398#if defined(CONFIG_PM) && defined(CONFIG_ACPI)
 399static ssize_t d3cold_allowed_store(struct device *dev,
 400                                    struct device_attribute *attr,
 401                                    const char *buf, size_t count)
 402{
 403        struct pci_dev *pdev = to_pci_dev(dev);
 404        unsigned long val;
 405
 406        if (kstrtoul(buf, 0, &val) < 0)
 407                return -EINVAL;
 408
 409        pdev->d3cold_allowed = !!val;
 410        if (pdev->d3cold_allowed)
 411                pci_d3cold_enable(pdev);
 412        else
 413                pci_d3cold_disable(pdev);
 414
 415        pm_runtime_resume(dev);
 416
 417        return count;
 418}
 419
 420static ssize_t d3cold_allowed_show(struct device *dev,
 421                                   struct device_attribute *attr, char *buf)
 422{
 423        struct pci_dev *pdev = to_pci_dev(dev);
 424        return sprintf(buf, "%u\n", pdev->d3cold_allowed);
 425}
 426static DEVICE_ATTR_RW(d3cold_allowed);
 427#endif
 428
 429#ifdef CONFIG_OF
 430static ssize_t devspec_show(struct device *dev,
 431                            struct device_attribute *attr, char *buf)
 432{
 433        struct pci_dev *pdev = to_pci_dev(dev);
 434        struct device_node *np = pci_device_to_OF_node(pdev);
 435
 436        if (np == NULL || np->full_name == NULL)
 437                return 0;
 438        return sprintf(buf, "%s", np->full_name);
 439}
 440static DEVICE_ATTR_RO(devspec);
 441#endif
 442
 443#ifdef CONFIG_PCI_IOV
 444static ssize_t sriov_totalvfs_show(struct device *dev,
 445                                   struct device_attribute *attr,
 446                                   char *buf)
 447{
 448        struct pci_dev *pdev = to_pci_dev(dev);
 449
 450        return sprintf(buf, "%u\n", pci_sriov_get_totalvfs(pdev));
 451}
 452
 453
 454static ssize_t sriov_numvfs_show(struct device *dev,
 455                                 struct device_attribute *attr,
 456                                 char *buf)
 457{
 458        struct pci_dev *pdev = to_pci_dev(dev);
 459
 460        return sprintf(buf, "%u\n", pdev->sriov->num_VFs);
 461}
 462
 463/*
 464 * num_vfs > 0; number of VFs to enable
 465 * num_vfs = 0; disable all VFs
 466 *
 467 * Note: SRIOV spec doesn't allow partial VF
 468 *       disable, so it's all or none.
 469 */
 470static ssize_t sriov_numvfs_store(struct device *dev,
 471                                  struct device_attribute *attr,
 472                                  const char *buf, size_t count)
 473{
 474        struct pci_dev *pdev = to_pci_dev(dev);
 475        struct pci_sriov *iov = pdev->sriov;
 476        int ret;
 477        u16 num_vfs;
 478
 479        ret = kstrtou16(buf, 0, &num_vfs);
 480        if (ret < 0)
 481                return ret;
 482
 483        if (num_vfs > pci_sriov_get_totalvfs(pdev))
 484                return -ERANGE;
 485
 486        mutex_lock(&iov->dev->sriov->lock);
 487
 488        if (num_vfs == pdev->sriov->num_VFs)
 489                goto exit;
 490
 491        /* is PF driver loaded w/callback */
 492        if (!pdev->driver || !pdev->driver->sriov_configure) {
 493                dev_info(&pdev->dev, "Driver doesn't support SRIOV configuration via sysfs\n");
 494                ret = -ENOENT;
 495                goto exit;
 496        }
 497
 498        if (num_vfs == 0) {
 499                /* disable VFs */
 500                ret = pdev->driver->sriov_configure(pdev, 0);
 501                goto exit;
 502        }
 503
 504        /* enable VFs */
 505        if (pdev->sriov->num_VFs) {
 506                dev_warn(&pdev->dev, "%d VFs already enabled. Disable before enabling %d VFs\n",
 507                         pdev->sriov->num_VFs, num_vfs);
 508                ret = -EBUSY;
 509                goto exit;
 510        }
 511
 512        ret = pdev->driver->sriov_configure(pdev, num_vfs);
 513        if (ret < 0)
 514                goto exit;
 515
 516        if (ret != num_vfs)
 517                dev_warn(&pdev->dev, "%d VFs requested; only %d enabled\n",
 518                         num_vfs, ret);
 519
 520exit:
 521        mutex_unlock(&iov->dev->sriov->lock);
 522
 523        if (ret < 0)
 524                return ret;
 525
 526        return count;
 527}
 528
 529static ssize_t sriov_drivers_autoprobe_show(struct device *dev,
 530                                            struct device_attribute *attr,
 531                                            char *buf)
 532{
 533        struct pci_dev *pdev = to_pci_dev(dev);
 534
 535        return sprintf(buf, "%u\n", pdev->sriov->drivers_autoprobe);
 536}
 537
 538static ssize_t sriov_drivers_autoprobe_store(struct device *dev,
 539                                             struct device_attribute *attr,
 540                                             const char *buf, size_t count)
 541{
 542        struct pci_dev *pdev = to_pci_dev(dev);
 543        bool drivers_autoprobe;
 544
 545        if (kstrtobool(buf, &drivers_autoprobe) < 0)
 546                return -EINVAL;
 547
 548        pdev->sriov->drivers_autoprobe = drivers_autoprobe;
 549
 550        return count;
 551}
 552
 553static struct device_attribute sriov_totalvfs_attr = __ATTR_RO(sriov_totalvfs);
 554static struct device_attribute sriov_numvfs_attr =
 555                __ATTR(sriov_numvfs, (S_IRUGO|S_IWUSR|S_IWGRP),
 556                       sriov_numvfs_show, sriov_numvfs_store);
 557static struct device_attribute sriov_drivers_autoprobe_attr =
 558                __ATTR(sriov_drivers_autoprobe, (S_IRUGO|S_IWUSR|S_IWGRP),
 559                       sriov_drivers_autoprobe_show, sriov_drivers_autoprobe_store);
 560#endif /* CONFIG_PCI_IOV */
 561
 562static ssize_t driver_override_store(struct device *dev,
 563                                     struct device_attribute *attr,
 564                                     const char *buf, size_t count)
 565{
 566        struct pci_dev *pdev = to_pci_dev(dev);
 567        char *driver_override, *old = pdev->driver_override, *cp;
 568
 569        /* We need to keep extra room for a newline */
 570        if (count >= (PAGE_SIZE - 1))
 571                return -EINVAL;
 572
 573        driver_override = kstrndup(buf, count, GFP_KERNEL);
 574        if (!driver_override)
 575                return -ENOMEM;
 576
 577        cp = strchr(driver_override, '\n');
 578        if (cp)
 579                *cp = '\0';
 580
 581        if (strlen(driver_override)) {
 582                pdev->driver_override = driver_override;
 583        } else {
 584                kfree(driver_override);
 585                pdev->driver_override = NULL;
 586        }
 587
 588        kfree(old);
 589
 590        return count;
 591}
 592
 593static ssize_t driver_override_show(struct device *dev,
 594                                    struct device_attribute *attr, char *buf)
 595{
 596        struct pci_dev *pdev = to_pci_dev(dev);
 597
 598        return snprintf(buf, PAGE_SIZE, "%s\n", pdev->driver_override);
 599}
 600static DEVICE_ATTR_RW(driver_override);
 601
 602static struct attribute *pci_dev_attrs[] = {
 603        &dev_attr_resource.attr,
 604        &dev_attr_vendor.attr,
 605        &dev_attr_device.attr,
 606        &dev_attr_subsystem_vendor.attr,
 607        &dev_attr_subsystem_device.attr,
 608        &dev_attr_revision.attr,
 609        &dev_attr_class.attr,
 610        &dev_attr_irq.attr,
 611        &dev_attr_local_cpus.attr,
 612        &dev_attr_local_cpulist.attr,
 613        &dev_attr_modalias.attr,
 614#ifdef CONFIG_NUMA
 615        &dev_attr_numa_node.attr,
 616#endif
 617        &dev_attr_dma_mask_bits.attr,
 618        &dev_attr_consistent_dma_mask_bits.attr,
 619        &dev_attr_enable.attr,
 620        &dev_attr_broken_parity_status.attr,
 621        &dev_attr_msi_bus.attr,
 622#if defined(CONFIG_PM) && defined(CONFIG_ACPI)
 623        &dev_attr_d3cold_allowed.attr,
 624#endif
 625#ifdef CONFIG_OF
 626        &dev_attr_devspec.attr,
 627#endif
 628        &dev_attr_driver_override.attr,
 629        NULL,
 630};
 631
 632static const struct attribute_group pci_dev_group = {
 633        .attrs = pci_dev_attrs,
 634};
 635
 636const struct attribute_group *pci_dev_groups[] = {
 637        &pci_dev_group,
 638        NULL,
 639};
 640
 641static struct attribute *pcibus_attrs[] = {
 642        &dev_attr_rescan.attr,
 643        &dev_attr_cpuaffinity.attr,
 644        &dev_attr_cpulistaffinity.attr,
 645        NULL,
 646};
 647
 648static const struct attribute_group pcibus_group = {
 649        .attrs = pcibus_attrs,
 650};
 651
 652const struct attribute_group *pcibus_groups[] = {
 653        &pcibus_group,
 654        NULL,
 655};
 656
 657static ssize_t boot_vga_show(struct device *dev, struct device_attribute *attr,
 658                             char *buf)
 659{
 660        struct pci_dev *pdev = to_pci_dev(dev);
 661        struct pci_dev *vga_dev = vga_default_device();
 662
 663        if (vga_dev)
 664                return sprintf(buf, "%u\n", (pdev == vga_dev));
 665
 666        return sprintf(buf, "%u\n",
 667                !!(pdev->resource[PCI_ROM_RESOURCE].flags &
 668                   IORESOURCE_ROM_SHADOW));
 669}
 670static struct device_attribute vga_attr = __ATTR_RO(boot_vga);
 671
 672static ssize_t pci_read_config(struct file *filp, struct kobject *kobj,
 673                               struct bin_attribute *bin_attr, char *buf,
 674                               loff_t off, size_t count)
 675{
 676        struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
 677        unsigned int size = 64;
 678        loff_t init_off = off;
 679        u8 *data = (u8 *) buf;
 680
 681        /* Several chips lock up trying to read undefined config space */
 682        if (file_ns_capable(filp, &init_user_ns, CAP_SYS_ADMIN))
 683                size = dev->cfg_size;
 684        else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
 685                size = 128;
 686
 687        if (off > size)
 688                return 0;
 689        if (off + count > size) {
 690                size -= off;
 691                count = size;
 692        } else {
 693                size = count;
 694        }
 695
 696        pci_config_pm_runtime_get(dev);
 697
 698        if ((off & 1) && size) {
 699                u8 val;
 700                pci_user_read_config_byte(dev, off, &val);
 701                data[off - init_off] = val;
 702                off++;
 703                size--;
 704        }
 705
 706        if ((off & 3) && size > 2) {
 707                u16 val;
 708                pci_user_read_config_word(dev, off, &val);
 709                data[off - init_off] = val & 0xff;
 710                data[off - init_off + 1] = (val >> 8) & 0xff;
 711                off += 2;
 712                size -= 2;
 713        }
 714
 715        while (size > 3) {
 716                u32 val;
 717                pci_user_read_config_dword(dev, off, &val);
 718                data[off - init_off] = val & 0xff;
 719                data[off - init_off + 1] = (val >> 8) & 0xff;
 720                data[off - init_off + 2] = (val >> 16) & 0xff;
 721                data[off - init_off + 3] = (val >> 24) & 0xff;
 722                off += 4;
 723                size -= 4;
 724        }
 725
 726        if (size >= 2) {
 727                u16 val;
 728                pci_user_read_config_word(dev, off, &val);
 729                data[off - init_off] = val & 0xff;
 730                data[off - init_off + 1] = (val >> 8) & 0xff;
 731                off += 2;
 732                size -= 2;
 733        }
 734
 735        if (size > 0) {
 736                u8 val;
 737                pci_user_read_config_byte(dev, off, &val);
 738                data[off - init_off] = val;
 739                off++;
 740                --size;
 741        }
 742
 743        pci_config_pm_runtime_put(dev);
 744
 745        return count;
 746}
 747
 748static ssize_t pci_write_config(struct file *filp, struct kobject *kobj,
 749                                struct bin_attribute *bin_attr, char *buf,
 750                                loff_t off, size_t count)
 751{
 752        struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
 753        unsigned int size = count;
 754        loff_t init_off = off;
 755        u8 *data = (u8 *) buf;
 756
 757        if (off > dev->cfg_size)
 758                return 0;
 759        if (off + count > dev->cfg_size) {
 760                size = dev->cfg_size - off;
 761                count = size;
 762        }
 763
 764        pci_config_pm_runtime_get(dev);
 765
 766        if ((off & 1) && size) {
 767                pci_user_write_config_byte(dev, off, data[off - init_off]);
 768                off++;
 769                size--;
 770        }
 771
 772        if ((off & 3) && size > 2) {
 773                u16 val = data[off - init_off];
 774                val |= (u16) data[off - init_off + 1] << 8;
 775                pci_user_write_config_word(dev, off, val);
 776                off += 2;
 777                size -= 2;
 778        }
 779
 780        while (size > 3) {
 781                u32 val = data[off - init_off];
 782                val |= (u32) data[off - init_off + 1] << 8;
 783                val |= (u32) data[off - init_off + 2] << 16;
 784                val |= (u32) data[off - init_off + 3] << 24;
 785                pci_user_write_config_dword(dev, off, val);
 786                off += 4;
 787                size -= 4;
 788        }
 789
 790        if (size >= 2) {
 791                u16 val = data[off - init_off];
 792                val |= (u16) data[off - init_off + 1] << 8;
 793                pci_user_write_config_word(dev, off, val);
 794                off += 2;
 795                size -= 2;
 796        }
 797
 798        if (size) {
 799                pci_user_write_config_byte(dev, off, data[off - init_off]);
 800                off++;
 801                --size;
 802        }
 803
 804        pci_config_pm_runtime_put(dev);
 805
 806        return count;
 807}
 808
 809static ssize_t read_vpd_attr(struct file *filp, struct kobject *kobj,
 810                             struct bin_attribute *bin_attr, char *buf,
 811                             loff_t off, size_t count)
 812{
 813        struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
 814
 815        if (bin_attr->size > 0) {
 816                if (off > bin_attr->size)
 817                        count = 0;
 818                else if (count > bin_attr->size - off)
 819                        count = bin_attr->size - off;
 820        }
 821
 822        return pci_read_vpd(dev, off, count, buf);
 823}
 824
 825static ssize_t write_vpd_attr(struct file *filp, struct kobject *kobj,
 826                              struct bin_attribute *bin_attr, char *buf,
 827                              loff_t off, size_t count)
 828{
 829        struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
 830
 831        if (bin_attr->size > 0) {
 832                if (off > bin_attr->size)
 833                        count = 0;
 834                else if (count > bin_attr->size - off)
 835                        count = bin_attr->size - off;
 836        }
 837
 838        return pci_write_vpd(dev, off, count, buf);
 839}
 840
 841#ifdef HAVE_PCI_LEGACY
 842/**
 843 * pci_read_legacy_io - read byte(s) from legacy I/O port space
 844 * @filp: open sysfs file
 845 * @kobj: kobject corresponding to file to read from
 846 * @bin_attr: struct bin_attribute for this file
 847 * @buf: buffer to store results
 848 * @off: offset into legacy I/O port space
 849 * @count: number of bytes to read
 850 *
 851 * Reads 1, 2, or 4 bytes from legacy I/O port space using an arch specific
 852 * callback routine (pci_legacy_read).
 853 */
 854static ssize_t pci_read_legacy_io(struct file *filp, struct kobject *kobj,
 855                                  struct bin_attribute *bin_attr, char *buf,
 856                                  loff_t off, size_t count)
 857{
 858        struct pci_bus *bus = to_pci_bus(kobj_to_dev(kobj));
 859
 860        /* Only support 1, 2 or 4 byte accesses */
 861        if (count != 1 && count != 2 && count != 4)
 862                return -EINVAL;
 863
 864        return pci_legacy_read(bus, off, (u32 *)buf, count);
 865}
 866
 867/**
 868 * pci_write_legacy_io - write byte(s) to legacy I/O port space
 869 * @filp: open sysfs file
 870 * @kobj: kobject corresponding to file to read from
 871 * @bin_attr: struct bin_attribute for this file
 872 * @buf: buffer containing value to be written
 873 * @off: offset into legacy I/O port space
 874 * @count: number of bytes to write
 875 *
 876 * Writes 1, 2, or 4 bytes from legacy I/O port space using an arch specific
 877 * callback routine (pci_legacy_write).
 878 */
 879static ssize_t pci_write_legacy_io(struct file *filp, struct kobject *kobj,
 880                                   struct bin_attribute *bin_attr, char *buf,
 881                                   loff_t off, size_t count)
 882{
 883        struct pci_bus *bus = to_pci_bus(kobj_to_dev(kobj));
 884
 885        /* Only support 1, 2 or 4 byte accesses */
 886        if (count != 1 && count != 2 && count != 4)
 887                return -EINVAL;
 888
 889        return pci_legacy_write(bus, off, *(u32 *)buf, count);
 890}
 891
 892/**
 893 * pci_mmap_legacy_mem - map legacy PCI memory into user memory space
 894 * @filp: open sysfs file
 895 * @kobj: kobject corresponding to device to be mapped
 896 * @attr: struct bin_attribute for this file
 897 * @vma: struct vm_area_struct passed to mmap
 898 *
 899 * Uses an arch specific callback, pci_mmap_legacy_mem_page_range, to mmap
 900 * legacy memory space (first meg of bus space) into application virtual
 901 * memory space.
 902 */
 903static int pci_mmap_legacy_mem(struct file *filp, struct kobject *kobj,
 904                               struct bin_attribute *attr,
 905                               struct vm_area_struct *vma)
 906{
 907        struct pci_bus *bus = to_pci_bus(kobj_to_dev(kobj));
 908
 909        return pci_mmap_legacy_page_range(bus, vma, pci_mmap_mem);
 910}
 911
 912/**
 913 * pci_mmap_legacy_io - map legacy PCI IO into user memory space
 914 * @filp: open sysfs file
 915 * @kobj: kobject corresponding to device to be mapped
 916 * @attr: struct bin_attribute for this file
 917 * @vma: struct vm_area_struct passed to mmap
 918 *
 919 * Uses an arch specific callback, pci_mmap_legacy_io_page_range, to mmap
 920 * legacy IO space (first meg of bus space) into application virtual
 921 * memory space. Returns -ENOSYS if the operation isn't supported
 922 */
 923static int pci_mmap_legacy_io(struct file *filp, struct kobject *kobj,
 924                              struct bin_attribute *attr,
 925                              struct vm_area_struct *vma)
 926{
 927        struct pci_bus *bus = to_pci_bus(kobj_to_dev(kobj));
 928
 929        return pci_mmap_legacy_page_range(bus, vma, pci_mmap_io);
 930}
 931
 932/**
 933 * pci_adjust_legacy_attr - adjustment of legacy file attributes
 934 * @b: bus to create files under
 935 * @mmap_type: I/O port or memory
 936 *
 937 * Stub implementation. Can be overridden by arch if necessary.
 938 */
 939void __weak pci_adjust_legacy_attr(struct pci_bus *b,
 940                                   enum pci_mmap_state mmap_type)
 941{
 942}
 943
 944/**
 945 * pci_create_legacy_files - create legacy I/O port and memory files
 946 * @b: bus to create files under
 947 *
 948 * Some platforms allow access to legacy I/O port and ISA memory space on
 949 * a per-bus basis.  This routine creates the files and ties them into
 950 * their associated read, write and mmap files from pci-sysfs.c
 951 *
 952 * On error unwind, but don't propagate the error to the caller
 953 * as it is ok to set up the PCI bus without these files.
 954 */
 955void pci_create_legacy_files(struct pci_bus *b)
 956{
 957        int error;
 958
 959        b->legacy_io = kzalloc(sizeof(struct bin_attribute) * 2,
 960                               GFP_ATOMIC);
 961        if (!b->legacy_io)
 962                goto kzalloc_err;
 963
 964        sysfs_bin_attr_init(b->legacy_io);
 965        b->legacy_io->attr.name = "legacy_io";
 966        b->legacy_io->size = 0xffff;
 967        b->legacy_io->attr.mode = S_IRUSR | S_IWUSR;
 968        b->legacy_io->read = pci_read_legacy_io;
 969        b->legacy_io->write = pci_write_legacy_io;
 970        b->legacy_io->mmap = pci_mmap_legacy_io;
 971        pci_adjust_legacy_attr(b, pci_mmap_io);
 972        error = device_create_bin_file(&b->dev, b->legacy_io);
 973        if (error)
 974                goto legacy_io_err;
 975
 976        /* Allocated above after the legacy_io struct */
 977        b->legacy_mem = b->legacy_io + 1;
 978        sysfs_bin_attr_init(b->legacy_mem);
 979        b->legacy_mem->attr.name = "legacy_mem";
 980        b->legacy_mem->size = 1024*1024;
 981        b->legacy_mem->attr.mode = S_IRUSR | S_IWUSR;
 982        b->legacy_mem->mmap = pci_mmap_legacy_mem;
 983        pci_adjust_legacy_attr(b, pci_mmap_mem);
 984        error = device_create_bin_file(&b->dev, b->legacy_mem);
 985        if (error)
 986                goto legacy_mem_err;
 987
 988        return;
 989
 990legacy_mem_err:
 991        device_remove_bin_file(&b->dev, b->legacy_io);
 992legacy_io_err:
 993        kfree(b->legacy_io);
 994        b->legacy_io = NULL;
 995kzalloc_err:
 996        printk(KERN_WARNING "pci: warning: could not create legacy I/O port and ISA memory resources to sysfs\n");
 997        return;
 998}
 999
1000void pci_remove_legacy_files(struct pci_bus *b)
1001{
1002        if (b->legacy_io) {
1003                device_remove_bin_file(&b->dev, b->legacy_io);
1004                device_remove_bin_file(&b->dev, b->legacy_mem);
1005                kfree(b->legacy_io); /* both are allocated here */
1006        }
1007}
1008#endif /* HAVE_PCI_LEGACY */
1009
1010#if defined(HAVE_PCI_MMAP) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE)
1011
1012int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
1013                  enum pci_mmap_api mmap_api)
1014{
1015        unsigned long nr, start, size;
1016        resource_size_t pci_start = 0, pci_end;
1017
1018        if (pci_resource_len(pdev, resno) == 0)
1019                return 0;
1020        nr = vma_pages(vma);
1021        start = vma->vm_pgoff;
1022        size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
1023        if (mmap_api == PCI_MMAP_PROCFS) {
1024                pci_resource_to_user(pdev, resno, &pdev->resource[resno],
1025                                     &pci_start, &pci_end);
1026                pci_start >>= PAGE_SHIFT;
1027        }
1028        if (start >= pci_start && start < pci_start + size &&
1029                        start + nr <= pci_start + size)
1030                return 1;
1031        return 0;
1032}
1033
1034/**
1035 * pci_mmap_resource - map a PCI resource into user memory space
1036 * @kobj: kobject for mapping
1037 * @attr: struct bin_attribute for the file being mapped
1038 * @vma: struct vm_area_struct passed into the mmap
1039 * @write_combine: 1 for write_combine mapping
1040 *
1041 * Use the regular PCI mapping routines to map a PCI resource into userspace.
1042 */
1043static int pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,
1044                             struct vm_area_struct *vma, int write_combine)
1045{
1046        struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj));
1047        int bar = (unsigned long)attr->private;
1048        enum pci_mmap_state mmap_type;
1049        struct resource *res = &pdev->resource[bar];
1050
1051        if (res->flags & IORESOURCE_MEM && iomem_is_exclusive(res->start))
1052                return -EINVAL;
1053
1054        if (!pci_mmap_fits(pdev, bar, vma, PCI_MMAP_SYSFS)) {
1055                WARN(1, "process \"%s\" tried to map 0x%08lx bytes at page 0x%08lx on %s BAR %d (start 0x%16Lx, size 0x%16Lx)\n",
1056                        current->comm, vma->vm_end-vma->vm_start, vma->vm_pgoff,
1057                        pci_name(pdev), bar,
1058                        (u64)pci_resource_start(pdev, bar),
1059                        (u64)pci_resource_len(pdev, bar));
1060                return -EINVAL;
1061        }
1062        mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;
1063
1064        return pci_mmap_resource_range(pdev, bar, vma, mmap_type, write_combine);
1065}
1066
1067static int pci_mmap_resource_uc(struct file *filp, struct kobject *kobj,
1068                                struct bin_attribute *attr,
1069                                struct vm_area_struct *vma)
1070{
1071        return pci_mmap_resource(kobj, attr, vma, 0);
1072}
1073
1074static int pci_mmap_resource_wc(struct file *filp, struct kobject *kobj,
1075                                struct bin_attribute *attr,
1076                                struct vm_area_struct *vma)
1077{
1078        return pci_mmap_resource(kobj, attr, vma, 1);
1079}
1080
1081static ssize_t pci_resource_io(struct file *filp, struct kobject *kobj,
1082                               struct bin_attribute *attr, char *buf,
1083                               loff_t off, size_t count, bool write)
1084{
1085        struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj));
1086        int bar = (unsigned long)attr->private;
1087        struct resource *res;
1088        unsigned long port = off;
1089
1090        res = &pdev->resource[bar];
1091
1092        port += pci_resource_start(pdev, bar);
1093
1094        if (port > pci_resource_end(pdev, bar))
1095                return 0;
1096
1097        if (port + count - 1 > pci_resource_end(pdev, bar))
1098                return -EINVAL;
1099
1100        switch (count) {
1101        case 1:
1102                if (write)
1103                        outb(*(u8 *)buf, port);
1104                else
1105                        *(u8 *)buf = inb(port);
1106                return 1;
1107        case 2:
1108                if (write)
1109                        outw(*(u16 *)buf, port);
1110                else
1111                        *(u16 *)buf = inw(port);
1112                return 2;
1113        case 4:
1114                if (write)
1115                        outl(*(u32 *)buf, port);
1116                else
1117                        *(u32 *)buf = inl(port);
1118                return 4;
1119        }
1120        return -EINVAL;
1121}
1122
1123static ssize_t pci_read_resource_io(struct file *filp, struct kobject *kobj,
1124                                    struct bin_attribute *attr, char *buf,
1125                                    loff_t off, size_t count)
1126{
1127        return pci_resource_io(filp, kobj, attr, buf, off, count, false);
1128}
1129
1130static ssize_t pci_write_resource_io(struct file *filp, struct kobject *kobj,
1131                                     struct bin_attribute *attr, char *buf,
1132                                     loff_t off, size_t count)
1133{
1134        return pci_resource_io(filp, kobj, attr, buf, off, count, true);
1135}
1136
1137/**
1138 * pci_remove_resource_files - cleanup resource files
1139 * @pdev: dev to cleanup
1140 *
1141 * If we created resource files for @pdev, remove them from sysfs and
1142 * free their resources.
1143 */
1144static void pci_remove_resource_files(struct pci_dev *pdev)
1145{
1146        int i;
1147
1148        for (i = 0; i < PCI_ROM_RESOURCE; i++) {
1149                struct bin_attribute *res_attr;
1150
1151                res_attr = pdev->res_attr[i];
1152                if (res_attr) {
1153                        sysfs_remove_bin_file(&pdev->dev.kobj, res_attr);
1154                        kfree(res_attr);
1155                }
1156
1157                res_attr = pdev->res_attr_wc[i];
1158                if (res_attr) {
1159                        sysfs_remove_bin_file(&pdev->dev.kobj, res_attr);
1160                        kfree(res_attr);
1161                }
1162        }
1163}
1164
1165static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine)
1166{
1167        /* allocate attribute structure, piggyback attribute name */
1168        int name_len = write_combine ? 13 : 10;
1169        struct bin_attribute *res_attr;
1170        char *res_attr_name;
1171        int retval;
1172
1173        res_attr = kzalloc(sizeof(*res_attr) + name_len, GFP_ATOMIC);
1174        if (!res_attr)
1175                return -ENOMEM;
1176
1177        res_attr_name = (char *)(res_attr + 1);
1178
1179        sysfs_bin_attr_init(res_attr);
1180        if (write_combine) {
1181                pdev->res_attr_wc[num] = res_attr;
1182                sprintf(res_attr_name, "resource%d_wc", num);
1183                res_attr->mmap = pci_mmap_resource_wc;
1184        } else {
1185                pdev->res_attr[num] = res_attr;
1186                sprintf(res_attr_name, "resource%d", num);
1187                if (pci_resource_flags(pdev, num) & IORESOURCE_IO) {
1188                        res_attr->read = pci_read_resource_io;
1189                        res_attr->write = pci_write_resource_io;
1190                        if (arch_can_pci_mmap_io())
1191                                res_attr->mmap = pci_mmap_resource_uc;
1192                } else {
1193                        res_attr->mmap = pci_mmap_resource_uc;
1194                }
1195        }
1196        res_attr->attr.name = res_attr_name;
1197        res_attr->attr.mode = S_IRUSR | S_IWUSR;
1198        res_attr->size = pci_resource_len(pdev, num);
1199        res_attr->private = (void *)(unsigned long)num;
1200        retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr);
1201        if (retval)
1202                kfree(res_attr);
1203
1204        return retval;
1205}
1206
1207/**
1208 * pci_create_resource_files - create resource files in sysfs for @dev
1209 * @pdev: dev in question
1210 *
1211 * Walk the resources in @pdev creating files for each resource available.
1212 */
1213static int pci_create_resource_files(struct pci_dev *pdev)
1214{
1215        int i;
1216        int retval;
1217
1218        /* Expose the PCI resources from this device as files */
1219        for (i = 0; i < PCI_ROM_RESOURCE; i++) {
1220
1221                /* skip empty resources */
1222                if (!pci_resource_len(pdev, i))
1223                        continue;
1224
1225                retval = pci_create_attr(pdev, i, 0);
1226                /* for prefetchable resources, create a WC mappable file */
1227                if (!retval && arch_can_pci_mmap_wc() &&
1228                    pdev->resource[i].flags & IORESOURCE_PREFETCH)
1229                        retval = pci_create_attr(pdev, i, 1);
1230                if (retval) {
1231                        pci_remove_resource_files(pdev);
1232                        return retval;
1233                }
1234        }
1235        return 0;
1236}
1237#else /* !HAVE_PCI_MMAP */
1238int __weak pci_create_resource_files(struct pci_dev *dev) { return 0; }
1239void __weak pci_remove_resource_files(struct pci_dev *dev) { return; }
1240#endif /* HAVE_PCI_MMAP */
1241
1242/**
1243 * pci_write_rom - used to enable access to the PCI ROM display
1244 * @filp: sysfs file
1245 * @kobj: kernel object handle
1246 * @bin_attr: struct bin_attribute for this file
1247 * @buf: user input
1248 * @off: file offset
1249 * @count: number of byte in input
1250 *
1251 * writing anything except 0 enables it
1252 */
1253static ssize_t pci_write_rom(struct file *filp, struct kobject *kobj,
1254                             struct bin_attribute *bin_attr, char *buf,
1255                             loff_t off, size_t count)
1256{
1257        struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj));
1258
1259        if ((off ==  0) && (*buf == '0') && (count == 2))
1260                pdev->rom_attr_enabled = 0;
1261        else
1262                pdev->rom_attr_enabled = 1;
1263
1264        return count;
1265}
1266
1267/**
1268 * pci_read_rom - read a PCI ROM
1269 * @filp: sysfs file
1270 * @kobj: kernel object handle
1271 * @bin_attr: struct bin_attribute for this file
1272 * @buf: where to put the data we read from the ROM
1273 * @off: file offset
1274 * @count: number of bytes to read
1275 *
1276 * Put @count bytes starting at @off into @buf from the ROM in the PCI
1277 * device corresponding to @kobj.
1278 */
1279static ssize_t pci_read_rom(struct file *filp, struct kobject *kobj,
1280                            struct bin_attribute *bin_attr, char *buf,
1281                            loff_t off, size_t count)
1282{
1283        struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj));
1284        void __iomem *rom;
1285        size_t size;
1286
1287        if (!pdev->rom_attr_enabled)
1288                return -EINVAL;
1289
1290        rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */
1291        if (!rom || !size)
1292                return -EIO;
1293
1294        if (off >= size)
1295                count = 0;
1296        else {
1297                if (off + count > size)
1298                        count = size - off;
1299
1300                memcpy_fromio(buf, rom + off, count);
1301        }
1302        pci_unmap_rom(pdev, rom);
1303
1304        return count;
1305}
1306
1307static struct bin_attribute pci_config_attr = {
1308        .attr = {
1309                .name = "config",
1310                .mode = S_IRUGO | S_IWUSR,
1311        },
1312        .size = PCI_CFG_SPACE_SIZE,
1313        .read = pci_read_config,
1314        .write = pci_write_config,
1315};
1316
1317static struct bin_attribute pcie_config_attr = {
1318        .attr = {
1319                .name = "config",
1320                .mode = S_IRUGO | S_IWUSR,
1321        },
1322        .size = PCI_CFG_SPACE_EXP_SIZE,
1323        .read = pci_read_config,
1324        .write = pci_write_config,
1325};
1326
1327static ssize_t reset_store(struct device *dev, struct device_attribute *attr,
1328                           const char *buf, size_t count)
1329{
1330        struct pci_dev *pdev = to_pci_dev(dev);
1331        unsigned long val;
1332        ssize_t result = kstrtoul(buf, 0, &val);
1333
1334        if (result < 0)
1335                return result;
1336
1337        if (val != 1)
1338                return -EINVAL;
1339
1340        result = pci_reset_function(pdev);
1341        if (result < 0)
1342                return result;
1343
1344        return count;
1345}
1346
1347static struct device_attribute reset_attr = __ATTR(reset, 0200, NULL, reset_store);
1348
1349static int pci_create_capabilities_sysfs(struct pci_dev *dev)
1350{
1351        int retval;
1352        struct bin_attribute *attr;
1353
1354        /* If the device has VPD, try to expose it in sysfs. */
1355        if (dev->vpd) {
1356                attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
1357                if (!attr)
1358                        return -ENOMEM;
1359
1360                sysfs_bin_attr_init(attr);
1361                attr->size = 0;
1362                attr->attr.name = "vpd";
1363                attr->attr.mode = S_IRUSR | S_IWUSR;
1364                attr->read = read_vpd_attr;
1365                attr->write = write_vpd_attr;
1366                retval = sysfs_create_bin_file(&dev->dev.kobj, attr);
1367                if (retval) {
1368                        kfree(attr);
1369                        return retval;
1370                }
1371                dev->vpd->attr = attr;
1372        }
1373
1374        /* Active State Power Management */
1375        pcie_aspm_create_sysfs_dev_files(dev);
1376
1377        if (!pci_probe_reset_function(dev)) {
1378                retval = device_create_file(&dev->dev, &reset_attr);
1379                if (retval)
1380                        goto error;
1381                dev->reset_fn = 1;
1382        }
1383        return 0;
1384
1385error:
1386        pcie_aspm_remove_sysfs_dev_files(dev);
1387        if (dev->vpd && dev->vpd->attr) {
1388                sysfs_remove_bin_file(&dev->dev.kobj, dev->vpd->attr);
1389                kfree(dev->vpd->attr);
1390        }
1391
1392        return retval;
1393}
1394
1395int __must_check pci_create_sysfs_dev_files(struct pci_dev *pdev)
1396{
1397        int retval;
1398        int rom_size;
1399        struct bin_attribute *attr;
1400
1401        if (!sysfs_initialized)
1402                return -EACCES;
1403
1404        if (pdev->cfg_size > PCI_CFG_SPACE_SIZE)
1405                retval = sysfs_create_bin_file(&pdev->dev.kobj, &pcie_config_attr);
1406        else
1407                retval = sysfs_create_bin_file(&pdev->dev.kobj, &pci_config_attr);
1408        if (retval)
1409                goto err;
1410
1411        retval = pci_create_resource_files(pdev);
1412        if (retval)
1413                goto err_config_file;
1414
1415        /* If the device has a ROM, try to expose it in sysfs. */
1416        rom_size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
1417        if (rom_size) {
1418                attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
1419                if (!attr) {
1420                        retval = -ENOMEM;
1421                        goto err_resource_files;
1422                }
1423                sysfs_bin_attr_init(attr);
1424                attr->size = rom_size;
1425                attr->attr.name = "rom";
1426                attr->attr.mode = S_IRUSR | S_IWUSR;
1427                attr->read = pci_read_rom;
1428                attr->write = pci_write_rom;
1429                retval = sysfs_create_bin_file(&pdev->dev.kobj, attr);
1430                if (retval) {
1431                        kfree(attr);
1432                        goto err_resource_files;
1433                }
1434                pdev->rom_attr = attr;
1435        }
1436
1437        /* add sysfs entries for various capabilities */
1438        retval = pci_create_capabilities_sysfs(pdev);
1439        if (retval)
1440                goto err_rom_file;
1441
1442        pci_create_firmware_label_files(pdev);
1443
1444        return 0;
1445
1446err_rom_file:
1447        if (pdev->rom_attr) {
1448                sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr);
1449                kfree(pdev->rom_attr);
1450                pdev->rom_attr = NULL;
1451        }
1452err_resource_files:
1453        pci_remove_resource_files(pdev);
1454err_config_file:
1455        if (pdev->cfg_size > PCI_CFG_SPACE_SIZE)
1456                sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr);
1457        else
1458                sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
1459err:
1460        return retval;
1461}
1462
1463static void pci_remove_capabilities_sysfs(struct pci_dev *dev)
1464{
1465        if (dev->vpd && dev->vpd->attr) {
1466                sysfs_remove_bin_file(&dev->dev.kobj, dev->vpd->attr);
1467                kfree(dev->vpd->attr);
1468        }
1469
1470        pcie_aspm_remove_sysfs_dev_files(dev);
1471        if (dev->reset_fn) {
1472                device_remove_file(&dev->dev, &reset_attr);
1473                dev->reset_fn = 0;
1474        }
1475}
1476
1477/**
1478 * pci_remove_sysfs_dev_files - cleanup PCI specific sysfs files
1479 * @pdev: device whose entries we should free
1480 *
1481 * Cleanup when @pdev is removed from sysfs.
1482 */
1483void pci_remove_sysfs_dev_files(struct pci_dev *pdev)
1484{
1485        if (!sysfs_initialized)
1486                return;
1487
1488        pci_remove_capabilities_sysfs(pdev);
1489
1490        if (pdev->cfg_size > PCI_CFG_SPACE_SIZE)
1491                sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr);
1492        else
1493                sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
1494
1495        pci_remove_resource_files(pdev);
1496
1497        if (pdev->rom_attr) {
1498                sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr);
1499                kfree(pdev->rom_attr);
1500                pdev->rom_attr = NULL;
1501        }
1502
1503        pci_remove_firmware_label_files(pdev);
1504}
1505
1506static int __init pci_sysfs_init(void)
1507{
1508        struct pci_dev *pdev = NULL;
1509        int retval;
1510
1511        sysfs_initialized = 1;
1512        for_each_pci_dev(pdev) {
1513                retval = pci_create_sysfs_dev_files(pdev);
1514                if (retval) {
1515                        pci_dev_put(pdev);
1516                        return retval;
1517                }
1518        }
1519
1520        return 0;
1521}
1522late_initcall(pci_sysfs_init);
1523
1524static struct attribute *pci_dev_dev_attrs[] = {
1525        &vga_attr.attr,
1526        NULL,
1527};
1528
1529static umode_t pci_dev_attrs_are_visible(struct kobject *kobj,
1530                                         struct attribute *a, int n)
1531{
1532        struct device *dev = kobj_to_dev(kobj);
1533        struct pci_dev *pdev = to_pci_dev(dev);
1534
1535        if (a == &vga_attr.attr)
1536                if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
1537                        return 0;
1538
1539        return a->mode;
1540}
1541
1542static struct attribute *pci_dev_hp_attrs[] = {
1543        &dev_remove_attr.attr,
1544        &dev_rescan_attr.attr,
1545        NULL,
1546};
1547
1548static umode_t pci_dev_hp_attrs_are_visible(struct kobject *kobj,
1549                                            struct attribute *a, int n)
1550{
1551        struct device *dev = kobj_to_dev(kobj);
1552        struct pci_dev *pdev = to_pci_dev(dev);
1553
1554        if (pdev->is_virtfn)
1555                return 0;
1556
1557        return a->mode;
1558}
1559
1560static struct attribute_group pci_dev_hp_attr_group = {
1561        .attrs = pci_dev_hp_attrs,
1562        .is_visible = pci_dev_hp_attrs_are_visible,
1563};
1564
1565#ifdef CONFIG_PCI_IOV
1566static struct attribute *sriov_dev_attrs[] = {
1567        &sriov_totalvfs_attr.attr,
1568        &sriov_numvfs_attr.attr,
1569        &sriov_drivers_autoprobe_attr.attr,
1570        NULL,
1571};
1572
1573static umode_t sriov_attrs_are_visible(struct kobject *kobj,
1574                                       struct attribute *a, int n)
1575{
1576        struct device *dev = kobj_to_dev(kobj);
1577
1578        if (!dev_is_pf(dev))
1579                return 0;
1580
1581        return a->mode;
1582}
1583
1584static struct attribute_group sriov_dev_attr_group = {
1585        .attrs = sriov_dev_attrs,
1586        .is_visible = sriov_attrs_are_visible,
1587};
1588#endif /* CONFIG_PCI_IOV */
1589
1590static struct attribute_group pci_dev_attr_group = {
1591        .attrs = pci_dev_dev_attrs,
1592        .is_visible = pci_dev_attrs_are_visible,
1593};
1594
1595static const struct attribute_group *pci_dev_attr_groups[] = {
1596        &pci_dev_attr_group,
1597        &pci_dev_hp_attr_group,
1598#ifdef CONFIG_PCI_IOV
1599        &sriov_dev_attr_group,
1600#endif
1601        NULL,
1602};
1603
1604struct device_type pci_dev_type = {
1605        .groups = pci_dev_attr_groups,
1606};
1607