Skip to content

Commit

Permalink
p2sb: Move P2SB hide and unhide code to p2sb_scan_and_cache()
Browse files Browse the repository at this point in the history
To prepare for the following fix, move the code to hide and unhide the
P2SB device from p2sb_cache_resources() to p2sb_scan_and_cache().

Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20241128002836.373745-4-shinichiro.kawasaki@wdc.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
  • Loading branch information
kawasaki authored and ij-intel committed Dec 10, 2024
1 parent ae3e6eb commit 0286070
Showing 1 changed file with 12 additions and 11 deletions.
23 changes: 12 additions & 11 deletions drivers/platform/x86/p2sb.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,25 @@ static void p2sb_scan_and_cache_devfn(struct pci_bus *bus, unsigned int devfn)

static int p2sb_scan_and_cache(struct pci_bus *bus, unsigned int devfn)
{
/*
* The BIOS prevents the P2SB device from being enumerated by the PCI
* subsystem, so we need to unhide and hide it back to lookup the BAR.
* Unhide the P2SB device here, if needed.
*/
if (p2sb_hidden_by_bios)
pci_bus_write_config_dword(bus, devfn, P2SBC, 0);

/* Scan the P2SB device and cache its BAR0 */
p2sb_scan_and_cache_devfn(bus, devfn);

/* On Goldmont p2sb_bar() also gets called for the SPI controller */
if (devfn == P2SB_DEVFN_GOLDMONT)
p2sb_scan_and_cache_devfn(bus, SPI_DEVFN_GOLDMONT);

/* Hide the P2SB device, if it was hidden */
if (p2sb_hidden_by_bios)
pci_bus_write_config_dword(bus, devfn, P2SBC, P2SBC_HIDE);

if (!p2sb_valid_resource(&p2sb_resources[PCI_FUNC(devfn)].res))
return -ENOENT;

Expand Down Expand Up @@ -153,22 +165,11 @@ static int p2sb_cache_resources(void)
*/
pci_lock_rescan_remove();

/*
* The BIOS prevents the P2SB device from being enumerated by the PCI
* subsystem, so we need to unhide and hide it back to lookup the BAR.
* Unhide the P2SB device here, if needed.
*/
pci_bus_read_config_dword(bus, devfn_p2sb, P2SBC, &value);
p2sb_hidden_by_bios = value & P2SBC_HIDE;
if (p2sb_hidden_by_bios)
pci_bus_write_config_dword(bus, devfn_p2sb, P2SBC, 0);

ret = p2sb_scan_and_cache(bus, devfn_p2sb);

/* Hide the P2SB device, if it was hidden */
if (p2sb_hidden_by_bios)
pci_bus_write_config_dword(bus, devfn_p2sb, P2SBC, P2SBC_HIDE);

pci_unlock_rescan_remove();

return ret;
Expand Down

0 comments on commit 0286070

Please sign in to comment.