Skip to content

Commit

Permalink
ARM: use ARM_DMA_ZONE_SIZE to adjust the zone sizes
Browse files Browse the repository at this point in the history
Rather than each platform providing its own function to adjust the
zone sizes, use the new ARM_DMA_ZONE_SIZE definition to perform this
adjustment.  This ensures that the actual DMA zone size and the
ISA_DMA_THRESHOLD/MAX_DMA_ADDRESS definitions are consistent with
each other, and moves this complexity out of the platform code.

Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King committed May 12, 2011
1 parent 2fb3ec5 commit be20902
Show file tree
Hide file tree
Showing 12 changed files with 25 additions and 144 deletions.
8 changes: 0 additions & 8 deletions arch/arm/common/sa1111.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,14 +185,6 @@ static struct sa1111_dev_info sa1111_devices[] = {
},
};

void __init sa1111_adjust_zones(unsigned long *size, unsigned long *holes)
{
unsigned int sz = SZ_1M >> PAGE_SHIFT;

size[1] = size[0] - sz;
size[0] = sz;
}

/*
* SA1111 interrupt support. Since clearing an IRQ while there are
* active IRQs causes the interrupt output to pulse, the upper levels
Expand Down
6 changes: 0 additions & 6 deletions arch/arm/include/asm/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -215,12 +215,6 @@ static inline unsigned long __phys_to_virt(unsigned long x)
#define ISA_DMA_THRESHOLD (PHYS_OFFSET + ARM_DMA_ZONE_SIZE - 1)
#endif

#ifndef arch_adjust_zones
#define arch_adjust_zones(size,holes) do { } while (0)
#elif !defined(CONFIG_ZONE_DMA)
#error "custom arch_adjust_zones() requires CONFIG_ZONE_DMA"
#endif

/*
* PFNs are used to describe any physical page; this means
* PFN 0 == physical address 0.
Expand Down
15 changes: 0 additions & 15 deletions arch/arm/mach-davinci/include/mach/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,26 +41,11 @@
*/
#define CONSISTENT_DMA_SIZE (14<<20)

#ifndef __ASSEMBLY__
/*
* Restrict DMA-able region to workaround silicon bug. The bug
* restricts buffers available for DMA to video hardware to be
* below 128M
*/
static inline void
__arch_adjust_zones(unsigned long *size, unsigned long *holes)
{
unsigned int sz = (128<<20) >> PAGE_SHIFT;

size[1] = size[0] - sz;
size[0] = sz;
}

#define arch_adjust_zones(zone_size, holes) \
if ((meminfo.bank[0].size >> 20) > 128) __arch_adjust_zones(zone_size, holes)

#define ARM_DMA_ZONE_SIZE SZ_128M

#endif

#endif /* __ASM_ARCH_MEMORY_H */
23 changes: 0 additions & 23 deletions arch/arm/mach-ixp4xx/common-pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,29 +342,6 @@ int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size)
return (dev->bus == &pci_bus_type ) && ((dma_addr + size) >= SZ_64M);
}

/*
* Only first 64MB of memory can be accessed via PCI.
* We use GFP_DMA to allocate safe buffers to do map/unmap.
* This is really ugly and we need a better way of specifying
* DMA-capable regions of memory.
*/
void __init ixp4xx_adjust_zones(unsigned long *zone_size,
unsigned long *zhole_size)
{
unsigned int sz = SZ_64M >> PAGE_SHIFT;

/*
* Only adjust if > 64M on current system
*/
if (zone_size[0] <= sz)
return;

zone_size[1] = zone_size[0] - sz;
zone_size[0] = sz;
zhole_size[1] = zhole_size[0];
zhole_size[0] = 0;
}

