summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Peiffer <pierre.peiffer@stericsson.com>2011-08-24 16:00:42 +0200
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:06:58 +0200
commit03bea25a71792646dd3d7b2a6b90f3672749eeaf (patch)
tree1f1d51d7e18a274662e639b96d3d16e55e391d47
parent410e1fe46039ea15870a9078d0dd11ddb3bae064 (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
-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
-rw-r--r--drivers/staging/nmf-cm/cm_debug.c5
-rw-r--r--drivers/staging/nmf-cm/cmld.c4
11 files changed, 73 insertions, 15 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;
+}
diff --git a/drivers/staging/nmf-cm/cm_debug.c b/drivers/staging/nmf-cm/cm_debug.c
index bf3fa422208..78552c9ce67 100644
--- a/drivers/staging/nmf-cm/cm_debug.c
+++ b/drivers/staging/nmf-cm/cm_debug.c
@@ -194,8 +194,7 @@ static ssize_t domain_read(struct file *file, char __user *userbuf,
int ret=0;
OSAL_LOCK_API();
- if ((cm_DM_CheckDomain(id, DOMAIN_ANY) == CM_OK)
- && (domain->domain.coreId != -1)
+ if ((domain->domain.coreId != -1)
&& (domain->dbgCooky != NULL)) {
t_cm_allocator_status status;
t_uint32 dOffset;
@@ -822,8 +821,6 @@ void cm_debug_init(void)
debugfs_create_u8("requested_opp", S_IRUSR|S_IRGRP,
osalEnv.mpc[i].dir,
&osalEnv.mpc[i].opp_request);
-
-
}
}
osal_debug_ops.component_create = cm_debug_component_create;
diff --git a/drivers/staging/nmf-cm/cmld.c b/drivers/staging/nmf-cm/cmld.c
index f8fe0d41059..4c754c55b72 100644
--- a/drivers/staging/nmf-cm/cmld.c
+++ b/drivers/staging/nmf-cm/cmld.c
@@ -1163,6 +1163,10 @@ static int __init cmld_init_module(void)
#ifdef CONFIG_DEBUG_FS
cm_debug_init();
+ if (osal_debug_ops.domain_create) {
+ osal_debug_ops.domain_create(DEFAULT_SVA_DOMAIN);
+ osal_debug_ops.domain_create(DEFAULT_SIA_DOMAIN);
+ }
#endif
/* Configure MPC Cores */