Skip to content

Commit

Permalink
lib: freertos: Add support for A72 and A78
Browse files Browse the repository at this point in the history
Enable A72 and A78 build in BSP for FreeRTOS OS.

Signed-off-by: Ben Levinsky <ben.levinsky@amd.com>
  • Loading branch information
bentheredonethat committed Sep 12, 2023
1 parent d17b4fa commit c2a1f59
Show file tree
Hide file tree
Showing 9 changed files with 208 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lib/system/freertos/xlnx_common/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,8 @@ collect (PROJECT_LIB_HEADERS sys.h)

collect (PROJECT_LIB_SOURCES irq.c)

if ("${PROJECT_MACHINE}" STREQUAL "zynqmp_a53" OR "${PROJECT_MACHINE}" STREQUAL "zynqmp_a72" OR "${PROJECT_MACHINE}" STREQUAL "zynqmp_a78")
add_subdirectory(zynqmp_aarch64)
endif ("${PROJECT_MACHINE}" STREQUAL "zynqmp_a53" OR "${PROJECT_MACHINE}" STREQUAL "zynqmp_a72" OR "${PROJECT_MACHINE}" STREQUAL "zynqmp_a78")

# vim: expandtab:ts=2:sw=2:smartindent
3 changes: 3 additions & 0 deletions lib/system/freertos/xlnx_common/zynqmp_aarch64/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
collect (PROJECT_LIB_HEADERS sys.h)
collect (PROJECT_LIB_SOURCES sys.c)
# vim: expandtab:ts=2:sw=2:smartindent
115 changes: 115 additions & 0 deletions lib/system/freertos/xlnx_common/zynqmp_aarch64/sys.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
/*
* Copyright (c) 2023 Advanced Micro Devices, Inc. All Rights Reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

/*
* @file freertos/xlnx_common/zynqmp_aarch64/sys.c
* @brief machine specific system primitives implementation.
*/

#include <metal/compiler.h>
#include <metal/io.h>
#include <metal/sys.h>
#include <metal/utilities.h>
#include <stdint.h>
#include "xil_cache.h"
#include "xil_exception.h"
#include "xil_mmu.h"
#include "xscugic.h"

/* System Device Tree (SDT) flow does not have the files generated. */
#ifndef SDT

#ifdef VERSAL_NET
#include "xcpu_cortexa78.h"
#elif defined(versal)
#include "xcpu_cortexa72.h"
#else
#include "xreg_cortexa53.h"
#endif /* defined(versal) */

#endif /* !SDT */

void sys_irq_restore_enable(unsigned int flags)
{
Xil_ExceptionEnableMask(~flags);
}

unsigned int sys_irq_save_disable(void)
{
unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;

if (state != XIL_EXCEPTION_ALL)
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);

return state;
}

void metal_machine_cache_flush(void *addr, unsigned int len)
{
if (!addr || !len)
Xil_DCacheFlush();
else
Xil_DCacheFlushRange((intptr_t)addr, len);
}

void metal_machine_cache_invalidate(void *addr, unsigned int len)
{
if (!addr || !len)
Xil_DCacheInvalidate();
else
Xil_DCacheInvalidateRange((intptr_t)addr, len);
}

/**
* @brief poll function until some event happens
*/
inline void metal_weak metal_freertos_default_poll(void)
{
metal_asm volatile("wfi");
}

/* TODO: document functionality of this function. */
void *metal_machine_io_mem_map(void *va, metal_phys_addr_t pa,
size_t size, unsigned int flags)
{
unsigned long section_offset;
unsigned long ttb_addr;
#if defined(__aarch64__)
unsigned long ttb_size = (pa < 4 * GB) ? 2 * MB : 1 * GB;
#else
unsigned long ttb_size = 1 * MB;
#endif /* defined(__aarch64__) */

if (!flags)
return va;

/* Ensure alignment on a section boundary */
pa &= ~(ttb_size - 1UL);

/*
* Loop through entire region of memory (one MMU section at a time).
* Each section requires a TTB entry.
*/
for (section_offset = 0; section_offset < size; ) {
/* Calculate translation table entry for this memory section */
ttb_addr = (pa + section_offset);

/* Write translation table entry value to entry address */
Xil_SetTlbAttributes(ttb_addr, flags);

#if defined(__aarch64__)
/*
* recalculate if we started below 4GB and going above in
* 64bit mode
*/
if (ttb_addr >= 4 * GB)
ttb_size = 1 * GB;
#endif
section_offset += ttb_size;
}

return va;
}
46 changes: 46 additions & 0 deletions lib/system/freertos/xlnx_common/zynqmp_aarch64/sys.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (c) 2023, Xilinx Inc. and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

