Changeset d3f60af in rtems


Ignore:
Timestamp:
03/02/17 14:25:34 (7 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
5, master
Children:
c0dafd7b
Parents:
35136d3
Message:

bsp/qoriq: Adjust workspace according to FDT

Location:
c/src/lib/libbsp/powerpc/qoriq
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/powerpc/qoriq/Makefile.am

    r35136d3 rd3f60af  
    5858        ../../shared/gnatinstallhandler.c \
    5959        ../../shared/bspclean.c \
    60         ../../shared/bspgetworkarea.c \
    6160        ../../shared/src/bsp-fdt.c \
    6261        ../shared/src/ppc-exc-handler-table.c \
  • c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c

    r35136d3 rd3f60af  
    88
    99/*
    10  * Copyright (c) 2011-2015 embedded brains GmbH.  All rights reserved.
     10 * Copyright (c) 2011, 2017 embedded brains GmbH.  All rights reserved.
    1111 *
    1212 *  embedded brains GmbH
     
    2222
    2323#include <bsp.h>
     24#include <bsp/bootcard.h>
     25#include <bsp/fdt.h>
     26#include <bsp/linker-symbols.h>
    2427#include <bsp/mmu.h>
    25 #include <bsp/linker-symbols.h>
    2628#include <bsp/qoriq.h>
     29
     30#include <sys/param.h>
     31
     32#include <libfdt.h>
     33
     34#include <rtems/config.h>
    2735
    2836#define TEXT __attribute__((section(".bsp_start_text")))
     
    96104}
    97105
    98 static const entry DATA config [] = {
     106#define WORKSPACE_ENTRY_INDEX 0
     107
     108static entry DATA config[] = {
     109        /* Must be first entry, see WORKSPACE_ENTRY_INDEX */
     110        ENTRY_RW(bsp_section_work_begin, bsp_section_work_size),
     111
    99112        #if defined(RTEMS_MULTIPROCESSING) && \
    100113            defined(QORIQ_INTERCOM_AREA_BEGIN) && \
     
    120133        ENTRY_RW(bsp_section_bss_begin, bsp_section_bss_size),
    121134        ENTRY_RW(bsp_section_rwextra_begin, bsp_section_rwextra_size),
    122         ENTRY_RW(bsp_section_work_begin, bsp_section_work_size),
    123135        ENTRY_RW(bsp_section_stack_begin, bsp_section_stack_size),
    124136        ENTRY_IO(bsp_section_nocache_begin, bsp_section_nocache_size),
     
    135147};
    136148
     149static DATA char memory_path[] = "/memory";
     150
     151static void TEXT config_fdt_adjust(void)
     152{
     153        const void *fdt = bsp_fdt_get();
     154        int node;
     155
     156        node = fdt_path_offset_namelen(
     157                fdt,
     158                memory_path,
     159                (int) sizeof(memory_path) - 1
     160        );
     161
     162        if (node >= 0) {
     163                int len;
     164                const void *val;
     165                uint64_t begin;
     166                uint64_t size;
     167
     168                val = fdt_getprop(fdt, node, "reg", &len);
     169                if (len == 8) {
     170                        begin = fdt32_to_cpu(((fdt32_t *) val)[0]);
     171                        size = fdt32_to_cpu(((fdt32_t *) val)[1]);
     172                } else if (len == 16) {
     173                        begin = fdt64_to_cpu(((fdt64_t *) val)[0]);
     174                        size = fdt64_to_cpu(((fdt64_t *) val)[1]);
     175                } else {
     176                        begin = 0;
     177                        size = 0;
     178                }
     179
     180                size = MAX(size, 0x80000000U);
     181
     182                if (begin == 0 && size > (uintptr_t) bsp_section_work_end) {
     183                        config[WORKSPACE_ENTRY_INDEX].size += (uintptr_t) size
     184                                - (uintptr_t) bsp_section_work_end;
     185                }
     186        }
     187}
     188
    137189void TEXT qoriq_mmu_config(int first_tlb, int scratch_tlb)
    138190{
     
    140192        int i = 0;
    141193
     194        config_fdt_adjust();
    142195        qoriq_mmu_context_init(&context);
    143196
     
    166219        qoriq_mmu_write_to_tlb1(&context, first_tlb);
    167220}
     221
     222void TEXT bsp_work_area_initialize(void)
     223{
     224        const entry *we = &config[WORKSPACE_ENTRY_INDEX];
     225        uintptr_t begin = we->begin;
     226        uintptr_t end = begin + we->size;
     227
     228#ifdef BSP_INTERRUPT_STACK_AT_WORK_AREA_BEGIN
     229        begin += rtems_configuration_get_interrupt_stack_size();
     230#endif
     231
     232        bsp_work_area_initialize_default((void *) begin, end - begin);
     233}
Note: See TracChangeset for help on using the changeset viewer.