Commit Graph

261 Commits

Author SHA1 Message Date
Myron Stowe a608c7ca1a s390/pci: Stop usurping pdev->dev.groups
JIRA: https://issues.redhat.com/browse/RHEL-67693
Upstream Status: 265baca69a0735b64227a43d4be865a95ba514bb

Conflict(s):
  Patching file arch/s390/pci/Makefile: Hunk #1 FAILED at 3.
  Due to RHEL backport out of order from upstream (ref: RHEL 9 commit
  a47ee83b11 ("s390/pci: Report PCI error recovery results via SCLP").


commit 265baca69a0735b64227a43d4be865a95ba514bb
Author: Lukas Wunner <lukas@wunner.de>
Date:   Mon Aug 5 17:24:05 2024 +0200

    s390/pci: Stop usurping pdev->dev.groups

    Bjorn suggests using pdev->dev.groups for attribute_groups constructed on
    PCI device enumeration:

      "Is it feasible to build an attribute group in pci_doe_init() and
       add it to dev->groups so device_add() will automatically add them?"
       https://lore.kernel.org/r/20231019165829.GA1381099@bhelgaas

    Unfortunately on s390, pcibios_device_add() usurps pdev->dev.groups for
    arch-specific attribute_groups, preventing its use for anything else.

    Introduce an ARCH_PCI_DEV_GROUPS macro which arches can define in
    <asm/pci.h>.  The macro is visible in drivers/pci/pci-sysfs.c through the
    inclusion of <linux/pci.h>, which in turn includes <asm/pci.h>.

    On s390, define the macro to the three attribute_groups previously assigned
    to pdev->dev.groups.  Thereby pdev->dev.groups is made available for use by
    the PCI core.

    As a side effect, arch/s390/pci/pci_sysfs.c no longer needs to be compiled
    into the kernel if CONFIG_SYSFS=n.

    Link: https://lore.kernel.org/r/7b970f7923e373d1b23784721208f93418720485.1722870934.git.lukas@wunner.de
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Acked-by: Niklas Schnelle <schnelle@linux.ibm.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2025-02-18 09:48:09 -07:00
Myron Stowe 26838dc0db PCI/sysfs: Demacrofy pci_dev_resource_resize_attr(n) functions
JIRA: https://issues.redhat.com/browse/RHEL-33544
Upstream Status: f6c73999837820f98519bf0146df44e58f20f89c

commit f6c73999837820f98519bf0146df44e58f20f89c
Author: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Date:   Thu Feb 22 13:46:06 2024 +0200

    PCI/sysfs: Demacrofy pci_dev_resource_resize_attr(n) functions

    pci_dev_resource_resize_attr(n) macro is invoked for six resources,
    creating a large footprint function for each resource.

    Rework the macro to only create a function that calls a helper function so
    the compiler can decide if it warrants to inline the function or not.

    With x86_64 defconfig, this saves roughly 2.5kB:

      $ scripts/bloat-o-meter drivers/pci/pci-sysfs.o{.old,.new}
      add/remove: 1/0 grow/shrink: 0/6 up/down: 512/-2934 (-2422)
      Function                                     old     new   delta
      __resource_resize_store                        -     512    +512
      resource5_resize_store                       503      14    -489
      resource4_resize_store                       503      14    -489
      resource3_resize_store                       503      14    -489
      resource2_resize_store                       503      14    -489
      resource1_resize_store                       503      14    -489
      resource0_resize_store                       500      11    -489
      Total: Before=13399, After=10977, chg -18.08%

    (The compiler seemingly chose to still inline __resource_resize_show()
    which is fine, those functions are not very complex/large.)

    Link: https://lore.kernel.org/r/20240222114607.1837-1-ilpo.jarvinen@linux.intel.com
    Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2024-05-13 15:56:47 -06:00
Myron Stowe 66f79d1f7e PCI/sysfs: Compile pci-sysfs.c only if CONFIG_SYSFS=y
JIRA: https://issues.redhat.com/browse/RHEL-33544
Upstream Status: be9c3a4c8be13326e434d8817d6dda6c5d2835f5

Conflict(s):
  Patching file drivers/pci/Makefile: Hunk #1 FAILED at 4.  Post context
  conflict due to originating patch not taking into account upstream
  commit 1e8cc8e6bd85 "PCI: Place interrupt related code into irq.c"
  (see merge commit b8de187056f "Merge branch 'pci/sysfs'").


commit be9c3a4c8be13326e434d8817d6dda6c5d2835f5
Author: Lukas Wunner <lukas@wunner.de>
Date:   Mon Oct 30 13:32:12 2023 +0100

    PCI/sysfs: Compile pci-sysfs.c only if CONFIG_SYSFS=y

    It is possible to enable CONFIG_PCI but disable CONFIG_SYSFS and for
    space-constrained devices such as routers, such a configuration may
    actually make sense.

    However pci-sysfs.c is compiled even if CONFIG_SYSFS is disabled,
    unnecessarily increasing the kernel's size.

    To rectify that:

    * Move pci_mmap_fits() to mmap.c.  It is not only needed by
      pci-sysfs.c, but also proc.c.

    * Move pci_dev_type to probe.c and make it private.  It references
      pci_dev_attr_groups in pci-sysfs.c.  Make that public instead for
      consistency with pci_dev_groups, pcibus_groups and pci_bus_groups,
      which are likewise public and referenced by struct definitions in
      pci-driver.c and probe.c.

    * Define pci_dev_groups, pci_dev_attr_groups, pcibus_groups and
      pci_bus_groups to NULL if CONFIG_SYSFS is disabled.  Provide empty
      static inlines for pci_{create,remove}_legacy_files() and
      pci_{create,remove}_sysfs_dev_files().

    Result:

    vmlinux size is reduced by 122996 bytes in my arm 32-bit test build.

    Link: https://lore.kernel.org/r/85ca95ae8e4d57ccf082c5c069b8b21eb141846e.1698668982.git.lukas@wunner.de
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2024-05-13 15:56:46 -06:00
Myron Stowe 49d9cabe46 PCI: Use FIELD_GET() to extract Link Width
JIRA: https://issues.redhat.com/browse/RHEL-26162
Upstream Status: d1f9b39da4a5347150246871325190018cda8cb3

commit d1f9b39da4a5347150246871325190018cda8cb3
Author: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Date:   Tue Sep 19 15:56:46 2023 +0300

    PCI: Use FIELD_GET() to extract Link Width

    Use FIELD_GET() to extract PCIe Negotiated and Maximum Link Width fields
    instead of custom masking and shifting.

    Link: https://lore.kernel.org/r/20230919125648.1920-7-ilpo.jarvinen@linux.intel.com
    Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
    [bhelgaas: drop duplicate include of <linux/bitfield.h>]
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2024-02-25 08:39:28 -07:00
Myron Stowe cc22556a3b PCI/sysfs: Enable 'boot_vga' attribute via pci_is_vga()
JIRA: https://issues.redhat.com/browse/RHEL-26162
Upstream Status: cdd3cecb521520ff316eea5ee36608b63a8df9f9

commit cdd3cecb521520ff316eea5ee36608b63a8df9f9
Author: Sui Jingfeng <suijingfeng@loongson.cn>
Date:   Wed Aug 30 19:15:30 2023 +0800

    PCI/sysfs: Enable 'boot_vga' attribute via pci_is_vga()

    Enable the 'boot_vga' sysfs attribute via pci_is_vga().

    This exposes 'boot_vga' for old PCI_CLASS_NOT_DEFINED_VGA (0x0001) devices
    as well as for the PCI_CLASS_DISPLAY_VGA (0x0300) devices where it was
    previously exposed.

    Link: https://lore.kernel.org/r/20230830111532.444535-4-sui.jingfeng@linux.dev
    Signed-off-by: Sui Jingfeng <suijingfeng@loongson.cn>
    [bhelgaas: commit log]
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: "Maciej W. Rozycki" <macro@orcam.me.uk>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2024-02-25 08:38:05 -07:00
Myron Stowe 8c77765240 PCI/sysfs: Protect driver's D3cold preference from user space
JIRA: https://issues.redhat.com/browse/RHEL-26162
Upstream Status: 70b70a4307cccebe91388337b1c85735ce4de6ff

commit 70b70a4307cccebe91388337b1c85735ce4de6ff
Author: Lukas Wunner <lukas@wunner.de>
Date:   Mon Sep 18 14:48:01 2023 +0200

    PCI/sysfs: Protect driver's D3cold preference from user space

    struct pci_dev contains two flags which govern whether the device may
    suspend to D3cold:

    * no_d3cold provides an opt-out for drivers (e.g. if a device is known
      to not wake from D3cold)

    * d3cold_allowed provides an opt-out for user space (default is true,
      user space may set to false)

    Since commit 9d26d3a8f1 ("PCI: Put PCIe ports into D3 during suspend"),
    the user space setting overwrites the driver setting.  Essentially user
    space is trusted to know better than the driver whether D3cold is
    working.

    That feels unsafe and wrong.  Assume that the change was introduced
    inadvertently and do not overwrite no_d3cold when d3cold_allowed is
    modified.  Instead, consider d3cold_allowed in addition to no_d3cold
    when choosing a suspend state for the device.

    That way, user space may opt out of D3cold if the driver hasn't, but it
    may no longer force an opt in if the driver has opted out.

    Fixes: 9d26d3a8f1 ("PCI: Put PCIe ports into D3 during suspend")
    Link: https://lore.kernel.org/r/b8a7f4af2b73f6b506ad8ddee59d747cbf834606.1695025365.git.lukas@wunner.de
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
    Cc: stable@vger.kernel.org      # v4.8+

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2024-02-25 08:38:04 -07:00
Mark Langsdorf 003236bf33 driver core: bus: mark the struct bus_type for sysfs callbacks as constant
JIRA: https://issues.redhat.com/browse/RHEL-1023
Conflicts:
	drivers/ata/pata_parport/pata_parport.c,
drivers/peci/sysfs.c - not present in centos-9 and
ignored
	drivers/s390/crypto/ap_bus.c - due to patches
being applied out of order, features_show() is present
in centos-9 well before it was present upstream and
needs to use a const struct bus_type. 10de638d8ea57
is the upstream merge commit that converts it, but that
is a huge and messy merge commit so simplify my life by
just adding the const here.
	drivers/block/rd.c - trivial context differences

commit 75cff725d9566699a670a02b3cfd1c6e9e9ed53e
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date: Thu, 23 Mar 2023 13:20:40 +0000

struct bus_type should never be modified in a sysfs callback as there is
nothing in the structure to modify, and frankly, the structure is almost
never used in a sysfs callback, so mark it as constant to allow struct
bus_type to be moved to read-only memory.

Cc: "David S. Miller" <davem@davemloft.net>
Cc: "James E.J. Bottomley" <jejb@linux.ibm.com>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Alexandre Bounine <alex.bou9@gmail.com>
Cc: Alison Schofield <alison.schofield@intel.com>
Cc: Ben Widawsky <bwidawsk@kernel.org>
Cc: Dexuan Cui <decui@microsoft.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Harald Freudenberger <freude@linux.ibm.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Hu Haowen <src.res@email.cn>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Laurentiu Tudor <laurentiu.tudor@nxp.com>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: Stuart Yoder <stuyoder@gmail.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Cc: Yanteng Si <siyanteng@loongson.cn>
Acked-by: Ilya Dryomov <idryomov@gmail.com> # rbd
Acked-by: Ira Weiny <ira.weiny@intel.com> # cxl
Reviewed-by: Alex Shi <alexs@kernel.org>
Acked-by: Iwona Winiarska <iwona.winiarska@intel.com>
Acked-by: Dan Williams <dan.j.williams@intel.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>	# pci
Acked-by: Wei Liu <wei.liu@kernel.org>
Acked-by: Martin K. Petersen <martin.petersen@oracle.com> # scsi
Link: https://lore.kernel.org/r/20230313182918.1312597-23-gregkh@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Mark Langsdorf <mlangsdo@redhat.com>

squash to bus_type const
2023-11-01 11:12:31 -05:00
Myron Stowe 95885a4440 PCI/sysfs: Fix double free in error path
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166398
Upstream Status: aa382ffa705bea9931ec92b6f3c70e1fdb372195

commit aa382ffa705bea9931ec92b6f3c70e1fdb372195
Author: Sascha Hauer <s.hauer@pengutronix.de>
Date:   Tue Nov 8 17:05:59 2022 -0600

    PCI/sysfs: Fix double free in error path

    When pci_create_attr() fails, pci_remove_resource_files() is called which
    will iterate over the res_attr[_wc] arrays and frees every non NULL entry.
    To avoid a double free here set the array entry only after it's clear we
    successfully initialized it.

    Fixes: b562ec8f74 ("PCI: Don't leak memory if sysfs_create_bin_file() fails")
    Link: https://lore.kernel.org/r/20221007070735.GX986@pengutronix.de/
    Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2023-03-07 07:21:29 -07:00
Myron Stowe 83c89ce688 PCI: Allow drivers to request exclusive config regions
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166398
Upstream Status: 278294798ac9118412c9624a801d3f20f2279363

commit 278294798ac9118412c9624a801d3f20f2279363
Author: Ira Weiny <ira.weiny@intel.com>
Date:   Mon Sep 26 14:57:10 2022 -0700

    PCI: Allow drivers to request exclusive config regions

    PCI config space access from user space has traditionally been
    unrestricted with writes being an understood risk for device operation.

    Unfortunately, device breakage or odd behavior from config writes lacks
    indicators that can leave driver writers confused when evaluating
    failures.  This is especially true with the new PCIe Data Object
    Exchange (DOE) mailbox protocol where backdoor shenanigans from user
    space through things such as vendor defined protocols may affect device
    operation without complete breakage.

    A prior proposal restricted read and writes completely.[1]  Greg and
    Bjorn pointed out that proposal is flawed for a couple of reasons.
    First, lspci should always be allowed and should not interfere with any
    device operation.  Second, setpci is a valuable tool that is sometimes
    necessary and it should not be completely restricted.[2]  Finally
    methods exist for full lock of device access if required.

    Even though access should not be restricted it would be nice for driver
    writers to be able to flag critical parts of the config space such that
    interference from user space can be detected.

    Introduce pci_request_config_region_exclusive() to mark exclusive config
    regions.  Such regions trigger a warning and kernel taint if accessed
    via user space.

    Create pci_warn_once() to restrict the user from spamming the log.

    [1] https://lore.kernel.org/all/161663543465.1867664.5674061943008380442.stgit@dwillia2-desk3.amr.corp.intel.com/
    [2] https://lore.kernel.org/all/YF8NGeGv9vYcMfTV@kroah.com/

    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Suggested-by: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: Ira Weiny <ira.weiny@intel.com>
    Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Link: https://lore.kernel.org/r/20220926215711.2893286-2-ira.weiny@intel.com
    Signed-off-by: Dan Williams <dan.j.williams@intel.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2023-03-07 07:21:26 -07:00
Myron Stowe d5e23c132f PCI: Use driver_set_override() instead of open-coding
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166398
Upstream Status: 23d99baf9d729ca30b2fb6798a7b403a37bfb800

commit 23d99baf9d729ca30b2fb6798a7b403a37bfb800
Author: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Date:   Tue Apr 19 13:34:28 2022 +0200

    PCI: Use driver_set_override() instead of open-coding

    Use a helper to set driver_override to the reduce amount of duplicated
    code.  Make the driver_override field const char, because it is not
    modified by the core and it matches other subsystems.

    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
    Link: https://lore.kernel.org/r/20220419113435.246203-6-krzysztof.kozlowski@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2023-03-07 07:21:24 -07:00
Myron Stowe b1dd6bfbd9 PCI/sysfs: use NUMA_NO_NODE macro
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166398
Upstream Status: cee0ad4a212fde377926d93aa822395167564452

commit cee0ad4a212fde377926d93aa822395167564452
Author: Max Gurtovoy <mgurtovoy@nvidia.com>
Date:   Mon Oct 4 16:34:53 2021 +0300

    PCI/sysfs: use NUMA_NO_NODE macro

    Use the proper macro instead of hard-coded (-1) value.

    Suggested-by: Krzysztof Wilczyński <kw@linux.com>
    Reviewed-by: Krzysztof Wilczyński <kw@linux.com>
    Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
    Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
    Link: https://lore.kernel.org/r/20211004133453.18881-2-mgurtovoy@nvidia.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2023-03-07 07:21:23 -07:00
Myron Stowe 071c7d18c7 sysfs: Rename struct bin_attribute member to f_mapping
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166398
Upstream Status: f06aff924f975881a6abf91d2af0078fc8cd37bf

  Upstream patch based on older code that did not take into account
  045a9277b5 PCI/sysfs: Use correct variable for the legacy_


commit f06aff924f975881a6abf91d2af0078fc8cd37bf
Author: Krzysztof Wilczyński <kw@linux.com>
Date:   Thu Jul 29 23:32:35 2021 +0000

    sysfs: Rename struct bin_attribute member to f_mapping

    There are two users of iomem_get_mapping(), the struct file and struct
    bin_attribute.  The former has a member called "f_mapping" and the
    latter has a member called "mapping", and both are poniters to struct
    address_space.

    Rename struct bin_attribute member to "f_mapping" to keep both meaning
    and the usage consistent with other users of iomem_get_mapping().

    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
    Link: https://lore.kernel.org/r/20210729233235.1508920-3-kw@linux.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2023-03-07 07:21:23 -07:00
Myron Stowe ce6749d21e sysfs: Invoke iomem_get_mapping() from the sysfs open callback
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166398
Upstream Status: 93bb8e352a9136a56dd26762bf54cf6554cfa96c

Conflict(s):
  Upstream patch based on older code that did not take into account
  045a9277b5 PCI/sysfs: Use correct variable for the legacy_


commit 93bb8e352a9136a56dd26762bf54cf6554cfa96c
Author: Krzysztof Wilczyński <kw@linux.com>
Date:   Thu Jul 29 23:32:34 2021 +0000

    sysfs: Invoke iomem_get_mapping() from the sysfs open callback

    Defer invocation of the iomem_get_mapping() to the sysfs open callback
    so that it can be executed as needed when the binary sysfs object has
    been accessed.

    To do that, convert the "mapping" member of the struct bin_attribute
    from a pointer to the struct address_space into a function pointer with
    a signature that requires the same return type, and then updates the
    sysfs_kf_bin_open() to invoke provided function should the function
    pointer be valid.

    Also, convert every invocation of iomem_get_mapping() into a function
    pointer assignment, therefore allowing for the iomem_get_mapping()
    invocation to be deferred to when the sysfs open callback runs.

    Thus, this change removes the need for the fs_initcalls to complete
    before any other sub-system that uses the iomem_get_mapping() would be
    able to invoke it safely without leading to a failure and an Oops
    related to an invalid iomem_get_mapping() access.

    Suggested-by: Dan Williams <dan.j.williams@intel.com>
    Reviewed-by: Dan Williams <dan.j.williams@intel.com>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
    Link: https://lore.kernel.org/r/20210729233235.1508920-2-kw@linux.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2023-03-07 07:21:23 -07:00
Myron Stowe d76ae837b9 PCI/sysfs: Use pci_irq_vector()
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2151246
Upstream Status: 793c5006769d77b8148236bc124b75e391110531

commit 793c5006769d77b8148236bc124b75e391110531
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Mon Dec 6 23:27:36 2021 +0100

    PCI/sysfs: Use pci_irq_vector()

    instead of fiddling with MSI descriptors.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Link: https://lore.kernel.org/r/20211206210224.265589103@linutronix.de

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2023-01-10 09:08:25 -07:00
Myron Stowe 0e2a020270 PCI: Expose PCIe Resizable BAR support via sysfs
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2135902
Upstream Status: 91fa127794ac1c48069479b9d45eb4c7378c0e30

commit 91fa127794ac1c48069479b9d45eb4c7378c0e30
Author: Alex Williamson <alex.williamson@redhat.com>
Date:   Fri Sep 16 14:44:48 2022 -0600

    PCI: Expose PCIe Resizable BAR support via sysfs

    Add a simple sysfs interface to Resizable BAR support, largely for the
    purposes of assigning such devices to a VM through VFIO.  Resizable BARs
    present a difficult feature to expose to a VM through emulation, as
    resizing a BAR is done on the host.  It can fail, and often does, but we
    have no means via emulation of a PCIe REBAR capability to handle the error
    cases.

    A vfio-pci specific ioctl interface is also cumbersome as there are often
    multiple devices within the same bridge aperture and handling them is a
    challenge.  In the interface proposed here, expanding a BAR potentially
    requires such devices to be soft-removed during the resize operation and
    rescanned after, in order for all the necessary resources to be released.
    A pci-sysfs interface is also more universal than a vfio specific
    interface.

    Please see the ABI documentation update for usage.

    Link: https://lore.kernel.org/r/166336088796.3597940.14973499936692558556.stgit@omen
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Cc: Krzysztof Wilczyński <kw@linux.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2022-11-06 09:09:46 -07:00
Myron Stowe 8e3c856f65 PCI: Remove unused assignments
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2068174
Upstream Status: c50762a85da6a95a96a20043ed518264b62b47df

commit c50762a85da6a95a96a20043ed518264b62b47df
Author: Bjorn Helgaas <bhelgaas@google.com>
Date:   Sun Mar 13 14:29:29 2022 -0500

    PCI: Remove unused assignments

    Remove variables and assignments that are never used.

    Found by Krzysztof using cppcheck, e.g.,

      $ cppcheck --enable=all --force
      uselessAssignmentPtrArg drivers/pci/proc.c:102 Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?
      unreadVariable drivers/pci/setup-bus.c:1528 Variable 'old_flags' is assigned a value that is never used.

    Reported-by: Krzysztof Wilczyński <kw@linux.com>
    Link: https://lore.kernel.org/r/20220313192933.434746-2-helgaas@kernel.org
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2022-06-16 10:07:40 -06:00
Myron Stowe f9adf3ed08 PCI/sysfs: Return -EINVAL consistently from "store" functions
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2052155
Upstream Status: 36f354ec7bf92f8aaf09eaf3b261ea06c25ec337

commit 36f354ec7bf92f8aaf09eaf3b261ea06c25ec337
Author: Krzysztof Wilczyński <kw@linux.com>
Date:   Wed Sep 15 23:01:26 2021 +0000

    PCI/sysfs: Return -EINVAL consistently from "store" functions

    Most of the "store" functions that handle userspace input via sysfs return
    -EINVAL should the value fail validation and/or type conversion.  This
    error code is a clear message to userspace that the value is not a valid
    input.

    However, some of the "show" functions return input parsing error codes
    as-is, which may be either -EINVAL or -ERANGE.  The former would often be
    from kstrtobool(), and the latter typically from other kstr*() functions
    such as kstrtou8(), kstrtou32(), kstrtoint(), etc.

    -EINVAL is commonly returned as the error code to indicate that the value
    provided is invalid, but -ERANGE is not very useful in userspace.

    Therefore, normalize the return error code to be -EINVAL for when the
    validation and/or type conversion fails.

    Link: https://lore.kernel.org/r/20210915230127.2495723-2-kw@linux.com
    Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2022-04-12 08:41:30 -06:00
Myron Stowe 656758e649 PCI/sysfs: Check CAP_SYS_ADMIN before parsing user input
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2052155
Upstream Status: 95e83e219d68956ba4fed9326683e4d2bd3e39a9

commit 95e83e219d68956ba4fed9326683e4d2bd3e39a9
Author: Krzysztof Wilczyński <kw@linux.com>
Date:   Wed Sep 15 23:01:25 2021 +0000

    PCI/sysfs: Check CAP_SYS_ADMIN before parsing user input

    Check if the "CAP_SYS_ADMIN" capability flag is set before parsing user
    input as it makes more sense to first check whether the current user
    actually has the right permissions before accepting any input from such
    user.

    This will also make order in which enable_store() and msi_bus_store()
    perform the "CAP_SYS_ADMIN" capability check consistent with other
    PCI-related sysfs objects that first verify whether user has this
    capability set.

    Link: https://lore.kernel.org/r/20210915230127.2495723-1-kw@linux.com
    Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2022-04-12 08:41:30 -06:00
Myron Stowe 0dfe40c0c9 PCI/sysfs: Explicitly show first MSI IRQ for 'irq'
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2052155
Upstream Status: ac8e3cef588c5affc6dfa7b693ec64bbf3cead6a

commit ac8e3cef588c5affc6dfa7b693ec64bbf3cead6a
Author: Barry Song <song.bao.hua@hisilicon.com>
Date:   Wed Aug 25 18:26:35 2021 +0800

    PCI/sysfs: Explicitly show first MSI IRQ for 'irq'

    The sysfs "irq" file contains the legacy INTx IRQ.  Or, if the device has
    MSI enabled, it contains the first MSI IRQ instead.

    Previously this file showed the pci_dev.irq value directly.  But we'd
    prefer to use pci_dev.irq only for the INTx IRQ and decouple that from any
    MSI or MSI-X IRQs.

    If the device has MSI enabled, explicitly look up and show the first MSI
    IRQ in the sysfs "irq" file.  Otherwise, show the INTx IRQ.

    This removes the requirement that msi_capability_init() set pci_dev.irq to
    the first MSI IRQ when enabling MSI and pci_msi_shutdown() restore the INTx
    IRQ when disabling MSI.

    [bhelgaas: commit log]
    Link: https://lore.kernel.org/r/20210825102636.52757-3-21cnbao@gmail.com
    Signed-off-by: Barry Song <song.bao.hua@hisilicon.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2022-04-12 08:40:16 -06:00
Myron Stowe 3f1870c32d PCI: Allow userspace to query and set device reset mechanism
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2039086
Upstream Status: d88f521da3efd698e36d0d504a2abba6ac4f5ef8

commit d88f521da3efd698e36d0d504a2abba6ac4f5ef8
Author: Amey Narkhede <ameynarkhede03@gmail.com>
Date:   Tue Aug 17 23:34:56 2021 +0530

    PCI: Allow userspace to query and set device reset mechanism

    Add "reset_method" sysfs attribute to enable user to query and set
    preferred device reset methods and their ordering.

    [bhelgaas: on invalid sysfs input, return error and preserve previous
    config, as in earlier patch versions]
    Co-developed-by: Alex Williamson <alex.williamson@redhat.com>
    Link: https://lore.kernel.org/r/20210817180500.1253-6-ameynarkhede03@gmail.com
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Amey Narkhede <ameynarkhede03@gmail.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Raphael Norwitz <raphael.norwitz@nutanix.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2022-01-18 15:14:34 -07:00
Myron Stowe 7956677bbe PCI: Remove reset_fn field from pci_dev
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2039086
Upstream Status: 4ec36dfeb155b72da8d28ab006a46f2f8b981eac

commit 4ec36dfeb155b72da8d28ab006a46f2f8b981eac
Author: Amey Narkhede <ameynarkhede03@gmail.com>
Date:   Tue Aug 17 23:34:55 2021 +0530

    PCI: Remove reset_fn field from pci_dev

    "reset_fn" indicates whether the device supports any reset mechanism.
    Remove the use of reset_fn in favor of the reset_methods array that tracks
    supported reset mechanisms of a device and their ordering.

    The octeon driver incorrectly used reset_fn to detect whether the device
    supports FLR or not. Use pcie_reset_flr() to probe whether it supports FLR.

    Co-developed-by: Alex Williamson <alex.williamson@redhat.com>
    Link: https://lore.kernel.org/r/20210817180500.1253-5-ameynarkhede03@gmail.com
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Amey Narkhede <ameynarkhede03@gmail.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Alex Williamson <alex.williamson@redhat.com>
    Reviewed-by: Raphael Norwitz <raphael.norwitz@nutanix.com>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2022-01-18 15:14:32 -07:00
Krzysztof Wilczyński 045a9277b5 PCI/sysfs: Use correct variable for the legacy_mem sysfs object
Two legacy PCI sysfs objects "legacy_io" and "legacy_mem" were updated
to use an unified address space in the commit 636b21b501 ("PCI: Revoke
mappings like devmem").  This allows for revocations to be managed from
a single place when drivers want to take over and mmap() a /dev/mem
range.

Following the update, both of the sysfs objects should leverage the
iomem_get_mapping() function to get an appropriate address range, but
only the "legacy_io" has been correctly updated - the second attribute
seems to be using a wrong variable to pass the iomem_get_mapping()
function to.

Thus, correct the variable name used so that the "legacy_mem" sysfs
object would also correctly call the iomem_get_mapping() function.

Fixes: 636b21b501 ("PCI: Revoke mappings like devmem")
Link: https://lore.kernel.org/r/20210812132144.791268-1-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2021-08-19 10:21:53 -05:00
Krzysztof Wilczyński 14c19b2a40 PCI/sysfs: Add 'devspec' newline
Previously, when the value of the "devspec" sysfs attribute was read from
the user space there was no newline present, and utilities such as "cat"
wouldn't display the result of the read correctly.

Append a newline character in the show() function to match other "devspec"
attributes.

Link: https://lore.kernel.org/r/20210603000112.703037-5-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
2021-06-04 09:21:07 -05:00
Linus Torvalds 57151b502c pci-v5.13-changes
-----BEGIN PGP SIGNATURE-----
 
 iQJIBAABCgAyFiEEgMe7l+5h9hnxdsnuWYigwDrT+vwFAmCRp48UHGJoZWxnYWFz
 QGdvb2dsZS5jb20ACgkQWYigwDrT+vwsVRAAsIYueNKzZczpkeQwHigYzf4HLdKm
 yyT2c/Zlj9REAUOe7ApkowVAJWiMGDJP0J361KIluAGvAxnkMP1V6WlVdByorYd0
 CrXc/UhD//cs+3QDo4SmJRHyL8q5QQTDa8Z/8seVJUYTR/t5OhSpMOuEJPhpeQ1s
 nqUk0yWNJRoN6wn6T/7KqgYEvPhARXo9epuWy5MNPZ5f8E7SRi/QG/6hP8/YOLpK
 A+8beIOX5LAvUJaXxEovwv5UQnSUkeZTGDyRietQYE6xXNeHPKCvZ7vDjjSE7NOW
 mIodD6JcG3n/riYV3sMA5PKDZgsPI3P/qJU6Y6vWBBYOaO/kQX/c7CZ+M2bcZay4
 mh1dW0vOqoTy/pAVwQB2aq08Rrg2SAskpNdeyzduXllmuTyuwCMPXzG4RKmbQ8I1
 qMFb8qOyNulRAWcTKgSMKByEQYASQsFA5yShtaba6h0+vqrseuP6hchBKKOEan8F
 9THTI3ZflKwRvGjkI0MDbp0z0+wPYmNhrcZDpAJ3bEltw58E8TL/9aBtuhajmo8+
 wJ64mZclFuMmSyhsfkAXOvjeKXMlEBaw7vinZGbcACmv4ZGI0MV7r4vVYQbQltcy
 myzB6xJxcWB8N07UpKpUbsGMb9JjTUPlaT36eZNvUZQDntrE1ljt8RSq3nphDrcD
 KmBRU8ru74I2RE0=
 =WvTD
 -----END PGP SIGNATURE-----

Merge tag 'pci-v5.13-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci

Pull pci updates from Bjorn Helgaas:
 "Enumeration:
   - Release OF node when pci_scan_device() fails (Dmitry Baryshkov)
   - Add pci_disable_parity() (Bjorn Helgaas)
   - Disable Mellanox Tavor parity reporting (Heiner Kallweit)
   - Disable N2100 r8169 parity reporting (Heiner Kallweit)
   - Fix RCiEP device to RCEC association (Qiuxu Zhuo)
   - Convert sysfs "config", "rom", "reset", "label", "index",
     "acpi_index" to static attributes to help fix races in device
     enumeration (Krzysztof Wilczyński)
   - Convert sysfs "vpd" to static attribute (Heiner Kallweit, Krzysztof
     Wilczyński)
   - Use sysfs_emit() in "show" functions (Krzysztof Wilczyński)
   - Remove unused alloc_pci_root_info() return value (Krzysztof
     Wilczyński)

  PCI device hotplug:
   - Fix acpiphp reference count leak (Feilong Lin)

  Power management:
   - Fix acpi_pci_set_power_state() debug message (Rafael J. Wysocki)
   - Fix runtime PM imbalance (Dinghao Liu)

  Virtualization:
   - Increase delay after FLR to work around Intel DC P4510 NVMe erratum
     (Raphael Norwitz)

  MSI:
   - Convert rcar, tegra, xilinx to MSI domains (Marc Zyngier)
   - For rcar, xilinx, use controller address as MSI doorbell (Marc
     Zyngier)
   - Remove unused hv msi_controller struct (Marc Zyngier)
   - Remove unused PCI core msi_controller support (Marc Zyngier)
   - Remove struct msi_controller altogether (Marc Zyngier)
   - Remove unused default_teardown_msi_irqs() (Marc Zyngier)
   - Let host bridges declare their reliance on MSI domains (Marc
     Zyngier)
   - Make pci_host_common_probe() declare its reliance on MSI domains
     (Marc Zyngier)
   - Advertise mediatek lack of built-in MSI handling (Thomas Gleixner)
   - Document ways of ending up with NO_MSI (Marc Zyngier)
   - Refactor HT advertising of NO_MSI flag (Marc Zyngier)

  VPD:
   - Remove obsolete Broadcom NIC VPD length-limiting quirk (Heiner
     Kallweit)
   - Remove sysfs VPD size checking dead code (Heiner Kallweit)
   - Convert VPF sysfs file to static attribute (Heiner Kallweit)
   - Remove unnecessary pci_set_vpd_size() (Heiner Kallweit)
   - Tone down "missing VPD" message (Heiner Kallweit)

  Endpoint framework:
   - Fix NULL pointer dereference when epc_features not implemented
     (Shradha Todi)
   - Add missing destroy_workqueue() in endpoint test (Yang Yingliang)

  Amazon Annapurna Labs PCIe controller driver:
   - Fix compile testing without CONFIG_PCI_ECAM (Arnd Bergmann)
   - Fix "no symbols" warnings when compile testing with
     CONFIG_TRIM_UNUSED_KSYMS (Arnd Bergmann)

  APM X-Gene PCIe controller driver:
   - Fix cfg resource mapping regression (Dejin Zheng)

  Broadcom iProc PCIe controller driver:
   - Return zero for success of iproc_msi_irq_domain_alloc() (Pali
     Rohár)

  Broadcom STB PCIe controller driver:
   - Add reset_control_rearm() stub for !CONFIG_RESET_CONTROLLER (Jim
     Quinlan)
   - Fix use of BCM7216 reset controller (Jim Quinlan)
   - Use reset/rearm for Broadcom STB pulse reset instead of
     deassert/assert (Jim Quinlan)
   - Fix brcm_pcie_probe() error return for unsupported revision (Wei
     Yongjun)

  Cavium ThunderX PCIe controller driver:
   - Fix compile testing (Arnd Bergmann)
   - Fix "no symbols" warnings when compile testing with
     CONFIG_TRIM_UNUSED_KSYMS (Arnd Bergmann)

  Freescale Layerscape PCIe controller driver:
   - Fix ls_pcie_ep_probe() syntax error (comma for semicolon)
     (Krzysztof Wilczyński)
   - Remove layerscape-gen4 dependencies on OF and ARM64, add dependency
     on ARCH_LAYERSCAPE (Geert Uytterhoeven)

  HiSilicon HIP PCIe controller driver:
   - Remove obsolete HiSilicon PCIe DT description (Dongdong Liu)

  Intel Gateway PCIe controller driver:
   - Remove unused pcie_app_rd() (Jiapeng Chong)

  Intel VMD host bridge driver:
   - Program IRTE with Requester ID of VMD endpoint, not child device
     (Jon Derrick)
   - Disable VMD MSI-X remapping when possible so children can use more
     MSI-X vectors (Jon Derrick)

  MediaTek PCIe controller driver:
   - Configure FC and FTS for functions other than 0 (Ryder Lee)
   - Add YAML schema for MediaTek (Jianjun Wang)
   - Export pci_pio_to_address() for module use (Jianjun Wang)
   - Add MediaTek MT8192 PCIe controller driver (Jianjun Wang)
   - Add MediaTek MT8192 INTx support (Jianjun Wang)
   - Add MediaTek MT8192 MSI support (Jianjun Wang)
   - Add MediaTek MT8192 system power management support (Jianjun Wang)
   - Add missing MODULE_DEVICE_TABLE (Qiheng Lin)

  Microchip PolarFlare PCIe controller driver:
   - Make several symbols static (Wei Yongjun)

  NVIDIA Tegra PCIe controller driver:
   - Add MCFG quirks for Tegra194 ECAM errata (Vidya Sagar)
   - Make several symbols const (Rikard Falkeborn)
   - Fix Kconfig host/endpoint typo (Wesley Sheng)

  SiFive FU740 PCIe controller driver:
   - Add pcie_aux clock to prci driver (Greentime Hu)
   - Use reset-simple in prci driver for PCIe (Greentime Hu)
   - Add SiFive FU740 PCIe host controller driver and DT binding (Paul
     Walmsley, Greentime Hu)

  Synopsys DesignWare PCIe controller driver:
   - Move MSI Receiver init to dw_pcie_host_init() so it is
     re-initialized along with the RC in resume (Jisheng Zhang)
   - Move iATU detection earlier to fix regression (Hou Zhiqiang)

  TI J721E PCIe driver:
   - Add DT binding and TI j721e support for refclk to PCIe connector
     (Kishon Vijay Abraham I)
   - Add host mode and endpoint mode DT bindings for TI AM64 SoC (Kishon
     Vijay Abraham I)

  TI Keystone PCIe controller driver:
   - Use generic config accessors for TI AM65x (K3) to fix regression
     (Kishon Vijay Abraham I)

  Xilinx NWL PCIe controller driver:
   - Add support for coherent PCIe DMA traffic using CCI (Bharat Kumar
     Gogada)
   - Add optional "dma-coherent" DT property (Bharat Kumar Gogada)

  Miscellaneous:
   - Fix kernel-doc warnings (Krzysztof Wilczyński)
   - Remove unused MicroGate SyncLink device IDs (Jiri Slaby)
   - Remove redundant dev_err() for devm_ioremap_resource() failure
     (Chen Hui)
   - Remove redundant initialization (Colin Ian King)
   - Drop redundant dev_err() for platform_get_irq() errors (Krzysztof
     Wilczyński)"

* tag 'pci-v5.13-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (98 commits)
  riscv: dts: Add PCIe support for the SiFive FU740-C000 SoC
  PCI: fu740: Add SiFive FU740 PCIe host controller driver
  dt-bindings: PCI: Add SiFive FU740 PCIe host controller
  MAINTAINERS: Add maintainers for SiFive FU740 PCIe driver
  clk: sifive: Use reset-simple in prci driver for PCIe driver
  clk: sifive: Add pcie_aux clock in prci driver for PCIe driver
  PCI: brcmstb: Use reset/rearm instead of deassert/assert
  ata: ahci_brcm: Fix use of BCM7216 reset controller
  reset: add missing empty function reset_control_rearm()
  PCI: Allow VPD access for QLogic ISP2722
  PCI/VPD: Add helper pci_get_func0_dev()
  PCI/VPD: Remove pci_vpd_find_tag() SRDT handling
  PCI/VPD: Remove pci_vpd_find_tag() 'offset' argument
  PCI/VPD: Change pci_vpd_init() return type to void
  PCI/VPD: Make missing VPD message less alarming
  PCI/VPD: Remove pci_set_vpd_size()
  x86/PCI: Remove unused alloc_pci_root_info() return value
  MAINTAINERS: Add Jianjun Wang as MediaTek PCI co-maintainer
  PCI: mediatek-gen3: Add system PM support
  PCI: mediatek-gen3: Add MSI support
  ...
2021-05-05 13:24:11 -07:00
Krzysztof Wilczyński ad025f8e46 PCI/sysfs: Use sysfs_emit() and sysfs_emit_at() in "show" functions
The sysfs_emit() and sysfs_emit_at() functions were introduced to make it
less ambiguous which function is preferred when writing to the output
buffer in a device attribute's "show" callback [1].

Convert the PCI sysfs object "show" functions from sprintf(), snprintf()
and scnprintf() to sysfs_emit() and sysfs_emit_at() accordingly, as the
latter is aware of the PAGE_SIZE buffer and correctly returns the number of
bytes written into the buffer.

No functional change intended.

[1] Documentation/filesystems/sysfs.rst

[bhelgaas: drop dsm_label_utf16s_to_utf8s(), link speed/width changes]
Link: https://lore.kernel.org/r/20210416205856.3234481-10-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2021-04-29 10:07:31 -05:00
Krzysztof Wilczyński 506140f9c0 PCI/sysfs: Convert "index", "acpi_index", "label" to static attributes
The "label", "index", and "acpi_index" sysfs attributes show firmware label
information about the device.  If the ACPI Device Name _DSM is implemented
for the device, we have:

  label        Device name (optional, may be null)
  acpi_index   Instance number (unique under \_SB scope)

When there is no ACPI _DSM and SMBIOS provides an Onboard Devices structure
for the device, we have:

  label        Reference Designation, e.g., a silkscreen label
  index        Device Type Instance

Previously these attributes were dynamically created either by
pci_bus_add_device() or the pci_sysfs_init() initcall, but since they don't
need to be created or removed dynamically, we can use a static attribute so
the device model takes care of addition and removal automatically.

Convert "label", "index", and "acpi_index" to static attributes.

Presence of the ACPI _DSM (device_has_acpi_name()) determines whether the
ACPI information (label, acpi_index) or the SMBIOS information (label,
index) is visible.

[bhelgaas: commit log, split to separate patch, add "pci_dev_" prefix]
Suggested-by: Oliver O'Halloran <oohall@gmail.com>
Link: https://lore.kernel.org/r/20210416205856.3234481-6-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2021-04-29 10:07:31 -05:00
Krzysztof Wilczyński d93f839905 PCI/sysfs: Convert "vpd" to static attribute
The "vpd" sysfs attribute allows access to Vital Product Data (VPD).
Previously it was dynamically created either by pci_bus_add_device() or the
pci_sysfs_init() initcall, but since it doesn't need to be created or
removed dynamically, we can use a static attribute so the device model
takes care of addition and removal automatically.

Convert "vpd" to a static attribute and use the .is_bin_visible() callback
to check whether the device supports VPD.

Remove pcie_vpd_create_sysfs_dev_files(),
pcie_vpd_remove_sysfs_dev_files(), pci_create_capabilities_sysfs(), and
pci_create_capabilities_sysfs(), which are no longer needed.

[bhelgaas: This is substantially the same as the earlier patch from Heiner
Kallweit <hkallweit1@gmail.com>.  I included Krzysztof's change here so all
the "convert to static attribute" changes are together.]

[bhelgaas: rename to vpd_read()/vpd_write() and pci_dev_vpd_attr_group]
Suggested-by: Oliver O'Halloran <oohall@gmail.com>
Based-on: https://lore.kernel.org/r/7703024f-8882-9eec-a122-599871728a89@gmail.com
Based-on-patch-by: Heiner Kallweit <hkallweit1@gmail.com>
Link: https://lore.kernel.org/r/20210416205856.3234481-5-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2021-04-29 10:07:31 -05:00
Krzysztof Wilczyński f42c35ea3b PCI/sysfs: Convert "reset" to static attribute
The "reset" sysfs attribute allows for resetting a PCI function.
Previously it was dynamically created either by pci_bus_add_device() or
the pci_sysfs_init() initcall, but since it doesn't need to be created or
removed dynamically, we can use a static attribute so the device model
takes care of addition and removal automatically.

Convert "reset" to a static attribute and use the .is_visible() callback to
check whether the device supports reset.

Clear reset_fn in pci_stop_dev() instead of pci_remove_capabilities_sysfs()
since we no longer explicitly remove the "reset" sysfs file.

[bhelgaas: commit log]
Suggested-by: Oliver O'Halloran <oohall@gmail.com>
Link: https://lore.kernel.org/r/20210416205856.3234481-4-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2021-04-27 17:53:20 -05:00
Krzysztof Wilczyński 527139d738 PCI/sysfs: Convert "rom" to static attribute
The "rom" sysfs attribute allows access to the PCI Option ROM.  Previously
it was dynamically created either by pci_bus_add_device() or the
pci_sysfs_init() initcall, but since it doesn't need to be created or
removed dynamically, we can use a static attribute so the device model
takes care of addition and removal automatically.

Convert "rom" to a static attribute and use the .is_bin_visible() callback
to set the correct object size based on the ROM size.

Remove "rom_attr" from the struct pci_dev since it is no longer needed.

This attribute was added in the pre-git era by https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git/commit/drivers/pci/pci-sysfs.c?id=f6d553444da2

[bhelgaas: commit log]
Suggested-by: Oliver O'Halloran <oohall@gmail.com>
Link: https://lore.kernel.org/r/20210416205856.3234481-3-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2021-04-27 17:53:17 -05:00
Krzysztof Wilczyński e1d3f3268b PCI/sysfs: Convert "config" to static attribute
The "config" sysfs attribute allows access to either the legacy (PCI and
PCI-X Mode 1) or the extended (PCI-X Mode 2 and PCIe) device configuration
space.  Previously it was dynamically created either when a device was
added (for hot-added devices) or via a late_initcall (for devices present
at boot):

  pci_bus_add_devices
    pci_bus_add_device
      pci_create_sysfs_dev_files
        if (!sysfs_initialized)
	  return
	sysfs_create_bin_file           # for hot-added devices

  pci_sysfs_init                        # late_initcall
    sysfs_initialized = 1
    for_each_pci_dev(pdev)
      pci_create_sysfs_dev_files(pdev)  # for devices present at boot

And dynamically removed when the PCI device is stopped and removed:

  pci_stop_bus_device
    pci_stop_dev
      pci_remove_sysfs_dev_files
        sysfs_remove_bin_file

This attribute does not need to be created or removed dynamically, so we
can use a static attribute so the device model takes care of addition and
removal automatically.

Convert "config" to a static attribute and use the .is_bin_visible()
callback to set the correct object size (either 256 bytes or 4 KiB) at
runtime.

The pci_sysfs_init() scheme was added in the pre-git era by
https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git/commit/drivers/pci/pci-sysfs.c?id=f6d553444da2

[bhelgaas: commit log]
Suggested-by: Oliver O'Halloran <oohall@gmail.com>
Link: https://lore.kernel.org/r/CAOSf1CHss03DBSDO4PmTtMp0tCEu5kScn704ZEwLKGXQzBfqaA@mail.gmail.com
Link: https://lore.kernel.org/r/20210416205856.3234481-2-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2021-04-27 17:53:13 -05:00
Leon Romanovsky c3d5c2d96d PCI/IOV: Add sysfs MSI-X vector assignment interface
A typical cloud provider SR-IOV use case is to create many VFs for use by
guest VMs. The VFs may not be assigned to a VM until a customer requests a
VM of a certain size, e.g., number of CPUs. A VF may need MSI-X vectors
proportional to the number of CPUs in the VM, but there is no standard way
to change the number of MSI-X vectors supported by a VF.

Some Mellanox ConnectX devices support dynamic assignment of MSI-X vectors
to SR-IOV VFs. This can be done by the PF driver after VFs are enabled,
and it can be done without affecting VFs that are already in use. The
hardware supports a limited pool of MSI-X vectors that can be assigned to
the PF or to individual VFs.  This is device-specific behavior that
requires support in the PF driver.

Add a read-only "sriov_vf_total_msix" sysfs file for the PF and a writable
"sriov_vf_msix_count" file for each VF. Management software may use these
to learn how many MSI-X vectors are available and to dynamically assign
them to VFs before the VFs are passed through to a VM.

If the PF driver implements the ->sriov_get_vf_total_msix() callback,
"sriov_vf_total_msix" contains the total number of MSI-X vectors available
for distribution among VFs.

If no driver is bound to the VF, writing "N" to "sriov_vf_msix_count" uses
the PF driver ->sriov_set_msix_vec_count() callback to assign "N" MSI-X
vectors to the VF.  When a VF driver subsequently reads the MSI-X Message
Control register, it will see the new Table Size "N".

Link: https://lore.kernel.org/linux-pci/20210314124256.70253-2-leon@kernel.org
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
2021-04-04 10:26:30 +03:00
Daniel Vetter 636b21b501 PCI: Revoke mappings like devmem
Since 3234ac664a ("/dev/mem: Revoke mappings when a driver claims
the region") /dev/kmem zaps PTEs when the kernel requests exclusive
acccess to an iomem region. And with CONFIG_IO_STRICT_DEVMEM, this is
the default for all driver uses.

Except there are two more ways to access PCI BARs: sysfs and proc mmap
support. Let's plug that hole.

For revoke_devmem() to work we need to link our vma into the same
address_space, with consistent vma->vm_pgoff. ->pgoff is already
adjusted, because that's how (io_)remap_pfn_range works, but for the
mapping we need to adjust vma->vm_file->f_mapping. The cleanest way is
to adjust this at at ->open time:

- for sysfs this is easy, now that binary attributes support this. We
  just set bin_attr->mapping when mmap is supported
- for procfs it's a bit more tricky, since procfs PCI access has only
  one file per device, and access to a specific resource first needs
  to be set up with some ioctl calls. But mmap is only supported for
  the same resources as sysfs exposes with mmap support, and otherwise
  rejected, so we can set the mapping unconditionally at open time
  without harm.

A special consideration is for arch_can_pci_mmap_io() - we need to
make sure that the ->f_mapping doesn't alias between ioport and iomem
space. There are only 2 ways in-tree to support mmap of ioports: generic
PCI mmap (ARCH_GENERIC_PCI_MMAP_RESOURCE), and sparc as the single
architecture hand-rolling. Both approaches support ioport mmap through a
special PFN range and not through magic PTE attributes. Aliasing is
therefore not a problem.

The only difference in access checks left is that sysfs PCI mmap does
not check for CAP_RAWIO. I'm not really sure whether that should be
added or not.

Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Kees Cook <keescook@chromium.org>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Jérôme Glisse <jglisse@redhat.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-mm@kvack.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-samsung-soc@vger.kernel.org
Cc: linux-media@vger.kernel.org
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: linux-pci@vger.kernel.org
Link: https://patchwork.freedesktop.org/patch/msgid/20210204165831.2703772-3-daniel.vetter@ffwll.ch
2021-02-11 15:59:19 +01:00
Daniel Vetter efd532a679 PCI: Also set up legacy files only after sysfs init
We are already doing this for all the regular sysfs files on PCI
devices, but not yet on the legacy io files on the PCI buses. Thus far
no problem, but in the next patch I want to wire up iomem revoke
support. That needs the vfs up and running already to make sure that
iomem_get_mapping() works.

Wire it up exactly like the existing code in
pci_create_sysfs_dev_files(). Note that pci_remove_legacy_files()
doesn't need a check since the one for pci_bus->legacy_io is
sufficient.

An alternative solution would be to implement a callback in sysfs to
set up the address space from iomem_get_mapping() when userspace calls
mmap(). This also works, but Greg didn't really like that just to work
around an ordering issue when the kernel loads initially.

v2: Improve commit message (Bjorn)

Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Kees Cook <keescook@chromium.org>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Jérôme Glisse <jglisse@redhat.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-mm@kvack.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-samsung-soc@vger.kernel.org
Cc: linux-media@vger.kernel.org
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: linux-pci@vger.kernel.org
Link: https://patchwork.freedesktop.org/patch/msgid/20210205133632.2827730-1-daniel.vetter@ffwll.ch
2021-02-11 15:58:54 +01:00
Maximilian Luz 80a129afb7 PCI: Add sysfs attribute for device power state
While PCI power states D0-D3hot can be queried from user-space via lspci,
D3cold cannot.  lspci cannot provide an accurate value when the device is
in D3cold as it has to restore the device to D0 before it can access its
power state via the configuration space, leading to it reporting D0 or
another on-state. Thus lspci cannot be used to diagnose power consumption
issues for devices that can enter D3cold or to ensure that devices properly
enter D3cold at all.

Add a new sysfs device attribute for the PCI power state, showing the
current power state as seen by the kernel.

[bhelgaas: drop READ_ONCE(), see discussion at the link]
Link: https://lore.kernel.org/r/20201102141520.831630-1-luzmaximilian@gmail.com
Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2020-12-04 16:45:17 -06:00
Bjorn Helgaas 8b28a3f346 Merge branch 'pci/misc'
- Remove unnecessary #includes (Gustavo Pimentel)

- Fix intel_mid_pci.c build error when !CONFIG_ACPI (Randy Dunlap)

- Use scnprintf(), not snprintf(), in sysfs "show" functions (Krzysztof
  Wilczyński)

- Simplify pci-pf-stub by using module_pci_driver() (Liu Shixin)

- Print IRQ used by Link Bandwidth Notification (Dongdong Liu)

- Update sysfs mmap-related #ifdef comments (Clint Sbisa)

- Simplify pci_dev_reset_slot_function() (Lukas Wunner)

- Use "NULL" instead of "0" to fix sparse warnings (Gustavo Pimentel)

- Simplify bool comparisons (Krzysztof Wilczyński)

- Drop double zeroing for P2PDMA sg_init_table() (Julia Lawall)

* pci/misc:
  PCI: v3-semi: Remove unneeded break
  PCI/P2PDMA: Drop double zeroing for sg_init_table()
  PCI: Simplify bool comparisons
  PCI: endpoint: Use "NULL" instead of "0" as a NULL pointer
  PCI: Simplify pci_dev_reset_slot_function()
  PCI: Update mmap-related #ifdef comments
  PCI/LINK: Print IRQ number used by port
  PCI/IOV: Simplify pci-pf-stub with module_pci_driver()
  PCI: Use scnprintf(), not snprintf(), in sysfs "show" functions
  x86/PCI: Fix intel_mid_pci.c build error when ACPI is not enabled
  PCI: Remove unnecessary header includes
2020-10-21 09:58:36 -05:00
Clint Sbisa 8c46d543aa PCI: Update mmap-related #ifdef comments
f719582435 ("PCI: Add pci_mmap_resource_range() and use it for ARM64")
changed the #ifdef condition around pci_create_resource_files(),
pci_remove_resource_files(), and related functions, but did not update
comments at the #else and #ifdef.

Update the comments to match the #ifdef.

[bhelgaas: commit log, drop #endif comment since it's close to the #else]
Link: https://lore.kernel.org/r/20200821155121.nzxjeeoze4h5pone@amazon.com
Signed-off-by: Clint Sbisa <csbisa@amazon.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2020-09-17 12:40:25 -05:00
Jiang Biao 2ce02a864a PCI: Add schedule point in pci_read_config()
The PCI sysfs "config" file allows large reads, and the resulting PCI
config reads can take several milliseconds to complete.  Testing with the
cyclictest [1] benchmark showed 5ms+ latencies.

Add a schedule point in pci_read_config() to reduce the maximum latency.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git/

[bhelgaas: commit log]
Link: https://lore.kernel.org/r/20200824052025.48362-1-benbjiang@tencent.com
Reported-by: Bin Lai <robinlai@tencent.com>
Signed-off-by: Jiang Biao <benbjiang@tencent.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2020-09-17 12:21:46 -05:00
Krzysztof Wilczyński e7a7499d84 PCI: Use scnprintf(), not snprintf(), in sysfs "show" functions
Sysfs "show" methods should return the number of bytes printed into the
buffer.  This is the return value of scnprintf() [1].

snprintf(buf, size, ...) prints at most "size" bytes into "buf", but
returns the number of bytes that *would* be printed if "buf" were large
enough.

Replace use of snprintf() with scnprintf().  No functional change intended.

Related:
  https://patchwork.kernel.org/patch/9946759/#20969333
  https://lwn.net/Articles/69419

[1] Documentation/filesystems/sysfs.rst

[bhelgaas: squashed, commit log]
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20200824233918.26306-2-kw@linux.com
Link: https://lore.kernel.org/r/20200824233918.26306-3-kw@linux.com
Link: https://lore.kernel.org/r/20200824233918.26306-4-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2020-09-01 14:04:55 -05:00
Bjorn Helgaas 10e8141baa Merge branch 'pci/misc'
- Move _HPX type array from stack to static data (Colin Ian King)

  - Avoid an ASMedia XHCI USB PME# defect; apparently it doesn't assert
    PME# when USB3.0 devices are hotplugged in D0 (Kai-Heng Feng)

  - Revert sysfs "rescan" file renames that broke an application (Kelsey
    Skunberg)

* pci/misc:
  PCI: sysfs: Revert "rescan" file renames
  PCI: Avoid ASMedia XHCI USB PME# from D0 defect
  PCI/ACPI: Move pcie_to_hpx3_type[] from stack to static data
2020-04-02 14:26:38 -05:00
Kelsey Skunberg bd641fd830 PCI: sysfs: Revert "rescan" file renames
We changed these sysfs filenames:

  .../pci_bus/<domain:bus>/rescan  ->  .../pci_bus/<domain:bus>/bus_rescan
  .../<domain🚌dev.fn>/rescan   ->  .../<domain🚌dev.fn>/dev_rescan

and Ruslan reported [1] that this broke a userspace application.

Revert these name changes so both files are named "rescan" again.

Note that we have to use __ATTR() to assign custom C symbols, i.e.,
"struct device_attribute <symbol>".

[1] https://lore.kernel.org/r/CAB=otbSYozS-ZfxB0nCiNnxcbqxwrHOSYxJJtDKa63KzXbXgpw@mail.gmail.com

[bhelgaas: commit log, use __ATTR() both places so we don't have to rename
the attributes]
Fixes: 8bdfa145f5 ("PCI: sysfs: Define device attributes with DEVICE_ATTR*()")
Fixes: 4e2b79436e ("PCI: sysfs: Change DEVICE_ATTR() to DEVICE_ATTR_WO()")
Link: https://lore.kernel.org/r/20200325151708.32612-1-skunberg.kelsey@gmail.com
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: stable@vger.kernel.org	# v5.4+
2020-03-30 10:01:48 -05:00
Bjorn Helgaas 6348a34dcb PCI: Use pci_speed_string() for all PCI/PCI-X/PCIe strings
Previously some PCI speed strings came from pci_speed_string(), some came
from the PCIe-specific PCIE_SPEED2STR(), and some came from a PCIe-specific
switch statement.  These methods were inconsistent:

  pci_speed_string()     PCIE_SPEED2STR()     switch
  ------------------     ----------------     ------
  33 MHz PCI
  ...
  2.5 GT/s PCIe          2.5 GT/s             2.5 GT/s
  5.0 GT/s PCIe          5 GT/s               5 GT/s
  8.0 GT/s PCIe          8 GT/s               8 GT/s
  16.0 GT/s PCIe         16 GT/s              16 GT/s
  32.0 GT/s PCIe         32 GT/s              32 GT/s

Standardize on pci_speed_string() as the single source of these strings.

Note that this adds ".0" and "PCIe" to some messages, including sysfs
"max_link_speed" files, a brcmstb "link up" message, and the link status
dmesg logging, e.g.,

  nvme 0000:01:00.0: 16.000 Gb/s available PCIe bandwidth, limited by 5.0 GT/s PCIe x4 link at 0000:00:01.1 (capable of 31.504 Gb/s with 8.0 GT/s PCIe x4 link)

I think it's better to standardize on a single version of the speed text.
Previously we had strings like this:

  /sys/bus/pci/slots/0/cur_bus_speed: 8.0 GT/s PCIe
  /sys/bus/pci/slots/0/max_bus_speed: 8.0 GT/s PCIe
  /sys/devices/pci0000:00/0000:00:1c.0/current_link_speed: 8 GT/s
  /sys/devices/pci0000:00/0000:00:1c.0/max_link_speed: 8 GT/s

This changes the latter two to match the slots files:

  /sys/devices/pci0000:00/0000:00:1c.0/current_link_speed: 8.0 GT/s PCIe
  /sys/devices/pci0000:00/0000:00:1c.0/max_link_speed: 8.0 GT/s PCIe

Based-on-patch by: Yicong Yang <yangyicong@hisilicon.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2020-03-10 14:06:20 -05:00
Bjorn Helgaas 774800cb09 Merge branch 'pci/resource'
- Protect pci_reassign_bridge_resources() against concurrent
    addition/removal (Benjamin Herrenschmidt)

  - Fix bridge dma_ranges resource list cleanup (Rob Herring)

  - Add PCI_STD_NUM_BARS for the number of standard BARs (Denis Efremov)

  - Add "pci=hpmmiosize" and "pci=hpmmioprefsize" parameters to control the
    MMIO and prefetchable MMIO window sizes of hotplug bridges
    independently (Nicholas Johnson)

  - Fix MMIO/MMIO_PREF window assignment that assigned more space than
    desired (Nicholas Johnson)

  - Only enforce bus numbers from bridge EA if the bridge has EA devices
    downstream (Subbaraya Sundeep)

* pci/resource:
  PCI: Do not use bus number zero from EA capability
  PCI: Avoid double hpmemsize MMIO window assignment
  PCI: Add "pci=hpmmiosize" and "pci=hpmmioprefsize" parameters
  PCI: Add PCI_STD_NUM_BARS for the number of standard BARs
  PCI: Fix missing bridge dma_ranges resource list cleanup
  PCI: Protect pci_reassign_bridge_resources() against concurrent addition/removal
2019-11-28 08:54:36 -06:00
Bjorn Helgaas e87eb585d3 Merge branch 'pci/misc'
- Add NumaChip SPDX header (Krzysztof Wilczynski)

  - Replace EXTRA_CFLAGS with ccflags-y (Krzysztof Wilczynski)

  - Remove unused includes (Krzysztof Wilczynski)

  - Avoid AMD FCH XHCI USB PME# from D0 defect that prevents wakeup on USB
    2.0 or 1.1 connect events (Kai-Heng Feng)

  - Removed unused sysfs attribute groups (Ben Dooks)

  - Remove PTM and ASPM dependencies on PCIEPORTBUS (Bjorn Helgaas)

  - Add PCIe Link Control 2 register field definitions to replace magic
    numbers in AMDGPU and Radeon CIK/SI (Bjorn Helgaas)

  - Fix incorrect Link Control 2 Transmit Margin usage in AMDGPU and Radeon
    CIK/SI PCIe Gen3 link training (Bjorn Helgaas)

  - Use pcie_capability_read_word() instead of pci_read_config_word() in
    AMDGPU and Radeon CIK/SI (Frederick Lawler)

* pci/misc:
  drm/radeon: Prefer pcie_capability_read_word()
  drm/radeon: Replace numbers with PCI_EXP_LNKCTL2 definitions
  drm/radeon: Correct Transmit Margin masks
  drm/amdgpu: Prefer pcie_capability_read_word()
  drm/amdgpu: Replace numbers with PCI_EXP_LNKCTL2 definitions
  drm/amdgpu: Correct Transmit Margin masks
  PCI: Add #defines for Enter Compliance, Transmit Margin
  PCI: Allow building PCIe things without PCIEPORTBUS
  PCI: Remove PCIe Kconfig dependencies on PCI
  PCI/ASPM: Remove dependency on PCIEPORTBUS
  PCI/PTM: Remove dependency on PCIEPORTBUS
  PCI/PTM: Remove spurious "d" from granularity message
  PCI: sysfs: Remove unused attribute groups
  x86/PCI: Avoid AMD FCH XHCI USB PME# from D0 defect
  PCI: Remove unused includes and superfluous struct declaration
  x86/PCI: Replace deprecated EXTRA_CFLAGS with ccflags-y
  x86/PCI: Correct SPDX comment style
  x86/PCI: Add NumaChip SPDX GPL-2.0 to replace COPYING boilerplate
2019-11-28 08:54:32 -06:00
Heiner Kallweit 87e90283c9 PCI/ASPM: Remove PCIEASPM_DEBUG Kconfig option and related code
Previously, CONFIG_PCIEASPM_DEBUG enabled "link_state" and "clk_ctl" sysfs
files that controlled ASPM.  We believe these files were rarely if ever
used.

We recently added sysfs ASPM controls that are always present, so the debug
code is no longer needed.  Removing this debug code has been discussed for
quite some time, see e.g. [0].

Remove PCIEASPM_DEBUG and the related code.

[0] https://lore.kernel.org/lkml/20180727202619.GD173328@bhelgaas-glaptop.roam.corp.google.com/
Link: https://lore.kernel.org/r/ec935d8e-c084-3938-f1d1-748617596b25@gmail.com
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2019-11-21 17:31:46 -06:00
Heiner Kallweit 72ea91afbf PCI/ASPM: Add sysfs attributes for controlling ASPM link states
Add sysfs attributes to Endpoints and other Upstream Ports to control ASPM,
Clock PM, and L1 PM Substates.  The new attributes are:

  /sys/devices/pci*/.../link/clkpm
  /sys/devices/pci*/.../link/l0s_aspm
  /sys/devices/pci*/.../link/l1_aspm
  /sys/devices/pci*/.../link/l1_1_aspm
  /sys/devices/pci*/.../link/l1_2_aspm
  /sys/devices/pci*/.../link/l1_1_pcipm
  /sys/devices/pci*/.../link/l1_2_pcipm

An attribute is only visible if both ends of the Link leading to the device
support the state.  Writing y/1/on to the file enables the state; n/0/off
disables it.

These attributes can be used to tune the power/performance tradeoff for
individual devices.

[bhelgaas: commit log, rename directory to "link"]
Link: https://lore.kernel.org/r/b1c83f8a-9bf6-eac5-82d0-cf5b90128fbf@gmail.com
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2019-11-21 17:30:24 -06:00
Ben Dooks ca22d1f547 PCI: sysfs: Remove unused attribute groups
56c1af4606 ("PCI: Add sysfs max_link_speed/width,
current_link_speed/width, etc") added the following objects, but they are
unused, so remove them:

  pci_bridge_group
  pci_bridge_groups
  pcie_dev_group
  pcie_dev_groups

This fixes the following warnings from sparse:

  drivers/pci/pci-sysfs.c:1546:30: warning: symbol 'pci_bridge_groups' was not declared. Should it be static?
  drivers/pci/pci-sysfs.c:1555:30: warning: symbol 'pcie_dev_groups' was not declared. Should it be static?

Link: https://lore.kernel.org/r/20191016080324.12864-1-ben.dooks@codethink.co.uk
Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2019-11-21 07:52:31 -06:00
Denis Efremov c9c13ba428 PCI: Add PCI_STD_NUM_BARS for the number of standard BARs
Code that iterates over all standard PCI BARs typically uses
PCI_STD_RESOURCE_END.  However, that requires the unusual test
"i <= PCI_STD_RESOURCE_END" rather than something the typical
"i < PCI_STD_NUM_BARS".

Add a definition for PCI_STD_NUM_BARS and change loops to use the more
idiomatic C style to help avoid fencepost errors.

Link: https://lore.kernel.org/r/20190927234026.23342-1-efremov@linux.com
Link: https://lore.kernel.org/r/20190927234308.23935-1-efremov@linux.com
Link: https://lore.kernel.org/r/20190916204158.6889-3-efremov@linux.com
Signed-off-by: Denis Efremov <efremov@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Sebastian Ott <sebott@linux.ibm.com>			# arch/s390/
Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>	# video/fbdev/
Acked-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>	# pci/controller/dwc/
Acked-by: Jack Wang <jinpu.wang@cloud.ionos.com>		# scsi/pm8001/
Acked-by: Martin K. Petersen <martin.petersen@oracle.com>	# scsi/pm8001/
Acked-by: Ulf Hansson <ulf.hansson@linaro.org>			# memstick/
2019-10-14 10:22:26 -05:00
Linus Torvalds aefcf2f4b5 Merge branch 'next-lockdown' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
Pull kernel lockdown mode from James Morris:
 "This is the latest iteration of the kernel lockdown patchset, from
  Matthew Garrett, David Howells and others.

  From the original description:

    This patchset introduces an optional kernel lockdown feature,
    intended to strengthen the boundary between UID 0 and the kernel.
    When enabled, various pieces of kernel functionality are restricted.
    Applications that rely on low-level access to either hardware or the
    kernel may cease working as a result - therefore this should not be
    enabled without appropriate evaluation beforehand.

    The majority of mainstream distributions have been carrying variants
    of this patchset for many years now, so there's value in providing a
    doesn't meet every distribution requirement, but gets us much closer
    to not requiring external patches.

  There are two major changes since this was last proposed for mainline:

   - Separating lockdown from EFI secure boot. Background discussion is
     covered here: https://lwn.net/Articles/751061/

   -  Implementation as an LSM, with a default stackable lockdown LSM
      module. This allows the lockdown feature to be policy-driven,
      rather than encoding an implicit policy within the mechanism.

  The new locked_down LSM hook is provided to allow LSMs to make a
  policy decision around whether kernel functionality that would allow
  tampering with or examining the runtime state of the kernel should be
  permitted.

  The included lockdown LSM provides an implementation with a simple
  policy intended for general purpose use. This policy provides a coarse
  level of granularity, controllable via the kernel command line:

    lockdown={integrity|confidentiality}

  Enable the kernel lockdown feature. If set to integrity, kernel features
  that allow userland to modify the running kernel are disabled. If set to
  confidentiality, kernel features that allow userland to extract
  confidential information from the kernel are also disabled.

  This may also be controlled via /sys/kernel/security/lockdown and
  overriden by kernel configuration.

  New or existing LSMs may implement finer-grained controls of the
  lockdown features. Refer to the lockdown_reason documentation in
  include/linux/security.h for details.

  The lockdown feature has had signficant design feedback and review
  across many subsystems. This code has been in linux-next for some
  weeks, with a few fixes applied along the way.

  Stephen Rothwell noted that commit 9d1f8be5cf ("bpf: Restrict bpf
  when kernel lockdown is in confidentiality mode") is missing a
  Signed-off-by from its author. Matthew responded that he is providing
  this under category (c) of the DCO"

* 'next-lockdown' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (31 commits)
  kexec: Fix file verification on S390
  security: constify some arrays in lockdown LSM
  lockdown: Print current->comm in restriction messages
  efi: Restrict efivar_ssdt_load when the kernel is locked down
  tracefs: Restrict tracefs when the kernel is locked down
  debugfs: Restrict debugfs when the kernel is locked down
  kexec: Allow kexec_file() with appropriate IMA policy when locked down
  lockdown: Lock down perf when in confidentiality mode
  bpf: Restrict bpf when kernel lockdown is in confidentiality mode
  lockdown: Lock down tracing and perf kprobes when in confidentiality mode
  lockdown: Lock down /proc/kcore
  x86/mmiotrace: Lock down the testmmiotrace module
  lockdown: Lock down module params that specify hardware parameters (eg. ioport)
  lockdown: Lock down TIOCSSERIAL
  lockdown: Prohibit PCMCIA CIS storage when the kernel is locked down
  acpi: Disable ACPI table override if the kernel is locked down
  acpi: Ignore acpi_rsdp kernel param when the kernel has been locked down
  ACPI: Limit access to custom_method when the kernel is locked down
  x86/msr: Restrict MSR access when the kernel is locked down
  x86: Lock down IO port access when the kernel is locked down
  ...
2019-09-28 08:14:15 -07:00
Kelsey Skunberg aaee0c1ffd PCI/IOV: Move sysfs SR-IOV functions to iov.c
The sysfs SR-IOV functions are only needed when the kernel is built with
SR-IOV support.  Rather than put them in pci-sysfs.c under #ifdef
CONFIG_PCI_IOV, move them to iov.c, which is only compiled when
CONFIG_PCI_IOV=y.

Link: https://lore.kernel.org/r/20190813204513.4790-4-skunberg.kelsey@gmail.com
Signed-off-by: Kelsey Skunberg <skunberg.kelsey@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Donald Dutile <ddutile@redhat.com>
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
2019-08-20 14:05:05 -05:00
Kelsey Skunberg e2154044dd PCI: sysfs: Change permissions from symbolic to octal
We prefer octal permissions over symbolic permissions such as "(S_IWUSR |
S_IWGRP)".  Change all symbolic permissions to octal permissions, e.g.,

  - (S_IWUSR | S_IWGRP)
  + 0220

Link: https://lore.kernel.org/r/20190813204513.4790-3-skunberg.kelsey@gmail.com
Signed-off-by: Kelsey Skunberg <skunberg.kelsey@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Donald Dutile <ddutile@redhat.com>
2019-08-20 14:05:00 -05:00