linux/drivers/pci/hotplug/shpchp_sysfs.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Compaq Hot Plug Controller Driver
   4 *
   5 * Copyright (c) 1995,2001 Compaq Computer Corporation
   6 * Copyright (c) 2001,2003 Greg Kroah-Hartman (greg@kroah.com)
   7 * Copyright (c) 2001 IBM Corp.
   8 *
   9 * All rights reserved.
  10 *
  11 * Send feedback to <greg@kroah.com>
  12 *
  13 */
  14
  15#include <linux/module.h>
  16#include <linux/kernel.h>
  17#include <linux/types.h>
  18#include <linux/pci.h>
  19#include "shpchp.h"
  20
  21
  22/* A few routines that create sysfs entries for the hot plug controller */
  23
  24static ssize_t show_ctrl(struct device *dev, struct device_attribute *attr, char *buf)
  25{
  26        struct pci_dev *pdev;
  27        char *out = buf;
  28        int index, busnr;
  29        struct resource *res;
  30        struct pci_bus *bus;
  31
  32        pdev = to_pci_dev(dev);
  33        bus = pdev->subordinate;
  34
  35        out += sprintf(buf, "Free resources: memory\n");
  36        pci_bus_for_each_resource(bus, res, index) {
  37                if (res && (res->flags & IORESOURCE_MEM) &&
  38                                !(res->flags & IORESOURCE_PREFETCH)) {
  39                        out += sprintf(out, "start = %8.8llx, length = %8.8llx\n",
  40                                       (unsigned long long)res->start,
  41                                       (unsigned long long)resource_size(res));
  42                }
  43        }
  44        out += sprintf(out, "Free resources: prefetchable memory\n");
  45        pci_bus_for_each_resource(bus, res, index) {
  46                if (res && (res->flags & IORESOURCE_MEM) &&
  47                               (res->flags & IORESOURCE_PREFETCH)) {
  48                        out += sprintf(out, "start = %8.8llx, length = %8.8llx\n",
  49                                       (unsigned long long)res->start,
  50                                       (unsigned long long)resource_size(res));
  51                }
  52        }
  53        out += sprintf(out, "Free resources: IO\n");
  54        pci_bus_for_each_resource(bus, res, index) {
  55                if (res && (res->flags & IORESOURCE_IO)) {
  56                        out += sprintf(out, "start = %8.8llx, length = %8.8llx\n",
  57                                       (unsigned long long)res->start,
  58                                       (unsigned long long)resource_size(res));
  59                }
  60        }
  61        out += sprintf(out, "Free resources: bus numbers\n");
  62        for (busnr = bus->busn_res.start; busnr <= bus->busn_res.end; busnr++) {
  63                if (!pci_find_bus(pci_domain_nr(bus), busnr))
  64                        break;
  65        }
  66        if (busnr < bus->busn_res.end)
  67                out += sprintf(out, "start = %8.8x, length = %8.8x\n",
  68                                busnr, (int)(bus->busn_res.end - busnr));
  69
  70        return out - buf;
  71}
  72static DEVICE_ATTR(ctrl, S_IRUGO, show_ctrl, NULL);
  73
  74int shpchp_create_ctrl_files(struct controller *ctrl)
  75{
  76        return device_create_file(&ctrl->pci_dev->dev, &dev_attr_ctrl);
  77}
  78
  79void shpchp_remove_ctrl_files(struct controller *ctrl)
  80{
  81        device_remove_file(&ctrl->pci_dev->dev, &dev_attr_ctrl);
  82}
  83