Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a32073bf authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds
Browse files

[PATCH] x86_64: Clean and enhance up K8 northbridge access code



 - Factor out the duplicated access/cache code into a single file
   * Shared between i386/x86-64.
 - Share flush code between AGP and IOMMU
   * Fix a bug: AGP didn't wait for end of flush before
 - Drop 8 northbridges limit and allocate dynamically
 - Add lock to serialize AGP and IOMMU GART flushes
 - Add PCI ID for next AMD northbridge
 - Random related cleanups

The old K8 NUMA discovery code is unchanged. New systems
should all use SRAT for this.

Cc: "Navin Boppuri" <navin.boppuri@newisys.com>
Cc: Dave Jones <davej@redhat.com>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7c2d9cd2
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1054,6 +1054,10 @@ config SCx200
	  This support is also available as a module.  If compiled as a
	  module, it will be called scx200.

config K8_NB
	def_bool y
	depends on AGP_AMD64

source "drivers/pcmcia/Kconfig"

source "drivers/pci/hotplug/Kconfig"
+4 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ obj-$(CONFIG_EFI) += efi.o efi_stub.o
obj-$(CONFIG_DOUBLEFAULT) 	+= doublefault.o
obj-$(CONFIG_VM86)		+= vm86.o
obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
obj-$(CONFIG_K8_NB)		+= k8.o

EXTRA_AFLAGS   := -traditional

@@ -76,3 +77,6 @@ SYSCFLAGS_vsyscall-syms.o = -r
$(obj)/vsyscall-syms.o: $(src)/vsyscall.lds \
			$(obj)/vsyscall-sysenter.o $(obj)/vsyscall-note.o FORCE
	$(call if_changed,syscall)

k8-y                      += ../../x86_64/kernel/k8.o
+4 −0
Original line number Diff line number Diff line
@@ -501,6 +501,10 @@ config REORDER
         optimal TLB usage. If you have pretty much any version of binutils, 
	 this can increase your kernel build time by roughly one minute.

config K8_NB
	def_bool y
	depends on AGP_AMD64 || GART_IOMMU || (PCI && NUMA)

endmenu

#
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o
obj-$(CONFIG_KPROBES)		+= kprobes.o
obj-$(CONFIG_X86_PM_TIMER)	+= pmtimer.o
obj-$(CONFIG_X86_VSMP)		+= vsmp.o
obj-$(CONFIG_K8_NB)		+= k8.o

obj-$(CONFIG_MODULES)		+= module.o

+10 −14
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <asm/proto.h>
#include <asm/pci-direct.h>
#include <asm/dma.h>
#include <asm/k8.h>

int iommu_aperture;
int iommu_aperture_disabled __initdata = 0;
@@ -37,8 +38,6 @@ int fix_aperture __initdata = 1;
/* This code runs before the PCI subsystem is initialized, so just
   access the northbridge directly. */

#define NB_ID_3 (PCI_VENDOR_ID_AMD | (0x1103<<16))

static u32 __init allocate_aperture(void) 
{
	pg_data_t *nd0 = NODE_DATA(0);
@@ -68,20 +67,20 @@ static u32 __init allocate_aperture(void)
	return (u32)__pa(p); 
}

static int __init aperture_valid(char *name, u64 aper_base, u32 aper_size) 
static int __init aperture_valid(u64 aper_base, u32 aper_size)
{ 
	if (!aper_base) 
		return 0;
	if (aper_size < 64*1024*1024) { 
		printk("Aperture from %s too small (%d MB)\n", name, aper_size>>20); 
		printk("Aperture too small (%d MB)\n", aper_size>>20);
		return 0;
	}
	if (aper_base + aper_size >= 0xffffffff) { 
		printk("Aperture from %s beyond 4GB. Ignoring.\n",name);
		printk("Aperture beyond 4GB. Ignoring.\n");
		return 0; 
	}
	if (e820_any_mapped(aper_base, aper_base + aper_size, E820_RAM)) {
		printk("Aperture from %s pointing to e820 RAM. Ignoring.\n",name);
		printk("Aperture pointing to e820 RAM. Ignoring.\n");
		return 0; 
	} 
	return 1;
@@ -140,7 +139,7 @@ static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order)
	printk("Aperture from AGP @ %Lx size %u MB (APSIZE %x)\n", 
	       aper, 32 << *order, apsizereg);

	if (!aperture_valid("AGP bridge", aper, (32*1024*1024) << *order))
	if (!aperture_valid(aper, (32*1024*1024) << *order))
	    return 0;
	return (u32)aper; 
} 
@@ -208,8 +207,7 @@ void __init iommu_hole_init(void)

	fix = 0;
	for (num = 24; num < 32; num++) {		
		char name[30];
		if (read_pci_config(0, num, 3, 0x00) != NB_ID_3) 
		if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00)))
			continue;

		iommu_aperture = 1; 
@@ -222,9 +220,7 @@ void __init iommu_hole_init(void)
		printk("CPU %d: aperture @ %Lx size %u MB\n", num-24, 
		       aper_base, aper_size>>20);
		
		sprintf(name, "northbridge cpu %d", num-24); 

		if (!aperture_valid(name, aper_base, aper_size)) { 
		if (!aperture_valid(aper_base, aper_size)) {
			fix = 1; 
			break; 
		}
@@ -273,7 +269,7 @@ void __init iommu_hole_init(void)

	/* Fix up the north bridges */
	for (num = 24; num < 32; num++) { 		
		if (read_pci_config(0, num, 3, 0x00) != NB_ID_3) 
		if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00)))
			continue;	

		/* Don't enable translation yet. That is done later. 
Loading