ext: libmetal: Update import of libmetal from b4b5bea to a4f7630
Pull in a more recent version of libmetal, motivated by the void pointer fixes in efc33fe. libmetal's b4b5bea to a4f7630 spans: a4f7630 linux: device: fix max chars to copy for the dev name 10a0d5b lib: system: freertos: mutex: change to use atomic_int ... 4e670c5 ci: Zephyr env var for toolchain 3bef6f0 cmake: Fix Zephyr library integration 13158c3 compiler: add IAR compiler file 0820a2e microblaze: suppress io 64-bit R/W access if 64 bit atomic ... e2e5608 io: suppress io 64 bit R/W access if 64 bit atomic not ... efc33fe io: fix compilation error for void pointers. 32ad1d2 cache: fix compilation issue c1ade0d travis CI: update Zephyr SDK version to 0.9.3 c49d7cd travis CI: updated arm compiler ubuntu package d279a6a travis ci: Update FreeRTOS download path 5c70105 irq: update sys_irq_restore_enable and sys_irq_save_disable 05f0cd4 cmake: Only look for doxygen package if docs enabled b4b5bea zephyr: Introduce WITH_ZEPHYR_LIB option At current time of writing, libmetal's HEAD is 5bc2106641. However this failed to build in their Travis CI. The latest passing commit is a4f7630. Signed-off-by: Mark Ruvald Pedersen <mped@oticon.com>
This commit is contained in:
parent
3a8e37caae
commit
6a3552433a
27 changed files with 145 additions and 160 deletions
|
@ -4,10 +4,8 @@ libmetal
|
||||||
Origin:
|
Origin:
|
||||||
https://github.com/OpenAMP/libmetal
|
https://github.com/OpenAMP/libmetal
|
||||||
|
|
||||||
Status:
|
Import instructions:
|
||||||
b4b5beab4b71388d63c732470b6d6da606ae8ffc
|
When we import libmetal we remove the tests/ and examples/ dir to reduce
|
||||||
|
|
||||||
When we import libmetal we removed the tests/ and examples/ dir to reduce
|
|
||||||
the amount of code imported.
|
the amount of code imported.
|
||||||
|
|
||||||
Purpose:
|
Purpose:
|
||||||
|
@ -29,7 +27,7 @@ URL:
|
||||||
https://github.com/OpenAMP/libmetal
|
https://github.com/OpenAMP/libmetal
|
||||||
|
|
||||||
commit:
|
commit:
|
||||||
b4b5beab4b71388d63c732470b6d6da606ae8ffc
|
a4f763094cb26cd8f7abdff251f57a6a802c039d
|
||||||
|
|
||||||
Maintained-by:
|
Maintained-by:
|
||||||
External
|
External
|
||||||
|
|
|
@ -8,14 +8,15 @@ dist: trusty
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- ZEPHYR_GCC_VARIANT=zephyr
|
- ZEPHYR_TOOLCHAIN_VARIANT=zephyr
|
||||||
- ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk
|
- ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk
|
||||||
- ZEPHYR_BASE=$TRAVIS_BUILD_DIR/deps/zephyr
|
- ZEPHYR_BASE=$TRAVIS_BUILD_DIR/deps/zephyr
|
||||||
- ZEPHYR_SDK_VERSION=0.9.2
|
- ZEPHYR_SDK_VERSION=0.9.3
|
||||||
- ZEPHYR_SDK_DOWNLOAD_FOLDER=https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/$ZEPHYR_SDK_VERSION
|
- ZEPHYR_SDK_DOWNLOAD_FOLDER=https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/$ZEPHYR_SDK_VERSION
|
||||||
- ZEPHYR_SDK_SETUP_BINARY=zephyr-sdk-$ZEPHYR_SDK_VERSION-setup.run
|
- ZEPHYR_SDK_SETUP_BINARY=zephyr-sdk-$ZEPHYR_SDK_VERSION-setup.run
|
||||||
- ZEPHYR_SDK_DOWNLOAD_URL=$ZEPHYR_SDK_DOWNLOAD_FOLDER/$ZEPHYR_SDK_SETUP_BINARY
|
- ZEPHYR_SDK_DOWNLOAD_URL=$ZEPHYR_SDK_DOWNLOAD_FOLDER/$ZEPHYR_SDK_SETUP_BINARY
|
||||||
- FREERTOS_ZIP_URL=https://downloads.sourceforge.net/project/freertos/FreeRTOS/V10.0.1/FreeRTOSv10.0.1.zip
|
- FREERTOS_ZIP_URL=https://cfhcable.dl.sourceforge.net/project/freertos/FreeRTOS/V10.0.1/FreeRTOSv10.0.1.zip
|
||||||
|
- GCC_ARM_COMPILER_PACKAGE=gcc-arm-embedded_7-2018q2-1~trusty1_amd64.deb
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
|
@ -47,8 +48,8 @@ before_install:
|
||||||
fi
|
fi
|
||||||
# This is to kick start CI on generic platform. Will need to have a proper way to get the required packages
|
# This is to kick start CI on generic platform. Will need to have a proper way to get the required packages
|
||||||
- if [[ "$TARGET" == "generic" || "$TARGET" == "freertos" ]]; then
|
- if [[ "$TARGET" == "generic" || "$TARGET" == "freertos" ]]; then
|
||||||
wget http://ppa.launchpad.net/team-gcc-arm-embedded/ppa/ubuntu/pool/main/g/gcc-arm-none-eabi/gcc-arm-embedded_7-2017q4-1~trusty3_amd64.deb &&
|
wget http://ppa.launchpad.net/team-gcc-arm-embedded/ppa/ubuntu/pool/main/g/gcc-arm-none-eabi/${GCC_ARM_COMPILER_PACKAGE} &&
|
||||||
sudo dpkg -i gcc-arm-embedded_7-2017q4-1~trusty3_amd64.deb;
|
sudo dpkg -i ${GCC_ARM_COMPILER_PACKAGE};
|
||||||
fi
|
fi
|
||||||
- if [[ "$TARGET" == "freertos" ]]; then
|
- if [[ "$TARGET" == "freertos" ]]; then
|
||||||
wget $FREERTOS_ZIP_URL &&
|
wget $FREERTOS_ZIP_URL &&
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
find_package (Doxygen)
|
if (WITH_DOC)
|
||||||
|
find_package (Doxygen)
|
||||||
|
endif (WITH_DOC)
|
||||||
|
|
||||||
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
|
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ endif (WITH_DEFAULT_LOGGER)
|
||||||
if (WITH_ZEPHYR)
|
if (WITH_ZEPHYR)
|
||||||
zephyr_library_named(metal)
|
zephyr_library_named(metal)
|
||||||
add_dependencies(metal offsets_h)
|
add_dependencies(metal offsets_h)
|
||||||
target_sources (metal PRIVATE ${_sources})
|
zephyr_library_sources(${_sources})
|
||||||
zephyr_include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
|
zephyr_include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
|
||||||
else (WITH_ZEPHYR)
|
else (WITH_ZEPHYR)
|
||||||
# Build a shared library if so configured.
|
# Build a shared library if so configured.
|
||||||
|
|
|
@ -32,7 +32,7 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
static inline void metal_cache_flush(void *addr, unsigned int len)
|
static inline void metal_cache_flush(void *addr, unsigned int len)
|
||||||
{
|
{
|
||||||
return __metal_cache_flush(addr, len);
|
__metal_cache_flush(addr, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,7 +45,7 @@ static inline void metal_cache_flush(void *addr, unsigned int len)
|
||||||
*/
|
*/
|
||||||
static inline void metal_cache_invalidate(void *addr, unsigned int len)
|
static inline void metal_cache_invalidate(void *addr, unsigned int len)
|
||||||
{
|
{
|
||||||
return __metal_cache_invalidate(addr, len);
|
__metal_cache_invalidate(addr, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
# include <metal/compiler/gcc/compiler.h>
|
# include <metal/compiler/gcc/compiler.h>
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
# include <metal/compiler/iar/compiler.h>
|
||||||
#else
|
#else
|
||||||
# error "Missing compiler support"
|
# error "Missing compiler support"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
add_subdirectory (gcc)
|
add_subdirectory (gcc)
|
||||||
|
add_subdirectory (iar)
|
||||||
|
|
||||||
# vim: expandtab:ts=2:sw=2:smartindent
|
# vim: expandtab:ts=2:sw=2:smartindent
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
collect (PROJECT_LIB_HEADERS compiler.h)
|
||||||
|
|
||||||
|
# vim: expandtab:ts=2:sw=2:smartindent
|
27
ext/hal/libmetal/libmetal/lib/compiler/iar/compiler.h
Normal file
27
ext/hal/libmetal/libmetal/lib/compiler/iar/compiler.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ST Microelectronics. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @file iar/compiler.h
|
||||||
|
* @brief IAR specific primitives for libmetal.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __METAL_IAR_COMPILER__H__
|
||||||
|
#define __METAL_IAR_COMPILER__H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define restrict __restrict__
|
||||||
|
#define metal_align(n) __attribute__((aligned(n)))
|
||||||
|
#define metal_weak __attribute__((weak))
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __METAL_IAR_COMPILER__H__ */
|
|
@ -33,7 +33,8 @@ void metal_io_init(struct metal_io_region *io, void *virt,
|
||||||
int metal_io_block_read(struct metal_io_region *io, unsigned long offset,
|
int metal_io_block_read(struct metal_io_region *io, unsigned long offset,
|
||||||
void *restrict dst, int len)
|
void *restrict dst, int len)
|
||||||
{
|
{
|
||||||
void *ptr = metal_io_virt(io, offset);
|
unsigned char *ptr = metal_io_virt(io, offset);
|
||||||
|
unsigned char *dest = dst;
|
||||||
int retlen;
|
int retlen;
|
||||||
|
|
||||||
if (offset > io->size)
|
if (offset > io->size)
|
||||||
|
@ -47,20 +48,20 @@ int metal_io_block_read(struct metal_io_region *io, unsigned long offset,
|
||||||
} else {
|
} else {
|
||||||
atomic_thread_fence(memory_order_seq_cst);
|
atomic_thread_fence(memory_order_seq_cst);
|
||||||
while ( len && (
|
while ( len && (
|
||||||
((uintptr_t)dst % sizeof(int)) ||
|
((uintptr_t)dest % sizeof(int)) ||
|
||||||
((uintptr_t)ptr % sizeof(int)))) {
|
((uintptr_t)ptr % sizeof(int)))) {
|
||||||
*(unsigned char *)dst =
|
*(unsigned char *)dest =
|
||||||
*(const unsigned char *)ptr;
|
*(const unsigned char *)ptr;
|
||||||
dst++;
|
dest++;
|
||||||
ptr++;
|
ptr++;
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
for (; len >= (int)sizeof(int); dst += sizeof(int),
|
for (; len >= (int)sizeof(int); dest += sizeof(int),
|
||||||
ptr += sizeof(int),
|
ptr += sizeof(int),
|
||||||
len -= sizeof(int))
|
len -= sizeof(int))
|
||||||
*(unsigned int *)dst = *(const unsigned int *)ptr;
|
*(unsigned int *)dest = *(const unsigned int *)ptr;
|
||||||
for (; len != 0; dst++, ptr++, len--)
|
for (; len != 0; dest++, ptr++, len--)
|
||||||
*(unsigned char *)dst =
|
*(unsigned char *)dest =
|
||||||
*(const unsigned char *)ptr;
|
*(const unsigned char *)ptr;
|
||||||
}
|
}
|
||||||
return retlen;
|
return retlen;
|
||||||
|
@ -69,7 +70,8 @@ int metal_io_block_read(struct metal_io_region *io, unsigned long offset,
|
||||||
int metal_io_block_write(struct metal_io_region *io, unsigned long offset,
|
int metal_io_block_write(struct metal_io_region *io, unsigned long offset,
|
||||||
const void *restrict src, int len)
|
const void *restrict src, int len)
|
||||||
{
|
{
|
||||||
void *ptr = metal_io_virt(io, offset);
|
unsigned char *ptr = metal_io_virt(io, offset);
|
||||||
|
const unsigned char *source = src;
|
||||||
int retlen;
|
int retlen;
|
||||||
|
|
||||||
if (offset > io->size)
|
if (offset > io->size)
|
||||||
|
@ -83,20 +85,20 @@ int metal_io_block_write(struct metal_io_region *io, unsigned long offset,
|
||||||
} else {
|
} else {
|
||||||
while ( len && (
|
while ( len && (
|
||||||
((uintptr_t)ptr % sizeof(int)) ||
|
((uintptr_t)ptr % sizeof(int)) ||
|
||||||
((uintptr_t)src % sizeof(int)))) {
|
((uintptr_t)source % sizeof(int)))) {
|
||||||
*(unsigned char *)ptr =
|
*(unsigned char *)ptr =
|
||||||
*(const unsigned char *)src;
|
*(const unsigned char *)source;
|
||||||
ptr++;
|
ptr++;
|
||||||
src++;
|
source++;
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
for (; len >= (int)sizeof(int); ptr += sizeof(int),
|
for (; len >= (int)sizeof(int); ptr += sizeof(int),
|
||||||
src += sizeof(int),
|
source += sizeof(int),
|
||||||
len -= sizeof(int))
|
len -= sizeof(int))
|
||||||
*(unsigned int *)ptr = *(const unsigned int *)src;
|
*(unsigned int *)ptr = *(const unsigned int *)source;
|
||||||
for (; len != 0; ptr++, src++, len--)
|
for (; len != 0; ptr++, source++, len--)
|
||||||
*(unsigned char *)ptr =
|
*(unsigned char *)ptr =
|
||||||
*(const unsigned char *)src;
|
*(const unsigned char *)source;
|
||||||
atomic_thread_fence(memory_order_seq_cst);
|
atomic_thread_fence(memory_order_seq_cst);
|
||||||
}
|
}
|
||||||
return retlen;
|
return retlen;
|
||||||
|
@ -105,7 +107,7 @@ int metal_io_block_write(struct metal_io_region *io, unsigned long offset,
|
||||||
int metal_io_block_set(struct metal_io_region *io, unsigned long offset,
|
int metal_io_block_set(struct metal_io_region *io, unsigned long offset,
|
||||||
unsigned char value, int len)
|
unsigned char value, int len)
|
||||||
{
|
{
|
||||||
void *ptr = metal_io_virt(io, offset);
|
unsigned char *ptr = metal_io_virt(io, offset);
|
||||||
int retlen = len;
|
int retlen = len;
|
||||||
|
|
||||||
if (offset > io->size)
|
if (offset > io->size)
|
||||||
|
|
|
@ -233,12 +233,9 @@ metal_io_read(struct metal_io_region *io, unsigned long offset,
|
||||||
return atomic_load_explicit((atomic_uint *)ptr, order);
|
return atomic_load_explicit((atomic_uint *)ptr, order);
|
||||||
else if (ptr && sizeof(atomic_ulong) == width)
|
else if (ptr && sizeof(atomic_ulong) == width)
|
||||||
return atomic_load_explicit((atomic_ulong *)ptr, order);
|
return atomic_load_explicit((atomic_ulong *)ptr, order);
|
||||||
else if (ptr && sizeof(atomic_ullong) == width)
|
|
||||||
#ifndef NO_ATOMIC_64_SUPPORT
|
#ifndef NO_ATOMIC_64_SUPPORT
|
||||||
|
else if (ptr && sizeof(atomic_ullong) == width)
|
||||||
return atomic_load_explicit((atomic_ullong *)ptr, order);
|
return atomic_load_explicit((atomic_ullong *)ptr, order);
|
||||||
|
|
||||||
#else
|
|
||||||
return metal_processor_io_read64((atomic_ullong *)ptr, order);
|
|
||||||
#endif
|
#endif
|
||||||
metal_assert(0);
|
metal_assert(0);
|
||||||
return 0; /* quiet compiler */
|
return 0; /* quiet compiler */
|
||||||
|
@ -269,11 +266,9 @@ metal_io_write(struct metal_io_region *io, unsigned long offset,
|
||||||
atomic_store_explicit((atomic_uint *)ptr, value, order);
|
atomic_store_explicit((atomic_uint *)ptr, value, order);
|
||||||
else if (ptr && sizeof(atomic_ulong) == width)
|
else if (ptr && sizeof(atomic_ulong) == width)
|
||||||
atomic_store_explicit((atomic_ulong *)ptr, value, order);
|
atomic_store_explicit((atomic_ulong *)ptr, value, order);
|
||||||
else if (ptr && sizeof(atomic_ullong) == width)
|
|
||||||
#ifndef NO_ATOMIC_64_SUPPORT
|
#ifndef NO_ATOMIC_64_SUPPORT
|
||||||
|
else if (ptr && sizeof(atomic_ullong) == width)
|
||||||
atomic_store_explicit((atomic_ullong *)ptr, value, order);
|
atomic_store_explicit((atomic_ullong *)ptr, value, order);
|
||||||
#else
|
|
||||||
metal_processor_io_write64((atomic_ullong *)ptr, value, order);
|
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
metal_assert (0);
|
metal_assert (0);
|
||||||
|
|
|
@ -17,28 +17,4 @@
|
||||||
|
|
||||||
#define metal_cpu_yield()
|
#define metal_cpu_yield()
|
||||||
|
|
||||||
static inline void metal_processor_io_write64(void *ptr, uint64_t value,
|
|
||||||
memory_order order)
|
|
||||||
{
|
|
||||||
void *tmp = &value;
|
|
||||||
|
|
||||||
atomic_store_explicit((atomic_ulong *)ptr, *((atomic_ulong *)tmp), order);
|
|
||||||
tmp += sizeof(atomic_ulong);
|
|
||||||
ptr += sizeof(atomic_ulong);
|
|
||||||
atomic_store_explicit((atomic_ulong *)ptr, *((atomic_ulong *)tmp), order);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint64_t metal_processor_io_read64(void *ptr, memory_order order)
|
|
||||||
{
|
|
||||||
uint64_t long_ret;
|
|
||||||
void *tmp = &long_ret;
|
|
||||||
|
|
||||||
*((atomic_ulong *)tmp) = atomic_load_explicit((atomic_ulong *)ptr, order);
|
|
||||||
tmp += sizeof(atomic_ulong);
|
|
||||||
ptr += sizeof(atomic_ulong);
|
|
||||||
*((atomic_ulong *)tmp) = atomic_load_explicit((atomic_ulong *)ptr, order);
|
|
||||||
|
|
||||||
return long_ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __METAL_MICROBLAZE__H__ */
|
#endif /* __METAL_MICROBLAZE__H__ */
|
||||||
|
|
|
@ -234,15 +234,12 @@ int metal_irq_unregister(int irq,
|
||||||
|
|
||||||
unsigned int metal_irq_save_disable(void)
|
unsigned int metal_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
sys_irq_save_disable();
|
return sys_irq_save_disable();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_irq_restore_enable(unsigned int flags)
|
void metal_irq_restore_enable(unsigned int flags)
|
||||||
{
|
{
|
||||||
(void)flags;
|
sys_irq_restore_enable(flags);
|
||||||
|
|
||||||
sys_irq_restore_enable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_irq_enable(unsigned int vector)
|
void metal_irq_enable(unsigned int vector)
|
||||||
|
|
|
@ -16,24 +16,22 @@
|
||||||
#ifndef __METAL_FREERTOS_MUTEX__H__
|
#ifndef __METAL_FREERTOS_MUTEX__H__
|
||||||
#define __METAL_FREERTOS_MUTEX__H__
|
#define __METAL_FREERTOS_MUTEX__H__
|
||||||
|
|
||||||
#include <metal/assert.h>
|
#include <metal/atomic.h>
|
||||||
#include "FreeRTOS.h"
|
#include <stdlib.h>
|
||||||
#include "semphr.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SemaphoreHandle_t m;
|
atomic_int v;
|
||||||
} metal_mutex_t;
|
} metal_mutex_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* METAL_MUTEX_INIT - used for initializing an mutex elmenet in a static struct
|
* METAL_MUTEX_INIT - used for initializing an mutex elmenet in a static struct
|
||||||
* or global
|
* or global
|
||||||
*/
|
*/
|
||||||
#define METAL_MUTEX_INIT(m) { NULL }
|
#define METAL_MUTEX_INIT(m) { ATOMIC_VAR_INIT(0) }
|
||||||
/*
|
/*
|
||||||
* METAL_MUTEX_DEFINE - used for defining and initializing a global or
|
* METAL_MUTEX_DEFINE - used for defining and initializing a global or
|
||||||
* static singleton mutex
|
* static singleton mutex
|
||||||
|
@ -42,40 +40,34 @@ typedef struct {
|
||||||
|
|
||||||
static inline void __metal_mutex_init(metal_mutex_t *mutex)
|
static inline void __metal_mutex_init(metal_mutex_t *mutex)
|
||||||
{
|
{
|
||||||
metal_assert(mutex);
|
atomic_store(&mutex->v, 0);
|
||||||
mutex->m = xSemaphoreCreateMutex();
|
|
||||||
metal_assert(mutex->m != NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __metal_mutex_deinit(metal_mutex_t *mutex)
|
static inline void __metal_mutex_deinit(metal_mutex_t *mutex)
|
||||||
{
|
{
|
||||||
metal_assert(mutex && mutex->m != NULL);
|
(void)mutex;
|
||||||
vSemaphoreDelete(mutex->m);
|
|
||||||
mutex->m=NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int __metal_mutex_try_acquire(metal_mutex_t *mutex)
|
static inline int __metal_mutex_try_acquire(metal_mutex_t *mutex)
|
||||||
{
|
{
|
||||||
metal_assert(mutex && mutex->m != NULL);
|
return 1 - atomic_flag_test_and_set(&mutex->v);
|
||||||
return xSemaphoreTake(mutex->m, ( TickType_t ) 0 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __metal_mutex_acquire(metal_mutex_t *mutex)
|
static inline void __metal_mutex_acquire(metal_mutex_t *mutex)
|
||||||
{
|
{
|
||||||
metal_assert(mutex && mutex->m != NULL);
|
while (atomic_flag_test_and_set(&mutex->v)) {
|
||||||
xSemaphoreTake(mutex->m, portMAX_DELAY);
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __metal_mutex_release(metal_mutex_t *mutex)
|
static inline void __metal_mutex_release(metal_mutex_t *mutex)
|
||||||
{
|
{
|
||||||
metal_assert(mutex && mutex->m != NULL);
|
atomic_flag_clear(&mutex->v);
|
||||||
xSemaphoreGive(mutex->m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int __metal_mutex_is_acquired(metal_mutex_t *mutex)
|
static inline int __metal_mutex_is_acquired(metal_mutex_t *mutex)
|
||||||
{
|
{
|
||||||
metal_assert(mutex && mutex->m != NULL);
|
return atomic_load(&mutex->v);
|
||||||
return (NULL == xSemaphoreGetMutexHolder(mutex->m)) ? 0 : 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -38,12 +38,12 @@ struct metal_state {
|
||||||
/**
|
/**
|
||||||
* @brief restore interrupts to state before disable_global_interrupt()
|
* @brief restore interrupts to state before disable_global_interrupt()
|
||||||
*/
|
*/
|
||||||
void sys_irq_restore_enable(void);
|
void sys_irq_restore_enable(unsigned int flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief disable all interrupts
|
* @brief disable all interrupts
|
||||||
*/
|
*/
|
||||||
void sys_irq_save_disable(void);
|
unsigned int sys_irq_save_disable(void);
|
||||||
|
|
||||||
#endif /* METAL_INTERNAL */
|
#endif /* METAL_INTERNAL */
|
||||||
|
|
||||||
|
|
|
@ -14,13 +14,15 @@
|
||||||
#include <metal/utilities.h>
|
#include <metal/utilities.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
void sys_irq_restore_enable(void)
|
void sys_irq_restore_enable(unsigned int flags)
|
||||||
{
|
{
|
||||||
|
metal_unused(flags);
|
||||||
/* Add implementation here */
|
/* Add implementation here */
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
|
return 0;
|
||||||
/* Add implementation here */
|
/* Add implementation here */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,21 +28,19 @@
|
||||||
/* Mask off lower bits of addr */
|
/* Mask off lower bits of addr */
|
||||||
#define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL))
|
#define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL))
|
||||||
|
|
||||||
/* default value setting for disabling interrupts */
|
void sys_irq_restore_enable(unsigned int flags)
|
||||||
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
|
|
||||||
|
|
||||||
void sys_irq_restore_enable(void)
|
|
||||||
{
|
{
|
||||||
Xil_ExceptionEnableMask(~int_old_val);
|
Xil_ExceptionEnableMask(~flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL;
|
unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
|
||||||
|
|
||||||
if (XIL_EXCEPTION_ALL != int_old_val) {
|
if (XIL_EXCEPTION_ALL != state) {
|
||||||
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
||||||
}
|
}
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_machine_cache_flush(void *addr, unsigned int len)
|
void metal_machine_cache_flush(void *addr, unsigned int len)
|
||||||
|
|
|
@ -22,21 +22,19 @@
|
||||||
#define MB (1024 * 1024UL)
|
#define MB (1024 * 1024UL)
|
||||||
#define GB (1024 * 1024 * 1024UL)
|
#define GB (1024 * 1024 * 1024UL)
|
||||||
|
|
||||||
/* default value setting for disabling interrupts */
|
void sys_irq_restore_enable(unsigned int flags)
|
||||||
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
|
|
||||||
|
|
||||||
void sys_irq_restore_enable(void)
|
|
||||||
{
|
{
|
||||||
Xil_ExceptionEnableMask(~int_old_val);
|
Xil_ExceptionEnableMask(~flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL;
|
unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
|
||||||
|
|
||||||
if (XIL_EXCEPTION_ALL != int_old_val) {
|
if (XIL_EXCEPTION_ALL != state) {
|
||||||
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
||||||
}
|
}
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_machine_cache_flush(void *addr, unsigned int len)
|
void metal_machine_cache_flush(void *addr, unsigned int len)
|
||||||
|
|
|
@ -22,21 +22,19 @@
|
||||||
|
|
||||||
#define MPU_REGION_SIZE_MIN 0x20
|
#define MPU_REGION_SIZE_MIN 0x20
|
||||||
|
|
||||||
/* default value setting for disabling interrupts */
|
void sys_irq_restore_enable(unsigned int flags)
|
||||||
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
|
|
||||||
|
|
||||||
void sys_irq_restore_enable(void)
|
|
||||||
{
|
{
|
||||||
Xil_ExceptionEnableMask(~int_old_val);
|
Xil_ExceptionEnableMask(~flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL;
|
unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
|
||||||
|
|
||||||
if (XIL_EXCEPTION_ALL != int_old_val) {
|
if (XIL_EXCEPTION_ALL != state) {
|
||||||
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
||||||
}
|
}
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_machine_cache_flush(void *addr, unsigned int len)
|
void metal_machine_cache_flush(void *addr, unsigned int len)
|
||||||
|
|
|
@ -234,15 +234,12 @@ int metal_irq_unregister(int irq,
|
||||||
|
|
||||||
unsigned int metal_irq_save_disable(void)
|
unsigned int metal_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
sys_irq_save_disable();
|
return sys_irq_save_disable();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_irq_restore_enable(unsigned int flags)
|
void metal_irq_restore_enable(unsigned int flags)
|
||||||
{
|
{
|
||||||
(void)flags;
|
sys_irq_restore_enable(flags);
|
||||||
|
|
||||||
sys_irq_restore_enable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_irq_enable(unsigned int vector)
|
void metal_irq_enable(unsigned int vector)
|
||||||
|
|
|
@ -22,36 +22,36 @@
|
||||||
|
|
||||||
#define MSR_IE 0x2UL /* MicroBlaze status register interrupt enable mask */
|
#define MSR_IE 0x2UL /* MicroBlaze status register interrupt enable mask */
|
||||||
|
|
||||||
static unsigned int int_old_val = 0;
|
|
||||||
|
|
||||||
#if (XPAR_MICROBLAZE_USE_MSR_INSTR != 0)
|
#if (XPAR_MICROBLAZE_USE_MSR_INSTR != 0)
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
|
unsigned int state;
|
||||||
|
|
||||||
asm volatile(" mfs %0, rmsr \n"
|
asm volatile(" mfs %0, rmsr \n"
|
||||||
" msrclr r0, %1 \n"
|
" msrclr r0, %1 \n"
|
||||||
: "=r"(int_old_val)
|
: "=r"(state)
|
||||||
: "i"(MSR_IE)
|
: "i"(MSR_IE)
|
||||||
: "memory");
|
: "memory");
|
||||||
|
|
||||||
int_old_val &= MSR_IE;
|
return state &= MSR_IE;
|
||||||
}
|
}
|
||||||
#else /* XPAR_MICROBLAZE_USE_MSR_INSTR == 0 */
|
#else /* XPAR_MICROBLAZE_USE_MSR_INSTR == 0 */
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
unsigned int tmp;
|
unsigned int tmp, state;
|
||||||
|
|
||||||
asm volatile (" mfs %0, rmsr \n"
|
asm volatile (" mfs %0, rmsr \n"
|
||||||
" andi %1, %0, %2 \n"
|
" andi %1, %0, %2 \n"
|
||||||
" mts rmsr, %1 \n"
|
" mts rmsr, %1 \n"
|
||||||
: "=r"(int_old_val), "=r"(tmp)
|
: "=r"(state), "=r"(tmp)
|
||||||
: "i"(~MSR_IE)
|
: "i"(~MSR_IE)
|
||||||
: "memory");
|
: "memory");
|
||||||
|
|
||||||
int_old_val &= MSR_IE;
|
return state &= MSR_IE;
|
||||||
}
|
}
|
||||||
#endif /* XPAR_MICROBLAZE_USE_MSR_INSTR */
|
#endif /* XPAR_MICROBLAZE_USE_MSR_INSTR */
|
||||||
|
|
||||||
void sys_irq_restore_enable(void)
|
void sys_irq_restore_enable(unsigned int flags)
|
||||||
{
|
{
|
||||||
unsigned int tmp;
|
unsigned int tmp;
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ void sys_irq_restore_enable(void)
|
||||||
" or %0, %0, %1 \n"
|
" or %0, %0, %1 \n"
|
||||||
" mts rmsr, %0 \n"
|
" mts rmsr, %0 \n"
|
||||||
: "=r"(tmp)
|
: "=r"(tmp)
|
||||||
: "r"(int_old_val)
|
: "r"(~flags)
|
||||||
: "memory");
|
: "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,12 +47,12 @@ struct metal_state {
|
||||||
/**
|
/**
|
||||||
* @brief restore interrupts to state before disable_global_interrupt()
|
* @brief restore interrupts to state before disable_global_interrupt()
|
||||||
*/
|
*/
|
||||||
void sys_irq_restore_enable(void);
|
void sys_irq_restore_enable(unsigned int flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief disable all interrupts
|
* @brief disable all interrupts
|
||||||
*/
|
*/
|
||||||
void sys_irq_save_disable(void);
|
unsigned int sys_irq_save_disable(void);
|
||||||
|
|
||||||
#endif /* METAL_INTERNAL */
|
#endif /* METAL_INTERNAL */
|
||||||
|
|
||||||
|
|
|
@ -14,13 +14,15 @@
|
||||||
#include <metal/utilities.h>
|
#include <metal/utilities.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
void sys_irq_restore_enable(void)
|
void sys_irq_restore_enable(unsigned int flags)
|
||||||
{
|
{
|
||||||
|
metal_unused(flags);
|
||||||
/* Add implementation here */
|
/* Add implementation here */
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
|
return 0;
|
||||||
/* Add implementation here */
|
/* Add implementation here */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,21 +25,19 @@
|
||||||
/* Mask off lower bits of addr */
|
/* Mask off lower bits of addr */
|
||||||
#define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL))
|
#define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL))
|
||||||
|
|
||||||
/* default value setting for disabling interrupts */
|
void sys_irq_restore_enable(unsigned int flags)
|
||||||
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
|
|
||||||
|
|
||||||
void sys_irq_restore_enable(void)
|
|
||||||
{
|
{
|
||||||
Xil_ExceptionEnableMask(~int_old_val);
|
Xil_ExceptionEnableMask(~flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL;
|
unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
|
||||||
|
|
||||||
if (XIL_EXCEPTION_ALL != int_old_val) {
|
if (XIL_EXCEPTION_ALL != state) {
|
||||||
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
||||||
}
|
}
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_machine_cache_flush(void *addr, unsigned int len)
|
void metal_machine_cache_flush(void *addr, unsigned int len)
|
||||||
|
|
|
@ -22,21 +22,19 @@
|
||||||
#define MB (1024 * 1024UL)
|
#define MB (1024 * 1024UL)
|
||||||
#define GB (1024 * 1024 * 1024UL)
|
#define GB (1024 * 1024 * 1024UL)
|
||||||
|
|
||||||
/* default value setting for disabling interrupts */
|
void sys_irq_restore_enable(unsigned int flags)
|
||||||
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
|
|
||||||
|
|
||||||
void sys_irq_restore_enable(void)
|
|
||||||
{
|
{
|
||||||
Xil_ExceptionEnableMask(~int_old_val);
|
Xil_ExceptionEnableMask(~flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL;
|
unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
|
||||||
|
|
||||||
if (XIL_EXCEPTION_ALL != int_old_val) {
|
if (XIL_EXCEPTION_ALL != state) {
|
||||||
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
||||||
}
|
}
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_machine_cache_flush(void *addr, unsigned int len)
|
void metal_machine_cache_flush(void *addr, unsigned int len)
|
||||||
|
|
|
@ -22,21 +22,19 @@
|
||||||
|
|
||||||
#define MPU_REGION_SIZE_MIN 0x20
|
#define MPU_REGION_SIZE_MIN 0x20
|
||||||
|
|
||||||
/* default value setting for disabling interrupts */
|
void sys_irq_restore_enable(unsigned int flags)
|
||||||
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
|
|
||||||
|
|
||||||
void sys_irq_restore_enable(void)
|
|
||||||
{
|
{
|
||||||
Xil_ExceptionEnableMask(~int_old_val);
|
Xil_ExceptionEnableMask(~flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_irq_save_disable(void)
|
unsigned int sys_irq_save_disable(void)
|
||||||
{
|
{
|
||||||
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL;
|
unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
|
||||||
|
|
||||||
if (XIL_EXCEPTION_ALL != int_old_val) {
|
if (XIL_EXCEPTION_ALL != state) {
|
||||||
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
|
||||||
}
|
}
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void metal_machine_cache_flush(void *addr, unsigned int len)
|
void metal_machine_cache_flush(void *addr, unsigned int len)
|
||||||
|
|
|
@ -430,7 +430,7 @@ static int metal_linux_dev_open(struct metal_bus *bus,
|
||||||
|
|
||||||
/* Reset device data. */
|
/* Reset device data. */
|
||||||
memset(ldev, 0, sizeof(*ldev));
|
memset(ldev, 0, sizeof(*ldev));
|
||||||
strncpy(ldev->dev_name, dev_name, sizeof(ldev->dev_name));
|
strncpy(ldev->dev_name, dev_name, sizeof(ldev->dev_name) - 1);
|
||||||
ldev->fd = -1;
|
ldev->fd = -1;
|
||||||
ldev->ldrv = ldrv;
|
ldev->ldrv = ldrv;
|
||||||
ldev->device.bus = bus;
|
ldev->device.bus = bus;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue