/**--------------------------------------------------------------------------------**\ \**--------------------------------------------------------------------------------**/ #include #include #include static unsigned long c55_mem_start; static unsigned long c55_code_start; /*--- extern unsigned long _text, _stext, _etext, _sdata, _end; ---*/ #define ALIGN_16MBYTE(addr) ((addr) & ~((16 * SZ_1M) - 1)) /*--------------------------------------------------------------------------------*\ \*--------------------------------------------------------------------------------*/ static int var_is_in_area(unsigned long test, unsigned long range_min, unsigned long range_max) { if((test >= range_min) && (test < range_max)) { return 1; } return 0; } #define EXTERNAL_MEMORY_START 0xf00000 /*--------------------------------------------------------------------------------*\ * keine Ueberschneidung mit Kernel! * * <------> * C55-Adressraum (24 Bit): * * external SRAM 0xf00000 - 0xf30000-1 (0x30000) * reserved * Programcode 0xFF0000 - 0xfffFE00-1 (0x00FE00) ((1 << 24) - CONFIG_ARM_PUMA_C55_MEMORY) * Checkarea 0xFFFE00 - 0xFFFF00-1 (0x000100) * Vector 0xFFFF00 - 0xFFFFFF (0x000100) \*--------------------------------------------------------------------------------*/ struct resource *puma_alloc_c55_code(unsigned long ramstart, unsigned long ramend) { #if defined(CONFIG_ARM_PUMA_C55_MEMORY) && (CONFIG_ARM_PUMA_C55_MEMORY != 0) static struct resource c55_pram; unsigned long c55_codesize = SZ_1K * CONFIG_ARM_PUMA_C55_MEMORY; unsigned long c55_size = (1 << 24) - EXTERNAL_MEMORY_START; unsigned long kcode_start = virt_to_phys(_text); unsigned long kcode_end = virt_to_phys(_etext - 1); unsigned long kdata_start = virt_to_phys(_sdata); unsigned long kdata_end = virt_to_phys(_end - 1); ramstart = ALIGN_16MBYTE(ramstart + (16 * SZ_1M)); c55_mem_start = 0; printk("[c55] kcode_start = 0x%lx kcode_end 0x%lx kdata_start 0x%lx kdata_end 0x%lx\n", kcode_start, kcode_end, kdata_start, kdata_end); while(ramstart < ramend) { c55_mem_start = ramstart - c55_size; c55_code_start = ramstart - c55_codesize; printk(KERN_ERR"[c55] ramend %lx ramstart %lx c55_mem_start %lx\n", ramend, ramstart, c55_mem_start); if(!var_is_in_area(c55_mem_start, kcode_start, kcode_end) && !var_is_in_area(c55_mem_start + c55_size, kcode_start, kcode_end) && !var_is_in_area(c55_mem_start, kdata_start, kdata_end) && !var_is_in_area(c55_mem_start + c55_size, kdata_start, kdata_end)) { break; } ramstart += (16 * SZ_1M); c55_mem_start = 0; c55_code_start = 0; } if(c55_mem_start) { printk(KERN_ERR"[c55] c55_mem_start = 0x%lx c55_code_start= 0x%lx\n", c55_mem_start, c55_code_start); c55_pram.name = "c55 text"; c55_pram.start = c55_mem_start; c55_pram.end = c55_pram.start + c55_size - 1; c55_pram.flags = IORESOURCE_MEM | IORESOURCE_BUSY; return &c55_pram; } #endif/*--- #if defined(CONFIG_ARM_PUMA_C55_MEMORY) && (CONFIG_ARM_PUMA_C55_MEMORY != 0) ---*/ return NULL; } /*--------------------------------------------------------------------------------*\ \*--------------------------------------------------------------------------------*/ int prom_c55_get_base_memory(unsigned int *base, unsigned int *len) { #if defined(CONFIG_ARM_PUMA_C55_MEMORY) #define ARM_PUMA_C55_MEMORY CONFIG_ARM_PUMA_C55_MEMORY #else /*--- #if defined(CONFIG_ARM_PUMA_C55_MEMORY) ---*/ #define ARM_PUMA_C55_MEMORY 0 #endif/*--- #else ---*//*--- #if defined(CONFIG_ARM_PUMA_C55_MEMORY) ---*/ if(len)*len = ARM_PUMA_C55_MEMORY * SZ_1K; if(base)*base = c55_code_start; return 0; } EXPORT_SYMBOL(prom_c55_get_base_memory); /**--------------------------------------------------------------------------------**\ \**--------------------------------------------------------------------------------**/ int prom_c55_get_external_sram(unsigned int *base, unsigned int *len){ #if defined(CONFIG_ARM_PUMA_C55_MEMORY) if(len)*len = 192 * SZ_1K; if(base)*base = c55_mem_start; #else /*--- #if defined(CONFIG_ARM_PUMA_C55_MEMORY) ---*/ if(len)*len = 0; if(base)*base = 0; #endif/*--- #else ---*//*--- #if defined(CONFIG_ARM_PUMA_C55_MEMORY) ---*/ return 0; } EXPORT_SYMBOL(prom_c55_get_external_sram);