From: Christoph Lameter Allow the use to specify CONFIG_ZONE_DMA32 and CONFIG_ZONE_DMA (via CONFIG_GENERIC_ISA_DMA). The default is on to be on the safe side. If CONFIG_ZONE_DMA is off then devices requiring ISA DMA can no longer be selected. There are no drivers depending on CONFIG_ZONE_DMA32. If CONFIG_ZONE_DMA32 is not set then the system assumes that DMA devices are capable of doing DMA to all of memory. This is frequently the case if 1. No memory exists over the 4GB boundary (careful, some motherboards equipped with 4GB memory will have memory show up above the 4GB boundary!). It is safe if one has 2GB or less memory in an x86_64 system. 2. The system has an IOMMU. 3. All devices using DMA are supporting DMA to all memory. Signed-off-by: Christoph Lameter Cc: Andi Kleen Signed-off-by: Andrew Morton --- arch/x86_64/Kconfig | 27 +++++++++++++++++++-------- arch/x86_64/kernel/Makefile | 3 ++- arch/x86_64/mm/init.c | 12 +++++++++--- 3 files changed, 30 insertions(+), 12 deletions(-) diff -puN arch/x86_64/Kconfig~optional-zone_dma-for-x86_64 arch/x86_64/Kconfig --- a/arch/x86_64/Kconfig~optional-zone_dma-for-x86_64 +++ a/arch/x86_64/Kconfig @@ -24,10 +24,6 @@ config X86 bool default y -config ZONE_DMA32 - bool - default y - config LOCKDEP_SUPPORT bool default y @@ -73,10 +69,6 @@ config EARLY_PRINTK bool default y -config GENERIC_ISA_DMA - bool - default y - config GENERIC_IOMAP bool default y @@ -249,6 +241,24 @@ config MTRR See for more information. +config ZONE_DMA32 + bool "32 Bit DMA Zone (only needed if memory >4GB)" + default y + help + Some x64 configurations have 32 bit DMA controllers that cannot + write to all of memory. If you have one of these and you have RAM + beyond the 4GB boundary then enable this option. + +config GENERIC_ISA_DMA + bool "ISA DMA zone (to support ISA legacy DMA)" + default y + help + If DMA for ISA boards needs to be supported then this option + needs to be enabled. An additional DMA zone for <16MB memory + will be created and memory below 16MB will be used for those + devices. If this is deselected then devices that use ISA + DMA will not be selectable. + config SMP bool "Symmetric multi-processing support" ---help--- @@ -597,6 +607,7 @@ config GENERIC_IRQ_PROBE # we have no ISA slots, but we do have ISA-style DMA. config ISA_DMA_API bool + depends on GENERIC_ISA_DMA default y config GENERIC_PENDING_IRQ diff -puN arch/x86_64/kernel/Makefile~optional-zone_dma-for-x86_64 arch/x86_64/kernel/Makefile --- a/arch/x86_64/kernel/Makefile~optional-zone_dma-for-x86_64 +++ a/arch/x86_64/kernel/Makefile @@ -7,9 +7,10 @@ EXTRA_AFLAGS := -traditional obj-y := process.o signal.o entry.o traps.o irq.o \ ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_x86_64.o \ x8664_ksyms.o i387.o syscall.o vsyscall.o \ - setup64.o bootflag.o e820.o reboot.o quirks.o i8237.o \ + setup64.o bootflag.o e820.o reboot.o quirks.o \ pci-dma.o pci-nommu.o alternative.o early-quirks.o +obj-$(CONFIG_GENERIC_ISA_DMA) += i8237.o obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_X86_MCE) += mce.o obj-$(CONFIG_X86_MCE_INTEL) += mce_intel.o diff -puN arch/x86_64/mm/init.c~optional-zone_dma-for-x86_64 arch/x86_64/mm/init.c --- a/arch/x86_64/mm/init.c~optional-zone_dma-for-x86_64 +++ a/arch/x86_64/mm/init.c @@ -406,9 +406,15 @@ void __cpuinit zap_low_mappings(int cpu) #ifndef CONFIG_NUMA void __init paging_init(void) { - unsigned long max_zone_pfns[MAX_NR_ZONES] = {MAX_DMA_PFN, - MAX_DMA32_PFN, - end_pfn}; + unsigned long max_zone_pfns[MAX_NR_ZONES] = { +#ifdef CONFIG_ZONE_DMA + MAX_DMA_PFN, +#endif +#ifdef CONFIG_ZONE_DMA32 + MAX_DMA32_PFN, +#endif + end_pfn + }; memory_present(0, 0, end_pfn); sparse_init(); free_area_init_nodes(max_zone_pfns); _