msm: ipc: Update server lookup to multiple compatible services

IPC Router looks up all compatible services during the server
lookup using the compatibility mask provided by the clients.

Signed-off-by: Karthikeyan Ramasubramanian <kramasub@codeaurora.org>
diff --git a/arch/arm/mach-msm/ipc_router.c b/arch/arm/mach-msm/ipc_router.c
index 70393e4..ea9d246 100644
--- a/arch/arm/mach-msm/ipc_router.c
+++ b/arch/arm/mach-msm/ipc_router.c
@@ -2001,11 +2001,12 @@
 
 int msm_ipc_router_lookup_server_name(struct msm_ipc_port_name *srv_name,
 				struct msm_ipc_port_addr *srv_addr,
-				int num_entries_in_array)
+				int num_entries_in_array,
+				uint32_t lookup_mask)
 {
 	struct msm_ipc_server *server;
 	struct msm_ipc_server_port *server_port;
-	int i = 0; /*num_entries_found*/
+	int key, i = 0; /*num_entries_found*/
 
 	if (!srv_name) {
 		pr_err("%s: Invalid srv_name\n", __func__);
@@ -2017,18 +2018,27 @@
 		return -EINVAL;
 	}
 
-	server = msm_ipc_router_lookup_server(srv_name->service,
-					srv_name->instance, 0, 0);
-	if (!server)
-		return -ENODEV;
-
 	mutex_lock(&server_list_lock);
-	list_for_each_entry(server_port, &server->server_port_list, list) {
-		if (i < num_entries_in_array) {
-			srv_addr[i].node_id = server_port->server_addr.node_id;
-			srv_addr[i].port_id = server_port->server_addr.port_id;
+	if (!lookup_mask)
+		lookup_mask = 0xFFFFFFFF;
+	for (key = 0; key < SRV_HASH_SIZE; key++) {
+		list_for_each_entry(server, &server_list[key], list) {
+			if ((server->name.service != srv_name->service) ||
+			    ((server->name.instance & lookup_mask) !=
+				srv_name->instance))
+				continue;
+
+			list_for_each_entry(server_port,
+				&server->server_port_list, list) {
+				if (i < num_entries_in_array) {
+					srv_addr[i].node_id =
+					  server_port->server_addr.node_id;
+					srv_addr[i].port_id =
+					  server_port->server_addr.port_id;
+				}
+				i++;
+			}
 		}
-		i++;
 	}
 	mutex_unlock(&server_list_lock);
 
diff --git a/arch/arm/mach-msm/ipc_router.h b/arch/arm/mach-msm/ipc_router.h
index d058e9b..b125185 100644
--- a/arch/arm/mach-msm/ipc_router.h
+++ b/arch/arm/mach-msm/ipc_router.h
@@ -182,7 +182,8 @@
 int msm_ipc_router_bind_control_port(struct msm_ipc_port *port_ptr);
 int msm_ipc_router_lookup_server_name(struct msm_ipc_port_name *srv_name,
 				      struct msm_ipc_port_addr *port_addr,
-				      int num_entries_in_array);
+				      int num_entries_in_array,
+				      uint32_t lookup_mask);
 int msm_ipc_router_close_port(struct msm_ipc_port *port_ptr);
 
 struct msm_ipc_port *msm_ipc_router_create_port(
diff --git a/arch/arm/mach-msm/ipc_socket.c b/arch/arm/mach-msm/ipc_socket.c
index 132f2a9..467c2c2 100644
--- a/arch/arm/mach-msm/ipc_socket.c
+++ b/arch/arm/mach-msm/ipc_socket.c
@@ -431,7 +431,8 @@
 			}
 		}
 		ret = msm_ipc_router_lookup_server_name(&server_arg.port_name,
-				port_addr, server_arg.num_entries_in_array);
+				port_addr, server_arg.num_entries_in_array,
+				server_arg.lookup_mask);
 		if (ret < 0) {
 			pr_err("%s: Server not found\n", __func__);
 			ret = -ENODEV;
diff --git a/include/linux/msm_ipc.h b/include/linux/msm_ipc.h
index 19cb82e..82f76a6 100644
--- a/include/linux/msm_ipc.h
+++ b/include/linux/msm_ipc.h
@@ -66,6 +66,7 @@
 	struct msm_ipc_port_name port_name;
 	int num_entries_in_array;
 	int num_entries_found;
+	uint32_t lookup_mask;
 	struct msm_ipc_port_addr port_addr[0];
 };