Patchwork powerpc: rework dma-noncoherent to use generic vmap/vunmap functions

login
register
mail settings
Submitter Ilya Yanok
Date Jan. 9, 2009, 12:58 p.m.
Message ID <1231505915-16082-1-git-send-email-yanok@emcraft.com>
Download mbox | patch
Permalink /patch/17505/
State Superseded
Delegated to: Benjamin Herrenschmidt
Headers show

Comments

Ilya Yanok - Jan. 9, 2009, 12:58 p.m.
This patch rewrites consistent dma allocations support to use vmalloc
layer to allocate virtual memory space from vmalloc pool and get rid
of CONFIG_CONSISTENT_{START,SIZE}.

Signed-off-by: Ilya Yanok <yanok@emcraft.com>
---
 arch/powerpc/Kconfig                           |   25 --
 arch/powerpc/configs/40x/acadia_defconfig      |    2 -
 arch/powerpc/configs/40x/ep405_defconfig       |    2 -
 arch/powerpc/configs/40x/hcu4_defconfig        |    2 -
 arch/powerpc/configs/40x/kilauea_defconfig     |    2 -
 arch/powerpc/configs/40x/makalu_defconfig      |    2 -
 arch/powerpc/configs/40x/virtex_defconfig      |    2 -
 arch/powerpc/configs/40x/walnut_defconfig      |    2 -
 arch/powerpc/configs/44x/arches_defconfig      |    2 -
 arch/powerpc/configs/44x/bamboo_defconfig      |    2 -
 arch/powerpc/configs/44x/canyonlands_defconfig |    2 -
 arch/powerpc/configs/44x/ebony_defconfig       |    2 -
 arch/powerpc/configs/44x/katmai_defconfig      |    2 -
 arch/powerpc/configs/44x/rainier_defconfig     |    2 -
 arch/powerpc/configs/44x/sam440ep_defconfig    |    2 -
 arch/powerpc/configs/44x/sequoia_defconfig     |    2 -
 arch/powerpc/configs/44x/taishan_defconfig     |    2 -
 arch/powerpc/configs/44x/virtex5_defconfig     |    2 -
 arch/powerpc/configs/44x/warp_defconfig        |    2 -
 arch/powerpc/configs/adder875_defconfig        |    2 -
 arch/powerpc/configs/c2k_defconfig             |    2 -
 arch/powerpc/configs/ep88xc_defconfig          |    2 -
 arch/powerpc/configs/mgsuvd_defconfig          |    2 -
 arch/powerpc/configs/mpc866_ads_defconfig      |    2 -
 arch/powerpc/configs/mpc885_ads_defconfig      |    2 -
 arch/powerpc/configs/ppc40x_defconfig          |    2 -
 arch/powerpc/configs/ppc44x_defconfig          |    2 -
 arch/powerpc/configs/prpmc2800_defconfig       |    2 -
 arch/powerpc/lib/dma-noncoherent.c             |  278 +++--------------------
 29 files changed, 37 insertions(+), 320 deletions(-)
Benjamin Herrenschmidt - Jan. 10, 2009, 11:30 p.m.
On Fri, 2009-01-09 at 15:58 +0300, Ilya Yanok wrote:
> This patch rewrites consistent dma allocations support to use vmalloc
> layer to allocate virtual memory space from vmalloc pool and get rid
> of CONFIG_CONSISTENT_{START,SIZE}.

Ah good, I like that. I haven't reviewed in details yet but that's the
right approach. I'll have a closer look hopefully tomorrow.

I seems too late for .29 though... 

Cheers,
Ben.
Grant Likely - Jan. 11, 2009, 12:31 a.m.
On Fri, Jan 9, 2009 at 5:58 AM, Ilya Yanok <yanok@emcraft.com> wrote:
> This patch rewrites consistent dma allocations support to use vmalloc
> layer to allocate virtual memory space from vmalloc pool and get rid
> of CONFIG_CONSISTENT_{START,SIZE}.

Impressive patch.  I'll pull it into my tree and see how it works on
4xx and 5200.

BTW, you can drop all the defconfig updates in this patch.  The old
config values will just disappear when 'make *_defconfig' is run.
Putting them in the patch makes it far more likely that it won't apply
at a later date.

g.

