On Sep 20, 2012, at 5:14 AM, Xie Shaohui-B21989 wrote: >>> On Thu, 2012-08-30 at 15:49 -0500, Kumar Gala wrote: >>>> On Aug 24, 2012, at 5:50 AM, Shaohui Xie wrote: >>>> >>>>> PowerPC platform only supports ZONE_DMA zone for 64bit kernel, so >>>>> all the memory will be put into this zone. If the memory size is >>>>> greater than the device's DMA capability and device uses >>>>> dma_alloc_coherent to allocate memory, it will get an address >>>>> which is over the device's DMA addressing, the device will fail. >>>>> >>>>> So we split the memory to two zones: zone ZONE_DMA32 & >>>>> ZONE_NORMAL, since we already allocate PCICSRBAR/PEXCSRBAR right >>>>> below the 4G boundary (if the lowest PCI address is above 4G), so >>>>> we constrain the DMA zone ZONE_DMA32 to 2GB, also, we clear flag >>>>> __GFP_DMA & >>>>> __GFP_DMA32 and set __GFP_DMA32 only if the device's dma_mask < >>>>> total memory size. By doing this, devices which cannot DMA all the >>>>> memory will be limited to ZONE_DMA32, but devices which can DMA >>>>> all >>> the memory will not be affected by this limitation. >>>>> >>>>> Signed-off-by: Shaohui Xie <shaohui....@freescale.com> >>>>> Signed-off-by: Mingkai Hu <mingkai...@freescale.com> >>>>> Signed-off-by: Chen Yuanquan <b41...@freescale.com> >>>>> --- >>>>> changes for v2: >>>>> 1. use a config option for using two zones (ZONE_DMA32 & >>>>> ZONE_NORMAL) in freescale 64 bit kernel. >>>>> >>> >>> There must have been a misunderstanding. I think this should be a >>> runtime choice, possibly by the platform code. Any reason that can't be >> done ? >>> >> [S.H] Do you mean this: >> >> phys_addr_t platform_dma_size (maybe a default value should be used, then >> platform code will change it) >> >> if (top_of_ram > platform_dma_size) >> max_zone_pfns[ZONE_DMA] = platform_dma_size >> PAGE_SHIFT; else >> max_zone_pfns[ZONE_DMA] = top_of_ram >> PAGE_SHIFT; >> >> max_zone_pfns[ZONE_NORMAL] = top_of_ram >> PAGE_SHIFT; >> >>> Also how does Intel do it ? >> [S.H] below are codes in Intel: >> >> 403 void __init zone_sizes_init(void) >> 404 { >> 405 unsigned long max_zone_pfns[MAX_NR_ZONES]; >> 406 >> 407 memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); >> 408 >> 409 #ifdef CONFIG_ZONE_DMA >> 410 max_zone_pfns[ZONE_DMA] = MAX_DMA_PFN; >> 411 #endif >> 412 #ifdef CONFIG_ZONE_DMA32 >> 413 max_zone_pfns[ZONE_DMA32] = MAX_DMA32_PFN; >> 414 #endif >> 415 max_zone_pfns[ZONE_NORMAL] = max_low_pfn; >> 416 #ifdef CONFIG_HIGHMEM >> 417 max_zone_pfns[ZONE_HIGHMEM] = max_pfn; >> 418 #endif >> 419 >> >> For x86_64, there is no CONFIG_HIGHMEM, so there will be three zones: >> ZONE_DMA/ZONE_DMA32/ZONE_NORMAL. >> > [S.H] Hello, Ben, > > I have some questions, though I'm still expecting your comments. > PPC does not have ZONE_DMA32 by default, if we want to use it, we need to add > "config ZONE_DMA32" in Kconfig first. > If setting multiple zones without ZONE_DMA, kmalloc in > "include/linux/slab_def.h" will fail if it uses flag GFP_DMA. > For the runtime choice in 64-bit kernel, what exactly multiple zones should > be used? > "ZONE_DMA & ZONE_NORMAL" or "ZONE_DMA & ZONE_DMA32 & ZONE_NORMAL"? > Then what the size should be set for them respectively? > > Please comment, Thanks!
I think Ben is saying that Kconfig would enable ZONE_DMA32 for all PPC64, but make it runtime/per platform how we setup the zone's such that either ZONE_DMA32 is set to MAX_DMA32_PFN or it set to same value as ZONE_DMA. However that's just a guess. - k _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev