2 * Firmware replacement code.
4 * Work around broken BIOSes that don't set an aperture or only set the
5 * aperture in the AGP bridge.
6 * If all fails map the aperture over some low memory. This is cheaper than
7 * doing bounce buffering. The memory is lost. This is done at early boot
8 * because only the bootmem allocator can allocate 32+MB.
10 * Copyright 2002 Andi Kleen, SuSE Labs.
12 #include <linux/kernel.h>
13 #include <linux/types.h>
14 #include <linux/init.h>
15 #include <linux/bootmem.h>
16 #include <linux/mmzone.h>
17 #include <linux/pci_ids.h>
18 #include <linux/pci.h>
19 #include <linux/bitops.h>
22 #include <asm/proto.h>
23 #include <asm/pci-direct.h>
28 int iommu_aperture_disabled __initdata = 0;
29 int iommu_aperture_allowed __initdata = 0;
31 int fallback_aper_order __initdata = 1; /* 64MB */
32 int fallback_aper_force __initdata = 0;
34 int fix_aperture __initdata = 1;
36 /* This code runs before the PCI subsystem is initialized, so just
37 access the northbridge directly. */
39 static u32 __init allocate_aperture(void)
41 pg_data_t *nd0 = NODE_DATA(0);
45 if (fallback_aper_order > 7)
46 fallback_aper_order = 7;
47 aper_size = (32 * 1024 * 1024) << fallback_aper_order;
50 * Aperture has to be naturally aligned. This means an 2GB aperture won't
51 * have much chances to find a place in the lower 4GB of memory.
52 * Unfortunately we cannot move it up because that would make the
55 p = __alloc_bootmem_node(nd0, aper_size, aper_size, 0);
56 if (!p || __pa(p)+aper_size > 0xffffffff) {
57 printk("Cannot allocate aperture memory hole (%p,%uK)\n",
60 free_bootmem_node(nd0, __pa(p), aper_size);
63 printk("Mapping aperture over %d KB of RAM @ %lx\n",
64 aper_size >> 10, __pa(p));
68 static int __init aperture_valid(u64 aper_base, u32 aper_size)
72 if (aper_size < 64*1024*1024) {
73 printk("Aperture too small (%d MB)\n", aper_size>>20);
76 if (aper_base + aper_size >= 0xffffffff) {
77 printk("Aperture beyond 4GB. Ignoring.\n");
80 if (e820_any_mapped(aper_base, aper_base + aper_size, E820_RAM)) {
81 printk("Aperture pointing to e820 RAM. Ignoring.\n");
87 /* Find a PCI capability */
88 static __u32 __init find_cap(int num, int slot, int func, int cap)
92 if (!(read_pci_config_16(num,slot,func,PCI_STATUS) & PCI_STATUS_CAP_LIST))
94 pos = read_pci_config_byte(num,slot,func,PCI_CAPABILITY_LIST);
95 for (bytes = 0; bytes < 48 && pos >= 0x40; bytes++) {
98 id = read_pci_config_byte(num,slot,func,pos+PCI_CAP_LIST_ID);
103 pos = read_pci_config_byte(num,slot,func,pos+PCI_CAP_LIST_NEXT);
108 /* Read a standard AGPv3 bridge header */
109 static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order)
114 u32 aper_low, aper_hi;
117 printk("AGP bridge at %02x:%02x:%02x\n", num, slot, func);
118 apsizereg = read_pci_config_16(num,slot,func, cap + 0x14);
119 if (apsizereg == 0xffffffff) {
120 printk("APSIZE in AGP bridge unreadable\n");
124 apsize = apsizereg & 0xfff;
125 /* Some BIOS use weird encodings not in the AGPv3 table. */
128 nbits = hweight16(apsize);
130 if ((int)*order < 0) /* < 32MB */
133 aper_low = read_pci_config(num,slot,func, 0x10);
134 aper_hi = read_pci_config(num,slot,func,0x14);
135 aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32);
137 printk("Aperture from AGP @ %Lx size %u MB (APSIZE %x)\n",
138 aper, 32 << *order, apsizereg);
140 if (!aperture_valid(aper, (32*1024*1024) << *order))
145 /* Look for an AGP bridge. Windows only expects the aperture in the
146 AGP bridge and some BIOS forget to initialize the Northbridge too.
147 Work around this here.
149 Do an PCI bus scan by hand because we're running before the PCI
152 All K8 AGP bridges are AGPv3 compliant, so we can do this scan
153 generically. It's probably overkill to always scan all slots because
154 the AGP bridges should be always an own bus on the HT hierarchy,
155 but do it here for future safety. */
156 static __u32 __init search_agp_bridge(u32 *order, int *valid_agp)
160 /* Poor man's PCI discovery */
161 for (num = 0; num < 256; num++) {
162 for (slot = 0; slot < 32; slot++) {
163 for (func = 0; func < 8; func++) {
166 class = read_pci_config(num,slot,func,
168 if (class == 0xffffffff)
171 switch (class >> 16) {
172 case PCI_CLASS_BRIDGE_HOST:
173 case PCI_CLASS_BRIDGE_OTHER: /* needed? */
175 cap = find_cap(num,slot,func,PCI_CAP_ID_AGP);
179 return read_agp(num,slot,func,cap,order);
182 /* No multi-function device? */
183 type = read_pci_config_byte(num,slot,func,
190 printk("No AGP bridge found\n");
194 void __init iommu_hole_init(void)
197 u32 aper_size, aper_alloc = 0, aper_order = 0, last_aper_order = 0;
198 u64 aper_base, last_aper_base = 0;
201 if (iommu_aperture_disabled || !fix_aperture)
204 printk("Checking aperture...\n");
207 for (num = 24; num < 32; num++) {
208 if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00)))
214 aper_order = (read_pci_config(0, num, 3, 0x90) >> 1) & 7;
215 aper_size = (32 * 1024 * 1024) << aper_order;
216 aper_base = read_pci_config(0, num, 3, 0x94) & 0x7fff;
219 printk("CPU %d: aperture @ %Lx size %u MB\n", num-24,
220 aper_base, aper_size>>20);
222 if (!aperture_valid(aper_base, aper_size)) {
227 if ((last_aper_order && aper_order != last_aper_order) ||
228 (last_aper_base && aper_base != last_aper_base)) {
232 last_aper_order = aper_order;
233 last_aper_base = aper_base;
236 if (!fix && !fallback_aper_force)
239 if (!fallback_aper_force)
240 aper_alloc = search_agp_bridge(&aper_order, &valid_agp);
243 /* Got the aperture from the AGP bridge */
244 } else if (swiotlb && !valid_agp) {
246 } else if ((!no_iommu && end_pfn > MAX_DMA32_PFN) ||
249 fallback_aper_force) {
250 printk("Your BIOS doesn't leave a aperture memory hole\n");
251 printk("Please enable the IOMMU option in the BIOS setup\n");
252 printk("This costs you %d MB of RAM\n",
253 32 << fallback_aper_order);
255 aper_order = fallback_aper_order;
256 aper_alloc = allocate_aperture();
258 /* Could disable AGP and IOMMU here, but it's probably
259 not worth it. But the later users cannot deal with
260 bad apertures and turning on the aperture over memory
261 causes very strange problems, so it's better to
263 panic("Not enough memory for aperture");
269 /* Fix up the north bridges */
270 for (num = 24; num < 32; num++) {
271 if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00)))
274 /* Don't enable translation yet. That is done later.
275 Assume this BIOS didn't initialise the GART so
276 just overwrite all previous bits */
277 write_pci_config(0, num, 3, 0x90, aper_order<<1);
278 write_pci_config(0, num, 3, 0x94, aper_alloc>>25);