summaryrefslogtreecommitdiff
path: root/drivers/staging/nmf-cm/cm/engine/semaphores/src/semaphores.c
blob: daf95355a56c731b7787174cd9cc9fdcfafd48ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
 * Copyright (C) ST-Ericsson SA 2010
 * Author: Jean-Philippe FASSINO <jean-philippe.fassino@stericsson.com> for ST-Ericsson.
 * License terms: GNU General Public License (GPL) version 2.
 */
#include <cm/inc/cm_type.h>
#include <cm/engine/semaphores/inc/semaphores.h>
#include <cm/engine/semaphores/hw_semaphores/inc/hw_semaphores.h>
#include <cm/engine/dsp/inc/semaphores_dsp.h>
#include <cm/engine/trace/inc/trace.h>
#include <share/inc/nmf.h>

void (*cm_SEM_GenerateIrq[NB_CORE_IDS])(t_nmf_core_id coreId, t_semaphore_id semId);
t_cm_error (*cm_SEM_PowerOn[NB_CORE_IDS])(t_nmf_core_id coreId);
void (*cm_SEM_PowerOff[NB_CORE_IDS])(t_nmf_core_id coreId);

#define SEM_TYPE_ID_DEFAULT_VALUE ((t_nmf_semaphore_type_id)MASK_ALL32)
static t_nmf_semaphore_type_id semaphoreTypePerCoreId[NB_CORE_IDS];

static t_cm_error cm_LSEM_PowerOn(t_nmf_core_id coreId)
{
    return CM_OK;
}

static void cm_LSEM_PowerOff(t_nmf_core_id coreId)
{
}

PUBLIC t_cm_error cm_SEM_Init(const t_cm_system_address *pSystemAddr)
{
    t_nmf_core_id coreId;

    for (coreId = ARM_CORE_ID; coreId < NB_CORE_IDS; coreId++)
    {
        semaphoreTypePerCoreId[coreId] = SEM_TYPE_ID_DEFAULT_VALUE;

        /* By default, we suppose that we use a full feature NMF ;) */
        cm_SEM_GenerateIrq[coreId] = NULL;
        cm_SEM_PowerOn[coreId] = NULL;
        cm_SEM_PowerOff[coreId] = NULL;
   }

    cm_HSEM_Init(pSystemAddr);
    /* if needed local semaphore init will be done coreId per coreId */

    return CM_OK;
}

PUBLIC t_cm_error cm_SEM_InitMpc(t_nmf_core_id coreId, t_nmf_semaphore_type_id semTypeId)
{
    if (semaphoreTypePerCoreId[coreId] != SEM_TYPE_ID_DEFAULT_VALUE)
        return CM_MPC_ALREADY_INITIALIZED;

    if(semTypeId == SYSTEM_SEMAPHORES)
    {
        cm_SEM_GenerateIrq[coreId] = cm_HSEM_GenerateIrq;
        cm_SEM_PowerOn[coreId] = cm_HSEM_PowerOn;
        cm_SEM_PowerOff[coreId] = cm_HSEM_PowerOff;
    }
    else if (semTypeId == LOCAL_SEMAPHORES)
    {
        cm_SEM_GenerateIrq[coreId] = cm_DSP_SEM_GenerateIrq;
        cm_SEM_PowerOn[coreId] = cm_LSEM_PowerOn;
        cm_SEM_PowerOff[coreId] = cm_LSEM_PowerOff;
    }

    semaphoreTypePerCoreId[coreId] =  semTypeId;

    return CM_OK;
}

PUBLIC t_semaphore_id cm_SEM_Alloc(t_nmf_core_id fromCoreId, t_nmf_core_id toCoreId)
{
    t_semaphore_id semId;
    t_nmf_core_id corex;

    semId = FIRST_NEIGHBOR_SEMID(toCoreId);
    for (corex = FIRST_CORE_ID; corex < fromCoreId; corex++)
    {
        if (corex == toCoreId)
            continue;
        semId++;
    }

    if (
            (toCoreId == ARM_CORE_ID && semaphoreTypePerCoreId[fromCoreId] == SYSTEM_SEMAPHORES) ||
            (semaphoreTypePerCoreId[toCoreId] == SYSTEM_SEMAPHORES)
       )
    {
        cm_HSEM_EnableSemIrq(semId, toCoreId);
    }

    return semId;
}