//------------------------------------------------------------------------------
void dualprocshm_targetReleaseLock(tDualprocLock* pBase_p,
                                   tDualProcInstance procInstance_p)
{
    if (pBase_p == NULL)
        return;

    DPSHM_WRITE8(&pBase_p->afFlag[procInstance_p], 0);
    DUALPROCSHM_FLUSH_DCACHE_RANGE(&pBase_p->afFlag[procInstance_p],
                                   sizeof(pBase_p->afFlag[procInstance_p]));
}
//------------------------------------------------------------------------------
void dualprocshm_targetWriteData(UINT8* pBase_p, UINT16 size_p, UINT8* pData_p)
{
    if (pBase_p == NULL || pData_p == NULL)
    {
        TRACE("%s Invalid parameters\n", __FUNCTION__);
        return;
    }

    DUALPROCSHM_MEMCPY(pBase_p, pData_p, size_p);

    DUALPROCSHM_FLUSH_DCACHE_RANGE(pBase_p, size_p);
}
//------------------------------------------------------------------------------
void dualprocshm_targetAcquireLock(tDualprocLock* pBase_p,
                                   tDualProcInstance procInstance_p)
{
    tDualProcInstance   otherProcInstance;

    if (pBase_p == NULL)
        return;

    switch (procInstance_p)
    {
        case kDualProcFirst:
            otherProcInstance = kDualProcSecond;
            break;

        case kDualProcSecond:
            otherProcInstance = kDualProcFirst;
            break;

        default:
            TRACE("Invalid processor instance\n");
            return;
    }

    DUALPROCSHM_INVALIDATE_DCACHE_RANGE(pBase_p, sizeof(tDualprocLock));

    DPSHM_WRITE8(&pBase_p->afFlag[procInstance_p], 1);
    DUALPROCSHM_FLUSH_DCACHE_RANGE(&pBase_p->afFlag[procInstance_p],
                                   sizeof(pBase_p->afFlag[procInstance_p]));

    DPSHM_WRITE8(&pBase_p->turn, otherProcInstance);
    DUALPROCSHM_FLUSH_DCACHE_RANGE(&pBase_p->turn, sizeof(pBase_p->turn));

    DPSHM_DMB();

    do
    {
        DUALPROCSHM_INVALIDATE_DCACHE_RANGE(pBase_p, sizeof(tDualprocLock));
    } while (DPSHM_READ8(&pBase_p->afFlag[otherProcInstance]) &&
             (DPSHM_READ8(&pBase_p->turn) == otherProcInstance));
}
//------------------------------------------------------------------------------
void dualprocshm_targetWriteData(void* pBase_p,
                                 size_t size_p,
                                 const void* pData_p)
{
    if ((pBase_p == NULL) ||
        (pData_p == NULL))
    {
        TRACE("%s(): Invalid parameters\n", __func__);
        return;
    }

    DUALPROCSHM_MEMCPY(pBase_p, pData_p, size_p);

    DUALPROCSHM_FLUSH_DCACHE_RANGE(pBase_p, size_p);
}