Blame view

common/memsize.c 1.87 KB
c83bf6a2d   wdenk   Add a common get_...
1
2
3
4
  /*
   * (C) Copyright 2004
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
c83bf6a2d   wdenk   Add a common get_...
6
   */
e38661634   York Sun   common: Add get_e...
7
8
9
  #include <common.h>
  
  DECLARE_GLOBAL_DATA_PTR;
91650b3e4   Wolfgang Denk   Sequential access...
10
11
12
13
14
15
16
17
18
  #ifdef __PPC__
  /*
   * At least on G2 PowerPC cores, sequential accesses to non-existent
   * memory must be synchronized.
   */
  # include <asm/io.h>	/* for sync() */
  #else
  # define sync()		/* nothing */
  #endif
c83bf6a2d   wdenk   Add a common get_...
19
20
21
22
23
24
  
  /*
   * Check memory range for valid RAM. A simple memory test determines
   * the actually available RAM size between addresses `base' and
   * `base + maxsize'.
   */
a55d23ccf   Albert ARIBAUD   Remove volatile q...
25
  long get_ram_size(long *base, long maxsize)
c83bf6a2d   wdenk   Add a common get_...
26
27
28
29
30
31
32
  {
  	volatile long *addr;
  	long           save[32];
  	long           cnt;
  	long           val;
  	long           size;
  	int            i = 0;
cc8d698fa   Hans de Goede   Revert "common/me...
33
  	for (cnt = (maxsize / sizeof(long)) >> 1; cnt > 0; cnt >>= 1) {
c83bf6a2d   wdenk   Add a common get_...
34
  		addr = base + cnt;	/* pointer arith! */
95099fee4   Wolfgang Denk   common/memsize.c:...
35
  		sync();
cc8d698fa   Hans de Goede   Revert "common/me...
36
  		save[i++] = *addr;
95099fee4   Wolfgang Denk   common/memsize.c:...
37
  		sync();
cc8d698fa   Hans de Goede   Revert "common/me...
38
  		*addr = ~cnt;
c83bf6a2d   wdenk   Add a common get_...
39
  	}
cc8d698fa   Hans de Goede   Revert "common/me...
40
41
42
43
44
  	addr = base;
  	sync();
  	save[i] = *addr;
  	sync();
  	*addr = 0;
8e7cba048   Eddy PetriČ™or   common/memsize.c:...
45
  	sync();
cc8d698fa   Hans de Goede   Revert "common/me...
46
47
48
49
50
51
52
53
54
55
56
57
58
  	if ((val = *addr) != 0) {
  		/* Restore the original data before leaving the function. */
  		sync();
  		*addr = save[i];
  		for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  			addr  = base + cnt;
  			sync();
  			*addr = save[--i];
  		}
  		return (0);
  	}
  
  	for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
c83bf6a2d   wdenk   Add a common get_...
59
60
  		addr = base + cnt;	/* pointer arith! */
  		val = *addr;
cc8d698fa   Hans de Goede   Revert "common/me...
61
62
  		*addr = save[--i];
  		if (val != ~cnt) {
95099fee4   Wolfgang Denk   common/memsize.c:...
63
64
65
66
  			size = cnt * sizeof(long);
  			/*
  			 * Restore the original data
  			 * before leaving the function.
c83bf6a2d   wdenk   Add a common get_...
67
  			 */
95099fee4   Wolfgang Denk   common/memsize.c:...
68
69
70
  			for (cnt <<= 1;
  			     cnt < maxsize / sizeof(long);
  			     cnt <<= 1) {
c83bf6a2d   wdenk   Add a common get_...
71
  				addr  = base + cnt;
cc8d698fa   Hans de Goede   Revert "common/me...
72
  				*addr = save[--i];
c83bf6a2d   wdenk   Add a common get_...
73
74
75
  			}
  			return (size);
  		}
cc8d698fa   Hans de Goede   Revert "common/me...
76
  	}
c83bf6a2d   wdenk   Add a common get_...
77
78
79
  
  	return (maxsize);
  }
e38661634   York Sun   common: Add get_e...
80
81
82
83
84
85
86
87
88
89
90
  
  phys_size_t __weak get_effective_memsize(void)
  {
  #ifndef CONFIG_VERY_BIG_RAM
  	return gd->ram_size;
  #else
  	/* limit stack to what we can reasonable map */
  	return ((gd->ram_size > CONFIG_MAX_MEM_MAPPED) ?
  		CONFIG_MAX_MEM_MAPPED : gd->ram_size);
  #endif
  }