16b8fa8539ac19fe60e113fddcb6ea193f1ab34d
[keystone-rtos/rm-lld.git] / src / rm_nameserver.c
1 /**
2  *   @file  rm_nameserver.c
3  *
4  *   @brief   
5  *      Resource Manager NameServer source.
6  *
7  *  \par
8  *  ============================================================================
9  *  @n   (C) Copyright 2012-2013, Texas Instruments, Inc.
10  * 
11  *  Redistribution and use in source and binary forms, with or without 
12  *  modification, are permitted provided that the following conditions 
13  *  are met:
14  *
15  *    Redistributions of source code must retain the above copyright 
16  *    notice, this list of conditions and the following disclaimer.
17  *
18  *    Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the 
20  *    documentation and/or other materials provided with the   
21  *    distribution.
22  *
23  *    Neither the name of Texas Instruments Incorporated nor the names of
24  *    its contributors may be used to endorse or promote products derived
25  *    from this software without specific prior written permission.
26  *
27  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
28  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
29  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
31  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
32  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
33  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
36  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
37  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  *
39  *  \par
40 */
42 /* Standard includes */
43 #include <string.h>
45 /* RM external API includes */
46 #include <ti/drv/rm/rm.h>
48 /* RM internal API includes */
49 #include <ti/drv/rm/include/rm_internal.h>
50 #include <ti/drv/rm/include/rm_loc.h>
51 #include <ti/drv/rm/include/rm_nameserverloc.h>
52 #include <ti/drv/rm/include/rm_treeloc.h>
54 /* Tree algorithm includes */
55 #include <ti/drv/rm/util/tree.h>
57 /* RM OSAL layer */
58 #include <rm_osal.h>
60 /**********************************************************************
61  ******************* Internal NameServer APIs *************************
62  **********************************************************************/
64 /* FUNCTION PURPOSE: Adds an object to the NameServer
65  ***********************************************************************
66  * DESCRIPTION: Adds an object mapping a name to a resource to
67  *              the NameServer tree.
68  */
69 int32_t rmNameServerAddObject(Rm_NameServerObjCfg *objCfg)
70 {
71     Rm_NameServerNode *newNode = NULL;
72     int32_t            retVal = RM_SERVICE_APPROVED;
73     
74     if (newNode = rmNameServerNodeNew(&objCfg->nodeCfg)) {
75         if (RB_INSERT(_Rm_NameServerTree, objCfg->nameServerTree, newNode)) {
76             /* Collision */
77             rmNameServerNodeFree(newNode);
78             retVal = RM_SERVICE_DENIED_NAME_EXISTS_IN_NS;
79         }
80     }
81     else {
82         retVal = RM_ERROR_NAMESERVER_NAME_ADD_FAILED;
83     }
84     
85     return(retVal);
86 }
88 /* FUNCTION PURPOSE: Finds a NameServer object based on the name
89  ***********************************************************************
90  * DESCRIPTION: Finds the NameServer node with the name specified
91  *              in the objCfg structure and returns the resource
92  *              values mapped to the name via the objCfg structure
93  */
94 int32_t rmNameServerFindObject(Rm_NameServerObjCfg *objCfg)
95 {
96     Rm_NameServerNode  findNode;
97     Rm_NameServerNode *matchingNode;
98     int32_t            retVal = RM_ERROR_NAMESERVER_NAME_DOES_NOT_EXIST;
100     memset((void *)&findNode, 0, sizeof(Rm_NameServerNode));
101     strncpy(findNode.objName, objCfg->nodeCfg.objName, RM_NAME_MAX_CHARS);
102     
103     if (matchingNode = RB_FIND(_Rm_NameServerTree, objCfg->nameServerTree, &findNode)) {
104         /* Found in NameServer */
105         objCfg->nodeCfg.resourceName = matchingNode->resourceName;
106         objCfg->nodeCfg.resourceBase = matchingNode->resourceBase;
107         objCfg->nodeCfg.resourceLength = matchingNode->resourceLength;
109         retVal = RM_SERVICE_PROCESSING;
110     }    
111     return(retVal);
114 /* FUNCTION PURPOSE: Deletes an object from the NameServer
115  ***********************************************************************
116  * DESCRIPTION: Deletes the object with the name defined in the
117  *              objCfg structure from the NameServer tree.  Frees the
118  *              memory associated with the NameServer node
119  */
120 int32_t rmNameServerDeleteObject(Rm_NameServerObjCfg *objCfg)
121 {   
122     Rm_NameServerNode  findNode;
123     Rm_NameServerNode *matchingNode;
124     int32_t            retVal = RM_ERROR_NAMESERVER_NAME_DOES_NOT_EXIST;    
126     memset((void *)&findNode, 0, sizeof(Rm_NameServerNode));
127     strncpy(findNode.objName, objCfg->nodeCfg.objName, RM_NAME_MAX_CHARS);
128     
129     if (matchingNode = RB_FIND(_Rm_NameServerTree, objCfg->nameServerTree, &findNode)) {
130         /* Remove from NameServer */
131         RB_REMOVE(_Rm_NameServerTree, objCfg->nameServerTree, matchingNode);
132         rmNameServerNodeFree(matchingNode);
133         
134         retVal = RM_SERVICE_APPROVED;
135     }    
136     return(retVal);
139 /* FUNCTION PURPOSE: Prints the NameServer objects
140  ***********************************************************************
141  * DESCRIPTION: Prints the names and the resources they're mapped
142  *              to for all objects stored in the NameServer tree.
143  */
144 void rmNameServerPrintObjects(Rm_Handle rmHandle)
146     Rm_Inst           *rmInst = (Rm_Inst *)rmHandle;
147     Rm_NameServerTree *root = rmInst->u.server.nameServer;
148     Rm_NameServerNode *node;
150     if (rmInst->instType == Rm_instType_SHARED_SERVER) {
151         rmNameServerTreeInv(root);
152     }
153     RB_FOREACH(node, _Rm_NameServerTree, root) {
154         Rm_osalLog("Name: %s resourceName: %s base: %d length: %d\n", node->objName, node->resourceName,
155                                                                       node->resourceBase, node->resourceLength);
156     }
159 /* FUNCTION PURPOSE: Initializes the NameServer tree
160  ***********************************************************************
161  * DESCRIPTION: Creates and initializes the NameServer tree
162  *              root entry.
163  */
164 void rmNameServerInit(Rm_Handle rmHandle)
166     Rm_Inst           *rmInst = (Rm_Inst *)rmHandle;
167     Rm_NameServerTree *rootEntry = NULL;
169     rootEntry = Rm_osalMalloc(sizeof(Rm_NameServerTree));
170     RB_INIT(rootEntry);
171     RM_SS_OBJ_WB(rootEntry, Rm_NameServerTree);
172     rmInst->u.server.nameServer = rootEntry;
175 /* FUNCTION PURPOSE: Deletes the NameServer tree
176  ***********************************************************************
177  * DESCRIPTION: Removes all objects from the NameServer tree
178  *              and deletes the NameServer tree root node.
179  */
180 void rmNameServerDelete(Rm_Handle rmHandle)
182     Rm_Inst             *rmInst = (Rm_Inst *)rmHandle;
183     Rm_NameServerTree   *treeRoot = rmInst->u.server.nameServer;
184     Rm_NameServerNode   *node;
185     Rm_NameServerNode   *nextNode;
186     Rm_NameServerObjCfg  objCfg;
188     if (treeRoot) {
189         if (rmInst->instType == Rm_instType_SHARED_SERVER) {
190             rmNameServerTreeInv(treeRoot);
191         }
192         
193         for (node = RB_MIN(_Rm_NameServerTree, treeRoot); node != NULL; node = nextNode) {
194             nextNode = RB_NEXT(_Rm_NameServerTree, treeRoot, node);
195             objCfg.nameServerTree = treeRoot;
196             objCfg.nodeCfg.objName = node->objName;
197             rmNameServerDeleteObject(&objCfg);
198         }
200         /* Don't need to writeback tree node changes since NameServer will be made
201          * NULL in instance */
202          
203         if (RB_MIN(_Rm_NameServerTree, treeRoot) == NULL) {
204             Rm_osalFree((void *)treeRoot, sizeof(Rm_NameServerTree));
205         }
206         rmInst->u.server.nameServer = NULL;
207     }