summaryrefslogtreecommitdiff
path: root/drivers/staging/nmf-cm/cm
diff options
context:
space:
mode:
authorPierre Peiffer <pierre.peiffer@stericsson.com>2011-08-24 16:00:42 +0200
committerPhilippe Langlais <philippe.langlais@linaro.org>2012-03-19 09:02:20 +0100
commit148c1aac70d59a4d6531cc18905dfd640a762ba5 (patch)
tree6014a2f62bdac89d50a4701af7526ec0d5c6eb38 /drivers/staging/nmf-cm/cm
parent925581cbdd18f28078d471e7dd6f7780ed378d5b (diff)
U8500 CM: instantiate singleton in default domain
Singleton components are components used as shared lib on MMDSP and are allocated in the memory domain given at first instantiation. That domain will thus be seen as busy until all users have released their reference to this singleton component, preventing this domain to be released by its creator, even if it has released his reference. This patch assigns these singletons to a default domain once they are created to avoid this issue. ST-Ericsson ID: 356938 ST-Ericsson Linux next: - ST-Ericsson FOSS-OUT ID: Trivial Signed-off-by: Pierre Peiffer <pierre.peiffer@stericsson.com> Change-Id: Ie5590147624d3cb399469600bbc35359ef741295
Diffstat (limited to 'drivers/staging/nmf-cm/cm')
-rw-r--r--drivers/staging/nmf-cm/cm/engine/component/src/instantiater.c9
-rw-r--r--drivers/staging/nmf-cm/cm/engine/component/src/loader.c2
-rw-r--r--drivers/staging/nmf-cm/cm/engine/elf/inc/elfapi.h6
-rw-r--r--drivers/staging/nmf-cm/cm/engine/elf/src/elfload.c16
-rw-r--r--drivers/staging/nmf-cm/cm/engine/memory/inc/domain.h8
-rw-r--r--drivers/staging/nmf-cm/cm/engine/memory/inc/domain_type.h1
-rw-r--r--drivers/staging/nmf-cm/cm/engine/memory/inc/remote_allocator.h11
-rw-r--r--drivers/staging/nmf-cm/cm/engine/memory/src/domain.c21
-rw-r--r--drivers/staging/nmf-cm/cm/engine/memory/src/remote_allocator.c5
9 files changed, 68 insertions, 11 deletions
diff --git a/drivers/staging/nmf-cm/cm/engine/component/src/instantiater.c b/drivers/staging/nmf-cm/cm/engine/component/src/instantiater.c
index 2a61d4a7433..b7b42802cea 100644
--- a/drivers/staging/nmf-cm/cm/engine/component/src/instantiater.c
+++ b/drivers/staging/nmf-cm/cm/engine/component/src/instantiater.c
@@ -278,7 +278,7 @@ t_cm_error cm_instantiateComponent(const char* templateName,
LOG_INTERNAL(1, "\n##### Instantiate %s/%x (%s) component on %s at priority %d #####\n", component->pathname, component, template->name, cm_getDspName(coreId), priority, 0);
- if((error = cm_ELF_LoadInstance(domainId, elfhandle, template->memories, component->memories)) != CM_OK)
+ if((error = cm_ELF_LoadInstance(domainId, elfhandle, template->memories, component->memories, template->classe == SINGLETON)) != CM_OK)
{
cm_DestroyComponentMemory(component);
return error;
@@ -298,7 +298,6 @@ t_cm_error cm_instantiateComponent(const char* templateName,
/*
* Create a new component instance
*/
- component->domainId = domainId;
component->priority = priority;
component->thisAddress = 0xFFFFFFFF;
component->state = STATE_NONE;
@@ -314,6 +313,12 @@ t_cm_error cm_instantiateComponent(const char* templateName,
cl->numberOfInstance = 1;
template->singletonIfAvaliable = component;
+ if (cm_DM_GetDomainCoreId(domainId) == SVA_CORE_ID)
+ component->domainId = DEFAULT_SVA_DOMAIN;
+ else
+ component->domainId = DEFAULT_SIA_DOMAIN;
+ } else {
+ component->domainId = domainId;
}
if(component->memories[template->thisMemory->id] != INVALID_MEMORY_HANDLE)
diff --git a/drivers/staging/nmf-cm/cm/engine/component/src/loader.c b/drivers/staging/nmf-cm/cm/engine/component/src/loader.c
index ad6af00f5a5..a128b7aa8c7 100644
--- a/drivers/staging/nmf-cm/cm/engine/component/src/loader.c
+++ b/drivers/staging/nmf-cm/cm/engine/component/src/loader.c
@@ -226,7 +226,7 @@ t_cm_error cm_loadComponent(
* Load shared memory from file
*/
// START();
- if((error = cm_ELF_LoadTemplate(domainId, elfhandle, template->memories)) != CM_OK)
+ if((error = cm_ELF_LoadTemplate(domainId, elfhandle, template->memories, template->classe == SINGLETON)) != CM_OK)
goto out;
MMDSP_serializeMemories(elfhandle->instanceProperty, &template->codeMemory, &template->thisMemory);
// END("cm_ELF_LoadTemplate");
diff --git a/drivers/staging/nmf-cm/cm/engine/elf/inc/elfapi.h b/drivers/staging/nmf-cm/cm/engine/elf/inc/elfapi.h
index 564086db26c..cce6d158b4e 100644
--- a/drivers/staging/nmf-cm/cm/engine/elf/inc/elfapi.h
+++ b/drivers/staging/nmf-cm/cm/engine/elf/inc/elfapi.h
@@ -48,7 +48,8 @@ void cm_ELF_CloseFile(
t_cm_error cm_ELF_LoadTemplate(
t_cm_domain_id domainId,
t_elfdescription *elfhandle,
- t_memory_handle sharedMemories[NUMBER_OF_MMDSP_MEMORY]);
+ t_memory_handle sharedMemories[NUMBER_OF_MMDSP_MEMORY],
+ t_bool isSingleton);
/*!
* \internal
@@ -73,7 +74,8 @@ t_cm_error cm_ELF_LoadInstance(
t_cm_domain_id domainId,
t_elfdescription *elfhandle,
t_memory_handle sharedMemories[NUMBER_OF_MMDSP_MEMORY],
- t_memory_handle privateMemories[NUMBER_OF_MMDSP_MEMORY]);
+ t_memory_handle privateMemories[NUMBER_OF_MMDSP_MEMORY],
+ t_bool isSingleton);
void cm_ELF_FreeInstance(
t_nmf_core_id coreId,
diff --git a/drivers/staging/nmf-cm/cm/engine/elf/src/elfload.c b/drivers/staging/nmf-cm/cm/engine/elf/src/elfload.c
index 84f841ef443..7950cd99007 100644
--- a/drivers/staging/nmf-cm/cm/engine/elf/src/elfload.c
+++ b/drivers/staging/nmf-cm/cm/engine/elf/src/elfload.c
@@ -574,7 +574,8 @@ static t_cm_error allocSegment(
t_cm_domain_id domainId,
t_elfdescription *elfhandle,
t_memory_handle memories[NUMBER_OF_MMDSP_MEMORY],
- t_memory_property property) {
+ t_memory_property property,
+ t_bool isSingleton) {
t_memory_id memId;
const t_elfmemory *thisMemory; //!< Memory used to determine this
const t_elfmemory *codeMemory; //!< Memory used to determine code
@@ -610,6 +611,9 @@ static t_cm_error allocSegment(
cm_DSP_GetDspAddress(memories[memId], &elfhandle->segments[memId].mpcAddr);
+ if (isSingleton)
+ cm_DM_SetDefaultDomain(memories[memId], cm_DM_GetDomainCoreId(domainId));
+
// Log it
LOG_INTERNAL(1, "\t%s%s: 0x%x..+0x%x (0x%x)\n",
mapping->memoryName,
@@ -639,11 +643,12 @@ static t_cm_error allocSegment(
t_cm_error cm_ELF_LoadTemplate(
t_cm_domain_id domainId,
t_elfdescription *elfhandle,
- t_memory_handle sharedMemories[NUMBER_OF_MMDSP_MEMORY])
+ t_memory_handle sharedMemories[NUMBER_OF_MMDSP_MEMORY],
+ t_bool isSingleton)
{
t_cm_error error;
- if((error = allocSegment(domainId, elfhandle, sharedMemories, MEM_SHARABLE)) != CM_OK)
+ if((error = allocSegment(domainId, elfhandle, sharedMemories, MEM_SHARABLE, isSingleton)) != CM_OK)
return error;
// Load each readonly segment
@@ -657,7 +662,8 @@ t_cm_error cm_ELF_LoadInstance(
t_cm_domain_id domainId,
t_elfdescription *elfhandle,
t_memory_handle sharedMemories[NUMBER_OF_MMDSP_MEMORY],
- t_memory_handle privateMemories[NUMBER_OF_MMDSP_MEMORY])
+ t_memory_handle privateMemories[NUMBER_OF_MMDSP_MEMORY],
+ t_bool isSingleton)
{
t_memory_id memId;
t_cm_error error;
@@ -668,7 +674,7 @@ t_cm_error cm_ELF_LoadInstance(
privateMemories[memId] = sharedMemories[memId];
}
- if((error = allocSegment(domainId, elfhandle, privateMemories, MEM_PRIVATE)) != CM_OK)
+ if((error = allocSegment(domainId, elfhandle, privateMemories, MEM_PRIVATE, isSingleton)) != CM_OK)
return error;
// Load each writable memory
diff --git a/drivers/staging/nmf-cm/cm/engine/memory/inc/domain.h b/drivers/staging/nmf-cm/cm/engine/memory/inc/domain.h
index 07caee2d8c1..c9b39956c63 100644
--- a/drivers/staging/nmf-cm/cm/engine/memory/inc/domain.h
+++ b/drivers/staging/nmf-cm/cm/engine/memory/inc/domain.h
@@ -20,6 +20,10 @@
#include <cm/engine/memory/inc/memory.h>
#include <cm/engine/dsp/inc/dsp.h>
+/* These default domains are used for singleton only ! */
+#define DEFAULT_SVA_DOMAIN (t_cm_domain_id)1
+#define DEFAULT_SIA_DOMAIN (t_cm_domain_id)2
+
/*!
* \brief Domain type.
* \internal
@@ -152,4 +156,8 @@ PUBLIC t_cm_error cm_DM_GetAllocatorStatus(t_cm_domain_id domainId, t_dsp_memory
PUBLIC t_cm_error cm_DM_GetDomainAbsAdresses(t_cm_domain_id domainId, t_cm_domain_info *info);
+/*!
+ * \brief Change the domain for the given allocated chunk
+ */
+PUBLIC void cm_DM_SetDefaultDomain(t_memory_handle memHandle, t_nmf_core_id coreId);
#endif /* DOMAIN_H_ */
diff --git a/drivers/staging/nmf-cm/cm/engine/memory/inc/domain_type.h b/drivers/staging/nmf-cm/cm/engine/memory/inc/domain_type.h
index 712d077d894..7463f82eb89 100644
--- a/drivers/staging/nmf-cm/cm/engine/memory/inc/domain_type.h
+++ b/drivers/staging/nmf-cm/cm/engine/memory/inc/domain_type.h
@@ -33,7 +33,6 @@ typedef t_uint8 t_cm_domain_id;
* \ingroup CM_DOMAIN_API
*/
typedef t_uint32 t_nmf_client_id;
-// TO BE REMOVED LATER, I guess, when default domains will be removed (PP)
#define NMF_CORE_CLIENT (t_nmf_client_id)-1
#define NMF_CURRENT_CLIENT (t_nmf_client_id)0
diff --git a/drivers/staging/nmf-cm/cm/engine/memory/inc/remote_allocator.h b/drivers/staging/nmf-cm/cm/engine/memory/inc/remote_allocator.h
index f556c6f7056..36994f37daa 100644
--- a/drivers/staging/nmf-cm/cm/engine/memory/inc/remote_allocator.h
+++ b/drivers/staging/nmf-cm/cm/engine/memory/inc/remote_allocator.h
@@ -261,4 +261,15 @@ PUBLIC void cm_MM_GetMemoryHandleUserData(t_memory_handle memHandle, t_uint16 *p
*/
PUBLIC void cm_MM_DumpMemory(t_cm_allocator_desc* alloc, t_uint32 start, t_uint32 end);
+/*!
+ * \brief Change the domain for the given chunk of memory
+ *
+ * \param[in] memHandle The given chunk of memory
+ * \param[in] domainId The new domain id to set
+ *
+ * \retval void
+ *
+ * \ingroup MEMORY_INTERNAL
+ */
+PUBLIC void cm_MM_SetDefaultDomain(t_memory_handle memHandle, t_uint32 domainId);
#endif /* _REMOTE_ALLOCATOR_H_*/
diff --git a/drivers/staging/nmf-cm/cm/engine/memory/src/domain.c b/drivers/staging/nmf-cm/cm/engine/memory/src/domain.c
index 8524183ce19..a605cc475a9 100644
--- a/drivers/staging/nmf-cm/cm/engine/memory/src/domain.c
+++ b/drivers/staging/nmf-cm/cm/engine/memory/src/domain.c
@@ -122,6 +122,20 @@ PUBLIC t_cm_error cm_DM_Init(void)
domainDesc[2].client = NMF_CORE_CLIENT;
domainDesc[3].client = NMF_CORE_CLIENT;
+ /* We use domain 1 and 2 for the singleton, only used for components structure */
+ domainDesc[DEFAULT_SVA_DOMAIN].type = DOMAIN_NORMAL;
+ domainDesc[DEFAULT_SVA_DOMAIN].domain.coreId= SVA_CORE_ID;
+ domainDesc[DEFAULT_SVA_DOMAIN].domain.esramCode.size = (t_uint32)-1;
+ domainDesc[DEFAULT_SVA_DOMAIN].domain.esramData.size = (t_uint32)-1;
+ domainDesc[DEFAULT_SVA_DOMAIN].domain.sdramCode.size = (t_uint32)-1;
+ domainDesc[DEFAULT_SVA_DOMAIN].domain.sdramData.size = (t_uint32)-1;
+ domainDesc[DEFAULT_SIA_DOMAIN].type = DOMAIN_NORMAL;
+ domainDesc[DEFAULT_SIA_DOMAIN].domain.coreId= SIA_CORE_ID;
+ domainDesc[DEFAULT_SIA_DOMAIN].domain.esramCode.size = (t_uint32)-1;
+ domainDesc[DEFAULT_SIA_DOMAIN].domain.esramData.size = (t_uint32)-1;
+ domainDesc[DEFAULT_SIA_DOMAIN].domain.sdramCode.size = (t_uint32)-1;
+ domainDesc[DEFAULT_SIA_DOMAIN].domain.sdramData.size = (t_uint32)-1;
+
for(i = 0; i < MAX_SCRATCH_DOMAIN_NB; i++) {
domainScratchDesc[i].domainId = 0;
domainScratchDesc[i].parentId = 0;
@@ -585,3 +599,10 @@ static void cm_DM_DomainError(const t_cm_domain_id parentId, const t_nmf_client_
domainDesc[parentId].domain.esramData.offset + domainDesc[parentId].domain.esramData.size);
}
+PUBLIC void cm_DM_SetDefaultDomain(t_memory_handle memHandle, t_nmf_core_id coreId)
+{
+ if (coreId == SVA_CORE_ID)
+ cm_MM_SetDefaultDomain(memHandle, DEFAULT_SVA_DOMAIN);
+ else if (coreId == SIA_CORE_ID)
+ cm_MM_SetDefaultDomain(memHandle, DEFAULT_SIA_DOMAIN);
+}
diff --git a/drivers/staging/nmf-cm/cm/engine/memory/src/remote_allocator.c b/drivers/staging/nmf-cm/cm/engine/memory/src/remote_allocator.c
index ec23e28917c..0d000d37371 100644
--- a/drivers/staging/nmf-cm/cm/engine/memory/src/remote_allocator.c
+++ b/drivers/staging/nmf-cm/cm/engine/memory/src/remote_allocator.c
@@ -649,3 +649,8 @@ PUBLIC void cm_MM_DumpMemory(t_cm_allocator_desc* alloc, t_uint32 start, t_uint3
chunk = chunk->next;
}
}
+
+PUBLIC void cm_MM_SetDefaultDomain(t_memory_handle memHandle, t_uint32 domainId)
+{
+ ((t_cm_chunk *) memHandle)->domainId = domainId;
+}