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

fixups-sdk7786.c (1621B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * SDK7786 FPGA PCIe mux handling
      4 *
      5 * Copyright (C) 2010  Paul Mundt
      6 */
      7#define pr_fmt(fmt) "PCI: " fmt
      8
      9#include <linux/init.h>
     10#include <linux/kernel.h>
     11#include <linux/pci.h>
     12#include <mach/fpga.h>
     13
     14/*
     15 * The SDK7786 FPGA supports mangling of most of the slots in some way or
     16 * another. Slots 3/4 are special in that only one can be supported at a
     17 * time, and both appear on port 3 to the PCI bus scan. Enabling slot 4
     18 * (the horizontal edge connector) will disable slot 3 entirely.
     19 *
     20 * Misconfigurations can be detected through the FPGA via the slot
     21 * resistors to determine card presence. Hotplug remains unsupported.
     22 */
     23static unsigned int slot4en __initdata;
     24
     25char *__init pcibios_setup(char *str)
     26{
     27	if (strcmp(str, "slot4en") == 0) {
     28		slot4en = 1;
     29		return NULL;
     30	}
     31
     32	return str;
     33}
     34
     35static int __init sdk7786_pci_init(void)
     36{
     37	u16 data = fpga_read_reg(PCIECR);
     38
     39	/*
     40	 * Enable slot #4 if it's been specified on the command line.
     41	 *
     42	 * Optionally reroute if slot #4 has a card present while slot #3
     43	 * does not, regardless of command line value.
     44	 *
     45	 * Card presence is logically inverted.
     46	 */
     47	slot4en ?: (!(data & PCIECR_PRST4) && (data & PCIECR_PRST3));
     48	if (slot4en) {
     49		pr_info("Activating PCIe slot#4 (disabling slot#3)\n");
     50
     51		data &= ~PCIECR_PCIEMUX1;
     52		fpga_write_reg(data, PCIECR);
     53
     54		/* Warn about forced rerouting if slot#3 is occupied */
     55		if ((data & PCIECR_PRST3) == 0) {
     56			pr_warn("Unreachable card detected in slot#3\n");
     57			return -EBUSY;
     58		}
     59	} else
     60		pr_info("PCIe slot#4 disabled\n");
     61
     62	return 0;
     63}
     64postcore_initcall(sdk7786_pci_init);