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