>
> Signed-off-by: Ilya Yanok <yanok@emcraft.com>
> ---
>  arch/powerpc/Kconfig                           |   25 --
>  arch/powerpc/configs/40x/acadia_defconfig      |    2 -
>  arch/powerpc/configs/40x/ep405_defconfig       |    2 -
>  arch/powerpc/configs/40x/hcu4_defconfig        |    2 -
>  arch/powerpc/configs/40x/kilauea_defconfig     |    2 -
>  arch/powerpc/configs/40x/makalu_defconfig      |    2 -
>  arch/powerpc/configs/40x/virtex_defconfig      |    2 -
>  arch/powerpc/configs/40x/walnut_defconfig      |    2 -
>  arch/powerpc/configs/44x/arches_defconfig      |    2 -
>  arch/powerpc/configs/44x/bamboo_defconfig      |    2 -
>  arch/powerpc/configs/44x/canyonlands_defconfig |    2 -
>  arch/powerpc/configs/44x/ebony_defconfig       |    2 -
>  arch/powerpc/configs/44x/katmai_defconfig      |    2 -
>  arch/powerpc/configs/44x/rainier_defconfig     |    2 -
>  arch/powerpc/configs/44x/sam440ep_defconfig    |    2 -
>  arch/powerpc/configs/44x/sequoia_defconfig     |    2 -
>  arch/powerpc/configs/44x/taishan_defconfig     |    2 -
>  arch/powerpc/configs/44x/virtex5_defconfig     |    2 -
>  arch/powerpc/configs/44x/warp_defconfig        |    2 -
>  arch/powerpc/configs/adder875_defconfig        |    2 -
>  arch/powerpc/configs/c2k_defconfig             |    2 -
>  arch/powerpc/configs/ep88xc_defconfig          |    2 -
>  arch/powerpc/configs/mgsuvd_defconfig          |    2 -
>  arch/powerpc/configs/mpc866_ads_defconfig      |    2 -
>  arch/powerpc/configs/mpc885_ads_defconfig      |    2 -
>  arch/powerpc/configs/ppc40x_defconfig          |    2 -
>  arch/powerpc/configs/ppc44x_defconfig          |    2 -
>  arch/powerpc/configs/prpmc2800_defconfig       |    2 -
>  arch/powerpc/lib/dma-noncoherent.c             |  278 +++--------------------
>  29 files changed, 37 insertions(+), 320 deletions(-)
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 525c13a..a451a06 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -777,31 +777,6 @@ config TASK_SIZE
>        default "0x80000000" if PPC_PREP || PPC_8xx
>        default "0xc0000000"
>
> -config CONSISTENT_START_BOOL
> -       bool "Set custom consistent memory pool address"
> -       depends on ADVANCED_OPTIONS && NOT_COHERENT_CACHE
> -       help
> -         This option allows you to set the base virtual address
> -         of the consistent memory pool.  This pool of virtual
> -         memory is used to make consistent memory allocations.
> -
> -config CONSISTENT_START
> -       hex "Base virtual address of consistent memory pool" if CONSISTENT_START_BOOL
> -       default "0xfd000000" if (NOT_COHERENT_CACHE && 8xx)
> -       default "0xff100000" if NOT_COHERENT_CACHE
> -
> -config CONSISTENT_SIZE_BOOL
> -       bool "Set custom consistent memory pool size"
> -       depends on ADVANCED_OPTIONS && NOT_COHERENT_CACHE
> -       help
> -         This option allows you to set the size of the
> -         consistent memory pool.  This pool of virtual memory
> -         is used to make consistent memory allocations.
> -
> -config CONSISTENT_SIZE
> -       hex "Size of consistent memory pool" if CONSISTENT_SIZE_BOOL
> -       default "0x00200000" if NOT_COHERENT_CACHE
> -
>  config PIN_TLB
>        bool "Pinned Kernel TLBs (860 ONLY)"
>        depends on ADVANCED_OPTIONS && 8xx
> diff --git a/arch/powerpc/configs/40x/acadia_defconfig b/arch/powerpc/configs/40x/acadia_defconfig
> index 25572cc..ea5d89c 100644
> --- a/arch/powerpc/configs/40x/acadia_defconfig
> +++ b/arch/powerpc/configs/40x/acadia_defconfig
> @@ -265,8 +265,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/40x/ep405_defconfig b/arch/powerpc/configs/40x/ep405_defconfig
> index b80ba7a..1f3ebea 100644
> --- a/arch/powerpc/configs/40x/ep405_defconfig
> +++ b/arch/powerpc/configs/40x/ep405_defconfig
> @@ -267,8 +267,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/40x/hcu4_defconfig b/arch/powerpc/configs/40x/hcu4_defconfig
> index 45dcb82..bfb010d 100644
> --- a/arch/powerpc/configs/40x/hcu4_defconfig
> +++ b/arch/powerpc/configs/40x/hcu4_defconfig
> @@ -265,8 +265,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/40x/kilauea_defconfig b/arch/powerpc/configs/40x/kilauea_defconfig
> index e2f3695..40e181f 100644
> --- a/arch/powerpc/configs/40x/kilauea_defconfig
> +++ b/arch/powerpc/configs/40x/kilauea_defconfig
> @@ -265,8 +265,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/40x/makalu_defconfig b/arch/powerpc/configs/40x/makalu_defconfig
> index 413c778..bb2c4ae 100644
> --- a/arch/powerpc/configs/40x/makalu_defconfig
> +++ b/arch/powerpc/configs/40x/makalu_defconfig
> @@ -265,8 +265,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/40x/virtex_defconfig b/arch/powerpc/configs/40x/virtex_defconfig
> index 9a9350d..d082d98 100644
> --- a/arch/powerpc/configs/40x/virtex_defconfig
> +++ b/arch/powerpc/configs/40x/virtex_defconfig
> @@ -273,8 +273,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/40x/walnut_defconfig b/arch/powerpc/configs/40x/walnut_defconfig
> index 5820e0a..c1c37eb 100644
> --- a/arch/powerpc/configs/40x/walnut_defconfig
> +++ b/arch/powerpc/configs/40x/walnut_defconfig
> @@ -268,8 +268,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/arches_defconfig b/arch/powerpc/configs/44x/arches_defconfig
> index 082158d..2784aa4 100644
> --- a/arch/powerpc/configs/44x/arches_defconfig
> +++ b/arch/powerpc/configs/44x/arches_defconfig
> @@ -272,8 +272,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/bamboo_defconfig b/arch/powerpc/configs/44x/bamboo_defconfig
> index f47c2f3..4821b4f 100644
> --- a/arch/powerpc/configs/44x/bamboo_defconfig
> +++ b/arch/powerpc/configs/44x/bamboo_defconfig
> @@ -276,8 +276,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/canyonlands_defconfig b/arch/powerpc/configs/44x/canyonlands_defconfig
> index 0694756..be68259 100644
> --- a/arch/powerpc/configs/44x/canyonlands_defconfig
> +++ b/arch/powerpc/configs/44x/canyonlands_defconfig
> @@ -272,8 +272,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/ebony_defconfig b/arch/powerpc/configs/44x/ebony_defconfig
> index c993757..8e0ce20 100644
> --- a/arch/powerpc/configs/44x/ebony_defconfig
> +++ b/arch/powerpc/configs/44x/ebony_defconfig
> @@ -274,8 +274,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/katmai_defconfig b/arch/powerpc/configs/44x/katmai_defconfig
> index e326ee8..d1767b4 100644
> --- a/arch/powerpc/configs/44x/katmai_defconfig
> +++ b/arch/powerpc/configs/44x/katmai_defconfig
> @@ -270,8 +270,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/rainier_defconfig b/arch/powerpc/configs/44x/rainier_defconfig
> index 927f829..fb1309f 100644
> --- a/arch/powerpc/configs/44x/rainier_defconfig
> +++ b/arch/powerpc/configs/44x/rainier_defconfig
> @@ -274,8 +274,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/sam440ep_defconfig b/arch/powerpc/configs/44x/sam440ep_defconfig
> index 15f48e0..79ded88 100644
> --- a/arch/powerpc/configs/44x/sam440ep_defconfig
> +++ b/arch/powerpc/configs/44x/sam440ep_defconfig
> @@ -275,8 +275,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/sequoia_defconfig b/arch/powerpc/configs/44x/sequoia_defconfig
> index 562beea..ef65b9f 100644
> --- a/arch/powerpc/configs/44x/sequoia_defconfig
> +++ b/arch/powerpc/configs/44x/sequoia_defconfig
> @@ -276,8 +276,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/taishan_defconfig b/arch/powerpc/configs/44x/taishan_defconfig
> index 427bb6a..6e97ae9 100644
> --- a/arch/powerpc/configs/44x/taishan_defconfig
> +++ b/arch/powerpc/configs/44x/taishan_defconfig
> @@ -274,8 +274,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/virtex5_defconfig b/arch/powerpc/configs/44x/virtex5_defconfig
> index 7513d36..5b2ccd6 100644
> --- a/arch/powerpc/configs/44x/virtex5_defconfig
> +++ b/arch/powerpc/configs/44x/virtex5_defconfig
> @@ -278,8 +278,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/44x/warp_defconfig b/arch/powerpc/configs/44x/warp_defconfig
> index 59cbd27..126be06 100644
> --- a/arch/powerpc/configs/44x/warp_defconfig
> +++ b/arch/powerpc/configs/44x/warp_defconfig
> @@ -266,8 +266,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/adder875_defconfig b/arch/powerpc/configs/adder875_defconfig
> index 024f279..f5e50c0 100644
> --- a/arch/powerpc/configs/adder875_defconfig
> +++ b/arch/powerpc/configs/adder875_defconfig
> @@ -265,8 +265,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0x80000000
> -CONFIG_CONSISTENT_START=0xfd000000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/c2k_defconfig b/arch/powerpc/configs/c2k_defconfig
> index 5078594..b877f07 100644
> --- a/arch/powerpc/configs/c2k_defconfig
> +++ b/arch/powerpc/configs/c2k_defconfig
> @@ -307,8 +307,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/ep88xc_defconfig b/arch/powerpc/configs/ep88xc_defconfig
> index 870d289..8aacae7 100644
> --- a/arch/powerpc/configs/ep88xc_defconfig
> +++ b/arch/powerpc/configs/ep88xc_defconfig
> @@ -265,8 +265,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0x80000000
> -CONFIG_CONSISTENT_START=0xfd000000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/mgsuvd_defconfig b/arch/powerpc/configs/mgsuvd_defconfig
> index fbaa67f..0da7b58 100644
> --- a/arch/powerpc/configs/mgsuvd_defconfig
> +++ b/arch/powerpc/configs/mgsuvd_defconfig
> @@ -262,8 +262,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0x80000000
> -CONFIG_CONSISTENT_START=0xfd000000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/mpc866_ads_defconfig b/arch/powerpc/configs/mpc866_ads_defconfig
> index 8272b1a..e16bd69 100644
> --- a/arch/powerpc/configs/mpc866_ads_defconfig
> +++ b/arch/powerpc/configs/mpc866_ads_defconfig
> @@ -262,8 +262,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0x80000000
> -CONFIG_CONSISTENT_START=0xfd000000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/mpc885_ads_defconfig b/arch/powerpc/configs/mpc885_ads_defconfig
> index a4283b6..0937771 100644
> --- a/arch/powerpc/configs/mpc885_ads_defconfig
> +++ b/arch/powerpc/configs/mpc885_ads_defconfig
> @@ -272,8 +272,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0x80000000
> -CONFIG_CONSISTENT_START=0xfd000000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/ppc40x_defconfig b/arch/powerpc/configs/ppc40x_defconfig
> index 4256e2c..0cbb6c3 100644
> --- a/arch/powerpc/configs/ppc40x_defconfig
> +++ b/arch/powerpc/configs/ppc40x_defconfig
> @@ -275,8 +275,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/ppc44x_defconfig b/arch/powerpc/configs/ppc44x_defconfig
> index cfc94cf..54e5583 100644
> --- a/arch/powerpc/configs/ppc44x_defconfig
> +++ b/arch/powerpc/configs/ppc44x_defconfig
> @@ -286,8 +286,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/configs/prpmc2800_defconfig b/arch/powerpc/configs/prpmc2800_defconfig
> index 6046dc0..bb61e21 100644
> --- a/arch/powerpc/configs/prpmc2800_defconfig
> +++ b/arch/powerpc/configs/prpmc2800_defconfig
> @@ -272,8 +272,6 @@ CONFIG_PAGE_OFFSET=0xc0000000
>  CONFIG_KERNEL_START=0xc0000000
>  CONFIG_PHYSICAL_START=0x00000000
>  CONFIG_TASK_SIZE=0xc0000000
> -CONFIG_CONSISTENT_START=0xff100000
> -CONFIG_CONSISTENT_SIZE=0x00200000
>  CONFIG_NET=y
>
>  #
> diff --git a/arch/powerpc/lib/dma-noncoherent.c b/arch/powerpc/lib/dma-noncoherent.c
> index 31734c0..f6c932f 100644
> --- a/arch/powerpc/lib/dma-noncoherent.c
> +++ b/arch/powerpc/lib/dma-noncoherent.c
> @@ -29,121 +29,11 @@
>  #include <linux/types.h>
>  #include <linux/highmem.h>
>  #include <linux/dma-mapping.h>
> +#include <linux/vmalloc.h>
>
>  #include <asm/tlbflush.h>
>
>  /*
> - * This address range defaults to a value that is safe for all
> - * platforms which currently set CONFIG_NOT_COHERENT_CACHE. It
> - * can be further configured for specific applications under
> - * the "Advanced Setup" menu. -Matt
> - */
> -#define CONSISTENT_BASE        (CONFIG_CONSISTENT_START)
> -#define CONSISTENT_END (CONFIG_CONSISTENT_START + CONFIG_CONSISTENT_SIZE)
> -#define CONSISTENT_OFFSET(x)   (((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT)
> -
> -/*
> - * This is the page table (2MB) covering uncached, DMA consistent allocations
> - */
> -static pte_t *consistent_pte;
> -static DEFINE_SPINLOCK(consistent_lock);
> -
> -/*
> - * VM region handling support.
> - *
> - * This should become something generic, handling VM region allocations for
> - * vmalloc and similar (ioremap, module space, etc).
> - *
> - * I envisage vmalloc()'s supporting vm_struct becoming:
> - *
> - *  struct vm_struct {
> - *    struct vm_region region;
> - *    unsigned long    flags;
> - *    struct page      **pages;
> - *    unsigned int     nr_pages;
> - *    unsigned long    phys_addr;
> - *  };
> - *
> - * get_vm_area() would then call vm_region_alloc with an appropriate
> - * struct vm_region head (eg):
> - *
> - *  struct vm_region vmalloc_head = {
> - *     .vm_list        = LIST_HEAD_INIT(vmalloc_head.vm_list),
> - *     .vm_start       = VMALLOC_START,
> - *     .vm_end         = VMALLOC_END,
> - *  };
> - *
> - * However, vmalloc_head.vm_start is variable (typically, it is dependent on
> - * the amount of RAM found at boot time.)  I would imagine that get_vm_area()
> - * would have to initialise this each time prior to calling vm_region_alloc().
> - */
> -struct vm_region {
> -       struct list_head        vm_list;
> -       unsigned long           vm_start;
> -       unsigned long           vm_end;
> -};
> -
> -static struct vm_region consistent_head = {
> -       .vm_list        = LIST_HEAD_INIT(consistent_head.vm_list),
> -       .vm_start       = CONSISTENT_BASE,
> -       .vm_end         = CONSISTENT_END,
> -};
> -
> -static struct vm_region *
> -vm_region_alloc(struct vm_region *head, size_t size, gfp_t gfp)
> -{
> -       unsigned long addr = head->vm_start, end = head->vm_end - size;
> -       unsigned long flags;
> -       struct vm_region *c, *new;
> -
> -       new = kmalloc(sizeof(struct vm_region), gfp);
> -       if (!new)
> -               goto out;
> -
> -       spin_lock_irqsave(&consistent_lock, flags);
> -
> -       list_for_each_entry(c, &head->vm_list, vm_list) {
> -               if ((addr + size) < addr)
> -                       goto nospc;
> -               if ((addr + size) <= c->vm_start)
> -                       goto found;
> -               addr = c->vm_end;
> -               if (addr > end)
> -                       goto nospc;
> -       }
> -
> - found:
> -       /*
> -        * Insert this entry _before_ the one we found.
> -        */
> -       list_add_tail(&new->vm_list, &c->vm_list);
> -       new->vm_start = addr;
> -       new->vm_end = addr + size;
> -
> -       spin_unlock_irqrestore(&consistent_lock, flags);
> -       return new;
> -
> - nospc:
> -       spin_unlock_irqrestore(&consistent_lock, flags);
> -       kfree(new);
> - out:
> -       return NULL;
> -}
> -
> -static struct vm_region *vm_region_find(struct vm_region *head, unsigned long addr)
> -{
> -       struct vm_region *c;
> -
> -       list_for_each_entry(c, &head->vm_list, vm_list) {
> -               if (c->vm_start == addr)
> -                       goto out;
> -       }
> -       c = NULL;
> - out:
> -       return c;
> -}
> -
> -/*
>  * Allocate DMA-coherent memory space and return both the kernel remapped
>  * virtual and bus address for that space.
>  */
> @@ -151,19 +41,17 @@ void *
>  __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
>  {
>        struct page *page;
> -       struct vm_region *c;
>        unsigned long order;
> +       void *v;
> +       int i;
> +       struct page *pages[PAGE_ALIGN(size)>>PAGE_SHIFT];
> +       struct page *end;
>        u64 mask = 0x00ffffff, limit; /* ISA default */
>
> -       if (!consistent_pte) {
> -               printk(KERN_ERR "%s: not initialised\n", __func__);
> -               dump_stack();
> -               return NULL;
> -       }
> -
> +       BUG_ON(!mem_init_done);
>        size = PAGE_ALIGN(size);
>        limit = (mask + 1) & ~mask;
> -       if ((limit && size >= limit) || size >= (CONSISTENT_END - CONSISTENT_BASE)) {
> +       if (limit && size >= limit) {
>                printk(KERN_WARNING "coherent allocation too big (requested %#x mask %#Lx)\n",
>                       size, mask);
>                return NULL;
> @@ -178,6 +66,8 @@ __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
>        if (!page)
>                goto no_page;
>
> +       end = page + (1 << order);
> +
>        /*
>         * Invalidate any data that might be lurking in the
>         * kernel direct-mapped region for device DMA.
> @@ -188,45 +78,34 @@ __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
>                flush_dcache_range(kaddr, kaddr + size);
>        }
>
> +       split_page(page, order);
> +
>        /*
> -        * Allocate a virtual address in the consistent mapping region.
> +        * Set the "dma handle"
>         */
> -       c = vm_region_alloc(&consistent_head, size,
> -                           gfp & ~(__GFP_DMA | __GFP_HIGHMEM));
> -       if (c) {
> -               unsigned long vaddr = c->vm_start;
> -               pte_t *pte = consistent_pte + CONSISTENT_OFFSET(vaddr);
> -               struct page *end = page + (1 << order);
> -
> -               split_page(page, order);
> -
> -               /*
> -                * Set the "dma handle"
> -                */
> -               *handle = page_to_phys(page);
> -
> -               do {
> -                       BUG_ON(!pte_none(*pte));
> -
> -                       SetPageReserved(page);
> -                       set_pte_at(&init_mm, vaddr,
> -                                  pte, mk_pte(page, pgprot_noncached(PAGE_KERNEL)));
> -                       page++;
> -                       pte++;
> -                       vaddr += PAGE_SIZE;
> -               } while (size -= PAGE_SIZE);
> +       *handle = page_to_phys(page);
> +       for (i = 0; i < size>>PAGE_SHIFT; i++)
> +               pages[i] = page + i;
> +       v = vmap(pages, size>>PAGE_SHIFT, VM_IOREMAP,
> +                       pgprot_noncached(PAGE_KERNEL));
> +       if (!v)
> +               goto out;
>
> -               /*
> -                * Free the otherwise unused pages.
> -                */
> -               while (page < end) {
> -                       __free_page(page);
> -                       page++;
> -               }
> +       do {
> +               SetPageReserved(page);
> +               page++;
> +       } while (size -= PAGE_SIZE);
>
> -               return (void *)c->vm_start;
> +       /*
> +        * Free the otherwise unused pages.
> +        */
> +       while (page < end) {
> +               __free_page(page);
> +               page++;
>        }
>
> +       return v;
> +     out:
>        if (page)
>                __free_pages(page, order);
>  no_page:
> @@ -239,105 +118,22 @@ EXPORT_SYMBOL(__dma_alloc_coherent);
>  */
>  void __dma_free_coherent(size_t size, void *vaddr)
>  {
> -       struct vm_region *c;
> -       unsigned long flags, addr;
> -       pte_t *ptep;
> +       struct page *page;
>
>        size = PAGE_ALIGN(size);
> +       page = vmalloc_to_page(vaddr);
>
> -       spin_lock_irqsave(&consistent_lock, flags);
> +       vunmap(vaddr);
>
> -       c = vm_region_find(&consistent_head, (unsigned long)vaddr);
> -       if (!c)
> -               goto no_area;
> -
> -       if ((c->vm_end - c->vm_start) != size) {
> -               printk(KERN_ERR "%s: freeing wrong coherent size (%ld != %d)\n",
> -                      __func__, c->vm_end - c->vm_start, size);
> -               dump_stack();
> -               size = c->vm_end - c->vm_start;
> -       }
> -
> -       ptep = consistent_pte + CONSISTENT_OFFSET(c->vm_start);
> -       addr = c->vm_start;
>        do {
> -               pte_t pte = ptep_get_and_clear(&init_mm, addr, ptep);
> -               unsigned long pfn;
> -
> -               ptep++;
> -               addr += PAGE_SIZE;
> -
> -               if (!pte_none(pte) && pte_present(pte)) {
> -                       pfn = pte_pfn(pte);
> -
> -                       if (pfn_valid(pfn)) {
> -                               struct page *page = pfn_to_page(pfn);
> -                               ClearPageReserved(page);
> -
> -                               __free_page(page);
> -                               continue;
> -                       }
> -               }
> -
> -               printk(KERN_CRIT "%s: bad page in kernel page table\n",
> -                      __func__);
> +               ClearPageReserved(page);
> +               __free_page(page);
> +               page++;
>        } while (size -= PAGE_SIZE);
> -
> -       flush_tlb_kernel_range(c->vm_start, c->vm_end);
> -
> -       list_del(&c->vm_list);
> -
> -       spin_unlock_irqrestore(&consistent_lock, flags);
> -
> -       kfree(c);
> -       return;
> -
> - no_area:
> -       spin_unlock_irqrestore(&consistent_lock, flags);
> -       printk(KERN_ERR "%s: trying to free invalid coherent area: %p\n",
> -              __func__, vaddr);
> -       dump_stack();
>  }
>  EXPORT_SYMBOL(__dma_free_coherent);
>
>  /*
> - * Initialise the consistent memory allocation.
> - */
> -static int __init dma_alloc_init(void)
> -{
> -       pgd_t *pgd;
> -       pud_t *pud;
> -       pmd_t *pmd;
> -       pte_t *pte;
> -       int ret = 0;
> -
> -       do {
> -               pgd = pgd_offset(&init_mm, CONSISTENT_BASE);
> -               pud = pud_alloc(&init_mm, pgd, CONSISTENT_BASE);
> -               pmd = pmd_alloc(&init_mm, pud, CONSISTENT_BASE);
> -               if (!pmd) {
> -                       printk(KERN_ERR "%s: no pmd tables\n", __func__);
> -                       ret = -ENOMEM;
> -                       break;
> -               }
> -               WARN_ON(!pmd_none(*pmd));
> -
> -               pte = pte_alloc_kernel(pmd, CONSISTENT_BASE);
> -               if (!pte) {
> -                       printk(KERN_ERR "%s: no pte tables\n", __func__);
> -                       ret = -ENOMEM;
> -                       break;
> -               }
> -
> -               consistent_pte = pte;
> -       } while (0);
> -
> -       return ret;
> -}
> -
> -core_initcall(dma_alloc_init);
> -
> -/*
>  * make an area consistent.
>  */
>  void __dma_sync(void *vaddr, size_t size, int direction)
> --
> 1.6.0.6
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
>
Josh Boyer - Jan. 12, 2009, 12:47 a.m.
On Sat, Jan 10, 2009 at 05:31:19PM -0700, Grant Likely wrote:
>On Fri, Jan 9, 2009 at 5:58 AM, Ilya Yanok <yanok@emcraft.com> wrote:
>> This patch rewrites consistent dma allocations support to use vmalloc
>> layer to allocate virtual memory space from vmalloc pool and get rid
>> of CONFIG_CONSISTENT_{START,SIZE}.
>
>Impressive patch.  I'll pull it into my tree and see how it works on
>4xx and 5200.

Doing my job for me now?  ;)

>BTW, you can drop all the defconfig updates in this patch.  The old
>config values will just disappear when 'make *_defconfig' is run.
>Putting them in the patch makes it far more likely that it won't apply
>at a later date.

Yes, totally agreed.  I update the 4xx defconfigs every release, so
they will get changed when I do that.

As Ben said, this is probably too late for .29, but definitely seems
like the right way to go.

josh
Benjamin Herrenschmidt - Feb. 4, 2009, 4:43 a.m.
On Fri, 2009-01-09 at 15:58 +0300, Ilya Yanok wrote:
> This patch rewrites consistent dma allocations support to use vmalloc
> layer to allocate virtual memory space from vmalloc pool and get rid
> of CONFIG_CONSISTENT_{START,SIZE}.

So as commented before, please drop the defconfig updates.

I'm happy with the idea but I have a few nits with the implementation:

> -/*
>   * Allocate DMA-coherent memory space and return both the kernel remapped
>   * virtual and bus address for that space.
>   */
> @@ -151,19 +41,17 @@ void *
>  __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
>  {
>  	struct page *page;
> -	struct vm_region *c;
>  	unsigned long order;
> +	void *v;
> +	int i;
> +	struct page *pages[PAGE_ALIGN(size)>>PAGE_SHIFT];

I'm not -too- fan of that page list one the stack up there.

I understand why you don't wantto kmalloc something here etc... but
that's what __vmalloc_area() does and it's somewhat useful to keep track
of the page array that way, it might prove handy in the future.

Might even be worth adding a generic patch to add a VM_COHERENT_DMA flag
so they can be listed as such and make sure you set the "caller" field
yourself with your own caller.

(Hint: look at the output of /proc/vmallocinfo)

Also, the mucking around with PG_Reserved shouldn't be of any use
anymore.

Cheers,
Ben.
Ilya Yanok - Feb. 12, 2009, 5:40 p.m.
Hi Ben,

excuse me for so long time to reply.

Benjamin Herrenschmidt wrote:
>> This patch rewrites consistent dma allocations support to use vmalloc
>> layer to allocate virtual memory space from vmalloc pool and get rid
>> of CONFIG_CONSISTENT_{START,SIZE}.
>>     
>
> So as commented before, please drop the defconfig updates.
>   

Ok.

>> -/*
>>   * Allocate DMA-coherent memory space and return both the kernel remapped
>>   * virtual and bus address for that space.
>>   */
>> @@ -151,19 +41,17 @@ void *
>>  __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
>>  {
>>  	struct page *page;
>> -	struct vm_region *c;
>>  	unsigned long order;
>> +	void *v;
>> +	int i;
>> +	struct page *pages[PAGE_ALIGN(size)>>PAGE_SHIFT];
>>     
>
> I'm not -too- fan of that page list one the stack up there.
>
> I understand why you don't wantto kmalloc something here etc... but
> that's what __vmalloc_area() does and it's somewhat useful to keep track
> of the page array that way, it might prove handy in the future.
>   

I don't like array being on stack too... But I fear I didn't understand
what were you talking about here...
__vmalloc_area does kmalloc or vmalloc to allocate pages array and then
allocates pages one by one but we need physically contiguous pages
here... (And that is why we don't really need to store pages array)
So I just added kmalloc/vmalloc to allocate the pages array and stored
it in vm_struct structure.

> Might even be worth adding a generic patch to add a VM_COHERENT_DMA flag
> so they can be listed as such and make sure you set the "caller" field
> yourself with your own caller.
>   
I used __builtin_return_address(1) as the 'caller' so I get useful
output in /proc/vmallocinfo (btw, ioremap doesn't provide useful 'caller').
Do you think we have high chances of such a patch being accepted in
lkml? Well, I'll try to do this (for now I stick with VM_IOREMAP).

> (Hint: look at the output of /proc/vmallocinfo)
>
> Also, the mucking around with PG_Reserved shouldn't be of any use
> anymore.
>   
Ok, removed.

Please review the updated patch (I'll post it as a followup).

Regards, Ilya.
Benjamin Herrenschmidt - Feb. 12, 2009, 8:41 p.m.
> btw, ioremap doesn't provide useful 'caller').

I fixed that :-) (see patches I posted to the list, though that's
waiting for a patch to go upstream first that adds a
__get_vm_area_caller() that I need for ppc64).

Cheers,
Ben.
Ilya Yanok - Feb. 12, 2009, 9:03 p.m.
Hi Ben,

Benjamin Herrenschmidt wrote:
>> btw, ioremap doesn't provide useful 'caller').
>>     
>
> I fixed that :-) (see patches I posted to the list, though that's
> waiting for a patch to go upstream first that adds a
> __get_vm_area_caller() that I need for ppc64).
>   

Yep, I saw them. Btw, I've posted update consistent memory patch in a
new thread please take a look.

Regards, Ilya.

Patch

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 525c13a..a451a06 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -777,31 +777,6 @@  config TASK_SIZE
 	default "0x80000000" if PPC_PREP || PPC_8xx
 	default "0xc0000000"
 
-config CONSISTENT_START_BOOL
-	bool "Set custom consistent memory pool address"
-	depends on ADVANCED_OPTIONS && NOT_COHERENT_CACHE
-	help
-	  This option allows you to set the base virtual address
-	  of the consistent memory pool.  This pool of virtual
-	  memory is used to make consistent memory allocations.
-
-config CONSISTENT_START
-	hex "Base virtual address of consistent memory pool" if CONSISTENT_START_BOOL
-	default "0xfd000000" if (NOT_COHERENT_CACHE && 8xx)
-	default "0xff100000" if NOT_COHERENT_CACHE
-
-config CONSISTENT_SIZE_BOOL
-	bool "Set custom consistent memory pool size"
-	depends on ADVANCED_OPTIONS && NOT_COHERENT_CACHE
-	help
-	  This option allows you to set the size of the
-	  consistent memory pool.  This pool of virtual memory
-	  is used to make consistent memory allocations.
-
-config CONSISTENT_SIZE
-	hex "Size of consistent memory pool" if CONSISTENT_SIZE_BOOL
-	default "0x00200000" if NOT_COHERENT_CACHE
-
 config PIN_TLB
 	bool "Pinned Kernel TLBs (860 ONLY)"
 	depends on ADVANCED_OPTIONS && 8xx
diff --git a/arch/powerpc/configs/40x/acadia_defconfig b/arch/powerpc/configs/40x/acadia_defconfig
index 25572cc..ea5d89c 100644
--- a/arch/powerpc/configs/40x/acadia_defconfig
+++ b/arch/powerpc/configs/40x/acadia_defconfig
@@ -265,8 +265,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/40x/ep405_defconfig b/arch/powerpc/configs/40x/ep405_defconfig
index b80ba7a..1f3ebea 100644
--- a/arch/powerpc/configs/40x/ep405_defconfig
+++ b/arch/powerpc/configs/40x/ep405_defconfig
@@ -267,8 +267,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/40x/hcu4_defconfig b/arch/powerpc/configs/40x/hcu4_defconfig
index 45dcb82..bfb010d 100644
--- a/arch/powerpc/configs/40x/hcu4_defconfig
+++ b/arch/powerpc/configs/40x/hcu4_defconfig
@@ -265,8 +265,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/40x/kilauea_defconfig b/arch/powerpc/configs/40x/kilauea_defconfig
index e2f3695..40e181f 100644
--- a/arch/powerpc/configs/40x/kilauea_defconfig
+++ b/arch/powerpc/configs/40x/kilauea_defconfig
@@ -265,8 +265,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/40x/makalu_defconfig b/arch/powerpc/configs/40x/makalu_defconfig
index 413c778..bb2c4ae 100644
--- a/arch/powerpc/configs/40x/makalu_defconfig
+++ b/arch/powerpc/configs/40x/makalu_defconfig
@@ -265,8 +265,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/40x/virtex_defconfig b/arch/powerpc/configs/40x/virtex_defconfig
index 9a9350d..d082d98 100644
--- a/arch/powerpc/configs/40x/virtex_defconfig
+++ b/arch/powerpc/configs/40x/virtex_defconfig
@@ -273,8 +273,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/40x/walnut_defconfig b/arch/powerpc/configs/40x/walnut_defconfig
index 5820e0a..c1c37eb 100644
--- a/arch/powerpc/configs/40x/walnut_defconfig
+++ b/arch/powerpc/configs/40x/walnut_defconfig
@@ -268,8 +268,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/arches_defconfig b/arch/powerpc/configs/44x/arches_defconfig
index 082158d..2784aa4 100644
--- a/arch/powerpc/configs/44x/arches_defconfig
+++ b/arch/powerpc/configs/44x/arches_defconfig
@@ -272,8 +272,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/bamboo_defconfig b/arch/powerpc/configs/44x/bamboo_defconfig
index f47c2f3..4821b4f 100644
--- a/arch/powerpc/configs/44x/bamboo_defconfig
+++ b/arch/powerpc/configs/44x/bamboo_defconfig
@@ -276,8 +276,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/canyonlands_defconfig b/arch/powerpc/configs/44x/canyonlands_defconfig
index 0694756..be68259 100644
--- a/arch/powerpc/configs/44x/canyonlands_defconfig
+++ b/arch/powerpc/configs/44x/canyonlands_defconfig
@@ -272,8 +272,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/ebony_defconfig b/arch/powerpc/configs/44x/ebony_defconfig
index c993757..8e0ce20 100644
--- a/arch/powerpc/configs/44x/ebony_defconfig
+++ b/arch/powerpc/configs/44x/ebony_defconfig
@@ -274,8 +274,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/katmai_defconfig b/arch/powerpc/configs/44x/katmai_defconfig
index e326ee8..d1767b4 100644
--- a/arch/powerpc/configs/44x/katmai_defconfig
+++ b/arch/powerpc/configs/44x/katmai_defconfig
@@ -270,8 +270,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/rainier_defconfig b/arch/powerpc/configs/44x/rainier_defconfig
index 927f829..fb1309f 100644
--- a/arch/powerpc/configs/44x/rainier_defconfig
+++ b/arch/powerpc/configs/44x/rainier_defconfig
@@ -274,8 +274,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/sam440ep_defconfig b/arch/powerpc/configs/44x/sam440ep_defconfig
index 15f48e0..79ded88 100644
--- a/arch/powerpc/configs/44x/sam440ep_defconfig
+++ b/arch/powerpc/configs/44x/sam440ep_defconfig
@@ -275,8 +275,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/sequoia_defconfig b/arch/powerpc/configs/44x/sequoia_defconfig
index 562beea..ef65b9f 100644
--- a/arch/powerpc/configs/44x/sequoia_defconfig
+++ b/arch/powerpc/configs/44x/sequoia_defconfig
@@ -276,8 +276,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/taishan_defconfig b/arch/powerpc/configs/44x/taishan_defconfig
index 427bb6a..6e97ae9 100644
--- a/arch/powerpc/configs/44x/taishan_defconfig
+++ b/arch/powerpc/configs/44x/taishan_defconfig
@@ -274,8 +274,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/virtex5_defconfig b/arch/powerpc/configs/44x/virtex5_defconfig
index 7513d36..5b2ccd6 100644
--- a/arch/powerpc/configs/44x/virtex5_defconfig
+++ b/arch/powerpc/configs/44x/virtex5_defconfig
@@ -278,8 +278,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/44x/warp_defconfig b/arch/powerpc/configs/44x/warp_defconfig
index 59cbd27..126be06 100644
--- a/arch/powerpc/configs/44x/warp_defconfig
+++ b/arch/powerpc/configs/44x/warp_defconfig
@@ -266,8 +266,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/adder875_defconfig b/arch/powerpc/configs/adder875_defconfig
index 024f279..f5e50c0 100644
--- a/arch/powerpc/configs/adder875_defconfig
+++ b/arch/powerpc/configs/adder875_defconfig
@@ -265,8 +265,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0x80000000
-CONFIG_CONSISTENT_START=0xfd000000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/c2k_defconfig b/arch/powerpc/configs/c2k_defconfig
index 5078594..b877f07 100644
--- a/arch/powerpc/configs/c2k_defconfig
+++ b/arch/powerpc/configs/c2k_defconfig
@@ -307,8 +307,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/ep88xc_defconfig b/arch/powerpc/configs/ep88xc_defconfig
index 870d289..8aacae7 100644
--- a/arch/powerpc/configs/ep88xc_defconfig
+++ b/arch/powerpc/configs/ep88xc_defconfig
@@ -265,8 +265,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0x80000000
-CONFIG_CONSISTENT_START=0xfd000000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/mgsuvd_defconfig b/arch/powerpc/configs/mgsuvd_defconfig
index fbaa67f..0da7b58 100644
--- a/arch/powerpc/configs/mgsuvd_defconfig
+++ b/arch/powerpc/configs/mgsuvd_defconfig
@@ -262,8 +262,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0x80000000
-CONFIG_CONSISTENT_START=0xfd000000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/mpc866_ads_defconfig b/arch/powerpc/configs/mpc866_ads_defconfig
index 8272b1a..e16bd69 100644
--- a/arch/powerpc/configs/mpc866_ads_defconfig
+++ b/arch/powerpc/configs/mpc866_ads_defconfig
@@ -262,8 +262,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0x80000000
-CONFIG_CONSISTENT_START=0xfd000000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/mpc885_ads_defconfig b/arch/powerpc/configs/mpc885_ads_defconfig
index a4283b6..0937771 100644
--- a/arch/powerpc/configs/mpc885_ads_defconfig
+++ b/arch/powerpc/configs/mpc885_ads_defconfig
@@ -272,8 +272,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0x80000000
-CONFIG_CONSISTENT_START=0xfd000000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/ppc40x_defconfig b/arch/powerpc/configs/ppc40x_defconfig
index 4256e2c..0cbb6c3 100644
--- a/arch/powerpc/configs/ppc40x_defconfig
+++ b/arch/powerpc/configs/ppc40x_defconfig
@@ -275,8 +275,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/ppc44x_defconfig b/arch/powerpc/configs/ppc44x_defconfig
index cfc94cf..54e5583 100644
--- a/arch/powerpc/configs/ppc44x_defconfig
+++ b/arch/powerpc/configs/ppc44x_defconfig
@@ -286,8 +286,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/configs/prpmc2800_defconfig b/arch/powerpc/configs/prpmc2800_defconfig
index 6046dc0..bb61e21 100644
--- a/arch/powerpc/configs/prpmc2800_defconfig
+++ b/arch/powerpc/configs/prpmc2800_defconfig
@@ -272,8 +272,6 @@  CONFIG_PAGE_OFFSET=0xc0000000
 CONFIG_KERNEL_START=0xc0000000
 CONFIG_PHYSICAL_START=0x00000000
 CONFIG_TASK_SIZE=0xc0000000
-CONFIG_CONSISTENT_START=0xff100000
-CONFIG_CONSISTENT_SIZE=0x00200000
 CONFIG_NET=y
 
 #
diff --git a/arch/powerpc/lib/dma-noncoherent.c b/arch/powerpc/lib/dma-noncoherent.c
index 31734c0..f6c932f 100644
--- a/arch/powerpc/lib/dma-noncoherent.c
+++ b/arch/powerpc/lib/dma-noncoherent.c
@@ -29,121 +29,11 @@ 
 #include <linux/types.h>
 #include <linux/highmem.h>
 #include <linux/dma-mapping.h>
+#include <linux/vmalloc.h>
 
 #include <asm/tlbflush.h>
 
 /*
- * This address range defaults to a value that is safe for all
- * platforms which currently set CONFIG_NOT_COHERENT_CACHE. It
- * can be further configured for specific applications under
- * the "Advanced Setup" menu. -Matt
- */
-#define CONSISTENT_BASE	(CONFIG_CONSISTENT_START)
-#define CONSISTENT_END	(CONFIG_CONSISTENT_START + CONFIG_CONSISTENT_SIZE)
-#define CONSISTENT_OFFSET(x)	(((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT)
-
-/*
- * This is the page table (2MB) covering uncached, DMA consistent allocations
- */
-static pte_t *consistent_pte;
-static DEFINE_SPINLOCK(consistent_lock);
-
-/*
- * VM region handling support.
- *
- * This should become something generic, handling VM region allocations for
- * vmalloc and similar (ioremap, module space, etc).
- *
- * I envisage vmalloc()'s supporting vm_struct becoming:
- *
- *  struct vm_struct {
- *    struct vm_region	region;
- *    unsigned long	flags;
- *    struct page	**pages;
- *    unsigned int	nr_pages;
- *    unsigned long	phys_addr;
- *  };
- *
- * get_vm_area() would then call vm_region_alloc with an appropriate
- * struct vm_region head (eg):
- *
- *  struct vm_region vmalloc_head = {
- *	.vm_list	= LIST_HEAD_INIT(vmalloc_head.vm_list),
- *	.vm_start	= VMALLOC_START,
- *	.vm_end		= VMALLOC_END,
- *  };
- *
- * However, vmalloc_head.vm_start is variable (typically, it is dependent on
- * the amount of RAM found at boot time.)  I would imagine that get_vm_area()
- * would have to initialise this each time prior to calling vm_region_alloc().
- */
-struct vm_region {
-	struct list_head	vm_list;
-	unsigned long		vm_start;
-	unsigned long		vm_end;
-};
-
-static struct vm_region consistent_head = {
-	.vm_list	= LIST_HEAD_INIT(consistent_head.vm_list),
-	.vm_start	= CONSISTENT_BASE,
-	.vm_end		= CONSISTENT_END,
-};
-
-static struct vm_region *
-vm_region_alloc(struct vm_region *head, size_t size, gfp_t gfp)
-{
-	unsigned long addr = head->vm_start, end = head->vm_end - size;
-	unsigned long flags;
-	struct vm_region *c, *new;
-
-	new = kmalloc(sizeof(struct vm_region), gfp);
-	if (!new)
-		goto out;
-
-	spin_lock_irqsave(&consistent_lock, flags);
-
-	list_for_each_entry(c, &head->vm_list, vm_list) {
-		if ((addr + size) < addr)
-			goto nospc;
-		if ((addr + size) <= c->vm_start)
-			goto found;
-		addr = c->vm_end;
-		if (addr > end)
-			goto nospc;
-	}
-
- found:
-	/*
-	 * Insert this entry _before_ the one we found.
-	 */
-	list_add_tail(&new->vm_list, &c->vm_list);
-	new->vm_start = addr;
-	new->vm_end = addr + size;
-
-	spin_unlock_irqrestore(&consistent_lock, flags);
-	return new;
-
- nospc:
-	spin_unlock_irqrestore(&consistent_lock, flags);
-	kfree(new);
- out:
-	return NULL;
-}
-
-static struct vm_region *vm_region_find(struct vm_region *head, unsigned long addr)
-{
-	struct vm_region *c;
-
-	list_for_each_entry(c, &head->vm_list, vm_list) {
-		if (c->vm_start == addr)
-			goto out;
-	}
-	c = NULL;
- out:
-	return c;
-}
-
-/*
  * Allocate DMA-coherent memory space and return both the kernel remapped
  * virtual and bus address for that space.
  */
@@ -151,19 +41,17 @@  void *
 __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
 {
 	struct page *page;
-	struct vm_region *c;
 	unsigned long order;
+	void *v;
+	int i;
+	struct page *pages[PAGE_ALIGN(size)>>PAGE_SHIFT];
+	struct page *end;
 	u64 mask = 0x00ffffff, limit; /* ISA default */
 
-	if (!consistent_pte) {
-		printk(KERN_ERR "%s: not initialised\n", __func__);
-		dump_stack();
-		return NULL;
-	}
-
+	BUG_ON(!mem_init_done);
 	size = PAGE_ALIGN(size);
 	limit = (mask + 1) & ~mask;
-	if ((limit && size >= limit) || size >= (CONSISTENT_END - CONSISTENT_BASE)) {
+	if (limit && size >= limit) {
 		printk(KERN_WARNING "coherent allocation too big (requested %#x mask %#Lx)\n",
 		       size, mask);
 		return NULL;
@@ -178,6 +66,8 @@  __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
 	if (!page)
 		goto no_page;
 
+	end = page + (1 << order);
+
 	/*
 	 * Invalidate any data that might be lurking in the
 	 * kernel direct-mapped region for device DMA.
@@ -188,45 +78,34 @@  __dma_alloc_coherent(size_t size, dma_addr_t *handle, gfp_t gfp)
 		flush_dcache_range(kaddr, kaddr + size);
 	}
 
+	split_page(page, order);
+
 	/*
-	 * Allocate a virtual address in the consistent mapping region.
+	 * Set the "dma handle"
 	 */
-	c = vm_region_alloc(&consistent_head, size,
-			    gfp & ~(__GFP_DMA | __GFP_HIGHMEM));
-	if (c) {
-		unsigned long vaddr = c->vm_start;
-		pte_t *pte = consistent_pte + CONSISTENT_OFFSET(vaddr);
-		struct page *end = page + (1 << order);
-
-		split_page(page, order);
-
-		/*
-		 * Set the "dma handle"
-		 */
-		*handle = page_to_phys(page);
-
-		do {
-			BUG_ON(!pte_none(*pte));
-
-			SetPageReserved(page);
-			set_pte_at(&init_mm, vaddr,
-				   pte, mk_pte(page, pgprot_noncached(PAGE_KERNEL)));
-			page++;
-			pte++;
-			vaddr += PAGE_SIZE;
-		} while (size -= PAGE_SIZE);
+	*handle = page_to_phys(page);
+	for (i = 0; i < size>>PAGE_SHIFT; i++)
+		pages[i] = page + i;
+	v = vmap(pages, size>>PAGE_SHIFT, VM_IOREMAP,
+			pgprot_noncached(PAGE_KERNEL));
+	if (!v)
+		goto out;
 
-		/*
-		 * Free the otherwise unused pages.
-		 */
-		while (page < end) {
-			__free_page(page);
-			page++;
-		}
+	do {
+		SetPageReserved(page);
+		page++;
+	} while (size -= PAGE_SIZE);
 
-		return (void *)c->vm_start;
+	/*
+	 * Free the otherwise unused pages.
+	 */
+	while (page < end) {
+		__free_page(page);
+		page++;
 	}
 
+	return v;
+     out:
 	if (page)
 		__free_pages(page, order);
  no_page:
@@ -239,105 +118,22 @@  EXPORT_SYMBOL(__dma_alloc_coherent);
  */
 void __dma_free_coherent(size_t size, void *vaddr)
 {
-	struct vm_region *c;
-	unsigned long flags, addr;
-	pte_t *ptep;
+	struct page *page;
 
 	size = PAGE_ALIGN(size);
+	page = vmalloc_to_page(vaddr);
 
-	spin_lock_irqsave(&consistent_lock, flags);
+	vunmap(vaddr);
 
-	c = vm_region_find(&consistent_head, (unsigned long)vaddr);
-	if (!c)
-		goto no_area;
-
-	if ((c->vm_end - c->vm_start) != size) {
-		printk(KERN_ERR "%s: freeing wrong coherent size (%ld != %d)\n",
-		       __func__, c->vm_end - c->vm_start, size);
-		dump_stack();
-		size = c->vm_end - c->vm_start;
-	}
-
-	ptep = consistent_pte + CONSISTENT_OFFSET(c->vm_start);
-	addr = c->vm_start;
 	do {
-		pte_t pte = ptep_get_and_clear(&init_mm, addr, ptep);
-		unsigned long pfn;
-
-		ptep++;
-		addr += PAGE_SIZE;
-
-		if (!pte_none(pte) && pte_present(pte)) {
-			pfn = pte_pfn(pte);
-
-			if (pfn_valid(pfn)) {
-				struct page *page = pfn_to_page(pfn);
-				ClearPageReserved(page);
-
-				__free_page(page);
-				continue;
-			}
-		}
-
-		printk(KERN_CRIT "%s: bad page in kernel page table\n",
-		       __func__);
+		ClearPageReserved(page);
+		__free_page(page);
+		page++;
 	} while (size -= PAGE_SIZE);
-
-	flush_tlb_kernel_range(c->vm_start, c->vm_end);
-
-	list_del(&c->vm_list);
-
-	spin_unlock_irqrestore(&consistent_lock, flags);
-
-	kfree(c);
-	return;
-
- no_area:
-	spin_unlock_irqrestore(&consistent_lock, flags);
-	printk(KERN_ERR "%s: trying to free invalid coherent area: %p\n",
-	       __func__, vaddr);
-	dump_stack();
 }
 EXPORT_SYMBOL(__dma_free_coherent);
 
 /*
- * Initialise the consistent memory allocation.
- */
-static int __init dma_alloc_init(void)
-{
-	pgd_t *pgd;
-	pud_t *pud;
-	pmd_t *pmd;
-	pte_t *pte;
-	int ret = 0;
-
-	do {
-		pgd = pgd_offset(&init_mm, CONSISTENT_BASE);
-		pud = pud_alloc(&init_mm, pgd, CONSISTENT_BASE);
-		pmd = pmd_alloc(&init_mm, pud, CONSISTENT_BASE);
-		if (!pmd) {
-			printk(KERN_ERR "%s: no pmd tables\n", __func__);
-			ret = -ENOMEM;
-			break;
-		}
-		WARN_ON(!pmd_none(*pmd));
-
-		pte = pte_alloc_kernel(pmd, CONSISTENT_BASE);
-		if (!pte) {
-			printk(KERN_ERR "%s: no pte tables\n", __func__);
-			ret = -ENOMEM;
-			break;
-		}
-
-		consistent_pte = pte;
-	} while (0);
-
-	return ret;
-}
-
-core_initcall(dma_alloc_init);
-
-/*
  * make an area consistent.
  */
 void __dma_sync(void *vaddr, size_t size, int direction)