CVE-2024-53152

PCI: tegra194: Move controller cleanups to pex_ep_event_pex_rst_deassert()

published December 24, 2024

CVSS
—
EPSS
0%
Percentile
18.8
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

PCI: tegra194: Move controller cleanups to pex_ep_event_pex_rst_deassert()

Currently, the endpoint cleanup function dw_pcie_ep_cleanup() and EPF

deinit notify function pci_epc_deinit_notify() are called during the

execution of pex_ep_event_pex_rst_assert() i.e., when the host has asserted

PERST#. But quickly after this step, refclk will also be disabled by the

host.

All of the tegra194 endpoint SoCs supported as of now depend on the refclk

from the host for keeping the controller operational. Due to this

limitation, any access to the hardware registers in the absence of refclk

will result in a whole endpoint crash. Unfortunately, most of the

controller cleanups require accessing the hardware registers (like eDMA

cleanup performed in dw_pcie_ep_cleanup(), etc...). So these cleanup

functions can cause the crash in the endpoint SoC once host asserts PERST#.

One way to address this issue is by generating the refclk in the endpoint

itself and not depending on the host. But that is not always possible as

some of the endpoint designs do require the endpoint to consume refclk from

the host.

Thus, fix this crash by moving the controller cleanups to the start of

the pex_ep_event_pex_rst_deassert() function. This function is called

whenever the host has deasserted PERST# and it is guaranteed that the

refclk would be active at this point. So at the start of this function

(after enabling resources) the controller cleanup can be performed. Once

finished, rest of the code execution for PERST# deassert can continue as

usual.

The record
Technical detail
CVSS
Not scored
CVSS v4.0
Not supplied
EPSS
0.00275 · 18.8th percentile
Published
2024-12-24T11:28Z
EPSS history
Timeline
  • 24 DEC 11:28Z
    PCI: tegra194: Move controller cleanups to pex_ep_event_pex_rst_deassert()
    cvelistv5