1c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
2c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * dspapi.c
3c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *
4c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *
6c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Common DSP API functions, also includes the wrapper
7c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * functions called directly by the DeviceIOControl interface.
8c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *
9c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Copyright (C) 2005-2006 Texas Instruments, Inc.
10c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *
11c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * This package is free software; you can redistribute it and/or modify
12c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * it under the terms of the GNU General Public License version 2 as
13c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * published by the Free Software Foundation.
14c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *
15c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
192094f12d440c5a9fae032932266fa4a44135194cNishanth Menon#include <linux/types.h>
20c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
21c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Host OS */
22c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/host_os.h>
23c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
24c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- DSP/BIOS Bridge */
25c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dbdefs.h>
26c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
27c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- OS Adaptation Layer */
28c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/ntfy.h>
29c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
30c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Platform Manager */
31c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/chnl.h>
32c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dev.h>
33c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/drv.h>
34c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
35c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/proc.h>
36c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/strm.h>
37c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
38c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Resource Manager */
39c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/disp.h>
40c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/mgr.h>
41c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/node.h>
42c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/rmm.h>
43c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
44c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Others */
45c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/msg.h>
46c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/cmm.h>
47c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/io.h>
48c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
49c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- This */
50c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dspapi.h>
51c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dbdcd.h>
52c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
53c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/resourcecleanup.h>
54c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
55c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Defines, Data Structures, Typedefs */
56c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_TRACEBUFLEN 255
57c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_LOADARGS    16
58c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_NODES       64
59c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_STREAMS     16
60c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_BUFS	64
61c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
62c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Used to get dspbridge ioctl table */
63c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define DB_GET_IOC_TABLE(cmd)	(DB_GET_MODULE(cmd) >> DB_MODULE_SHIFT)
64c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
65c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Device IOCtl function pointer */
66c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastruct api_cmd {
670cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiens	u32(*fxn) (union trapped_args *args, void *pr_ctxt);
685108de0ae06190f2ab54b9a1da315b77b33be1e2Rene Sapiens	u32 index;
69c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
70c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
71c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Globals */
72c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic u32 api_c_refs;
73c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
74c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
75c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Function tables.
76c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  The order of these functions MUST be the same as the order of the command
77c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  numbers defined in dspapi-ioctl.h  This is how an IOCTL number in user mode
78c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  turns into a function call in kernel mode.
79c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
80c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
81c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* MGR wrapper functions */
82c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd mgr_cmd[] = {
83c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_enum_node_info},	/* MGR_ENUMNODE_INFO */
84c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_enum_proc_info},	/* MGR_ENUMPROC_INFO */
85c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_register_object},	/* MGR_REGISTEROBJECT */
86c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_unregister_object},	/* MGR_UNREGISTEROBJECT */
87c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_wait_for_bridge_events},	/* MGR_WAIT */
88c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_get_process_resources_info},	/* MGR_GET_PROC_RES */
89c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
90c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
91c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* PROC wrapper functions */
92c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd proc_cmd[] = {
93c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_attach},	/* PROC_ATTACH */
94c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_ctrl},	/* PROC_CTRL */
95c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_detach},	/* PROC_DETACH */
96c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_enum_node_info},	/* PROC_ENUMNODE */
97c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_enum_resources},	/* PROC_ENUMRESOURCES */
98c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_get_state},	/* PROC_GET_STATE */
99c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_get_trace},	/* PROC_GET_TRACE */
100c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_load},	/* PROC_LOAD */
101c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_register_notify},	/* PROC_REGISTERNOTIFY */
102c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_start},	/* PROC_START */
103c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_reserve_memory},	/* PROC_RSVMEM */
104c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_un_reserve_memory},	/* PROC_UNRSVMEM */
105c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_map},		/* PROC_MAPMEM */
106c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_un_map},	/* PROC_UNMAPMEM */
107c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_flush_memory},	/* PROC_FLUSHMEMORY */
108c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_stop},	/* PROC_STOP */
109c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_invalidate_memory},	/* PROC_INVALIDATEMEMORY */
110c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_begin_dma},	/* PROC_BEGINDMA */
111c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_end_dma},	/* PROC_ENDDMA */
112c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
113c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
114c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* NODE wrapper functions */
115c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd node_cmd[] = {
116c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_allocate},	/* NODE_ALLOCATE */
117c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_alloc_msg_buf},	/* NODE_ALLOCMSGBUF */
118c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_change_priority},	/* NODE_CHANGEPRIORITY */
119c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_connect},	/* NODE_CONNECT */
120c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_create},	/* NODE_CREATE */
121c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_delete},	/* NODE_DELETE */
122c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_free_msg_buf},	/* NODE_FREEMSGBUF */
123c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_get_attr},	/* NODE_GETATTR */
124c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_get_message},	/* NODE_GETMESSAGE */
125c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_pause},	/* NODE_PAUSE */
126c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_put_message},	/* NODE_PUTMESSAGE */
127c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_register_notify},	/* NODE_REGISTERNOTIFY */
128c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_run},		/* NODE_RUN */
129c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_terminate},	/* NODE_TERMINATE */
130c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_get_uuid_props},	/* NODE_GETUUIDPROPS */
131c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
132c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
133c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* STRM wrapper functions */
134c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd strm_cmd[] = {
135c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_allocate_buffer},	/* STRM_ALLOCATEBUFFER */
136c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_close},	/* STRM_CLOSE */
137c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_free_buffer},	/* STRM_FREEBUFFER */
138c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_get_event_handle},	/* STRM_GETEVENTHANDLE */
139c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_get_info},	/* STRM_GETINFO */
140c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_idle},	/* STRM_IDLE */
141c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_issue},	/* STRM_ISSUE */
142c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_open},	/* STRM_OPEN */
143c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_reclaim},	/* STRM_RECLAIM */
144c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_register_notify},	/* STRM_REGISTERNOTIFY */
145c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_select},	/* STRM_SELECT */
146c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
147c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
148c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* CMM wrapper functions */
149c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd cmm_cmd[] = {
150c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_calloc_buf},	/* CMM_ALLOCBUF */
151c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_free_buf},	/* CMM_FREEBUF */
152c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_get_handle},	/* CMM_GETHANDLE */
153c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_get_info},	/* CMM_GETINFO */
154c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
155c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
156c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Array used to store ioctl table sizes. It can hold up to 8 entries */
157c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic u8 size_cmd[] = {
158c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(mgr_cmd),
159c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(proc_cmd),
160c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(node_cmd),
161c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(strm_cmd),
162c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(cmm_cmd),
163c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
164c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
165c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic inline void _cp_fm_usr(void *to, const void __user * from,
166c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			      int *err, unsigned long bytes)
167c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
16851d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (*err)
169c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
170c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
171c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(!from)) {
172c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
173c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
174c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
175c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
176c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(copy_from_user(to, from, bytes)))
177c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
178c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
179c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
180c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define CP_FM_USR(to, from, err, n)				\
181c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	_cp_fm_usr(to, from, &(err), (n) * sizeof(*(to)))
182c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
183c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic inline void _cp_to_usr(void __user *to, const void *from,
184c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			      int *err, unsigned long bytes)
185c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
18651d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (*err)
187c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
188c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
189c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(!to)) {
190c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
191c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
192c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
193c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
194c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(copy_to_user(to, from, bytes)))
195c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
196c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
197c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
198c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define CP_TO_USR(to, from, err, n)				\
199c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	_cp_to_usr(to, from, &(err), (n) * sizeof(*(from)))
200c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
201c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
202c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_call_dev_ioctl ========
203c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Purpose:
204c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Call the (wrapper) function for the corresponding API IOCTL.
205c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
2060cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensinline int api_call_dev_ioctl(u32 cmd, union trapped_args *args,
207c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      u32 *result, void *pr_ctxt)
208c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
2090cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiens	u32(*ioctl_cmd) (union trapped_args *args, void *pr_ctxt) = NULL;
210c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int i;
211c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
212c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (_IOC_TYPE(cmd) != DB) {
213c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: Incompatible dspbridge ioctl number\n", __func__);
214c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
215c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
216c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
217c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DB_GET_IOC_TABLE(cmd) > ARRAY_SIZE(size_cmd)) {
218c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: undefined ioctl module\n", __func__);
219c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
220c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
221c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
222c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Check the size of the required cmd table */
223c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	i = DB_GET_IOC(cmd);
224c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (i > size_cmd[DB_GET_IOC_TABLE(cmd)]) {
225c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: requested ioctl %d out of bounds for table %d\n",
226c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		       __func__, i, DB_GET_IOC_TABLE(cmd));
227c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
228c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
229c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
230c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	switch (DB_GET_MODULE(cmd)) {
231c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_MGR:
232c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = mgr_cmd[i].fxn;
233c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
234c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_PROC:
235c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = proc_cmd[i].fxn;
236c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
237c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_NODE:
238c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = node_cmd[i].fxn;
239c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
240c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_STRM:
241c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = strm_cmd[i].fxn;
242c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
243c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_CMM:
244c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = cmm_cmd[i].fxn;
245c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
246c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
247c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
248c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!ioctl_cmd) {
249c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: requested ioctl not defined\n", __func__);
250c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
251c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	} else {
252c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*result = (*ioctl_cmd) (args, pr_ctxt);
253c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
254c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
255c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return 0;
256c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
257c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunaerr:
258c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -EINVAL;
259c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
260c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
261c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
262c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_exit ========
263c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
264c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunavoid api_exit(void)
265c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
266c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	api_c_refs--;
267c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
268a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVíctor Manuel Jáquez Leal	if (api_c_refs == 0)
269c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		mgr_exit();
270c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
271c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
272c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
273c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_init ========
274c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Purpose:
275c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Module initialization used by Bridge API.
276c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
277c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunabool api_init(void)
278c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
279c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	bool ret = true;
280a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVíctor Manuel Jáquez Leal
281a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVíctor Manuel Jáquez Leal	if (api_c_refs == 0)
282a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVíctor Manuel Jáquez Leal		ret = mgr_init();
283a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVíctor Manuel Jáquez Leal
284c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (ret)
285c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		api_c_refs++;
286c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
287c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
288c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
289c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
290c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
291c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_init_complete2 ========
292c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Purpose:
293c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Perform any required bridge initialization which cannot
294c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      be performed in api_init() or dev_start_device() due
295c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      to the fact that some services are not yet
296c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      completely initialized.
297c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Parameters:
298c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Returns:
299c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      0:	Allow this device to load
300c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      -EPERM:      Failure.
301c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Requires:
302c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Bridge API initialized.
303c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Ensures:
304c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
305c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunaint api_init_complete2(void)
306c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
307c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
308c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct cfg_devnode *dev_node;
309c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dev_object *hdev_obj;
3104a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos	struct drv_data *drv_datap;
311c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 dev_type;
312c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
313c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/*  Walk the list of DevObjects, get each devnode, and attempting to
314c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	 *  autostart the board. Note that this requires COF loading, which
315c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	 *  requires KFILE. */
316c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	for (hdev_obj = dev_get_first(); hdev_obj != NULL;
317c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	     hdev_obj = dev_get_next(hdev_obj)) {
31851d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (dev_get_dev_node(hdev_obj, &dev_node))
319c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			continue;
320c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
32151d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (dev_get_dev_type(hdev_obj, &dev_type))
322c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			continue;
323c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
3244a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos		if ((dev_type == DSP_UNIT) || (dev_type == IVA_UNIT)) {
3254a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos			drv_datap = dev_get_drvdata(bridge);
3264a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos
3274a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos			if (drv_datap && drv_datap->base_img)
328c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				proc_auto_start(dev_node, hdev_obj);
3294a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos		}
330c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
331c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
332c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
333c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
334c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
335c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* TODO: Remove deprecated and not implemented ioctl wrappers */
336c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
337c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
338c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_enum_node_info ========
339c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
3400cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_enum_node_info(union trapped_args *args, void *pr_ctxt)
341c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
342c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pndb_props;
343c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_nodes;
344c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
345121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	u32 size = args->args_mgr_enumnode_info.ndb_props_size;
346c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
347c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (size < sizeof(struct dsp_ndbprops))
348c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
349c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
350c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pndb_props = kmalloc(size, GFP_KERNEL);
351c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (pndb_props == NULL)
352c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
353c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
354157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
355c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
356c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		    mgr_enum_node_info(args->args_mgr_enumnode_info.node_id,
357c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       (struct dsp_ndbprops *)pndb_props, size,
358c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       &num_nodes);
359c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
360121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	CP_TO_USR(args->args_mgr_enumnode_info.ndb_props, pndb_props, status,
361c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  size);
362121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	CP_TO_USR(args->args_mgr_enumnode_info.num_nodes, &num_nodes, status,
363c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
364c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pndb_props);
365c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
366c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
367c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
368c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
369c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
370c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_enum_proc_info ========
371c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
3720cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_enum_proc_info(union trapped_args *args, void *pr_ctxt)
373c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
374c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *processor_info;
375c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 num_procs;
376c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
377c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 size = args->args_mgr_enumproc_info.processor_info_size;
378c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
379c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (size < sizeof(struct dsp_processorinfo))
380c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
381c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
382c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	processor_info = kmalloc(size, GFP_KERNEL);
383c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (processor_info == NULL)
384c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
385c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
386157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
387c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
388c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		    mgr_enum_processor_info(args->args_mgr_enumproc_info.
389c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    processor_id,
390c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    (struct dsp_processorinfo *)
391c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    processor_info, size, &num_procs);
392c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
393c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_mgr_enumproc_info.processor_info, processor_info,
394c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, size);
395121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	CP_TO_USR(args->args_mgr_enumproc_info.num_procs, &num_procs,
396c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
397c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(processor_info);
398c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
399c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
400c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
401c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
402c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define WRAP_MAP2CALLER(x) x
403c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
404c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_register_object ========
405c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
4060cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_register_object(union trapped_args *args, void *pr_ctxt)
407c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
408c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
409c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid uuid_obj;
410c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 path_size = 0;
411c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	char *psz_path_name = NULL;
412c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
413c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
414c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1);
41551d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status)
416c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
417c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* path_size is increased by 1 to accommodate NULL */
418c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	path_size = strlen_user((char *)
419121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens				args->args_mgr_registerobject.sz_path_name) +
420c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    1;
421c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	psz_path_name = kmalloc(path_size, GFP_KERNEL);
422cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall	if (!psz_path_name) {
423cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall		status = -ENOMEM;
424c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
425cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall	}
426c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = strncpy_from_user(psz_path_name,
427c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				(char *)args->args_mgr_registerobject.
428121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens				sz_path_name, path_size);
429c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!ret) {
430c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -EFAULT;
431c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
432c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
433c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
434cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall	if (args->args_mgr_registerobject.obj_type >= DSP_DCDMAXOBJTYPE) {
435cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall		status = -EINVAL;
436cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall		goto func_end;
437cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall	}
438c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
439c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = dcd_register_object(&uuid_obj,
440c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     args->args_mgr_registerobject.obj_type,
441c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     (char *)psz_path_name);
442c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
443c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(psz_path_name);
444c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
445c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
446c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
447c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
448c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_unregister_object ========
449c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
4500cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_unregister_object(union trapped_args *args, void *pr_ctxt)
451c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
452c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
453c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid uuid_obj;
454c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
455c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1);
45651d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status)
457c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
458c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
459c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = dcd_unregister_object(&uuid_obj,
460c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       args->args_mgr_unregisterobject.
461c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       obj_type);
462c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
463c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
464c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
465c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
466c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
467c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
468c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_wait_for_bridge_events ========
469c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
4700cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_wait_for_bridge_events(union trapped_args *args, void *pr_ctxt)
471c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
47235f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos	int status = 0;
473c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification *anotifications[MAX_EVENTS];
474c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notifications[MAX_EVENTS];
475c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 index, i;
476c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 count = args->args_mgr_wait.count;
477c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
478c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (count > MAX_EVENTS)
479c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -EINVAL;
480c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
481c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* get the array of pointers to user structures */
482c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(anotifications, args->args_mgr_wait.anotifications,
483c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, count);
484c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* get the events */
485c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	for (i = 0; i < count; i++) {
486c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&notifications[i], anotifications[i], status, 1);
48735f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos		if (status || !notifications[i].handle) {
48835f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos			status = -EINVAL;
48935f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos			break;
490c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
49135f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos		/* set the array of pointers to kernel structures */
49235f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos		anotifications[i] = &notifications[i];
493c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
494157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
49535f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos		status = mgr_wait_for_bridge_events(anotifications, count,
496c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna							 &index,
497c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna							 args->args_mgr_wait.
498a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens							 timeout);
499c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
500121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	CP_TO_USR(args->args_mgr_wait.index, &index, status, 1);
50135f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos	return status;
502c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
503c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
504c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
505c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== MGRWRAP_GetProcessResourceInfo ========
506c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5070cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated mgrwrap_get_process_resources_info(union trapped_args * args,
508c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna						    void *pr_ctxt)
509c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
510c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
511c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return 0;
512c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
513c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
514c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
515c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_attach ========
516c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5170cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_attach(union trapped_args *args, void *pr_ctxt)
518c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
519c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *processor;
520c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
521c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_processorattrin proc_attr_in, *attr_in = NULL;
522c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
523c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
524c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_attach.attr_in) {
525c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&proc_attr_in, args->args_proc_attach.attr_in, status,
526c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  1);
527157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
528c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			attr_in = &proc_attr_in;
529c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		else
530c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_end;
531c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
532c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
533c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_attach(args->args_proc_attach.processor_id, attr_in,
534c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			     &processor, pr_ctxt);
535c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_attach.ph_processor, &processor, status, 1);
536c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
537c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
538c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
539c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
540c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
541c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_ctrl ========
542c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5430cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_ctrl(union trapped_args *args, void *pr_ctxt)
544c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
545c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 cb_data_size, __user * psize = (u32 __user *)
546121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	    args->args_proc_ctrl.args;
547c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pargs = NULL;
548c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
549a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
550c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
551c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (psize) {
552c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (get_user(cb_data_size, psize)) {
553c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EPERM;
554c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_end;
555c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
556c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cb_data_size += sizeof(u32);
557c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pargs = kmalloc(cb_data_size, GFP_KERNEL);
558c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (pargs == NULL) {
559c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -ENOMEM;
560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_end;
561c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
562c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
563121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens		CP_FM_USR(pargs, args->args_proc_ctrl.args, status,
564c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  cb_data_size);
565c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
566157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
5676bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		status = proc_ctrl(hprocessor,
568b4da7fc381c51d42c231f97de912b89dbabe8928Rene Sapiens				   args->args_proc_ctrl.cmd,
569c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   (struct dsp_cbdata *)pargs);
570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
571c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
572121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	/* CP_TO_USR(args->args_proc_ctrl.args, pargs, status, 1); */
573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pargs);
574c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
575c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
577c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_detach ========
580c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5810cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated procwrap_detach(union trapped_args * args, void *pr_ctxt)
582c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
583c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* proc_detach called at bridge_release only */
584c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
585c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return 0;
586c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
587c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
588c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
589c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_node_info ========
590c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5910cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_node_info(union trapped_args *args, void *pr_ctxt)
592c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
593c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
594c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *node_tab[MAX_NODES];
595c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_nodes;
596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 alloc_cnt;
597a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
599c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_proc_enumnode_info.node_tab_size)
600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
601c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
6026bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	status = proc_enum_nodes(hprocessor,
603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 node_tab,
604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 args->args_proc_enumnode_info.node_tab_size,
605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 &num_nodes, &alloc_cnt);
606c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumnode_info.node_tab, node_tab, status,
607c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  num_nodes);
608121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	CP_TO_USR(args->args_proc_enumnode_info.num_nodes, &num_nodes,
609c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
610121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	CP_TO_USR(args->args_proc_enumnode_info.allocated, &alloc_cnt,
611c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
612c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
613c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
6150cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_end_dma(union trapped_args *args, void *pr_ctxt)
616c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
617c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
618c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
619c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_dma.dir >= DMA_NONE)
620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
621c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_end_dma(pr_ctxt,
623121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens				   args->args_proc_dma.mpu_addr,
624085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens				   args->args_proc_dma.size,
625c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.dir);
626c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
627c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
6290cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_begin_dma(union trapped_args *args, void *pr_ctxt)
630c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
631c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
632c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
633c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_dma.dir >= DMA_NONE)
634c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
635c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
636c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_begin_dma(pr_ctxt,
637121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens				   args->args_proc_dma.mpu_addr,
638085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens				   args->args_proc_dma.size,
639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.dir);
640c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
641c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
642c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
643c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
644c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_flush_memory ========
645c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
6460cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_flush_memory(union trapped_args *args, void *pr_ctxt)
647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
648c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
650fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	if (args->args_proc_flushmemory.flags >
651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    PROC_WRITEBACK_INVALIDATE_MEM)
652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
653c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
654c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_flush_memory(pr_ctxt,
655121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens				   args->args_proc_flushmemory.mpu_addr,
656085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens				   args->args_proc_flushmemory.size,
657fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens				   args->args_proc_flushmemory.flags);
658c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
659c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
660c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
661c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
662c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_invalidate_memory ========
663c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
6640cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_invalidate_memory(union trapped_args *args, void *pr_ctxt)
665c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
666c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
667c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
668c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status =
669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    proc_invalidate_memory(pr_ctxt,
670121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens				   args->args_proc_invalidatememory.mpu_addr,
671085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens				   args->args_proc_invalidatememory.size);
672c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
676c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_resources ========
677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
6780cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_resources(union trapped_args *args, void *pr_ctxt)
679c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
680c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
681c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_resourceinfo resource_info;
682a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
683c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
684c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_enumresources.resource_info_size <
685c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    sizeof(struct dsp_resourceinfo))
686c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
687c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status =
6896bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	    proc_get_resource_info(hprocessor,
690c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_enumresources.resource_type,
691c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   &resource_info,
692c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_enumresources.
693c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   resource_info_size);
694c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
695c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumresources.resource_info, &resource_info,
696c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
697c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
698c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
699c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
700c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
701c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
702c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
703c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_state ========
704c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7050cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_state(union trapped_args *args, void *pr_ctxt)
706c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
707c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
708c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_processorstate proc_state;
709a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
710c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
711c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_getstate.state_info_size <
712c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    sizeof(struct dsp_processorstate))
713c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
714c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
7156bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	status = proc_get_state(hprocessor, &proc_state,
716c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   args->args_proc_getstate.state_info_size);
717c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_getstate.proc_state_obj, &proc_state, status,
718c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
719c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
720c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
721c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
722c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
723c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
724c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_trace ========
725c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7260cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_trace(union trapped_args *args, void *pr_ctxt)
727c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
728c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
729c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pbuf;
730a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
731c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
732c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_gettrace.max_size > MAX_TRACEBUFLEN)
733c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
734c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
735c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pbuf = kzalloc(args->args_proc_gettrace.max_size, GFP_KERNEL);
736c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (pbuf != NULL) {
7376bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		status = proc_get_trace(hprocessor, pbuf,
738c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					args->args_proc_gettrace.max_size);
739c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	} else {
740c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
741c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
742ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	CP_TO_USR(args->args_proc_gettrace.buf, pbuf, status,
743c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  args->args_proc_gettrace.max_size);
744c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pbuf);
745c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
746c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
747c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
748c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
749c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
750c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_load ========
751c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7520cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_load(union trapped_args *args, void *pr_ctxt)
753c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
754c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	s32 i, len;
755c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
756c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	char *temp;
757c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	s32 count = args->args_proc_load.argc_index;
758c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 **argv = NULL, **envp = NULL;
759a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
760c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
761c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (count <= 0 || count > MAX_LOADARGS) {
762c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -EINVAL;
763c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
764c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
765c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
766c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	argv = kmalloc(count * sizeof(u8 *), GFP_KERNEL);
767c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!argv) {
768c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
769c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
770c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
771c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
772c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(argv, args->args_proc_load.user_args, status, count);
77351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status) {
774c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		kfree(argv);
775c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		argv = NULL;
776c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
777c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
778c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
779c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	for (i = 0; i < count; i++) {
780c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (argv[i]) {
781c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* User space pointer to argument */
782c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			temp = (char *)argv[i];
783c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* len is increased by 1 to accommodate NULL */
784c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			len = strlen_user((char *)temp) + 1;
785c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* Kernel space pointer to argument */
786c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			argv[i] = kmalloc(len, GFP_KERNEL);
787c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (argv[i]) {
788c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				CP_FM_USR(argv[i], temp, status, len);
78951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos				if (status) {
790c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					kfree(argv[i]);
791c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					argv[i] = NULL;
792c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					goto func_cont;
793c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				}
794c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			} else {
795c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
796c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				goto func_cont;
797c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			}
798c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
799c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
800c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* TODO: validate this */
801c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_load.user_envp) {
802c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		/* number of elements in the envp array including NULL */
803c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		count = 0;
804c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		do {
805b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov			if (get_user(temp,
806b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov				     args->args_proc_load.user_envp + count)) {
807b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov				status = -EFAULT;
808b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov				goto func_cont;
809b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov			}
810c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			count++;
811c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		} while (temp);
812c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		envp = kmalloc(count * sizeof(u8 *), GFP_KERNEL);
813c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (!envp) {
814c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -ENOMEM;
815c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_cont;
816c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
817c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
818c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(envp, args->args_proc_load.user_envp, status, count);
81951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (status) {
820c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			kfree(envp);
821c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			envp = NULL;
822c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_cont;
823c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
824c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		for (i = 0; envp[i]; i++) {
825c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* User space pointer to argument */
826c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			temp = (char *)envp[i];
827c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* len is increased by 1 to accommodate NULL */
828c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			len = strlen_user((char *)temp) + 1;
829c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* Kernel space pointer to argument */
830c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			envp[i] = kmalloc(len, GFP_KERNEL);
831c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (envp[i]) {
832c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				CP_FM_USR(envp[i], temp, status, len);
83351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos				if (status) {
834c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					kfree(envp[i]);
835c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					envp[i] = NULL;
836c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					goto func_cont;
837c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				}
838c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			} else {
839c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
840c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				goto func_cont;
841c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			}
842c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
843c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
844c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
845157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
8466bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		status = proc_load(hprocessor,
847c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_load.argc_index,
848cd4f13c02a5d72e1fc367c51cc0fd955f65538e0Menon, Nishanth				   (const char **)argv, (const char **)envp);
849c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
850c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
851c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (envp) {
852c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		i = 0;
853c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		while (envp[i])
854c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			kfree(envp[i++]);
855c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
856c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		kfree(envp);
857c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
858c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
859c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (argv) {
860c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		count = args->args_proc_load.argc_index;
861c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		for (i = 0; (i < count) && argv[i]; i++)
862c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			kfree(argv[i]);
863c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
864c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		kfree(argv);
865c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
866c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
867c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
868c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
869c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
870c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
871c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_map ========
872c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
8730cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_map(union trapped_args *args, void *pr_ctxt)
874c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
875c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
876c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *map_addr;
877a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
878c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
879085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens	if (!args->args_proc_mapmem.size)
880c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
881c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
882a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	status = proc_map(args->args_proc_mapmem.processor,
883121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens			  args->args_proc_mapmem.mpu_addr,
884085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens			  args->args_proc_mapmem.size,
885c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_mapmem.req_addr, &map_addr,
886121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens			  args->args_proc_mapmem.map_attr, pr_ctxt);
887157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
888121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens		if (put_user(map_addr, args->args_proc_mapmem.map_addr)) {
889c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EINVAL;
8906bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos			proc_un_map(hprocessor, map_addr, pr_ctxt);
891c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
892c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
893c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
894c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
895c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
896c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
897c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
898c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_register_notify ========
899c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9000cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_register_notify(union trapped_args *args, void *pr_ctxt)
901c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
902c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
903c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notification;
904a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
905c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
906c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Initialize the notification data structure */
907ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	notification.name = NULL;
908c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.handle = NULL;
909c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
9106bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	status = proc_register_notify(hprocessor,
911c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 args->args_proc_register_notify.event_mask,
912c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 args->args_proc_register_notify.notify_type,
913c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 &notification);
914121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	CP_TO_USR(args->args_proc_register_notify.notification, &notification,
915c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
916c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
917c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
918c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
919c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
920c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_reserve_memory ========
921c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9222fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contrerasu32 procwrap_reserve_memory(union trapped_args *args, void *pr_ctxt)
923c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
9242fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	int status;
9252fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	void *prsv_addr;
926a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
9272fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras
928085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens	if ((args->args_proc_rsvmem.size <= 0) ||
929085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens	    (args->args_proc_rsvmem.size & (PG_SIZE4K - 1)) != 0)
9302fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras		return -EINVAL;
9312fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras
9322fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	status = proc_reserve_memory(hprocessor,
933085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens				     args->args_proc_rsvmem.size, &prsv_addr,
9342fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras				     pr_ctxt);
9352fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	if (!status) {
936121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens		if (put_user(prsv_addr, args->args_proc_rsvmem.rsv_addr)) {
9372fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras			status = -EINVAL;
9382fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras			proc_un_reserve_memory(args->args_proc_rsvmem.
939a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens					       processor, prsv_addr, pr_ctxt);
9402fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras		}
9412fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	}
9422fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	return status;
943c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
944c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
945c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
946c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_start ========
947c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9480cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_start(union trapped_args *args, void *pr_ctxt)
949c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
950c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
951c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
952a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	ret = proc_start(((struct process_context *)pr_ctxt)->processor);
953c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
954c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
955c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
956c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
957c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_map ========
958c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9590cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_un_map(union trapped_args *args, void *pr_ctxt)
960c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
961c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
962c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
963a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	status = proc_un_map(((struct process_context *)pr_ctxt)->processor,
964c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			     args->args_proc_unmapmem.map_addr, pr_ctxt);
965c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
966c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
967c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
968c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
969c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_reserve_memory ========
970c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9712fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contrerasu32 procwrap_un_reserve_memory(union trapped_args *args, void *pr_ctxt)
972c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
9732fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	int status;
974a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
9752fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras
9762fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	status = proc_un_reserve_memory(hprocessor,
977121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens					args->args_proc_unrsvmem.rsv_addr,
9782fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras					pr_ctxt);
9792fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	return status;
980c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
981c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
982c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
983c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_stop ========
984c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9850cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_stop(union trapped_args *args, void *pr_ctxt)
986c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
987c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
988c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
989a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	ret = proc_stop(((struct process_context *)pr_ctxt)->processor);
990c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
991c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
992c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
993c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
994c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
9950624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos * ======== find_handle =========
9960624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos */
9970624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramosinline void find_node_handle(struct node_res_object **noderes,
9980624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				void *pr_ctxt, void *hnode)
9990624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos{
10000624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	rcu_read_lock();
10010624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	*noderes = idr_find(((struct process_context *)pr_ctxt)->node_id,
10028df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos								(int)hnode - 1);
10030624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	rcu_read_unlock();
10040624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	return;
10050624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos}
10060624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
10070624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
10080624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos/*
1009c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_allocate ========
1010c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10110cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_allocate(union trapped_args *args, void *pr_ctxt)
1012c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1013c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1014c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid node_uuid;
1015c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 cb_data_size = 0;
1016121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	u32 __user *psize = (u32 __user *) args->args_node_allocate.args;
1017c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pargs = NULL;
1018c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_nodeattrin proc_attr_in, *attr_in = NULL;
10190624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
10208df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos	int nodeid;
1021a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
1022c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1023c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
1024c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (psize) {
1025c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (get_user(cb_data_size, psize))
1026c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EPERM;
1027c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1028c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cb_data_size += sizeof(u32);
1029157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status) {
1030c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pargs = kmalloc(cb_data_size, GFP_KERNEL);
1031c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (pargs == NULL)
1032c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
1033c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1034c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1035121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens		CP_FM_USR(pargs, args->args_node_allocate.args, status,
1036c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  cb_data_size);
1037c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1038c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&node_uuid, args->args_node_allocate.node_id_ptr, status, 1);
103951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status)
1040c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
1041c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
1042c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_node_allocate.attr_in) {
1043c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&proc_attr_in, args->args_node_allocate.attr_in,
1044c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1045157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
1046c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			attr_in = &proc_attr_in;
1047c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		else
1048c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -ENOMEM;
1049c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1050c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1051157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
10526bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		status = node_allocate(hprocessor,
1053c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       &node_uuid, (struct dsp_cbdata *)pargs,
10540624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				       attr_in, &node_res, pr_ctxt);
1055c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1056157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
10578df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos		nodeid = node_res->id + 1;
1058fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens		CP_TO_USR(args->args_node_allocate.node, &nodeid,
10590624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos			status, 1);
106051d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (status) {
1061c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EFAULT;
10620624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos			node_delete(node_res, pr_ctxt);
1063c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1064c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1065c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
1066c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pargs);
1067c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1068c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1069c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1070c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1071c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1072c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== nodewrap_alloc_msg_buf ========
1073c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10740cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_alloc_msg_buf(union trapped_args *args, void *pr_ctxt)
1075c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1076c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1077c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr *pattr = NULL;
1078c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr attr;
1079c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pbuffer = NULL;
10800624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
10810624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
10820624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res,  pr_ctxt,
1083ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens				args->args_node_allocmsgbuf.node);
10840624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
10850624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
10860624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1087c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1088fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	if (!args->args_node_allocmsgbuf.size)
1089c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1090c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1091fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	if (args->args_node_allocmsgbuf.attr) {	/* Optional argument */
1092fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens		CP_FM_USR(&attr, args->args_node_allocmsgbuf.attr, status, 1);
1093157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
1094c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pattr = &attr;
1095c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1096c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1097e6bf74f06f5178fcccb66acf51d1f6ebc4e6c5d0Menon, Nishanth	/* argument */
1098ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	CP_FM_USR(&pbuffer, args->args_node_allocmsgbuf.buffer, status, 1);
1099157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
1100ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens		status = node_alloc_msg_buf(node_res->node,
1101fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens					    args->args_node_allocmsgbuf.size,
1102c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    pattr, &pbuffer);
1103c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1104ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	CP_TO_USR(args->args_node_allocmsgbuf.buffer, &pbuffer, status, 1);
1105c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1106c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1107c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1108c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1109c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_change_priority ========
1110c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
11110cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_change_priority(union trapped_args *args, void *pr_ctxt)
1112c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1113c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
11140624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
1115c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
11160624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt,
1117ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens				args->args_node_changepriority.node);
11180624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
11190624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
11200624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
11210624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1122ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	ret = node_change_priority(node_res->node,
1123c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_node_changepriority.prio);
1124c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1125c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1126c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1127c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1128c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1129c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_connect ========
1130c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
11310cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_connect(union trapped_args *args, void *pr_ctxt)
1132c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1133c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1134c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_strmattr attrs;
1135c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_strmattr *pattrs = NULL;
1136c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 cb_data_size;
1137c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 __user *psize = (u32 __user *) args->args_node_connect.conn_param;
1138c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pargs = NULL;
11390624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res1, *node_res2;
11400624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_object *node1 = NULL, *node2 = NULL;
11410624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1142ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	if ((int)args->args_node_connect.node != DSP_HGPPNODE) {
11430624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		find_node_handle(&node_res1, pr_ctxt,
1144ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens				args->args_node_connect.node);
11450624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		if (node_res1)
1146ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens			node1 = node_res1->node;
11470624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	} else {
1148ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens		node1 = args->args_node_connect.node;
11490624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	}
11500624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
11510624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if ((int)args->args_node_connect.other_node != DSP_HGPPNODE) {
11520624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		find_node_handle(&node_res2, pr_ctxt,
11530624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				args->args_node_connect.other_node);
11540624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		if (node_res2)
1155ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens			node2 = node_res2->node;
11560624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	} else {
11570624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		node2 = args->args_node_connect.other_node;
11580624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	}
11590624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
11600624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node1 || !node2)
11610624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1162c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1163c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
1164c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (psize) {
1165c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (get_user(cb_data_size, psize))
1166c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EPERM;
1167c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1168c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cb_data_size += sizeof(u32);
1169157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status) {
1170c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pargs = kmalloc(cb_data_size, GFP_KERNEL);
1171c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (pargs == NULL) {
1172c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
1173c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				goto func_cont;
1174c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			}
1175c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1176c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1177c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(pargs, args->args_node_connect.conn_param, status,
1178c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  cb_data_size);
117951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (status)
1180c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_cont;
1181c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1182fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	if (args->args_node_connect.attrs) {	/* Optional argument */
1183fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens		CP_FM_USR(&attrs, args->args_node_connect.attrs, status, 1);
1184157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
1185c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pattrs = &attrs;
1186c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1187c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1188157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
11890624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		status = node_connect(node1,
1190c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_connect.stream_id,
11910624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				      node2,
1192c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_connect.other_stream,
1193c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      pattrs, (struct dsp_cbdata *)pargs);
1194c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1195c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
1196c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pargs);
1197c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1198c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1199c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1200c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1201c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1202c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_create ========
1203c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12040cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_create(union trapped_args *args, void *pr_ctxt)
1205c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1206c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
12070624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
12080624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1209ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_node_create.node);
1210c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
12110624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
12120624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
12130624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1214ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	ret = node_create(node_res->node);
1215c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1216c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1217c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1218c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1219c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1220c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_delete ========
1221c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12220cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_delete(union trapped_args *args, void *pr_ctxt)
1223c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1224c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
12250624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
12260624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1227ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_node_delete.node);
12280624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
12290624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
12300624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1231c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
12320624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	ret = node_delete(node_res, pr_ctxt);
1233c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1234c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1235c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1236c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1237c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1238c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== nodewrap_free_msg_buf ========
1239c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12400cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_free_msg_buf(union trapped_args *args, void *pr_ctxt)
1241c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1242c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1243c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr *pattr = NULL;
1244c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr attr;
12450624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
12460624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1247ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_node_freemsgbuf.node);
12480624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
12490624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
12500624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
12510624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1252fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	if (args->args_node_freemsgbuf.attr) {	/* Optional argument */
1253fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens		CP_FM_USR(&attr, args->args_node_freemsgbuf.attr, status, 1);
1254157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
1255c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pattr = &attr;
1256c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1257c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1258c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1259ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	if (!args->args_node_freemsgbuf.buffer)
1260c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EFAULT;
1261c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1262157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
1263ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens		status = node_free_msg_buf(node_res->node,
1264ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens					   args->args_node_freemsgbuf.buffer,
1265c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					   pattr);
1266c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1267c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1268c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1269c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1270c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1271c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1272c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_attr ========
1273c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12740cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_attr(union trapped_args *args, void *pr_ctxt)
1275c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1276c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1277c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_nodeattr attr;
12780624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
1279c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1280ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_node_getattr.node);
12810624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
12820624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
12830624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
12840624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1285ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	status = node_get_attr(node_res->node, &attr,
1286c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			       args->args_node_getattr.attr_size);
1287fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	CP_TO_USR(args->args_node_getattr.attr, &attr, status, 1);
1288c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1289c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1290c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1291c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1292c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1293c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_message ========
1294c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12950cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_message(union trapped_args *args, void *pr_ctxt)
1296c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1297c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1298c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_msg msg;
12990624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
13000624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1301ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_node_getmessage.node);
1302c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
13030624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
13040624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
13050624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1306ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	status = node_get_message(node_res->node, &msg,
1307a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens				  args->args_node_getmessage.timeout);
1308c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1309c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_getmessage.message, &msg, status, 1);
1310c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1311c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1312c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1313c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1314c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1315c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_pause ========
1316c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13170cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_pause(union trapped_args *args, void *pr_ctxt)
1318c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1319c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
13200624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
13210624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1322ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_node_pause.node);
13230624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13240624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
13250624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1326c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1327ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	ret = node_pause(node_res->node);
1328c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1329c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1330c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1331c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1332c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1333c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_put_message ========
1334c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13350cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_put_message(union trapped_args *args, void *pr_ctxt)
1336c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1337c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1338c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_msg msg;
13390624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
13400624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1341ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_node_putmessage.node);
13420624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13430624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
13440624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1345c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1346c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&msg, args->args_node_putmessage.message, status, 1);
1347c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1348157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
1349c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
1350ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens		    node_put_message(node_res->node, &msg,
1351a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens				     args->args_node_putmessage.timeout);
1352c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1353c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1354c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1355c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1356c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1357c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1358c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_register_notify ========
1359c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13600cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_register_notify(union trapped_args *args, void *pr_ctxt)
1361c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1362c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1363c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notification;
13640624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
13650624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13660624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt,
1367ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens			args->args_node_registernotify.node);
13680624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13690624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
13700624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1371c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1372c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Initialize the notification data structure */
1373ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	notification.name = NULL;
1374c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.handle = NULL;
1375c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1376c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_proc_register_notify.event_mask)
1377c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&notification,
1378121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens			  args->args_proc_register_notify.notification,
1379c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1380c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1381ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	status = node_register_notify(node_res->node,
1382c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_registernotify.event_mask,
1383c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_registernotify.
1384c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      notify_type, &notification);
1385121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	CP_TO_USR(args->args_node_registernotify.notification, &notification,
1386c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
1387c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1388c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1389c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1390c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1391c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_run ========
1392c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13930cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_run(union trapped_args *args, void *pr_ctxt)
1394c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1395c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
13960624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
13970624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1398ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_node_run.node);
13990624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14000624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
14010624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1402c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1403ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	ret = node_run(node_res->node);
1404c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1405c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1406c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1407c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1408c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1409c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_terminate ========
1410c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14110cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_terminate(union trapped_args *args, void *pr_ctxt)
1412c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1413c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1414c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int tempstatus;
14150624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
1416c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1417ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_node_terminate.node);
14180624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14190624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
14200624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
14210624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1422ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	status = node_terminate(node_res->node, &tempstatus);
1423c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1424fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	CP_TO_USR(args->args_node_terminate.status, &tempstatus, status, 1);
1425c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1426c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1427c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1428c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1429c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1430c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_uuid_props ========
1431c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14320cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_uuid_props(union trapped_args *args, void *pr_ctxt)
1433c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1434c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1435c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid node_uuid;
1436c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_ndbprops *pnode_props = NULL;
1437a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
1438c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1439c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&node_uuid, args->args_node_getuuidprops.node_id_ptr, status,
1440c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
144151d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status)
1442c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
1443c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pnode_props = kmalloc(sizeof(struct dsp_ndbprops), GFP_KERNEL);
1444c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (pnode_props != NULL) {
1445c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
14466bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		    node_get_uuid_props(hprocessor, &node_uuid, pnode_props);
1447c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_node_getuuidprops.node_props, pnode_props,
1448c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1449c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	} else
1450c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
1451c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
1452c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pnode_props);
1453c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1454c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1455c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1456c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
14574ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos * ======== find_strm_handle =========
14584ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos */
14594ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramosinline void find_strm_handle(struct strm_res_object **strmres,
14604ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos				void *pr_ctxt, void *hstream)
14614ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos{
14624ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	rcu_read_lock();
14634ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	*strmres = idr_find(((struct process_context *)pr_ctxt)->stream_id,
1464084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos							(int)hstream - 1);
14654ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	rcu_read_unlock();
14664ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	return;
14674ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos}
14684ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
14694ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos/*
1470c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_allocate_buffer ========
1471c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14720cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_allocate_buffer(union trapped_args *args, void *pr_ctxt)
1473c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1474c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1475c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 **ap_buffer = NULL;
1476c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_bufs = args->args_strm_allocatebuffer.num_bufs;
14774ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
14784ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
14794ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt,
1480ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens		args->args_strm_allocatebuffer.stream);
14814ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
14824ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
14834ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1484c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1485c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (num_bufs > MAX_BUFS)
1486c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1487c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1488c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL);
1489dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy	if (ap_buffer == NULL)
1490dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy		return -ENOMEM;
1491c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
14924ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	status = strm_allocate_buffer(strm_res,
1493fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens				      args->args_strm_allocatebuffer.size,
1494c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      ap_buffer, num_bufs, pr_ctxt);
1495157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
1496c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_strm_allocatebuffer.ap_buffer, ap_buffer,
1497c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, num_bufs);
149851d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (status) {
1499c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EFAULT;
15004ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos			strm_free_buffer(strm_res,
1501c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					 ap_buffer, num_bufs, pr_ctxt);
1502c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1503c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1504c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(ap_buffer);
1505c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1506c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1507c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1508c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1509c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1510c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_close ========
1511c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15120cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_close(union trapped_args *args, void *pr_ctxt)
1513c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
15144ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
15154ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1516ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_strm_handle(&strm_res, pr_ctxt, args->args_strm_close.stream);
15174ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15184ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
15194ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
15204ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15214ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	return strm_close(strm_res, pr_ctxt);
1522c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1523c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1524c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1525c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_free_buffer ========
1526c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15270cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_free_buffer(union trapped_args *args, void *pr_ctxt)
1528c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1529c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1530c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 **ap_buffer = NULL;
1531c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_bufs = args->args_strm_freebuffer.num_bufs;
15324ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
15334ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15344ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt,
1535ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens			args->args_strm_freebuffer.stream);
15364ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15374ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
15384ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1539c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1540c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (num_bufs > MAX_BUFS)
1541c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1542c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1543c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL);
1544dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy	if (ap_buffer == NULL)
1545dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy		return -ENOMEM;
1546c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1547c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(ap_buffer, args->args_strm_freebuffer.ap_buffer, status,
1548c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  num_bufs);
1549c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
15504ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!status)
15514ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		status = strm_free_buffer(strm_res,
1552c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					  ap_buffer, num_bufs, pr_ctxt);
15534ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1554c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_freebuffer.ap_buffer, ap_buffer, status,
1555c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  num_bufs);
1556c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(ap_buffer);
1557c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1558c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1559c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1561c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1562c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_event_handle ========
1563c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15640cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated strmwrap_get_event_handle(union trapped_args * args,
1565c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					   void *pr_ctxt)
1566c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1567c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
1568c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -ENOSYS;
1569c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1571c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1572c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_info ========
1573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15740cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_get_info(union trapped_args *args, void *pr_ctxt)
1575c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1577c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct stream_info strm_info;
1578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_streaminfo user;
1579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_streaminfo *temp;
15804ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
15814ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15824ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt,
1583ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens			args->args_strm_getinfo.stream);
15844ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15854ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
15864ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1587c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1588c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&strm_info, args->args_strm_getinfo.stream_info, status, 1);
1589c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	temp = strm_info.user_strm;
1590c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1591c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	strm_info.user_strm = &user;
1592c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1593157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
1594ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens		status = strm_get_info(strm_res->stream,
1595c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       &strm_info,
1596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       args->args_strm_getinfo.
1597c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       stream_info_size);
1598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1599c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(temp, strm_info.user_strm, status, 1);
1600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	strm_info.user_strm = temp;
1601c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_getinfo.stream_info, &strm_info, status, 1);
1602c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1606c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_idle ========
1607c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16080cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_idle(union trapped_args *args, void *pr_ctxt)
1609c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1610c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
16114ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
16124ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1613ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_strm_handle(&strm_res, pr_ctxt, args->args_strm_idle.stream);
1614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
16154ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
16164ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
16174ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1618ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	ret = strm_idle(strm_res->stream, args->args_strm_idle.flush_flag);
1619c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1621c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1623c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1624c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_issue ========
1625c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16260cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_issue(union trapped_args *args, void *pr_ctxt)
1627c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
16294ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
16304ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1631ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_strm_handle(&strm_res, pr_ctxt, args->args_strm_issue.stream);
16324ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
16334ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
16344ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1635c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1636ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	if (!args->args_strm_issue.buffer)
1637c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EFAULT;
1638c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* No need of doing CP_FM_USR for the user buffer (pbuffer)
1640c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	   as this is done in Bridge internal function bridge_chnl_add_io_req
1641c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	   in chnl_sm.c */
1642ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	status = strm_issue(strm_res->stream,
1643ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens			    args->args_strm_issue.buffer,
1644fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens			    args->args_strm_issue.bytes,
1645fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens			    args->args_strm_issue.buf_size,
1646b4da7fc381c51d42c231f97de912b89dbabe8928Rene Sapiens			    args->args_strm_issue.arg);
1647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1648c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1650c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_open ========
1653c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16540cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_open(union trapped_args *args, void *pr_ctxt)
1655c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1656c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1657c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct strm_attr attr;
16584ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res_obj;
1659c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_streamattrin strm_attr_in;
16600624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
1661084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos	int strmid;
16620624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1663ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_node_handle(&node_res, pr_ctxt, args->args_strm_open.node);
16640624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
16650624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
16660624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1667c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1668c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&attr, args->args_strm_open.attr_in, status, 1);
1669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1670c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (attr.stream_attr_in != NULL) {	/* Optional argument */
1671c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&strm_attr_in, attr.stream_attr_in, status, 1);
1672157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status) {
1673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			attr.stream_attr_in = &strm_attr_in;
1674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (attr.stream_attr_in->strm_mode == STRMMODE_LDMA)
1675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				return -ENOSYS;
1676c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1678c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1679ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	status = strm_open(node_res->node,
1680c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   args->args_strm_open.direction,
16814ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos			   args->args_strm_open.index, &attr, &strm_res_obj,
1682c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   pr_ctxt);
1683084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos	if (!status) {
1684084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos		strmid = strm_res_obj->id + 1;
1685fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens		CP_TO_USR(args->args_strm_open.stream, &strmid, status, 1);
1686084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos	}
1687c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1689c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1690c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1691c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_reclaim ========
1692c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16930cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_reclaim(union trapped_args *args, void *pr_ctxt)
1694c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1695c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1696c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *buf_ptr;
1697c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ul_bytes;
1698c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 dw_arg;
1699c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ul_buf_size;
17004ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
17014ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1702ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	find_strm_handle(&strm_res, pr_ctxt, args->args_strm_reclaim.stream);
17034ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17044ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
17054ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1706c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1707ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	status = strm_reclaim(strm_res->stream, &buf_ptr,
1708c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			      &ul_bytes, &ul_buf_size, &dw_arg);
1709c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_reclaim.buf_ptr, &buf_ptr, status, 1);
1710c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_reclaim.bytes, &ul_bytes, status, 1);
1711fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	CP_TO_USR(args->args_strm_reclaim.arg, &dw_arg, status, 1);
1712c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1713c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_strm_reclaim.buf_size_ptr != NULL) {
1714c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_strm_reclaim.buf_size_ptr, &ul_buf_size,
1715c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1716c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1717c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1718c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1719c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1720c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1721c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1722c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_register_notify ========
1723c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
17240cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_register_notify(union trapped_args *args, void *pr_ctxt)
1725c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1726c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1727c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notification;
17284ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
17294ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17304ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt,
1731ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens			args->args_strm_registernotify.stream);
17324ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17334ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
17344ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1735c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1736c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Initialize the notification data structure */
1737ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	notification.name = NULL;
1738c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.handle = NULL;
1739c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1740ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens	status = strm_register_notify(strm_res->stream,
1741c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_strm_registernotify.event_mask,
1742c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_strm_registernotify.
1743c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      notify_type, &notification);
1744121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens	CP_TO_USR(args->args_strm_registernotify.notification, &notification,
1745c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
1746c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1747c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1748c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1749c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1750c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1751c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_select ========
1752c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
17530cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_select(union trapped_args *args, void *pr_ctxt)
1754c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1755c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 mask;
1756c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct strm_object *strm_tab[MAX_STREAMS];
1757c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
17584ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
17594ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	int *ids[MAX_STREAMS];
17604ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	int i;
1761c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1762c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_strm_select.strm_num > MAX_STREAMS)
1763c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1764c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
17654ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	CP_FM_USR(ids, args->args_strm_select.stream_tab, status,
17664ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		args->args_strm_select.strm_num);
17674ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17684ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (status)
17694ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return status;
17704ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17714ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	for (i = 0; i < args->args_strm_select.strm_num; i++) {
17724ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		find_strm_handle(&strm_res, pr_ctxt, ids[i]);
17734ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17744ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		if (!strm_res)
17754ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos			return -EFAULT;
17764ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1777ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens		strm_tab[i] = strm_res->stream;
17784ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	}
17794ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1780157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
1781c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = strm_select(strm_tab, args->args_strm_select.strm_num,
1782a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens				     &mask, args->args_strm_select.timeout);
1783c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1784fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	CP_TO_USR(args->args_strm_select.mask, &mask, status, 1);
1785c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1786c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1787c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1788c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* CMM */
1789c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1790c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1791c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_calloc_buf ========
1792c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
17930cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_calloc_buf(union trapped_args * args, void *pr_ctxt)
1794c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1795c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* This operation is done in kernel */
1796c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
1797c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -ENOSYS;
1798c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1799c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1800c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1801c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_free_buf ========
1802c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
18030cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_free_buf(union trapped_args * args, void *pr_ctxt)
1804c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1805c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* This operation is done in kernel */
1806c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
1807c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -ENOSYS;
1808c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1809c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1810c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1811c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_handle ========
1812c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
18130cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_handle(union trapped_args *args, void *pr_ctxt)
1814c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1815c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1816c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct cmm_object *hcmm_mgr;
1817a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens	void *hprocessor = ((struct process_context *)pr_ctxt)->processor;
1818c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
18196bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	status = cmm_get_handle(hprocessor, &hcmm_mgr);
1820c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1821fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens	CP_TO_USR(args->args_cmm_gethandle.cmm_mgr, &hcmm_mgr, status, 1);
1822c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1823c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1824c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1825c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1826c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1827c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_info ========
1828c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
18290cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_info(union trapped_args *args, void *pr_ctxt)
1830c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1831c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1832c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct cmm_info cmm_info_obj;
1833c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1834085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens	status = cmm_get_info(args->args_cmm_getinfo.cmm_mgr, &cmm_info_obj);
1835c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1836c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_cmm_getinfo.cmm_info_obj, &cmm_info_obj, status,
1837c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
1838c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1839c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1840c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1841