summaryrefslogtreecommitdiffstats
path: root/bsps/arm/raspberrypi/start/bspgetworkarea.c
blob: 4b2f440183e8a95ca0aaa370e1257481f008c88d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
 * @file
 *
 * @ingroup arm_start
 *
 * @brief Raspberry pi workarea initialization.
 */

/*
 * COPYRIGHT (c) 1989-2008.
 * On-Line Applications Research Corporation (OAR).
 *
 * Copyright (c) 2011-2012 embedded brains GmbH.
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.org/license/LICENSE.
 *
 * Copyright (c) 2015 YANG Qiao
 *
 * Code is based on c/src/lib/libbsp/shared/bspgetworkarea.c
 */

#include <string.h>
#include <bsp.h>
#include <bsp/bootcard.h>
#include <bsp/vc.h>

#if defined(HAS_UBOOT) && !defined(BSP_DISABLE_UBOOT_WORK_AREA_CONFIG)
  #define USE_UBOOT
#endif

/*
 *  These are provided by the linkcmds for ALL of the BSPs which use this file.
 */
extern char WorkAreaBase[];

/*
 *  We may get the size information from U-Boot or the linker scripts.
 */
#ifdef USE_UBOOT
  #include <bsp/u-boot.h>
#else
  extern char RamBase[];
  extern char RamSize[];
#endif

void bsp_work_area_initialize(void)
{
  uintptr_t work_base = (uintptr_t) WorkAreaBase;
  uintptr_t ram_end;
  bcm2835_get_vc_memory_entries vc_entry;
  /*
   * bcm2835_get_arm_memory_entries arm_entry;
   * is another alternative how to obtain usable memory size
   */

  #ifdef USE_UBOOT
    ram_end = (uintptr_t) bsp_uboot_board_info.bi_memstart +
                          bsp_uboot_board_info.bi_memsize;
  #else
    ram_end = (uintptr_t)RamBase + (uintptr_t)RamSize;
  #endif

  memset( &vc_entry, 0, sizeof(vc_entry) );
  if (bcm2835_mailbox_get_vc_memory( &vc_entry ) >= 0) {
    if (vc_entry.base > 10 * 1024 *1024)
      ram_end = ram_end > vc_entry.base? vc_entry.base: ram_end;
  }
  bsp_work_area_initialize_default( (void *) work_base, ram_end - work_base );
}