static int __init mt_mspace_probe(struct platform_device *dev) { struct resource *regs; struct exm_info *info; extmem_printk("[EXT_MEM] probing mt_mspace\n"); info = kzalloc(sizeof(struct exm_info), GFP_KERNEL); if (!info) return -ENOMEM; extmem_init(); info->mem[0].addr = get_max_phys_addr(); info->mem[0].size = extmem_mspace_size; info->mmap = mtk_mspace_mmap_physical; if (!info->mem[0].addr) { dev_err(&dev->dev, "Invalid memory resource\n"); return -ENODEV; } info->version = "0.0.2"; info->name= DEV_DRV_NAME; if (exm_register_device(&dev->dev, info)) { iounmap(info->mem[0].internal_addr); printk("[EXT_MEM] exm_register failed\n"); return -ENODEV; } platform_set_drvdata(dev, info); printk("[EXT_MEM] probing mt_mspace success\n"); return 0; }
static void extmem_init(void) { if (extmem_mspace == NULL) { if (extmem_mspace_size == 0) { size_t extmem_vmalloc_limit = (VMALLOC_TOTAL/3)& ~(0x02000000-1); if (get_max_DRAM_size() < (CONFIG_MAX_DRAM_SIZE_SUPPORT + 0x02000000)) { printk(KERN_ERR "[EXT_MEM] no extmem, get_max_DRAM_size:%p, CONFIG_MAX_DRAM_SIZE_SUPPORT:0x%x, get_max_phys_addr:%p\n", (void *)get_max_DRAM_size(), CONFIG_MAX_DRAM_SIZE_SUPPORT, (void *)get_max_phys_addr()); BUG(); } extmem_mspace_size = get_max_DRAM_size() - CONFIG_MAX_DRAM_SIZE_SUPPORT - 0x02000000; if (extmem_mspace_size > extmem_vmalloc_limit) { printk(KERN_WARNING "[EXT_MEM] extmem_mspace_size: 0x%zx over limit: 0x%zx\n", extmem_mspace_size, extmem_vmalloc_limit); extmem_mspace_size = extmem_vmalloc_limit; } } //extmem_mspace_base = (void*) ioremap(get_max_phys_addr(), extmem_mspace_size); extmem_mspace_base = (void*) ioremap_cached(get_max_phys_addr(), extmem_mspace_size); extmem_mspace = create_mspace_with_base(extmem_mspace_base, extmem_mspace_size, 1); extmem_printk("[EXT_MEM] get_max_DRAM_size:0x%x, CONFIG_MAX_DRAM_SIZE_SUPPORT:0x%x, get_max_phys_addr:%p, extmem_mspace:%p\n", get_max_DRAM_size(), CONFIG_MAX_DRAM_SIZE_SUPPORT, (void *)get_max_phys_addr(), extmem_mspace); } }
static void extmem_init(void) { if (extmem_mspace == NULL) { if (extmem_mspace_size == 0) extmem_mspace_size = get_actual_DRAM_size() - CONFIG_MAX_DRAM_SIZE_SUPPORT; extmem_mspace_base = (void*) ioremap(get_max_phys_addr(), extmem_mspace_size); extmem_mspace = create_mspace_with_base(extmem_mspace_base, extmem_mspace_size, 1); } }
unsigned long get_virt_from_mspace(unsigned long pa) { #ifdef CONFIG_OF extmem_printk("[EXT_MEM] %s pa: 0x%lx extmem_phys_base: %p extmem_mspace_base: %p\n", __FUNCTION__, pa, (void *)extmem_phys_base, extmem_mspace_base); return ( pa - extmem_phys_base + (unsigned long)extmem_mspace_base); #else return ( pa - get_max_phys_addr() + (unsigned long)extmem_mspace_base); #endif }
static unsigned long get_phys_from_mspace(unsigned long va) { #ifdef CONFIG_OF extmem_printk("[EXT_MEM] %s va: 0x%lx extmem_phys_base: %p extmem_mspace_base: %p\n", __FUNCTION__, va, (void *)extmem_phys_base, extmem_mspace_base); return ( va - (unsigned long)extmem_mspace_base + extmem_phys_base); #else return ( va - (unsigned long)extmem_mspace_base + get_max_phys_addr()); #endif }
static void extmem_init(void) { if (extmem_mspace == NULL) { if (extmem_mspace_size == 0) { // 0x9E000000 is the spare address extmem_mspace_size = get_actual_DRAM_size() - CONFIG_MAX_DRAM_SIZE_SUPPORT - 0x02000000; } //extmem_mspace_base = (void*) ioremap(get_max_phys_addr(), extmem_mspace_size); extmem_mspace_base = (void*) ioremap_cached(get_max_phys_addr(), extmem_mspace_size); extmem_mspace = create_mspace_with_base(extmem_mspace_base, extmem_mspace_size, 1); //printk(KERN_ERR "[LCH_DEBUG]get_actual_DRAM_size:0x%x, CONFIG_MAX_DRAM_SIZE_SUPPORT:0x%x, get_max_phys_addr:0x%x, extmem_mspace:0x%x\n", // get_actual_DRAM_size(), CONFIG_MAX_DRAM_SIZE_SUPPORT, get_max_phys_addr(), extmem_mspace); } }
unsigned long get_virt_from_mspace(unsigned long pa) { return ( pa - get_max_phys_addr() + (unsigned long)extmem_mspace_base ); }
static unsigned long get_phys_from_mspace(unsigned long va) { return ( va - (unsigned long)extmem_mspace_base + get_max_phys_addr()); }