cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

legacy.c (1647B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * legacy.c - traditional, old school PCI bus probing
      4 */
      5#include <linux/init.h>
      6#include <linux/export.h>
      7#include <linux/pci.h>
      8#include <asm/jailhouse_para.h>
      9#include <asm/pci_x86.h>
     10
     11/*
     12 * Discover remaining PCI buses in case there are peer host bridges.
     13 * We use the number of last PCI bus provided by the PCI BIOS.
     14 */
     15static void pcibios_fixup_peer_bridges(void)
     16{
     17	int n;
     18
     19	if (pcibios_last_bus <= 0 || pcibios_last_bus > 0xff)
     20		return;
     21	DBG("PCI: Peer bridge fixup\n");
     22
     23	for (n=0; n <= pcibios_last_bus; n++)
     24		pcibios_scan_specific_bus(n);
     25}
     26
     27int __init pci_legacy_init(void)
     28{
     29	if (!raw_pci_ops)
     30		return 1;
     31
     32	pr_info("PCI: Probing PCI hardware\n");
     33	pcibios_scan_root(0);
     34	return 0;
     35}
     36
     37void pcibios_scan_specific_bus(int busn)
     38{
     39	int stride = jailhouse_paravirt() ? 1 : 8;
     40	int devfn;
     41	u32 l;
     42
     43	if (pci_find_bus(0, busn))
     44		return;
     45
     46	for (devfn = 0; devfn < 256; devfn += stride) {
     47		if (!raw_pci_read(0, busn, devfn, PCI_VENDOR_ID, 2, &l) &&
     48		    l != 0x0000 && l != 0xffff) {
     49			DBG("Found device at %02x:%02x [%04x]\n", busn, devfn, l);
     50			pr_info("PCI: Discovered peer bus %02x\n", busn);
     51			pcibios_scan_root(busn);
     52			return;
     53		}
     54	}
     55}
     56EXPORT_SYMBOL_GPL(pcibios_scan_specific_bus);
     57
     58static int __init pci_subsys_init(void)
     59{
     60	/*
     61	 * The init function returns an non zero value when
     62	 * pci_legacy_init should be invoked.
     63	 */
     64	if (x86_init.pci.init()) {
     65		if (pci_legacy_init()) {
     66			pr_info("PCI: System does not support PCI\n");
     67			return -ENODEV;
     68		}
     69	}
     70
     71	pcibios_fixup_peer_bridges();
     72	x86_init.pci.init_irq();
     73	pcibios_init();
     74
     75	return 0;
     76}
     77subsys_initcall(pci_subsys_init);