summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/gen5200/bestcomm
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-11-15 10:55:02 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-11-15 10:55:02 +0000
commitddd5640ff64895e7d937bf69d8d8f8ffc507aad9 (patch)
treee05873b61dbe6b17b253c92f3d74dfbacb34aa9a /c/src/lib/libbsp/powerpc/gen5200/bestcomm
parent2010-11-12 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-ddd5640ff64895e7d937bf69d8d8f8ffc507aad9.tar.bz2
2010-11-12 Sebastian Huber <sebastian.huber@embedded-brains.de>
* make/custom/dp2.cfg, startup/linkcmds.dp2: New files. * Makefile.am, preinstall.am: Reflect change above. Install <bsp/utility.h>. Install BestComm header files. * configure.ac: Changed BSP options. * include/mpc5200.h: Added module structures and register defines. * bestcomm/bestcomm_api.c, bestcomm/bestcomm_api.h, bestcomm/bestcomm_glue.c, bestcomm/bestcomm_glue.h, bestcomm/bestcomm_priv.h, bestcomm/load_task.c, bestcomm/tasksetup_bdtable.c, bestcomm/task_api/bestcomm_cntrl.h: C++ compatibility. Use special heap to manage the SRAM region. Use interrupt extension API. Fixed warnings. * console/console.c: Fixed console registration. Fixed warnings. Added GPS module registration. * ide/pcmcia_ide.h: Fixed clock value macros. * ide/pcmcia_ide.c: Update for BestComm API changes. DP2 specific initialization. Removed zero loop in PIO receive function. * include/bsp.h: Added DP2 variant. Removed obsolete defines. * include/mscan-base.h, mscan/mscan-base.c: Use volatile qualifier. Format. * irq/irq.c: Fixed peripheral interrupt handling. * network_5200/network.c: Update for BestComm API changes. * start/start.S: U-Boot fixes. * startup/cpuinit.c: Enable write-back cache strategy. Added special memory regions. * startup/linkcmds.brs5l: Fixed memory size.
Diffstat (limited to 'c/src/lib/libbsp/powerpc/gen5200/bestcomm')
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.c47
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.h21
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c116
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.h18
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_priv.h1
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/bestcomm/load_task.c2
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/bestcomm/task_api/bestcomm_cntrl.h54
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/bestcomm/tasksetup_bdtable.c41
8 files changed, 138 insertions, 162 deletions
diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.c b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.c
index 42488cb87b..171882b803 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.c
+++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.c
@@ -70,11 +70,6 @@ uint8 *MBarGlobal;
sint64 MBarPhysOffsetGlobal;
/*
- * Offset to free space in SRAM after task code and buffer descriptors.
- */
-uint32 SramOffsetGlobal = 0;
-
-/*
* This flag is false when TaskStart() has not yet been called on a
* task newly configured by TaskSetup() or TaskStop() has been called.
* Otherwise it is true. It is possible that a task disabled itself
@@ -185,48 +180,6 @@ int TasksAttachImage(sdma_regs *sdma)
}
/*!
- * \brief This function returns the value of the internal variable
- * used to keep track of used space in SRAM.
- *
- * \returns The number of bytes from the beginning of SRAM to the end
- * used space in the SRAM.
- *
- * This function will return the offset to free space in the SRAM
- * not used by the CAPI. \b Note: The returned value is based
- * on what is in TasksSetSramOffset. This function can
- * not determine what SRAM space was used by another process. There must
- * be some way external to the CAPI to keep track of SRAM space. This
- * function only returns the internal variable used to keep track of buffer
- * descriptors.
- */
-uint32 TasksGetSramOffset(void)
-{
- return SramOffsetGlobal;
-}
-
-/*!
- * \brief This function stores the number of bytes from the
- * beginning of SRAM to the end of the used space.
- *
- * \param sram_offset Number of bytes until the beginning of
- * free space in the SRAM.
- *
- * This function sets the free space offset in SRAM. It must be called
- * before setup in multi-task environments. It is the application's
- * job to determine where the free space in SRAM is. This sets the
- * base offset for the buffer descriptor variables during setup, so to
- * deallocate buffers that have already been set this function should be
- * called with a new offset.
- */
-void TasksSetSramOffset(uint32 sram_offset)
-{
- /*
- * Set the SramOffsetGlobal variable to be used by TaskSetup_BDTable
- */
- SramOffsetGlobal = sram_offset;
-}
-
-/*!
* \brief Start an initialized task running.
* \param taskId Task handle passed back from a successful TaskSetup()
* \param autoStartEnable Boolean for whether autostart bit is enabled.
diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.h b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.h
index f4dfa68fde..f1fa22d1d5 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.h
+++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_api.h
@@ -36,12 +36,18 @@
* linked.
*/
+#include <rtems.h>
+
#include "include/ppctypes.h"
#include "include/mgt5200/sdma.h"
#include "task_api/tasksetup_bdtable.h"
#include "task_api/bestcomm_cntrl.h"
#include "task_api/bestcomm_api_mem.h"
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
/*!
* \brief TaskSetup() debugging
*
@@ -271,8 +277,10 @@ typedef struct {
* TaskId TaskSetup( TaskName_t TaskName,
* TaskSetupParamSet_t *TaskSetupParams );
*/
-#define TaskSetup(TaskName, TaskSetupParams) \
+#define TaskSetupHelper(TaskName, TaskSetupParams) \
TaskSetup_ ## TaskName (TaskName ## _api, TaskSetupParams)
+#define TaskSetup(TaskName, TaskSetupParams) \
+ TaskSetupHelper(TaskName, TaskSetupParams)
const char *TaskVersion(void);
@@ -283,9 +291,6 @@ int TasksInitAPI_VM(uint8 *MBarRef, uint8 *MBarPhys);
void TasksLoadImage(sdma_regs *sdma);
int TasksAttachImage(sdma_regs *sdma);
-uint32 TasksGetSramOffset(void);
-void TasksSetSramOffset(uint32 sram_offset);
-
int TaskStart(TaskId taskId, uint32 autoStartEnable,
TaskId autoStartTask, uint32 intrEnable);
int TaskStop(TaskId taskId);
@@ -327,7 +332,7 @@ static inline int TaskStatus(TaskId taskId)
*/
static inline TaskBD_t *TaskGetBD(TaskId taskId, BDIdx bd)
{
- TaskBD_t *bdTab;
+ void *bdTab;
bdTab = TaskBDIdxTable[taskId].BDTablePtr;
if (TaskBDIdxTable[taskId].numPtr == 1) {
@@ -350,7 +355,7 @@ static inline TaskBD_t *TaskGetBD(TaskId taskId, BDIdx bd)
*/
static inline TaskBD_t *TaskGetBDRing(TaskId taskId)
{
- return TaskBDIdxTable[taskId].BDTablePtr;
+ return (TaskBD_t *) TaskBDIdxTable[taskId].BDTablePtr;
}
/*!
@@ -448,4 +453,8 @@ static inline uint16 TaskBDInUse(TaskId taskId)
return TaskBDIdxTable[taskId].currBDInUse;
}
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
#endif /* __BESTCOMM_API_H */
diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c
index d1c01336b1..db2223ea87 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c
+++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.c
@@ -16,8 +16,8 @@
+-----------------------------------------------------------------+
| this file contains glue functions to the Freescale BestComm API |
\*===============================================================*/
+#include <assert.h>
#include <rtems.h>
-#include <rtems/error.h>
#include <bsp.h>
#include <bsp/irq.h>
#include "../include/mpc5200.h"
@@ -28,6 +28,10 @@
#include "bestcomm_glue.h"
#include "include/mgt5200/sdma.h"
+extern const uint32 taskTableBytes;
+
+static Heap_Control bestcomm_heap;
+
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
@@ -46,15 +50,12 @@ void bestcomm_glue_irq_enable
| none |
\*=========================================================================*/
{
- rtems_interrupt_level level;
if (0 != ((1UL<<bestcomm_taskno) & SDMA_INT_BIT_IMPL)) {
- rtems_interrupt_disable(level);
/*
* valid task number
* enable interrupt in bestcomm mask
*/
- SDMA_INT_ENABLE(&mpc5200.IntMask,bestcomm_taskno);
- rtems_interrupt_enable(level);
+ SDMA_INT_ENABLE(&mpc5200.sdma.IntMask,bestcomm_taskno);
}
}
@@ -76,24 +77,21 @@ void bestcomm_glue_irq_disable
| none |
\*=========================================================================*/
{
- rtems_interrupt_level level;
if (0 != ((1UL<<bestcomm_taskno) & SDMA_INT_BIT_IMPL)) {
- rtems_interrupt_disable(level);
/*
* valid task number
* disable interrupt in bestcomm mask
*/
- SDMA_INT_DISABLE(&mpc5200.IntMask,bestcomm_taskno);
- rtems_interrupt_enable(level);
+ SDMA_INT_DISABLE(&mpc5200.sdma.IntMask,bestcomm_taskno);
}
}
typedef struct {
- void (*the_handler)(rtems_irq_hdl_param);
- rtems_irq_hdl_param the_param;
+ rtems_interrupt_handler handler;
+ void *arg;
} bestcomm_glue_irq_handlers_t;
-bestcomm_glue_irq_handlers_t bestcomm_glue_irq_handlers[32];
+static bestcomm_glue_irq_handlers_t bestcomm_glue_irq_handlers[32];
/*=========================================================================*\
| Function: |
@@ -107,8 +105,8 @@ void bestcomm_glue_irq_install
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int bestcomm_taskno, /* task number for handler */
- void (*the_handler)(rtems_irq_hdl_param), /* function to call */
- rtems_irq_hdl_param the_param
+ rtems_interrupt_handler handler, /* function to call */
+ void *arg
)
/*-------------------------------------------------------------------------*\
| Return Value: |
@@ -120,8 +118,8 @@ void bestcomm_glue_irq_install
* valid task number
* install handler
*/
- bestcomm_glue_irq_handlers[bestcomm_taskno].the_handler = the_handler;
- bestcomm_glue_irq_handlers[bestcomm_taskno].the_param = the_param;
+ bestcomm_glue_irq_handlers[bestcomm_taskno].handler = handler;
+ bestcomm_glue_irq_handlers[bestcomm_taskno].arg = arg;
}
}
@@ -136,8 +134,7 @@ void bestcomm_glue_irq_dispatcher
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
- rtems_irq_hdl_param handle /* irq specific handle (not used) */
-
+ void *arg /* irq specific handle (not used) */
)
/*-------------------------------------------------------------------------*\
| Return Value: |
@@ -147,23 +144,23 @@ void bestcomm_glue_irq_dispatcher
uint32_t pending;
int curr_taskno;
- pending = mpc5200.IntPend & ~mpc5200.IntMask;
+ pending = mpc5200.sdma.IntPend & ~mpc5200.sdma.IntMask;
curr_taskno = 0;
while (pending != 0) {
if ((pending & (1UL<<curr_taskno)) != 0) {
- if (bestcomm_glue_irq_handlers[curr_taskno].the_handler == NULL) {
+ if (bestcomm_glue_irq_handlers[curr_taskno].handler != NULL) {
/*
- * This should never happen. we have a pending IRQ but no handler
- * let's clear this pending bit
+ * call proper handler
*/
- SDMA_CLEAR_IEVENT(&mpc5200.IntPend,curr_taskno);
+ bestcomm_glue_irq_handlers[curr_taskno].handler
+ (bestcomm_glue_irq_handlers[curr_taskno].arg);
}
else {
/*
- * call proper handler
+ * This should never happen. we have a pending IRQ but no handler
+ * let's clear this pending bit
*/
- bestcomm_glue_irq_handlers[curr_taskno].the_handler
- (bestcomm_glue_irq_handlers[curr_taskno].the_param);
+ SDMA_CLEAR_IEVENT(&mpc5200.sdma.IntPend,curr_taskno);
}
/*
* clear this bit in our pending copy
@@ -175,32 +172,6 @@ void bestcomm_glue_irq_dispatcher
}
}
-void bestcomm_glue_on(const rtems_irq_connect_data* ptr)
- {
- }
-
-
-void bestcomm_glue_isOn(const rtems_irq_connect_data* ptr)
- {
- /*return BSP_irq_enabled_at_cpm(ptr->name);*/
- }
-
-
-void bestcomm_glue_off(const rtems_irq_connect_data* ptr)
- {
- }
-
-static rtems_irq_connect_data bestcomm_glue_irq_data =
- {
-
- BSP_SIU_IRQ_SMARTCOMM,
- (rtems_irq_hdl) bestcomm_glue_irq_dispatcher,
- (rtems_irq_hdl_param) NULL,
- (rtems_irq_enable) bestcomm_glue_on,
- (rtems_irq_disable) bestcomm_glue_off,
- (rtems_irq_is_enabled) bestcomm_glue_isOn
- };
-
static bool bestcomm_glue_is_initialized = false;
/*=========================================================================*\
| Function: |
@@ -224,12 +195,24 @@ void bestcomm_glue_init
| none |
\*=========================================================================*/
{
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
+ uintptr_t heap_status = 0;
+
if (!bestcomm_glue_is_initialized) {
bestcomm_glue_is_initialized = true;
+
+ heap_status = _Heap_Initialize(
+ &bestcomm_heap,
+ (char *) &mpc5200.sram [0] + taskTableBytes,
+ sizeof(mpc5200.sram) - taskTableBytes,
+ 4
+ );
+ assert(heap_status != 0);
+
/*
* Set task bar to begin of sram
*/
- mpc5200.taskBar = (uint32_t)(&(mpc5200.sram[0]));
+ mpc5200.sdma.taskBar = (uint32_t)(&(mpc5200.sram[0]));
#if 0
/*
@@ -244,18 +227,35 @@ void bestcomm_glue_init
* the COMM bus. (Yes, _PE -- prefetch enable -- should probably be
* named _PD.)
*/
- mpc5200.PtdCntrl |= SDMA_PTDCNTRL_PE;
+ mpc5200.sdma.PtdCntrl |= SDMA_PTDCNTRL_PE;
TasksInitAPI((uint8*)&mpc5200);
- TasksLoadImage( (void *)&(mpc5200.taskBar));
+ TasksLoadImage( (void *)&(mpc5200.sdma.taskBar));
/*
* initialize interrupt dispatcher
*/
- if(!BSP_install_rtems_irq_handler (&bestcomm_glue_irq_data)) {
- rtems_panic ("Can't attach MPC5x00 BestComm interrupt handler\n");
- }
+ sc = rtems_interrupt_handler_install(
+ BSP_SIU_IRQ_SMARTCOMM,
+ "BESTCOMM",
+ RTEMS_INTERRUPT_UNIQUE,
+ bestcomm_glue_irq_dispatcher,
+ NULL
+ );
+ assert(sc == RTEMS_SUCCESSFUL);
+ }
+}
+void *bestcomm_malloc(size_t size)
+{
+ return _Heap_Allocate(&bestcomm_heap, size);
+}
+
+void bestcomm_free(void *ptr)
+{
+ if (ptr != NULL) {
+ bool ok = _Heap_Free(&bestcomm_heap, ptr);
+ assert(ok);
}
}
diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.h b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.h
index 13c3687fc0..aa78ce3209 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.h
+++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_glue.h
@@ -19,7 +19,11 @@
#ifndef _BESTCOMM_GLUE_H
#define _BESTCOMM_GLUE_H
-#include <rtems.h>
+#include <rtems/irq-extension.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
/*=========================================================================*\
| Function: |
@@ -69,8 +73,8 @@ void bestcomm_glue_irq_install
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int bestcomm_taskno, /* task number for handler */
- void (*the_handler)(rtems_irq_hdl_param), /* function to call */
- rtems_irq_hdl_param the_param
+ rtems_interrupt_handler handler, /* function to call */
+ void *arg
);
/*-------------------------------------------------------------------------*\
| Return Value: |
@@ -99,4 +103,12 @@ void bestcomm_glue_init
| none |
\*=========================================================================*/
+void *bestcomm_malloc(size_t size);
+
+void bestcomm_free(void *ptr);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
#endif /* _BESTCOMM_GLUE_H */
diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_priv.h b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_priv.h
index 1a3d932b5f..102fc082cb 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_priv.h
+++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/bestcomm_priv.h
@@ -31,7 +31,6 @@
* private data structures that should not be manipulated by API users.
*/
-extern uint32 SramOffsetGlobal;
extern TaskBDIdxTable_t TaskBDIdxTable[MAX_TASKS];
extern int TaskRunning[MAX_TASKS];
extern sint64 MBarPhysOffsetGlobal;
diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/load_task.c b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/load_task.c
index 2c4c96d84c..c6632955ff 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/load_task.c
+++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/load_task.c
@@ -81,6 +81,4 @@ void TasksLoadImage(sdma_regs *sdma)
tt->fdt = (sdma->taskBar & 0xFFFFFF00) + tt->fdt;
tt->context += sdma->taskBar;
}
-
- SramOffsetGlobal = taskTableBytes;
}
diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/task_api/bestcomm_cntrl.h b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/task_api/bestcomm_cntrl.h
index f4273cdb82..3712bae3d0 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/task_api/bestcomm_cntrl.h
+++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/task_api/bestcomm_cntrl.h
@@ -88,46 +88,54 @@
* Task control macros
******************************************************************************/
#define SDMA_TASK_CFG(RegAddr, TaskNum, AutoStart, AutoStartNum) { \
- *(((uint16 *)RegAddr)+TaskNum) = (uint16)(0x0000 | \
+ *(((volatile uint16 *)RegAddr)+TaskNum) = (uint16)(0x0000 | \
((AutoStart!=0)<<7) | \
(AutoStartNum&0xF) ); \
}
#define SDMA_TASK_AUTO_START(RegAddr, TaskNum, AutoStart, AutoStartNum) { \
- *(((uint16 *)RegAddr)+TaskNum) = (uint16)((*(((uint16 *)RegAddr)+TaskNum) & \
+ *(((volatile uint16 *)RegAddr)+TaskNum) = (uint16)((*(((volatile uint16 *)RegAddr)+TaskNum) & \
(uint16) 0xff30) | ((uint16)(0x0000 | \
((AutoStart!=0)<<7) | \
(AutoStartNum&0xF)) )); \
}
#define SDMA_TASK_ENABLE(RegAddr, TaskNum) { \
- *(((uint16 *)RegAddr)+TaskNum) |= (uint16)0x8000; \
+ *(((volatile uint16 *)RegAddr)+TaskNum) |= (uint16)0x8000; \
}
#define SDMA_TASK_DISABLE(RegAddr, TaskNum) { \
- *(((uint16 *)RegAddr)+TaskNum) &= ~(uint16)0x8000; \
+ *(((volatile uint16 *)RegAddr)+TaskNum) &= ~(uint16)0x8000; \
}
#define SDMA_TASK_STATUS(RegAddr, TaskNum) \
- *(((uint16 *)RegAddr)+TaskNum)
+ *(((volatile uint16 *)RegAddr)+TaskNum)
/*******************************************************************************
* Interrupt control macros
******************************************************************************/
-#define SDMA_INT_ENABLE(RegAddr, Bit) { \
- *((uint32 *)RegAddr) &= ~((uint32)(1<<Bit)); \
-}
-
-#define SDMA_INT_DISABLE(RegAddr, Bit) { \
- *((uint32 *)(RegAddr)) |= ((uint32)(1<<Bit)); \
-}
+#define SDMA_INT_ENABLE(RegAddr, Bit) \
+ do { \
+ rtems_interrupt_level level; \
+ rtems_interrupt_disable(level); \
+ *((volatile uint32 *) RegAddr) &= ~((uint32) (1 << Bit)); \
+ rtems_interrupt_enable(level); \
+ } while (0)
+
+#define SDMA_INT_DISABLE(RegAddr, Bit) \
+ do { \
+ rtems_interrupt_level level; \
+ rtems_interrupt_disable(level); \
+ *((volatile uint32 *) (RegAddr)) |= ((uint32)(1 << Bit)); \
+ rtems_interrupt_enable(level); \
+ } while (0)
#define SDMA_INT_SOURCE(RegPend, RegMask) \
- (*((uint32 *)(RegPend)) & (~*((uint32 *)(RegMask))) & (uint32)SDMA_INT_BIT_IMPL)
+ (*((volatile uint32 *)(RegPend)) & (~*((volatile uint32 *)(RegMask))) & (uint32)SDMA_INT_BIT_IMPL)
#define SDMA_INT_PENDING(RegPend, RegMask) \
- (*((uint32 *)(RegPend)) & (~*((uint32 *)(RegMask))))
+ (*((volatile uint32 *)(RegPend)) & (~*((volatile uint32 *)(RegMask))))
#define SDMA_INT_TEST(IntSource, Bit) \
(((uint32)IntSource) & ((uint32)(1<<Bit)))
@@ -139,7 +147,7 @@
/* Clear the IntPend bit */
#define SDMA_CLEAR_IEVENT(RegAddr, Bit) { \
- *((uint32 *)RegAddr) = ((uint32)(1<<Bit)); \
+ *((volatile uint32 *)RegAddr) = ((uint32)(1<<Bit)); \
}
#define SDMA_GET_PENDINGBIT(sdma, Bit) \
@@ -175,7 +183,7 @@
/* Determine which task caused a TEA on the XLB */
#define SDMA_TEA_SOURCE(RegPend) \
- (uint32)(((*(uint32 *)RegPend)>>SDMA_INT_BIT_TEA_TASK) & 0xF)
+ (uint32)(((*(volatile uint32 *)RegPend)>>SDMA_INT_BIT_TEA_TASK) & 0xF)
/*******************************************************************************
@@ -221,8 +229,8 @@
/* Note that masking the size w/ 0x3 gives the desired value for uint32 */
/* (expressed as 4), namely 0. */
#define SDMA_SET_SIZE(RegAddr, TaskNum, SrcSize, DstSize) \
- *(((uint8 *)RegAddr)+((uint32)(TaskNum/2))) = \
- (uint8)((*(((uint8 *)RegAddr)+((uint32)(TaskNum/2))) & \
+ *(((volatile uint8 *)RegAddr)+((uint32)(TaskNum/2))) = \
+ (uint8)((*(((volatile uint8 *)RegAddr)+((uint32)(TaskNum/2))) & \
((TaskNum%2) ? 0xf0 : 0x0f)) | \
((uint8)(((SrcSize & 0x3)<<2) | \
( DstSize & 0x3 ) ) <<(4*((int)(1-(TaskNum%2))))));
@@ -231,8 +239,8 @@
/* Set the Initiator in TCR */
#define SDMA_SET_INIT(RegAddr, TaskNum, Initiator) \
{ \
- *(((uint16 *)RegAddr)+TaskNum) &= (uint16)0xE0FF; \
- *(((uint16 *)RegAddr)+TaskNum) |= (((0x01F & Initiator)<<8) | \
+ *(((volatile uint16 *)RegAddr)+TaskNum) &= (uint16)0xE0FF; \
+ *(((volatile uint16 *)RegAddr)+TaskNum) |= (((0x01F & Initiator)<<8) | \
(0<<SDMA_TCR_BIT_HOLD)); \
}
@@ -248,16 +256,16 @@
/* Set the Initiator Priority */
#define SDMA_SET_INITIATOR_PRIORITY(sdma, initiator, priority) \
- *(((uint8 *)&sdma->IPR0)+initiator) = priority;
+ *(((volatile uint8 *)&sdma->IPR0)+initiator) = priority;
/* Read DRD initiator number */
#define SDMA_INIT_READ(PtrDRD) \
- (((*(uint32 *)PtrDRD)>>SDMA_DRD_BIT_INIT) & (uint32)0x1F)
+ (((*(volatile uint32 *)PtrDRD)>>SDMA_DRD_BIT_INIT) & (uint32)0x1F)
/* Write DRD initiator number */
#define SDMA_INIT_WRITE(PtrDRD, Initiator) { \
- *(uint32 *)PtrDRD = ((*(uint32 *)PtrDRD) & 0xFC1FFFFF) | \
+ *(volatile uint32 *)PtrDRD = ((*(volatile uint32 *)PtrDRD) & 0xFC1FFFFF) | \
(Initiator<<SDMA_DRD_BIT_INIT); \
}
diff --git a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/tasksetup_bdtable.c b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/tasksetup_bdtable.c
index a51c63e625..ee8e0939d9 100644
--- a/c/src/lib/libbsp/powerpc/gen5200/bestcomm/tasksetup_bdtable.c
+++ b/c/src/lib/libbsp/powerpc/gen5200/bestcomm/tasksetup_bdtable.c
@@ -22,7 +22,10 @@
*
******************************************************************************/
+#include <assert.h>
+
#include "bestcomm_api.h"
+#include "bestcomm_glue.h"
#include "task_api/tasksetup_bdtable.h"
#include "include/mgt5200/mgt5200.h"
@@ -40,8 +43,6 @@ extern const uint32 offsetEntry;
TaskBDIdxTable_t TaskBDIdxTable[MAX_TASKS];
-static uint8 *TaskTableFree = 0;
-
void TaskSetup_BDTable(volatile uint32 *BasePtr, volatile uint32 *LastPtr, volatile uint32 *StartPtr,
int TaskNum, uint32 NumBD, uint16 MaxBD,
uint8 NumPtr, ApiConfig_t ApiConfig, uint32 Status)
@@ -50,16 +51,6 @@ void TaskSetup_BDTable(volatile uint32 *BasePtr, volatile uint32 *LastPtr, volat
uint32 *ptr;
/*
- * If another process has not used SRAM already, then the start value
- * will have to be passed in using the TasksSetSramOffset() function.
- */
- if (SramOffsetGlobal == 0) {
- SramOffsetGlobal = taskTableBytes;
- }
-
- TaskTableFree = MBarGlobal + MBAR_SRAM + SramOffsetGlobal;
-
- /*
* First time through the Buffer Descriptor table configuration
* set the buffer descriptor table with parameters that will not
* change since they are determined by the task itself. The
@@ -70,25 +61,31 @@ void TaskSetup_BDTable(volatile uint32 *BasePtr, volatile uint32 *LastPtr, volat
* of the table.
*/
if (TaskBDIdxTable[TaskNum].BDTablePtr == 0) {
- TaskBDIdxTable[TaskNum].BDTablePtr = TaskTableFree;
- TaskBDIdxTable[TaskNum].numPtr = NumPtr;
- TaskBDIdxTable[TaskNum].apiConfig = ApiConfig;
- TaskBDIdxTable[TaskNum].BDStartPtr = StartPtr;
-
- *StartPtr = *BasePtr = (uint32)((uint32)TaskBDIdxTable[TaskNum].BDTablePtr
- + MBarPhysOffsetGlobal);
+ size_t AllocSize = 0;
+ void *AllocBegin = NULL;
switch (NumPtr) {
case 1:
- SramOffsetGlobal += MaxBD*sizeof(TaskBD1_t);
+ AllocSize += MaxBD*sizeof(TaskBD1_t);
break;
case 2:
- SramOffsetGlobal += MaxBD*sizeof(TaskBD2_t);
+ AllocSize += MaxBD*sizeof(TaskBD2_t);
break;
default:
- /* error */
+ assert(0);
break;
}
+
+ AllocBegin = bestcomm_malloc(AllocSize);
+ assert(AllocBegin != NULL);
+
+ TaskBDIdxTable[TaskNum].BDTablePtr = AllocBegin;
+ TaskBDIdxTable[TaskNum].numPtr = NumPtr;
+ TaskBDIdxTable[TaskNum].apiConfig = ApiConfig;
+ TaskBDIdxTable[TaskNum].BDStartPtr = StartPtr;
+
+ *StartPtr = *BasePtr = (uint32)((uint32)TaskBDIdxTable[TaskNum].BDTablePtr
+ + MBarPhysOffsetGlobal);
}
TaskBDIdxTable[TaskNum].currBDInUse = 0;