/*
* @file freertps/xlnx_common/zynqmp_aarch64/sys.h
* @brief freertos zynqmp_aarch64 system primitives for libmetal.
*/

#ifndef __METAL_FREERTOS_SYS__H__
#error "Include metal/sys.h instead of metal/freertos/@PROJECT_MACHINE@/sys.h"
#endif

#include <metal/system/@PROJECT_SYSTEM@/xlnx_common/sys.h>
#include "xscugic.h"

#ifndef __METAL_FREERTOS_ZYNQMP_XLNX_COMMON_AARCH64_SYS__H__
#define __METAL_FREERTOS_ZYNQMP_XLNX_COMMON_AARCH64_SYS__H__

#ifdef __cplusplus
extern "C" {
#endif

#ifdef METAL_INTERNAL

#define XLNX_MAXIRQS XSCUGIC_MAX_NUM_INTR_INPUTS

static inline void sys_irq_enable(unsigned int vector)
{
XScuGic_EnableIntr(XPAR_SCUGIC_0_DIST_BASEADDR, vector);
}

static inline void sys_irq_disable(unsigned int vector)
{
XScuGic_DisableIntr(XPAR_SCUGIC_0_DIST_BASEADDR, vector);
}

#endif /* METAL_INTERNAL */

#ifdef __cplusplus
}
#endif

#endif /* __METAL_FREERTOS_ZYNQMP_XLNX_COMMON_AARCH64_SYS__H__ */
4 changes: 4 additions & 0 deletions lib/system/freertos/zynqmp_a72/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
collect (PROJECT_LIB_HEADERS sys.h)

add_subdirectory(../xlnx_common ${CMAKE_CURRENT_BINARY_DIR}/../xlnx_common)
# vim: expandtab:ts=2:sw=2:smartindent
16 changes: 16 additions & 0 deletions lib/system/freertos/zynqmp_a72/sys.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright (c) 2023, Xilinx Inc. and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

/*
* @file freertos/zynqmp_a72/sys.h
* @brief freertos zynqmp_a72 system primitives for libmetal.
*/

/*
* The header file is still required as freertos/sys.h expects
* "./@PROJECT_MACHINE@/sys.h" to still exist.
*/
#include <metal/system/@PROJECT_SYSTEM@/xlnx_common/zynqmp_aarch64/sys.h>
3 changes: 3 additions & 0 deletions lib/system/freertos/zynqmp_a78/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
collect (PROJECT_LIB_HEADERS sys.h)

add_subdirectory(../xlnx_common ${CMAKE_CURRENT_BINARY_DIR}/../xlnx_common)
16 changes: 16 additions & 0 deletions lib/system/freertos/zynqmp_a78/sys.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright (c) 2023 Advanced Micro Devices, Inc. All Rights Reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

/*
* @file freertos/zynqmp_a78/sys.h
* @brief freertos zynqmp_a78 system primitives for libmetal.
*/

/*
* The header file is still required as freertos/sys.h expects
* "./@PROJECT_MACHINE@/sys.h" to still exist.
*/
#include <metal/system/@PROJECT_SYSTEM@/xlnx_common/zynqmp_aarch64/sys.h>
1 change: 1 addition & 0 deletions lib/system/generic/xlnx_common/zynqmp_aarch64/sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <metal/compiler.h>
#include <metal/io.h>
#include <metal/sys.h>
#include <metal/utilities.h>
#include <stdint.h>
#include "xil_cache.h"
#include "xil_exception.h"
Expand Down

0 comments on commit c2a1f59

Please sign in to comment.