1/* 2 * 3 * 4 * 5 * 6 */ 7#include <linux/types.h> 8#include <linux/kernel.h> 9#include <linux/string.h> 10#include <linux/module.h> 11#include <asm/io.h> 12#include "utils.h" 13 14 15#define miu_chan_cfg(x) ((volatile unsigned long *)(0xbff40000+x*4)) /* for andros */ 16 17int mbsize[8] = {1,2,4,8,16,32,64,128}; 18 19unsigned long get_mem_avail(void) { 20 21 unsigned long cfg[10],i,total_mem=0; 22 23 for(i=0;i<10;i++) 24 cfg[i] = *miu_chan_cfg(i); 25 26 for(i=0;i<10;i++){ 27 if(cfg[i]==0x1fc160c2) continue; // skip empties 28 if( ( (cfg[i]>>12) & 0xf ) <= 0xb ) continue; // skip roms 29 total_mem += mbsize[(cfg[i]>>16)&0x7] *1024*1024; 30 } 31 return total_mem; 32} 33 34 35 36 37static ulong* buffer_ptr = NULL; 38static ulong buffer_size = 0; 39 40ulong* get_reserved_buffer(void) {return KSEG0ADDR(buffer_ptr);} 41ulong* get_reserved_buffer_virtual(void) {return (ulong*)ReservedMemVirtualAddr;} 42ulong get_reserved_buffer_size(void) {return buffer_size;} 43 44#define MIN_GEN_MEM (4 << 20) 45 46 47void reserve_buffer(const char* cl, ulong base_mem) 48{ 49 char* pos = strstr(cl, "reserved_buffer="); 50 if (pos) { 51 buffer_size = simple_strtol(pos+strlen("reserved_buffer="), 52 0, 10); 53 buffer_size <<= 20; 54 if (buffer_size + MIN_GEN_MEM > base_mem) 55 buffer_size = base_mem - MIN_GEN_MEM; 56 if (buffer_size > 0) 57 buffer_ptr = (ulong*)(base_mem - buffer_size); 58 else 59 buffer_size = 0; 60 } 61} 62 63 64 65EXPORT_SYMBOL(get_reserved_buffer); 66EXPORT_SYMBOL(get_reserved_buffer_virtual); 67EXPORT_SYMBOL(get_reserved_buffer_size); 68 69 70