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

aperture_64.c (15960B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Firmware replacement code.
      4 *
      5 * Work around broken BIOSes that don't set an aperture, only set the
      6 * aperture in the AGP bridge, or set too small aperture.
      7 *
      8 * If all fails map the aperture over some low memory.  This is cheaper than
      9 * doing bounce buffering. The memory is lost. This is done at early boot
     10 * because only the bootmem allocator can allocate 32+MB.
     11 *
     12 * Copyright 2002 Andi Kleen, SuSE Labs.
     13 */
     14#define pr_fmt(fmt) "AGP: " fmt
     15
     16#include <linux/kernel.h>
     17#include <linux/kcore.h>
     18#include <linux/types.h>
     19#include <linux/init.h>
     20#include <linux/memblock.h>
     21#include <linux/mmzone.h>
     22#include <linux/pci_ids.h>
     23#include <linux/pci.h>
     24#include <linux/bitops.h>
     25#include <linux/suspend.h>
     26#include <asm/e820/api.h>
     27#include <asm/io.h>
     28#include <asm/iommu.h>
     29#include <asm/gart.h>
     30#include <asm/pci-direct.h>
     31#include <asm/dma.h>
     32#include <asm/amd_nb.h>
     33#include <asm/x86_init.h>
     34#include <linux/crash_dump.h>
     35
     36/*
     37 * Using 512M as goal, in case kexec will load kernel_big
     38 * that will do the on-position decompress, and could overlap with
     39 * with the gart aperture that is used.
     40 * Sequence:
     41 * kernel_small
     42 * ==> kexec (with kdump trigger path or gart still enabled)
     43 * ==> kernel_small (gart area become e820_reserved)
     44 * ==> kexec (with kdump trigger path or gart still enabled)
     45 * ==> kerne_big (uncompressed size will be big than 64M or 128M)
     46 * So don't use 512M below as gart iommu, leave the space for kernel
     47 * code for safe.
     48 */
     49#define GART_MIN_ADDR	(512ULL << 20)
     50#define GART_MAX_ADDR	(1ULL   << 32)
     51
     52int gart_iommu_aperture;
     53int gart_iommu_aperture_disabled __initdata;
     54int gart_iommu_aperture_allowed __initdata;
     55
     56int fallback_aper_order __initdata = 1; /* 64MB */
     57int fallback_aper_force __initdata;
     58
     59int fix_aperture __initdata = 1;
     60
     61#if defined(CONFIG_PROC_VMCORE) || defined(CONFIG_PROC_KCORE)
     62/*
     63 * If the first kernel maps the aperture over e820 RAM, the kdump kernel will
     64 * use the same range because it will remain configured in the northbridge.
     65 * Trying to dump this area via /proc/vmcore may crash the machine, so exclude
     66 * it from vmcore.
     67 */
     68static unsigned long aperture_pfn_start, aperture_page_count;
     69
     70static int gart_mem_pfn_is_ram(unsigned long pfn)
     71{
     72	return likely((pfn < aperture_pfn_start) ||
     73		      (pfn >= aperture_pfn_start + aperture_page_count));
     74}
     75
     76#ifdef CONFIG_PROC_VMCORE
     77static bool gart_oldmem_pfn_is_ram(struct vmcore_cb *cb, unsigned long pfn)
     78{
     79	return !!gart_mem_pfn_is_ram(pfn);
     80}
     81
     82static struct vmcore_cb gart_vmcore_cb = {
     83	.pfn_is_ram = gart_oldmem_pfn_is_ram,
     84};
     85#endif
     86
     87static void __init exclude_from_core(u64 aper_base, u32 aper_order)
     88{
     89	aperture_pfn_start = aper_base >> PAGE_SHIFT;
     90	aperture_page_count = (32 * 1024 * 1024) << aper_order >> PAGE_SHIFT;
     91#ifdef CONFIG_PROC_VMCORE
     92	register_vmcore_cb(&gart_vmcore_cb);
     93#endif
     94#ifdef CONFIG_PROC_KCORE
     95	WARN_ON(register_mem_pfn_is_ram(&gart_mem_pfn_is_ram));
     96#endif
     97}
     98#else
     99static void exclude_from_core(u64 aper_base, u32 aper_order)
    100{
    101}
    102#endif
    103
    104/* This code runs before the PCI subsystem is initialized, so just
    105   access the northbridge directly. */
    106
    107static u32 __init allocate_aperture(void)
    108{
    109	u32 aper_size;
    110	unsigned long addr;
    111
    112	/* aper_size should <= 1G */
    113	if (fallback_aper_order > 5)
    114		fallback_aper_order = 5;
    115	aper_size = (32 * 1024 * 1024) << fallback_aper_order;
    116
    117	/*
    118	 * Aperture has to be naturally aligned. This means a 2GB aperture
    119	 * won't have much chance of finding a place in the lower 4GB of
    120	 * memory. Unfortunately we cannot move it up because that would
    121	 * make the IOMMU useless.
    122	 */
    123	addr = memblock_phys_alloc_range(aper_size, aper_size,
    124					 GART_MIN_ADDR, GART_MAX_ADDR);
    125	if (!addr) {
    126		pr_err("Cannot allocate aperture memory hole [mem %#010lx-%#010lx] (%uKB)\n",
    127		       addr, addr + aper_size - 1, aper_size >> 10);
    128		return 0;
    129	}
    130	pr_info("Mapping aperture over RAM [mem %#010lx-%#010lx] (%uKB)\n",
    131		addr, addr + aper_size - 1, aper_size >> 10);
    132	register_nosave_region(addr >> PAGE_SHIFT,
    133			       (addr+aper_size) >> PAGE_SHIFT);
    134
    135	return (u32)addr;
    136}
    137
    138
    139/* Find a PCI capability */
    140static u32 __init find_cap(int bus, int slot, int func, int cap)
    141{
    142	int bytes;
    143	u8 pos;
    144
    145	if (!(read_pci_config_16(bus, slot, func, PCI_STATUS) &
    146						PCI_STATUS_CAP_LIST))
    147		return 0;
    148
    149	pos = read_pci_config_byte(bus, slot, func, PCI_CAPABILITY_LIST);
    150	for (bytes = 0; bytes < 48 && pos >= 0x40; bytes++) {
    151		u8 id;
    152
    153		pos &= ~3;
    154		id = read_pci_config_byte(bus, slot, func, pos+PCI_CAP_LIST_ID);
    155		if (id == 0xff)
    156			break;
    157		if (id == cap)
    158			return pos;
    159		pos = read_pci_config_byte(bus, slot, func,
    160						pos+PCI_CAP_LIST_NEXT);
    161	}
    162	return 0;
    163}
    164
    165/* Read a standard AGPv3 bridge header */
    166static u32 __init read_agp(int bus, int slot, int func, int cap, u32 *order)
    167{
    168	u32 apsize;
    169	u32 apsizereg;
    170	int nbits;
    171	u32 aper_low, aper_hi;
    172	u64 aper;
    173	u32 old_order;
    174
    175	pr_info("pci 0000:%02x:%02x:%02x: AGP bridge\n", bus, slot, func);
    176	apsizereg = read_pci_config_16(bus, slot, func, cap + 0x14);
    177	if (apsizereg == 0xffffffff) {
    178		pr_err("pci 0000:%02x:%02x.%d: APSIZE unreadable\n",
    179		       bus, slot, func);
    180		return 0;
    181	}
    182
    183	/* old_order could be the value from NB gart setting */
    184	old_order = *order;
    185
    186	apsize = apsizereg & 0xfff;
    187	/* Some BIOS use weird encodings not in the AGPv3 table. */
    188	if (apsize & 0xff)
    189		apsize |= 0xf00;
    190	nbits = hweight16(apsize);
    191	*order = 7 - nbits;
    192	if ((int)*order < 0) /* < 32MB */
    193		*order = 0;
    194
    195	aper_low = read_pci_config(bus, slot, func, 0x10);
    196	aper_hi = read_pci_config(bus, slot, func, 0x14);
    197	aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32);
    198
    199	/*
    200	 * On some sick chips, APSIZE is 0. It means it wants 4G
    201	 * so let double check that order, and lets trust AMD NB settings:
    202	 */
    203	pr_info("pci 0000:%02x:%02x.%d: AGP aperture [bus addr %#010Lx-%#010Lx] (old size %uMB)\n",
    204		bus, slot, func, aper, aper + (32ULL << (old_order + 20)) - 1,
    205		32 << old_order);
    206	if (aper + (32ULL<<(20 + *order)) > 0x100000000ULL) {
    207		pr_info("pci 0000:%02x:%02x.%d: AGP aperture size %uMB (APSIZE %#x) is not right, using settings from NB\n",
    208			bus, slot, func, 32 << *order, apsizereg);
    209		*order = old_order;
    210	}
    211
    212	pr_info("pci 0000:%02x:%02x.%d: AGP aperture [bus addr %#010Lx-%#010Lx] (%uMB, APSIZE %#x)\n",
    213		bus, slot, func, aper, aper + (32ULL << (*order + 20)) - 1,
    214		32 << *order, apsizereg);
    215
    216	if (!aperture_valid(aper, (32*1024*1024) << *order, 32<<20))
    217		return 0;
    218	return (u32)aper;
    219}
    220
    221/*
    222 * Look for an AGP bridge. Windows only expects the aperture in the
    223 * AGP bridge and some BIOS forget to initialize the Northbridge too.
    224 * Work around this here.
    225 *
    226 * Do an PCI bus scan by hand because we're running before the PCI
    227 * subsystem.
    228 *
    229 * All AMD AGP bridges are AGPv3 compliant, so we can do this scan
    230 * generically. It's probably overkill to always scan all slots because
    231 * the AGP bridges should be always an own bus on the HT hierarchy,
    232 * but do it here for future safety.
    233 */
    234static u32 __init search_agp_bridge(u32 *order, int *valid_agp)
    235{
    236	int bus, slot, func;
    237
    238	/* Poor man's PCI discovery */
    239	for (bus = 0; bus < 256; bus++) {
    240		for (slot = 0; slot < 32; slot++) {
    241			for (func = 0; func < 8; func++) {
    242				u32 class, cap;
    243				u8 type;
    244				class = read_pci_config(bus, slot, func,
    245							PCI_CLASS_REVISION);
    246				if (class == 0xffffffff)
    247					break;
    248
    249				switch (class >> 16) {
    250				case PCI_CLASS_BRIDGE_HOST:
    251				case PCI_CLASS_BRIDGE_OTHER: /* needed? */
    252					/* AGP bridge? */
    253					cap = find_cap(bus, slot, func,
    254							PCI_CAP_ID_AGP);
    255					if (!cap)
    256						break;
    257					*valid_agp = 1;
    258					return read_agp(bus, slot, func, cap,
    259							order);
    260				}
    261
    262				/* No multi-function device? */
    263				type = read_pci_config_byte(bus, slot, func,
    264							       PCI_HEADER_TYPE);
    265				if (!(type & 0x80))
    266					break;
    267			}
    268		}
    269	}
    270	pr_info("No AGP bridge found\n");
    271
    272	return 0;
    273}
    274
    275static bool gart_fix_e820 __initdata = true;
    276
    277static int __init parse_gart_mem(char *p)
    278{
    279	return kstrtobool(p, &gart_fix_e820);
    280}
    281early_param("gart_fix_e820", parse_gart_mem);
    282
    283/*
    284 * With kexec/kdump, if the first kernel doesn't shut down the GART and the
    285 * second kernel allocates a different GART region, there might be two
    286 * overlapping GART regions present:
    287 *
    288 * - the first still used by the GART initialized in the first kernel.
    289 * - (sub-)set of it used as normal RAM by the second kernel.
    290 *
    291 * which leads to memory corruptions and a kernel panic eventually.
    292 *
    293 * This can also happen if the BIOS has forgotten to mark the GART region
    294 * as reserved.
    295 *
    296 * Try to update the e820 map to mark that new region as reserved.
    297 */
    298void __init early_gart_iommu_check(void)
    299{
    300	u32 agp_aper_order = 0;
    301	int i, fix, slot, valid_agp = 0;
    302	u32 ctl;
    303	u32 aper_size = 0, aper_order = 0, last_aper_order = 0;
    304	u64 aper_base = 0, last_aper_base = 0;
    305	int aper_enabled = 0, last_aper_enabled = 0, last_valid = 0;
    306
    307	if (!amd_gart_present())
    308		return;
    309
    310	if (!early_pci_allowed())
    311		return;
    312
    313	/* This is mostly duplicate of iommu_hole_init */
    314	search_agp_bridge(&agp_aper_order, &valid_agp);
    315
    316	fix = 0;
    317	for (i = 0; amd_nb_bus_dev_ranges[i].dev_limit; i++) {
    318		int bus;
    319		int dev_base, dev_limit;
    320
    321		bus = amd_nb_bus_dev_ranges[i].bus;
    322		dev_base = amd_nb_bus_dev_ranges[i].dev_base;
    323		dev_limit = amd_nb_bus_dev_ranges[i].dev_limit;
    324
    325		for (slot = dev_base; slot < dev_limit; slot++) {
    326			if (!early_is_amd_nb(read_pci_config(bus, slot, 3, 0x00)))
    327				continue;
    328
    329			ctl = read_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL);
    330			aper_enabled = ctl & GARTEN;
    331			aper_order = (ctl >> 1) & 7;
    332			aper_size = (32 * 1024 * 1024) << aper_order;
    333			aper_base = read_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE) & 0x7fff;
    334			aper_base <<= 25;
    335
    336			if (last_valid) {
    337				if ((aper_order != last_aper_order) ||
    338				    (aper_base != last_aper_base) ||
    339				    (aper_enabled != last_aper_enabled)) {
    340					fix = 1;
    341					break;
    342				}
    343			}
    344
    345			last_aper_order = aper_order;
    346			last_aper_base = aper_base;
    347			last_aper_enabled = aper_enabled;
    348			last_valid = 1;
    349		}
    350	}
    351
    352	if (!fix && !aper_enabled)
    353		return;
    354
    355	if (!aper_base || !aper_size || aper_base + aper_size > 0x100000000UL)
    356		fix = 1;
    357
    358	if (gart_fix_e820 && !fix && aper_enabled) {
    359		if (e820__mapped_any(aper_base, aper_base + aper_size,
    360				    E820_TYPE_RAM)) {
    361			/* reserve it, so we can reuse it in second kernel */
    362			pr_info("e820: reserve [mem %#010Lx-%#010Lx] for GART\n",
    363				aper_base, aper_base + aper_size - 1);
    364			e820__range_add(aper_base, aper_size, E820_TYPE_RESERVED);
    365			e820__update_table_print();
    366		}
    367	}
    368
    369	if (valid_agp)
    370		return;
    371
    372	/* disable them all at first */
    373	for (i = 0; i < amd_nb_bus_dev_ranges[i].dev_limit; i++) {
    374		int bus;
    375		int dev_base, dev_limit;
    376
    377		bus = amd_nb_bus_dev_ranges[i].bus;
    378		dev_base = amd_nb_bus_dev_ranges[i].dev_base;
    379		dev_limit = amd_nb_bus_dev_ranges[i].dev_limit;
    380
    381		for (slot = dev_base; slot < dev_limit; slot++) {
    382			if (!early_is_amd_nb(read_pci_config(bus, slot, 3, 0x00)))
    383				continue;
    384
    385			ctl = read_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL);
    386			ctl &= ~GARTEN;
    387			write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, ctl);
    388		}
    389	}
    390
    391}
    392
    393static int __initdata printed_gart_size_msg;
    394
    395void __init gart_iommu_hole_init(void)
    396{
    397	u32 agp_aper_base = 0, agp_aper_order = 0;
    398	u32 aper_size, aper_alloc = 0, aper_order = 0, last_aper_order = 0;
    399	u64 aper_base, last_aper_base = 0;
    400	int fix, slot, valid_agp = 0;
    401	int i, node;
    402
    403	if (!amd_gart_present())
    404		return;
    405
    406	if (gart_iommu_aperture_disabled || !fix_aperture ||
    407	    !early_pci_allowed())
    408		return;
    409
    410	pr_info("Checking aperture...\n");
    411
    412	if (!fallback_aper_force)
    413		agp_aper_base = search_agp_bridge(&agp_aper_order, &valid_agp);
    414
    415	fix = 0;
    416	node = 0;
    417	for (i = 0; i < amd_nb_bus_dev_ranges[i].dev_limit; i++) {
    418		int bus;
    419		int dev_base, dev_limit;
    420		u32 ctl;
    421
    422		bus = amd_nb_bus_dev_ranges[i].bus;
    423		dev_base = amd_nb_bus_dev_ranges[i].dev_base;
    424		dev_limit = amd_nb_bus_dev_ranges[i].dev_limit;
    425
    426		for (slot = dev_base; slot < dev_limit; slot++) {
    427			if (!early_is_amd_nb(read_pci_config(bus, slot, 3, 0x00)))
    428				continue;
    429
    430			iommu_detected = 1;
    431			gart_iommu_aperture = 1;
    432			x86_init.iommu.iommu_init = gart_iommu_init;
    433
    434			ctl = read_pci_config(bus, slot, 3,
    435					      AMD64_GARTAPERTURECTL);
    436
    437			/*
    438			 * Before we do anything else disable the GART. It may
    439			 * still be enabled if we boot into a crash-kernel here.
    440			 * Reconfiguring the GART while it is enabled could have
    441			 * unknown side-effects.
    442			 */
    443			ctl &= ~GARTEN;
    444			write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, ctl);
    445
    446			aper_order = (ctl >> 1) & 7;
    447			aper_size = (32 * 1024 * 1024) << aper_order;
    448			aper_base = read_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE) & 0x7fff;
    449			aper_base <<= 25;
    450
    451			pr_info("Node %d: aperture [bus addr %#010Lx-%#010Lx] (%uMB)\n",
    452				node, aper_base, aper_base + aper_size - 1,
    453				aper_size >> 20);
    454			node++;
    455
    456			if (!aperture_valid(aper_base, aper_size, 64<<20)) {
    457				if (valid_agp && agp_aper_base &&
    458				    agp_aper_base == aper_base &&
    459				    agp_aper_order == aper_order) {
    460					/* the same between two setting from NB and agp */
    461					if (!no_iommu &&
    462					    max_pfn > MAX_DMA32_PFN &&
    463					    !printed_gart_size_msg) {
    464						pr_err("you are using iommu with agp, but GART size is less than 64MB\n");
    465						pr_err("please increase GART size in your BIOS setup\n");
    466						pr_err("if BIOS doesn't have that option, contact your HW vendor!\n");
    467						printed_gart_size_msg = 1;
    468					}
    469				} else {
    470					fix = 1;
    471					goto out;
    472				}
    473			}
    474
    475			if ((last_aper_order && aper_order != last_aper_order) ||
    476			    (last_aper_base && aper_base != last_aper_base)) {
    477				fix = 1;
    478				goto out;
    479			}
    480			last_aper_order = aper_order;
    481			last_aper_base = aper_base;
    482		}
    483	}
    484
    485out:
    486	if (!fix && !fallback_aper_force) {
    487		if (last_aper_base) {
    488			/*
    489			 * If this is the kdump kernel, the first kernel
    490			 * may have allocated the range over its e820 RAM
    491			 * and fixed up the northbridge
    492			 */
    493			exclude_from_core(last_aper_base, last_aper_order);
    494		}
    495		return;
    496	}
    497
    498	if (!fallback_aper_force) {
    499		aper_alloc = agp_aper_base;
    500		aper_order = agp_aper_order;
    501	}
    502
    503	if (aper_alloc) {
    504		/* Got the aperture from the AGP bridge */
    505	} else if ((!no_iommu && max_pfn > MAX_DMA32_PFN) ||
    506		   force_iommu ||
    507		   valid_agp ||
    508		   fallback_aper_force) {
    509		pr_info("Your BIOS doesn't leave an aperture memory hole\n");
    510		pr_info("Please enable the IOMMU option in the BIOS setup\n");
    511		pr_info("This costs you %dMB of RAM\n",
    512			32 << fallback_aper_order);
    513
    514		aper_order = fallback_aper_order;
    515		aper_alloc = allocate_aperture();
    516		if (!aper_alloc) {
    517			/*
    518			 * Could disable AGP and IOMMU here, but it's
    519			 * probably not worth it. But the later users
    520			 * cannot deal with bad apertures and turning
    521			 * on the aperture over memory causes very
    522			 * strange problems, so it's better to panic
    523			 * early.
    524			 */
    525			panic("Not enough memory for aperture");
    526		}
    527	} else {
    528		return;
    529	}
    530
    531	/*
    532	 * If this is the kdump kernel _and_ the first kernel did not
    533	 * configure the aperture in the northbridge, this range may
    534	 * overlap with the first kernel's memory. We can't access the
    535	 * range through vmcore even though it should be part of the dump.
    536	 */
    537	exclude_from_core(aper_alloc, aper_order);
    538
    539	/* Fix up the north bridges */
    540	for (i = 0; i < amd_nb_bus_dev_ranges[i].dev_limit; i++) {
    541		int bus, dev_base, dev_limit;
    542
    543		/*
    544		 * Don't enable translation yet but enable GART IO and CPU
    545		 * accesses and set DISTLBWALKPRB since GART table memory is UC.
    546		 */
    547		u32 ctl = aper_order << 1;
    548
    549		bus = amd_nb_bus_dev_ranges[i].bus;
    550		dev_base = amd_nb_bus_dev_ranges[i].dev_base;
    551		dev_limit = amd_nb_bus_dev_ranges[i].dev_limit;
    552		for (slot = dev_base; slot < dev_limit; slot++) {
    553			if (!early_is_amd_nb(read_pci_config(bus, slot, 3, 0x00)))
    554				continue;
    555
    556			write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, ctl);
    557			write_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE, aper_alloc >> 25);
    558		}
    559	}
    560
    561	set_up_gart_resume(aper_order, aper_alloc);
    562}