void __init ixp4xx_pci_preinit(void)
{
unsigned long cpuid = read_cpuid_id();
Expand Down
9 changes: 1 addition & 8 deletions arch/arm/mach-ixp4xx/include/mach/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,8 @@
*/
#define PLAT_PHYS_OFFSET UL(0x00000000)

#if !defined(__ASSEMBLY__) && defined(CONFIG_PCI)

void ixp4xx_adjust_zones(unsigned long *size, unsigned long *holes);

#define arch_adjust_zones(size, holes) \
ixp4xx_adjust_zones(size, holes)

#ifdef CONFIG_PCI
#define ARM_DMA_ZONE_SIZE SZ_64M

#endif

#endif
27 changes: 0 additions & 27 deletions arch/arm/mach-pxa/cm-x2xx-pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,33 +29,6 @@
unsigned long it8152_base_address;
static int cmx2xx_it8152_irq_gpio;

/*
* Only first 64MB of memory can be accessed via PCI.
* We use GFP_DMA to allocate safe buffers to do map/unmap.
* This is really ugly and we need a better way of specifying
* DMA-capable regions of memory.
*/
void __init cmx2xx_pci_adjust_zones(unsigned long *zone_size,
unsigned long *zhole_size)
{
unsigned int sz = SZ_64M >> PAGE_SHIFT;

if (machine_is_armcore()) {
pr_info("Adjusting zones for CM-X2XX\n");

/*
* Only adjust if > 64M on current system
*/
if (zone_size[0] <= sz)
return;

zone_size[1] = zone_size[0] - sz;
zone_size[0] = sz;
zhole_size[1] = zhole_size[0];
zhole_size[0] = 0;
}
}

static void cmx2xx_it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
{
/* clear our parent irq */
Expand Down
7 changes: 1 addition & 6 deletions arch/arm/mach-pxa/include/mach/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,7 @@
*/
#define PLAT_PHYS_OFFSET UL(0xa0000000)

#if !defined(__ASSEMBLY__) && defined(CONFIG_MACH_ARMCORE) && defined(CONFIG_PCI)
void cmx2xx_pci_adjust_zones(unsigned long *size, unsigned long *holes);

#define arch_adjust_zones(size, holes) \
cmx2xx_pci_adjust_zones(size, holes)

#if defined(CONFIG_MACH_ARMCORE) && defined(CONFIG_PCI)
#define ARM_DMA_ZONE_SIZE SZ_64M
#endif

Expand Down
19 changes: 0 additions & 19 deletions arch/arm/mach-realview/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,25 +56,6 @@

#include "core.h"

#ifdef CONFIG_ZONE_DMA
/*
* Adjust the zones if there are restrictions for DMA access.
*/
void __init realview_adjust_zones(unsigned long *size, unsigned long *hole)
{
unsigned long dma_size = SZ_256M >> PAGE_SHIFT;

if (!machine_is_realview_pbx() || size[0] <= dma_size)
return;

size[ZONE_NORMAL] = size[0] - dma_size;
size[ZONE_DMA] = dma_size;
hole[ZONE_NORMAL] = hole[0];
hole[ZONE_DMA] = 0;
}
#endif


#define REALVIEW_FLASHCTRL (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_FLASH_OFFSET)

static int realview_flash_init(void)
Expand Down
6 changes: 1 addition & 5 deletions arch/arm/mach-realview/include/mach/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,7 @@
#define PLAT_PHYS_OFFSET UL(0x00000000)
#endif

#if !defined(__ASSEMBLY__) && defined(CONFIG_ZONE_DMA)
extern void realview_adjust_zones(unsigned long *size, unsigned long *hole);
#define arch_adjust_zones(size, hole) \
realview_adjust_zones(size, hole)

#ifdef CONFIG_ZONE_DMA
#define ARM_DMA_ZONE_SIZE SZ_256M
#endif

Expand Down
9 changes: 0 additions & 9 deletions arch/arm/mach-sa1100/include/mach/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,8 @@
*/
#define PLAT_PHYS_OFFSET UL(0xc0000000)

#ifndef __ASSEMBLY__

#ifdef CONFIG_SA1111
void sa1111_adjust_zones(unsigned long *size, unsigned long *holes);

#define arch_adjust_zones(size, holes) \
sa1111_adjust_zones(size, holes)

#define ARM_DMA_ZONE_SIZE SZ_1M

#endif
#endif

/*
Expand Down
17 changes: 0 additions & 17 deletions arch/arm/mach-shark/include/mach/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,8 @@
*/
#define PLAT_PHYS_OFFSET UL(0x08000000)

#ifndef __ASSEMBLY__

static inline void __arch_adjust_zones(unsigned long *zone_size, unsigned long *zhole_size)
{
/* Only the first 4 MB (=1024 Pages) are usable for DMA */
/* See dev / -> .properties in OpenFirmware. */
zone_size[1] = zone_size[0] - 1024;
zone_size[0] = 1024;
zhole_size[1] = zhole_size[0];
zhole_size[0] = 0;
}

#define arch_adjust_zones(size, holes) \
__arch_adjust_zones(size, holes)

#define ARM_DMA_ZONE_SIZE SZ_4M

#endif

/*
* Cache flushing area
*/
Expand Down
23 changes: 22 additions & 1 deletion arch/arm/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,20 @@ static void __init arm_bootmem_init(unsigned long start_pfn,
}
}

#ifdef CONFIG_ZONE_DMA
static void __init arm_adjust_dma_zone(unsigned long *size, unsigned long *hole,
unsigned long dma_size)
{
if (size[0] <= dma_size)
return;

size[ZONE_NORMAL] = size[0] - dma_size;
size[ZONE_DMA] = dma_size;
hole[ZONE_NORMAL] = hole[0];
hole[ZONE_DMA] = 0;
}
#endif

static void __init arm_bootmem_free(unsigned long min, unsigned long max_low,
unsigned long max_high)
{
Expand Down Expand Up @@ -243,11 +257,18 @@ static void __init arm_bootmem_free(unsigned long min, unsigned long max_low,
#endif
}

#ifdef ARM_DMA_ZONE_SIZE
#ifndef CONFIG_ZONE_DMA
#error ARM_DMA_ZONE_SIZE set but no DMA zone to limit allocations
#endif

/*
* Adjust the sizes according to any special requirements for
* this machine type.
*/
arch_adjust_zones(zone_size, zhole_size);
arm_adjust_dma_zone(zone_size, zhole_size,
ARM_DMA_ZONE_SIZE >> PAGE_SHIFT);
#endif

free_area_init_node(0, zone_size, min, zhole_size);
}
Expand Down

0 comments on commit be20902

Please sign in to comment.