dspapi.c revision 2fa28a5182869968a388d34f8d809aa07a0d4046
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/*  ----------------------------------- Trace & Debug */
28c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dbc.h>
29c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
30c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- OS Adaptation Layer */
31c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/ntfy.h>
32c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
33c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Platform Manager */
34c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/chnl.h>
35c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dev.h>
36c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/drv.h>
37c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
38c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/proc.h>
39c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/strm.h>
40c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
41c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Resource Manager */
42c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/disp.h>
43c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/mgr.h>
44c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/node.h>
45c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/rmm.h>
46c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
47c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Others */
48c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/msg.h>
49c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/cmm.h>
50c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/io.h>
51c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
52c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- This */
53c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dspapi.h>
54c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dbdcd.h>
55c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
56c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/resourcecleanup.h>
57c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
58c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Defines, Data Structures, Typedefs */
59c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_TRACEBUFLEN 255
60c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_LOADARGS    16
61c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_NODES       64
62c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_STREAMS     16
63c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_BUFS	64
64c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
65c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Used to get dspbridge ioctl table */
66c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define DB_GET_IOC_TABLE(cmd)	(DB_GET_MODULE(cmd) >> DB_MODULE_SHIFT)
67c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
68c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Device IOCtl function pointer */
69c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastruct api_cmd {
700cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiens	u32(*fxn) (union trapped_args *args, void *pr_ctxt);
71c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 dw_index;
72c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
73c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
74c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Globals */
75c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic u32 api_c_refs;
76c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
77c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
78c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Function tables.
79c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  The order of these functions MUST be the same as the order of the command
80c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  numbers defined in dspapi-ioctl.h  This is how an IOCTL number in user mode
81c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  turns into a function call in kernel mode.
82c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
83c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
84c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* MGR wrapper functions */
85c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd mgr_cmd[] = {
86c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_enum_node_info},	/* MGR_ENUMNODE_INFO */
87c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_enum_proc_info},	/* MGR_ENUMPROC_INFO */
88c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_register_object},	/* MGR_REGISTEROBJECT */
89c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_unregister_object},	/* MGR_UNREGISTEROBJECT */
90c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_wait_for_bridge_events},	/* MGR_WAIT */
91c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_get_process_resources_info},	/* MGR_GET_PROC_RES */
92c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
93c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
94c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* PROC wrapper functions */
95c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd proc_cmd[] = {
96c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_attach},	/* PROC_ATTACH */
97c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_ctrl},	/* PROC_CTRL */
98c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_detach},	/* PROC_DETACH */
99c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_enum_node_info},	/* PROC_ENUMNODE */
100c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_enum_resources},	/* PROC_ENUMRESOURCES */
101c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_get_state},	/* PROC_GET_STATE */
102c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_get_trace},	/* PROC_GET_TRACE */
103c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_load},	/* PROC_LOAD */
104c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_register_notify},	/* PROC_REGISTERNOTIFY */
105c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_start},	/* PROC_START */
106c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_reserve_memory},	/* PROC_RSVMEM */
107c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_un_reserve_memory},	/* PROC_UNRSVMEM */
108c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_map},		/* PROC_MAPMEM */
109c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_un_map},	/* PROC_UNMAPMEM */
110c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_flush_memory},	/* PROC_FLUSHMEMORY */
111c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_stop},	/* PROC_STOP */
112c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_invalidate_memory},	/* PROC_INVALIDATEMEMORY */
113c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_begin_dma},	/* PROC_BEGINDMA */
114c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_end_dma},	/* PROC_ENDDMA */
115c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
116c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
117c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* NODE wrapper functions */
118c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd node_cmd[] = {
119c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_allocate},	/* NODE_ALLOCATE */
120c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_alloc_msg_buf},	/* NODE_ALLOCMSGBUF */
121c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_change_priority},	/* NODE_CHANGEPRIORITY */
122c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_connect},	/* NODE_CONNECT */
123c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_create},	/* NODE_CREATE */
124c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_delete},	/* NODE_DELETE */
125c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_free_msg_buf},	/* NODE_FREEMSGBUF */
126c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_get_attr},	/* NODE_GETATTR */
127c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_get_message},	/* NODE_GETMESSAGE */
128c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_pause},	/* NODE_PAUSE */
129c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_put_message},	/* NODE_PUTMESSAGE */
130c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_register_notify},	/* NODE_REGISTERNOTIFY */
131c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_run},		/* NODE_RUN */
132c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_terminate},	/* NODE_TERMINATE */
133c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_get_uuid_props},	/* NODE_GETUUIDPROPS */
134c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
135c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
136c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* STRM wrapper functions */
137c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd strm_cmd[] = {
138c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_allocate_buffer},	/* STRM_ALLOCATEBUFFER */
139c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_close},	/* STRM_CLOSE */
140c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_free_buffer},	/* STRM_FREEBUFFER */
141c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_get_event_handle},	/* STRM_GETEVENTHANDLE */
142c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_get_info},	/* STRM_GETINFO */
143c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_idle},	/* STRM_IDLE */
144c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_issue},	/* STRM_ISSUE */
145c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_open},	/* STRM_OPEN */
146c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_reclaim},	/* STRM_RECLAIM */
147c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_register_notify},	/* STRM_REGISTERNOTIFY */
148c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_select},	/* STRM_SELECT */
149c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
150c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
151c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* CMM wrapper functions */
152c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd cmm_cmd[] = {
153c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_calloc_buf},	/* CMM_ALLOCBUF */
154c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_free_buf},	/* CMM_FREEBUF */
155c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_get_handle},	/* CMM_GETHANDLE */
156c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_get_info},	/* CMM_GETINFO */
157c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
158c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
159c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Array used to store ioctl table sizes. It can hold up to 8 entries */
160c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic u8 size_cmd[] = {
161c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(mgr_cmd),
162c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(proc_cmd),
163c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(node_cmd),
164c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(strm_cmd),
165c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(cmm_cmd),
166c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
167c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
168c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic inline void _cp_fm_usr(void *to, const void __user * from,
169c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			      int *err, unsigned long bytes)
170c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
17151d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (*err)
172c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
173c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
174c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(!from)) {
175c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
176c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
177c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
178c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
179c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(copy_from_user(to, from, bytes)))
180c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
181c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
182c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
183c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define CP_FM_USR(to, from, err, n)				\
184c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	_cp_fm_usr(to, from, &(err), (n) * sizeof(*(to)))
185c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
186c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic inline void _cp_to_usr(void __user *to, const void *from,
187c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			      int *err, unsigned long bytes)
188c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
18951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (*err)
190c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
191c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
192c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(!to)) {
193c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
194c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
195c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
196c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
197c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(copy_to_user(to, from, bytes)))
198c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
199c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
200c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
201c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define CP_TO_USR(to, from, err, n)				\
202c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	_cp_to_usr(to, from, &(err), (n) * sizeof(*(from)))
203c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
204c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
205c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_call_dev_ioctl ========
206c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Purpose:
207c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Call the (wrapper) function for the corresponding API IOCTL.
208c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
2090cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensinline int api_call_dev_ioctl(u32 cmd, union trapped_args *args,
210c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      u32 *result, void *pr_ctxt)
211c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
2120cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiens	u32(*ioctl_cmd) (union trapped_args *args, void *pr_ctxt) = NULL;
213c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int i;
214c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
215c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (_IOC_TYPE(cmd) != DB) {
216c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: Incompatible dspbridge ioctl number\n", __func__);
217c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
218c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
219c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
220c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DB_GET_IOC_TABLE(cmd) > ARRAY_SIZE(size_cmd)) {
221c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: undefined ioctl module\n", __func__);
222c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
223c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
224c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
225c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Check the size of the required cmd table */
226c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	i = DB_GET_IOC(cmd);
227c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (i > size_cmd[DB_GET_IOC_TABLE(cmd)]) {
228c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: requested ioctl %d out of bounds for table %d\n",
229c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		       __func__, i, DB_GET_IOC_TABLE(cmd));
230c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
231c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
232c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
233c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	switch (DB_GET_MODULE(cmd)) {
234c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_MGR:
235c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = mgr_cmd[i].fxn;
236c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
237c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_PROC:
238c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = proc_cmd[i].fxn;
239c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
240c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_NODE:
241c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = node_cmd[i].fxn;
242c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
243c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_STRM:
244c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = strm_cmd[i].fxn;
245c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
246c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_CMM:
247c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = cmm_cmd[i].fxn;
248c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
249c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
250c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
251c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!ioctl_cmd) {
252c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: requested ioctl not defined\n", __func__);
253c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
254c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	} else {
255c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*result = (*ioctl_cmd) (args, pr_ctxt);
256c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
257c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
258c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return 0;
259c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
260c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunaerr:
261c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -EINVAL;
262c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
263c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
264c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
265c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_exit ========
266c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
267c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunavoid api_exit(void)
268c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
269c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	DBC_REQUIRE(api_c_refs > 0);
270c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	api_c_refs--;
271c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
272c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (api_c_refs == 0) {
273c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		/* Release all modules initialized in api_init(). */
274c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cod_exit();
275c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		dev_exit();
276c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		chnl_exit();
277c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		msg_exit();
278c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		io_exit();
279c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		strm_exit();
280c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		disp_exit();
281c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		node_exit();
282c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		proc_exit();
283c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		mgr_exit();
284c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		rmm_exit();
285c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		drv_exit();
286c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
287c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	DBC_ENSURE(api_c_refs >= 0);
288c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
289c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
290c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
291c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_init ========
292c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Purpose:
293c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Module initialization used by Bridge API.
294c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
295c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunabool api_init(void)
296c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
297c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	bool ret = true;
298c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	bool fdrv, fdev, fcod, fchnl, fmsg, fio;
299c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	bool fmgr, fproc, fnode, fdisp, fstrm, frmm;
300c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
301c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (api_c_refs == 0) {
302c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		/* initialize driver and other modules */
303c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fdrv = drv_init();
304c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fmgr = mgr_init();
305c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fproc = proc_init();
306c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fnode = node_init();
307c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fdisp = disp_init();
308c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fstrm = strm_init();
309c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		frmm = rmm_init();
310c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fchnl = chnl_init();
311c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fmsg = msg_mod_init();
312c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fio = io_init();
313c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fdev = dev_init();
314c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fcod = cod_init();
315c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ret = fdrv && fdev && fchnl && fcod && fmsg && fio;
316c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ret = ret && fmgr && fproc && frmm;
317c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (!ret) {
318c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fdrv)
319c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				drv_exit();
320c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
321c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fmgr)
322c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				mgr_exit();
323c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
324c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fstrm)
325c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				strm_exit();
326c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
327c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fproc)
328c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				proc_exit();
329c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
330c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fnode)
331c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				node_exit();
332c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
333c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fdisp)
334c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				disp_exit();
335c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
336c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fchnl)
337c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				chnl_exit();
338c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
339c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fmsg)
340c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				msg_exit();
341c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
342c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fio)
343c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				io_exit();
344c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
345c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fdev)
346c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				dev_exit();
347c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
348c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fcod)
349c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				cod_exit();
350c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
351c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (frmm)
352c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				rmm_exit();
353c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
354c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
355c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
356c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (ret)
357c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		api_c_refs++;
358c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
359c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
360c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
361c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
362c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
363c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_init_complete2 ========
364c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Purpose:
365c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Perform any required bridge initialization which cannot
366c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      be performed in api_init() or dev_start_device() due
367c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      to the fact that some services are not yet
368c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      completely initialized.
369c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Parameters:
370c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Returns:
371c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      0:	Allow this device to load
372c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      -EPERM:      Failure.
373c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Requires:
374c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Bridge API initialized.
375c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Ensures:
376c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
377c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunaint api_init_complete2(void)
378c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
379c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
380c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct cfg_devnode *dev_node;
381c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dev_object *hdev_obj;
3824a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos	struct drv_data *drv_datap;
383c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 dev_type;
384c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
385c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	DBC_REQUIRE(api_c_refs > 0);
386c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
387c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/*  Walk the list of DevObjects, get each devnode, and attempting to
388c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	 *  autostart the board. Note that this requires COF loading, which
389c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	 *  requires KFILE. */
390c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	for (hdev_obj = dev_get_first(); hdev_obj != NULL;
391c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	     hdev_obj = dev_get_next(hdev_obj)) {
39251d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (dev_get_dev_node(hdev_obj, &dev_node))
393c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			continue;
394c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
39551d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (dev_get_dev_type(hdev_obj, &dev_type))
396c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			continue;
397c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
3984a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos		if ((dev_type == DSP_UNIT) || (dev_type == IVA_UNIT)) {
3994a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos			drv_datap = dev_get_drvdata(bridge);
4004a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos
4014a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos			if (drv_datap && drv_datap->base_img)
402c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				proc_auto_start(dev_node, hdev_obj);
4034a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos		}
404c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
405c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
406c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
407c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
408c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
409c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* TODO: Remove deprecated and not implemented ioctl wrappers */
410c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
411c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
412c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_enum_node_info ========
413c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
4140cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_enum_node_info(union trapped_args *args, void *pr_ctxt)
415c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
416c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pndb_props;
417c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_nodes;
418c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
419c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 size = args->args_mgr_enumnode_info.undb_props_size;
420c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
421c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (size < sizeof(struct dsp_ndbprops))
422c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
423c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
424c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pndb_props = kmalloc(size, GFP_KERNEL);
425c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (pndb_props == NULL)
426c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
427c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
428157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
429c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
430c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		    mgr_enum_node_info(args->args_mgr_enumnode_info.node_id,
431c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       (struct dsp_ndbprops *)pndb_props, size,
432c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       &num_nodes);
433c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
434c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_mgr_enumnode_info.pndb_props, pndb_props, status,
435c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  size);
436c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_mgr_enumnode_info.pu_num_nodes, &num_nodes, status,
437c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
438c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pndb_props);
439c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
440c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
441c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
442c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
443c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
444c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_enum_proc_info ========
445c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
4460cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_enum_proc_info(union trapped_args *args, void *pr_ctxt)
447c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
448c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *processor_info;
449c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 num_procs;
450c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
451c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 size = args->args_mgr_enumproc_info.processor_info_size;
452c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
453c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (size < sizeof(struct dsp_processorinfo))
454c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
455c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
456c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	processor_info = kmalloc(size, GFP_KERNEL);
457c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (processor_info == NULL)
458c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
459c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
460157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
461c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
462c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		    mgr_enum_processor_info(args->args_mgr_enumproc_info.
463c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    processor_id,
464c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    (struct dsp_processorinfo *)
465c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    processor_info, size, &num_procs);
466c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
467c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_mgr_enumproc_info.processor_info, processor_info,
468c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, size);
469c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_mgr_enumproc_info.pu_num_procs, &num_procs,
470c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
471c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(processor_info);
472c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
473c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
474c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
475c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
476c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define WRAP_MAP2CALLER(x) x
477c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
478c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_register_object ========
479c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
4800cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_register_object(union trapped_args *args, void *pr_ctxt)
481c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
482c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
483c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid uuid_obj;
484c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 path_size = 0;
485c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	char *psz_path_name = NULL;
486c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
487c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
488c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1);
48951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status)
490c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
491c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* path_size is increased by 1 to accommodate NULL */
492c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	path_size = strlen_user((char *)
493c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				args->args_mgr_registerobject.psz_path_name) +
494c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    1;
495c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	psz_path_name = kmalloc(path_size, GFP_KERNEL);
496cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall	if (!psz_path_name) {
497cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall		status = -ENOMEM;
498c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
499cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall	}
500c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = strncpy_from_user(psz_path_name,
501c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				(char *)args->args_mgr_registerobject.
502c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				psz_path_name, path_size);
503c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!ret) {
504c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -EFAULT;
505c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
506c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
507c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
508cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall	if (args->args_mgr_registerobject.obj_type >= DSP_DCDMAXOBJTYPE) {
509cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall		status = -EINVAL;
510cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall		goto func_end;
511cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall	}
512c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
513c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = dcd_register_object(&uuid_obj,
514c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     args->args_mgr_registerobject.obj_type,
515c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     (char *)psz_path_name);
516c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
517c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(psz_path_name);
518c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
519c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
520c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
521c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
522c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_unregister_object ========
523c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5240cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_unregister_object(union trapped_args *args, void *pr_ctxt)
525c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
526c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
527c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid uuid_obj;
528c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
529c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1);
53051d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status)
531c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
532c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
533c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = dcd_unregister_object(&uuid_obj,
534c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       args->args_mgr_unregisterobject.
535c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       obj_type);
536c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
537c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
538c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
539c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
540c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
541c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
542c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_wait_for_bridge_events ========
543c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5440cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_wait_for_bridge_events(union trapped_args *args, void *pr_ctxt)
545c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
54635f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos	int status = 0;
547c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification *anotifications[MAX_EVENTS];
548c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notifications[MAX_EVENTS];
549c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 index, i;
550c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 count = args->args_mgr_wait.count;
551c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
552c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (count > MAX_EVENTS)
553c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -EINVAL;
554c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
555c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* get the array of pointers to user structures */
556c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(anotifications, args->args_mgr_wait.anotifications,
557c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, count);
558c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* get the events */
559c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	for (i = 0; i < count; i++) {
560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&notifications[i], anotifications[i], status, 1);
56135f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos		if (status || !notifications[i].handle) {
56235f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos			status = -EINVAL;
56335f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos			break;
564c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
56535f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos		/* set the array of pointers to kernel structures */
56635f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos		anotifications[i] = &notifications[i];
567c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
568157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
56935f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos		status = mgr_wait_for_bridge_events(anotifications, count,
570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna							 &index,
571c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna							 args->args_mgr_wait.
572c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna							 utimeout);
573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
574c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_mgr_wait.pu_index, &index, status, 1);
57535f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos	return status;
576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
577c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== MGRWRAP_GetProcessResourceInfo ========
580c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5810cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated mgrwrap_get_process_resources_info(union trapped_args * args,
582c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna						    void *pr_ctxt)
583c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
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_attach ========
590c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5910cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_attach(union trapped_args *args, void *pr_ctxt)
592c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
593c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *processor;
594c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
595c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_processorattrin proc_attr_in, *attr_in = NULL;
596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
597c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_attach.attr_in) {
599c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&proc_attr_in, args->args_proc_attach.attr_in, status,
600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  1);
601157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
602c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			attr_in = &proc_attr_in;
603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		else
604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_end;
605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
606c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
607c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_attach(args->args_proc_attach.processor_id, attr_in,
608c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			     &processor, pr_ctxt);
609c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_attach.ph_processor, &processor, status, 1);
610c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
611c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
612c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
613c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
615c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_ctrl ========
616c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
6170cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_ctrl(union trapped_args *args, void *pr_ctxt)
618c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
619c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 cb_data_size, __user * psize = (u32 __user *)
620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    args->args_proc_ctrl.pargs;
621c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pargs = NULL;
622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
6236bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
624c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
625c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (psize) {
626c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (get_user(cb_data_size, psize)) {
627c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EPERM;
628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_end;
629c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
630c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cb_data_size += sizeof(u32);
631c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pargs = kmalloc(cb_data_size, GFP_KERNEL);
632c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (pargs == NULL) {
633c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -ENOMEM;
634c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_end;
635c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
636c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
637c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(pargs, args->args_proc_ctrl.pargs, status,
638c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  cb_data_size);
639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
640157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
6416bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		status = proc_ctrl(hprocessor,
642c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_ctrl.dw_cmd,
643c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   (struct dsp_cbdata *)pargs);
644c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
645c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
646c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* CP_TO_USR(args->args_proc_ctrl.pargs, pargs, status, 1); */
647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pargs);
648c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
650c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
653c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_detach ========
654c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
6550cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated procwrap_detach(union trapped_args * args, void *pr_ctxt)
656c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
657c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* proc_detach called at bridge_release only */
658c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
659c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return 0;
660c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
661c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
662c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
663c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_node_info ========
664c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
6650cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_node_info(union trapped_args *args, void *pr_ctxt)
666c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
667c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
668c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *node_tab[MAX_NODES];
669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_nodes;
670c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 alloc_cnt;
6716bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
672c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_proc_enumnode_info.node_tab_size)
674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
6766bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	status = proc_enum_nodes(hprocessor,
677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 node_tab,
678c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 args->args_proc_enumnode_info.node_tab_size,
679c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 &num_nodes, &alloc_cnt);
680c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumnode_info.node_tab, node_tab, status,
681c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  num_nodes);
682c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumnode_info.pu_num_nodes, &num_nodes,
683c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
684c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumnode_info.pu_allocated, &alloc_cnt,
685c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
686c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
687c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
6890cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_end_dma(union trapped_args *args, void *pr_ctxt)
690c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
691c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
692c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
693c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_dma.dir >= DMA_NONE)
694c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
695c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
696c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_end_dma(pr_ctxt,
697c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.pmpu_addr,
698c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.ul_size,
699c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.dir);
700c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
701c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
702c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
7030cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_begin_dma(union trapped_args *args, void *pr_ctxt)
704c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
705c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
706c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
707c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_dma.dir >= DMA_NONE)
708c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
709c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
710c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_begin_dma(pr_ctxt,
711c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.pmpu_addr,
712c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.ul_size,
713c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.dir);
714c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
715c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
716c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
717c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
718c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_flush_memory ========
719c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7200cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_flush_memory(union trapped_args *args, void *pr_ctxt)
721c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
722c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
723c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
724c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_flushmemory.ul_flags >
725c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    PROC_WRITEBACK_INVALIDATE_MEM)
726c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
727c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
728c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_flush_memory(pr_ctxt,
729c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_flushmemory.pmpu_addr,
730c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_flushmemory.ul_size,
731c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_flushmemory.ul_flags);
732c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
733c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
734c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
735c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
736c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_invalidate_memory ========
737c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7380cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_invalidate_memory(union trapped_args *args, void *pr_ctxt)
739c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
740c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
741c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
742c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status =
743c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    proc_invalidate_memory(pr_ctxt,
744c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_invalidatememory.pmpu_addr,
745c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_invalidatememory.ul_size);
746c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
747c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
748c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
749c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
750c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_resources ========
751c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7520cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_resources(union trapped_args *args, void *pr_ctxt)
753c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
754c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
755c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_resourceinfo resource_info;
7566bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
757c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
758c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_enumresources.resource_info_size <
759c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    sizeof(struct dsp_resourceinfo))
760c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
761c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
762c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status =
7636bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	    proc_get_resource_info(hprocessor,
764c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_enumresources.resource_type,
765c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   &resource_info,
766c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_enumresources.
767c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   resource_info_size);
768c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
769c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumresources.resource_info, &resource_info,
770c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
771c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
772c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
773c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
774c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
775c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
776c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
777c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_state ========
778c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7790cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_state(union trapped_args *args, void *pr_ctxt)
780c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
781c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
782c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_processorstate proc_state;
7836bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
784c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
785c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_getstate.state_info_size <
786c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    sizeof(struct dsp_processorstate))
787c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
788c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
7896bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	status = proc_get_state(hprocessor, &proc_state,
790c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   args->args_proc_getstate.state_info_size);
791c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_getstate.proc_state_obj, &proc_state, status,
792c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
793c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
794c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
795c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
796c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
797c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
798c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_trace ========
799c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
8000cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_trace(union trapped_args *args, void *pr_ctxt)
801c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
802c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
803c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pbuf;
8046bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
805c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
806c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_gettrace.max_size > MAX_TRACEBUFLEN)
807c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
808c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
809c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pbuf = kzalloc(args->args_proc_gettrace.max_size, GFP_KERNEL);
810c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (pbuf != NULL) {
8116bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		status = proc_get_trace(hprocessor, pbuf,
812c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					args->args_proc_gettrace.max_size);
813c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	} else {
814c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
815c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
816c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_gettrace.pbuf, pbuf, status,
817c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  args->args_proc_gettrace.max_size);
818c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pbuf);
819c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
820c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
821c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
822c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
823c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
824c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_load ========
825c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
8260cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_load(union trapped_args *args, void *pr_ctxt)
827c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
828c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	s32 i, len;
829c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
830c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	char *temp;
831c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	s32 count = args->args_proc_load.argc_index;
832c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 **argv = NULL, **envp = NULL;
8336bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
834c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
835c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (count <= 0 || count > MAX_LOADARGS) {
836c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -EINVAL;
837c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
838c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
839c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
840c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	argv = kmalloc(count * sizeof(u8 *), GFP_KERNEL);
841c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!argv) {
842c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
843c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
844c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
845c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
846c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(argv, args->args_proc_load.user_args, status, count);
84751d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status) {
848c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		kfree(argv);
849c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		argv = NULL;
850c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
851c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
852c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
853c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	for (i = 0; i < count; i++) {
854c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (argv[i]) {
855c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* User space pointer to argument */
856c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			temp = (char *)argv[i];
857c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* len is increased by 1 to accommodate NULL */
858c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			len = strlen_user((char *)temp) + 1;
859c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* Kernel space pointer to argument */
860c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			argv[i] = kmalloc(len, GFP_KERNEL);
861c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (argv[i]) {
862c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				CP_FM_USR(argv[i], temp, status, len);
86351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos				if (status) {
864c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					kfree(argv[i]);
865c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					argv[i] = NULL;
866c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					goto func_cont;
867c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				}
868c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			} else {
869c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
870c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				goto func_cont;
871c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			}
872c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
873c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
874c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* TODO: validate this */
875c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_load.user_envp) {
876c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		/* number of elements in the envp array including NULL */
877c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		count = 0;
878c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		do {
879b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov			if (get_user(temp,
880b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov				     args->args_proc_load.user_envp + count)) {
881b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov				status = -EFAULT;
882b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov				goto func_cont;
883b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov			}
884c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			count++;
885c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		} while (temp);
886c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		envp = kmalloc(count * sizeof(u8 *), GFP_KERNEL);
887c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (!envp) {
888c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -ENOMEM;
889c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_cont;
890c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
891c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
892c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(envp, args->args_proc_load.user_envp, status, count);
89351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (status) {
894c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			kfree(envp);
895c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			envp = NULL;
896c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_cont;
897c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
898c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		for (i = 0; envp[i]; i++) {
899c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* User space pointer to argument */
900c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			temp = (char *)envp[i];
901c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* len is increased by 1 to accommodate NULL */
902c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			len = strlen_user((char *)temp) + 1;
903c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* Kernel space pointer to argument */
904c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			envp[i] = kmalloc(len, GFP_KERNEL);
905c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (envp[i]) {
906c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				CP_FM_USR(envp[i], temp, status, len);
90751d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos				if (status) {
908c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					kfree(envp[i]);
909c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					envp[i] = NULL;
910c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					goto func_cont;
911c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				}
912c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			} else {
913c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
914c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				goto func_cont;
915c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			}
916c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
917c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
918c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
919157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
9206bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		status = proc_load(hprocessor,
921c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_load.argc_index,
922cd4f13c02a5d72e1fc367c51cc0fd955f65538e0Menon, Nishanth				   (const char **)argv, (const char **)envp);
923c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
924c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
925c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (envp) {
926c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		i = 0;
927c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		while (envp[i])
928c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			kfree(envp[i++]);
929c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
930c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		kfree(envp);
931c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
932c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
933c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (argv) {
934c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		count = args->args_proc_load.argc_index;
935c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		for (i = 0; (i < count) && argv[i]; i++)
936c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			kfree(argv[i]);
937c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
938c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		kfree(argv);
939c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
940c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
941c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
942c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
943c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
944c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
945c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_map ========
946c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9470cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_map(union trapped_args *args, void *pr_ctxt)
948c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
949c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
950c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *map_addr;
9516bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
952c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
953c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_proc_mapmem.ul_size)
954c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
955c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
956c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_map(args->args_proc_mapmem.hprocessor,
957c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_mapmem.pmpu_addr,
958c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_mapmem.ul_size,
959c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_mapmem.req_addr, &map_addr,
960c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_mapmem.ul_map_attr, pr_ctxt);
961157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
962c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (put_user(map_addr, args->args_proc_mapmem.pp_map_addr)) {
963c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EINVAL;
9646bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos			proc_un_map(hprocessor, map_addr, pr_ctxt);
965c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
966c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
967c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
968c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
969c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
970c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
971c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
972c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_register_notify ========
973c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9740cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_register_notify(union trapped_args *args, void *pr_ctxt)
975c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
976c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
977c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notification;
9786bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
979c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
980c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Initialize the notification data structure */
981c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.ps_name = NULL;
982c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.handle = NULL;
983c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
9846bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	status = proc_register_notify(hprocessor,
985c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 args->args_proc_register_notify.event_mask,
986c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 args->args_proc_register_notify.notify_type,
987c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 &notification);
988c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_register_notify.hnotification, &notification,
989c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
990c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
991c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
992c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
993c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
994c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_reserve_memory ========
995c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9962fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contrerasu32 procwrap_reserve_memory(union trapped_args *args, void *pr_ctxt)
997c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
9982fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	int status;
9992fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	void *prsv_addr;
10002fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
10012fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras
10022fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	if ((args->args_proc_rsvmem.ul_size <= 0) ||
10032fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	    (args->args_proc_rsvmem.ul_size & (PG_SIZE4K - 1)) != 0)
10042fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras		return -EINVAL;
10052fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras
10062fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	status = proc_reserve_memory(hprocessor,
10072fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras				     args->args_proc_rsvmem.ul_size, &prsv_addr,
10082fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras				     pr_ctxt);
10092fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	if (!status) {
10102fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras		if (put_user(prsv_addr, args->args_proc_rsvmem.pp_rsv_addr)) {
10112fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras			status = -EINVAL;
10122fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras			proc_un_reserve_memory(args->args_proc_rsvmem.
10132fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras					       hprocessor, prsv_addr, pr_ctxt);
10142fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras		}
10152fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	}
10162fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	return status;
1017c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1018c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1019c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1020c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_start ========
1021c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10220cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_start(union trapped_args *args, void *pr_ctxt)
1023c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1024c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1025c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
10266bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	ret = proc_start(((struct process_context *)pr_ctxt)->hprocessor);
1027c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1028c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1029c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1030c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1031c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_map ========
1032c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10330cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_un_map(union trapped_args *args, void *pr_ctxt)
1034c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1035c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1036c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
10376bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	status = proc_un_map(((struct process_context *)pr_ctxt)->hprocessor,
1038c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			     args->args_proc_unmapmem.map_addr, pr_ctxt);
1039c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1040c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1041c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1042c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1043c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_reserve_memory ========
1044c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10452fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contrerasu32 procwrap_un_reserve_memory(union trapped_args *args, void *pr_ctxt)
1046c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
10472fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	int status;
10482fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
10492fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras
10502fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	status = proc_un_reserve_memory(hprocessor,
10512fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras					args->args_proc_unrsvmem.prsv_addr,
10522fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras					pr_ctxt);
10532fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras	return status;
1054c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1055c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1056c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1057c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_stop ========
1058c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10590cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_stop(union trapped_args *args, void *pr_ctxt)
1060c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1061c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1062c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
10636bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	ret = proc_stop(((struct process_context *)pr_ctxt)->hprocessor);
1064c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1065c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1066c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1067c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1068c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
10690624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos * ======== find_handle =========
10700624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos */
10710624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramosinline void find_node_handle(struct node_res_object **noderes,
10720624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				void *pr_ctxt, void *hnode)
10730624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos{
10740624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	rcu_read_lock();
10750624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	*noderes = idr_find(((struct process_context *)pr_ctxt)->node_id,
10768df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos								(int)hnode - 1);
10770624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	rcu_read_unlock();
10780624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	return;
10790624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos}
10800624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
10810624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
10820624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos/*
1083c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_allocate ========
1084c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10850cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_allocate(union trapped_args *args, void *pr_ctxt)
1086c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1087c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1088c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid node_uuid;
1089c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 cb_data_size = 0;
1090c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 __user *psize = (u32 __user *) args->args_node_allocate.pargs;
1091c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pargs = NULL;
1092c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_nodeattrin proc_attr_in, *attr_in = NULL;
10930624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
10948df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos	int nodeid;
10956bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
1096c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1097c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
1098c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (psize) {
1099c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (get_user(cb_data_size, psize))
1100c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EPERM;
1101c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1102c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cb_data_size += sizeof(u32);
1103157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status) {
1104c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pargs = kmalloc(cb_data_size, GFP_KERNEL);
1105c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (pargs == NULL)
1106c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
1107c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1108c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1109c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(pargs, args->args_node_allocate.pargs, status,
1110c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  cb_data_size);
1111c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1112c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&node_uuid, args->args_node_allocate.node_id_ptr, status, 1);
111351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status)
1114c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
1115c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
1116c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_node_allocate.attr_in) {
1117c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&proc_attr_in, args->args_node_allocate.attr_in,
1118c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1119157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
1120c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			attr_in = &proc_attr_in;
1121c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		else
1122c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -ENOMEM;
1123c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1124c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1125157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
11266bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		status = node_allocate(hprocessor,
1127c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       &node_uuid, (struct dsp_cbdata *)pargs,
11280624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				       attr_in, &node_res, pr_ctxt);
1129c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1130157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
11318df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos		nodeid = node_res->id + 1;
11328df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos		CP_TO_USR(args->args_node_allocate.ph_node, &nodeid,
11330624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos			status, 1);
113451d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (status) {
1135c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EFAULT;
11360624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos			node_delete(node_res, pr_ctxt);
1137c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1138c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1139c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
1140c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pargs);
1141c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1142c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1143c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1144c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1145c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1146c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== nodewrap_alloc_msg_buf ========
1147c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
11480cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_alloc_msg_buf(union trapped_args *args, void *pr_ctxt)
1149c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1150c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1151c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr *pattr = NULL;
1152c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr attr;
1153c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pbuffer = NULL;
11540624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
11550624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
11560624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res,  pr_ctxt,
11570624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				args->args_node_allocmsgbuf.hnode);
11580624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
11590624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
11600624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1161c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1162c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_node_allocmsgbuf.usize)
1163c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1164c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1165c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_node_allocmsgbuf.pattr) {	/* Optional argument */
1166c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&attr, args->args_node_allocmsgbuf.pattr, status, 1);
1167157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
1168c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pattr = &attr;
1169c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1170c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1171e6bf74f06f5178fcccb66acf51d1f6ebc4e6c5d0Menon, Nishanth	/* argument */
1172c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&pbuffer, args->args_node_allocmsgbuf.pbuffer, status, 1);
1173157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
11740624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		status = node_alloc_msg_buf(node_res->hnode,
1175c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    args->args_node_allocmsgbuf.usize,
1176c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    pattr, &pbuffer);
1177c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1178c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_allocmsgbuf.pbuffer, &pbuffer, status, 1);
1179c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1180c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1181c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1182c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1183c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_change_priority ========
1184c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
11850cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_change_priority(union trapped_args *args, void *pr_ctxt)
1186c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1187c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
11880624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
1189c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
11900624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt,
11910624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				args->args_node_changepriority.hnode);
11920624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
11930624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
11940624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
11950624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
11960624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	ret = node_change_priority(node_res->hnode,
1197c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_node_changepriority.prio);
1198c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1199c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1200c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1201c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1202c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1203c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_connect ========
1204c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12050cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_connect(union trapped_args *args, void *pr_ctxt)
1206c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1207c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1208c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_strmattr attrs;
1209c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_strmattr *pattrs = NULL;
1210c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 cb_data_size;
1211c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 __user *psize = (u32 __user *) args->args_node_connect.conn_param;
1212c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pargs = NULL;
12130624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res1, *node_res2;
12140624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_object *node1 = NULL, *node2 = NULL;
12150624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
12160624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if ((int)args->args_node_connect.hnode != DSP_HGPPNODE) {
12170624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		find_node_handle(&node_res1, pr_ctxt,
12180624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				args->args_node_connect.hnode);
12190624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		if (node_res1)
12200624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos			node1 = node_res1->hnode;
12210624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	} else {
12220624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		node1 = args->args_node_connect.hnode;
12230624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	}
12240624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
12250624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if ((int)args->args_node_connect.other_node != DSP_HGPPNODE) {
12260624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		find_node_handle(&node_res2, pr_ctxt,
12270624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				args->args_node_connect.other_node);
12280624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		if (node_res2)
12290624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos			node2 = node_res2->hnode;
12300624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	} else {
12310624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		node2 = args->args_node_connect.other_node;
12320624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	}
12330624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
12340624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node1 || !node2)
12350624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1236c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1237c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
1238c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (psize) {
1239c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (get_user(cb_data_size, psize))
1240c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EPERM;
1241c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1242c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cb_data_size += sizeof(u32);
1243157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status) {
1244c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pargs = kmalloc(cb_data_size, GFP_KERNEL);
1245c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (pargs == NULL) {
1246c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
1247c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				goto func_cont;
1248c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			}
1249c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1250c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1251c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(pargs, args->args_node_connect.conn_param, status,
1252c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  cb_data_size);
125351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (status)
1254c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_cont;
1255c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1256c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_node_connect.pattrs) {	/* Optional argument */
1257c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&attrs, args->args_node_connect.pattrs, status, 1);
1258157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
1259c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pattrs = &attrs;
1260c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1261c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1262157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
12630624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		status = node_connect(node1,
1264c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_connect.stream_id,
12650624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos				      node2,
1266c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_connect.other_stream,
1267c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      pattrs, (struct dsp_cbdata *)pargs);
1268c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1269c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
1270c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pargs);
1271c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1272c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1273c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1274c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1275c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1276c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_create ========
1277c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12780cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_create(union trapped_args *args, void *pr_ctxt)
1279c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1280c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
12810624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
12820624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
12830624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_node_create.hnode);
1284c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
12850624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
12860624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
12870624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
12880624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	ret = node_create(node_res->hnode);
1289c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1290c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1291c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1292c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1293c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1294c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_delete ========
1295c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12960cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_delete(union trapped_args *args, void *pr_ctxt)
1297c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1298c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
12990624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
13000624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13010624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_node_delete.hnode);
13020624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13030624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
13040624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1305c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
13060624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	ret = node_delete(node_res, pr_ctxt);
1307c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1308c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1309c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1310c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1311c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1312c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== nodewrap_free_msg_buf ========
1313c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13140cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_free_msg_buf(union trapped_args *args, void *pr_ctxt)
1315c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1316c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1317c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr *pattr = NULL;
1318c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr attr;
13190624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
13200624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13210624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_node_freemsgbuf.hnode);
13220624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13230624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
13240624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
13250624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
1326c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_node_freemsgbuf.pattr) {	/* Optional argument */
1327c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&attr, args->args_node_freemsgbuf.pattr, status, 1);
1328157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status)
1329c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pattr = &attr;
1330c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1331c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1332c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1333c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_node_freemsgbuf.pbuffer)
1334c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EFAULT;
1335c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1336157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
13370624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		status = node_free_msg_buf(node_res->hnode,
1338c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					   args->args_node_freemsgbuf.pbuffer,
1339c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					   pattr);
1340c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1341c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1342c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1343c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1344c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1345c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1346c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_attr ========
1347c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13480cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_attr(union trapped_args *args, void *pr_ctxt)
1349c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1350c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1351c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_nodeattr attr;
13520624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
1353c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
13540624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_node_getattr.hnode);
13550624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13560624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
13570624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
13580624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13590624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	status = node_get_attr(node_res->hnode, &attr,
1360c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			       args->args_node_getattr.attr_size);
1361c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_getattr.pattr, &attr, status, 1);
1362c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1363c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1364c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1365c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1366c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1367c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_message ========
1368c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13690cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_message(union trapped_args *args, void *pr_ctxt)
1370c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1371c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1372c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_msg msg;
13730624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
13740624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13750624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_node_getmessage.hnode);
1376c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
13770624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
13780624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
13790624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13800624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	status = node_get_message(node_res->hnode, &msg,
1381c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				  args->args_node_getmessage.utimeout);
1382c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1383c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_getmessage.message, &msg, status, 1);
1384c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1385c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1386c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1387c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1388c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1389c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_pause ========
1390c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13910cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_pause(union trapped_args *args, void *pr_ctxt)
1392c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1393c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
13940624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
13950624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13960624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_node_pause.hnode);
13970624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
13980624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
13990624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1400c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
14010624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	ret = node_pause(node_res->hnode);
1402c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1403c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1404c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1405c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1406c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1407c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_put_message ========
1408c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14090cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_put_message(union trapped_args *args, void *pr_ctxt)
1410c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1411c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1412c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_msg msg;
14130624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
14140624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14150624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_node_putmessage.hnode);
14160624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14170624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
14180624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1419c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1420c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&msg, args->args_node_putmessage.message, status, 1);
1421c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1422157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
1423c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
14240624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		    node_put_message(node_res->hnode, &msg,
1425c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     args->args_node_putmessage.utimeout);
1426c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1427c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1428c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1429c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1430c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1431c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1432c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_register_notify ========
1433c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14340cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_register_notify(union trapped_args *args, void *pr_ctxt)
1435c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1436c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1437c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notification;
14380624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
14390624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14400624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt,
14410624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos			args->args_node_registernotify.hnode);
14420624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14430624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
14440624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1445c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1446c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Initialize the notification data structure */
1447c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.ps_name = NULL;
1448c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.handle = NULL;
1449c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1450c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_proc_register_notify.event_mask)
1451c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&notification,
1452c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_register_notify.hnotification,
1453c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1454c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
14550624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	status = node_register_notify(node_res->hnode,
1456c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_registernotify.event_mask,
1457c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_registernotify.
1458c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      notify_type, &notification);
1459c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_registernotify.hnotification, &notification,
1460c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
1461c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1462c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1463c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1464c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1465c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_run ========
1466c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14670cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_run(union trapped_args *args, void *pr_ctxt)
1468c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1469c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
14700624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
14710624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14720624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_node_run.hnode);
14730624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14740624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
14750624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1476c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
14770624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	ret = node_run(node_res->hnode);
1478c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1479c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1480c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1481c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1482c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1483c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_terminate ========
1484c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14850cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_terminate(union trapped_args *args, void *pr_ctxt)
1486c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1487c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1488c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int tempstatus;
14890624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
1490c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
14910624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_node_terminate.hnode);
14920624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14930624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
14940624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
14950624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
14960624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	status = node_terminate(node_res->hnode, &tempstatus);
1497c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1498c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_terminate.pstatus, &tempstatus, status, 1);
1499c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1500c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1501c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1502c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1503c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1504c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_uuid_props ========
1505c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15060cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_uuid_props(union trapped_args *args, void *pr_ctxt)
1507c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1508c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1509c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid node_uuid;
1510c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_ndbprops *pnode_props = NULL;
15116bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
1512c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1513c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&node_uuid, args->args_node_getuuidprops.node_id_ptr, status,
1514c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
151551d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos	if (status)
1516c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
1517c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pnode_props = kmalloc(sizeof(struct dsp_ndbprops), GFP_KERNEL);
1518c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (pnode_props != NULL) {
1519c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
15206bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos		    node_get_uuid_props(hprocessor, &node_uuid, pnode_props);
1521c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_node_getuuidprops.node_props, pnode_props,
1522c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1523c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	} else
1524c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
1525c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
1526c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pnode_props);
1527c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1528c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1529c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1530c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
15314ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos * ======== find_strm_handle =========
15324ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos */
15334ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramosinline void find_strm_handle(struct strm_res_object **strmres,
15344ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos				void *pr_ctxt, void *hstream)
15354ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos{
15364ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	rcu_read_lock();
15374ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	*strmres = idr_find(((struct process_context *)pr_ctxt)->stream_id,
1538084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos							(int)hstream - 1);
15394ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	rcu_read_unlock();
15404ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	return;
15414ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos}
15424ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15434ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos/*
1544c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_allocate_buffer ========
1545c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15460cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_allocate_buffer(union trapped_args *args, void *pr_ctxt)
1547c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1548c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1549c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 **ap_buffer = NULL;
1550c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_bufs = args->args_strm_allocatebuffer.num_bufs;
15514ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
15524ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15534ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt,
15544ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		args->args_strm_allocatebuffer.hstream);
15554ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15564ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
15574ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1558c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1559c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (num_bufs > MAX_BUFS)
1560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1561c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1562c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL);
1563dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy	if (ap_buffer == NULL)
1564dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy		return -ENOMEM;
1565c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
15664ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	status = strm_allocate_buffer(strm_res,
1567c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_strm_allocatebuffer.usize,
1568c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      ap_buffer, num_bufs, pr_ctxt);
1569157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
1570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_strm_allocatebuffer.ap_buffer, ap_buffer,
1571c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, num_bufs);
157251d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos		if (status) {
1573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EFAULT;
15744ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos			strm_free_buffer(strm_res,
1575c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					 ap_buffer, num_bufs, pr_ctxt);
1576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1577c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(ap_buffer);
1579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1580c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1581c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1582c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1583c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1584c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_close ========
1585c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15860cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_close(union trapped_args *args, void *pr_ctxt)
1587c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
15884ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
15894ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15904ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt, args->args_strm_close.hstream);
15914ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15924ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
15934ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
15944ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
15954ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	return strm_close(strm_res, pr_ctxt);
1596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1597c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1599c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_free_buffer ========
1600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16010cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_free_buffer(union trapped_args *args, void *pr_ctxt)
1602c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 **ap_buffer = NULL;
1605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_bufs = args->args_strm_freebuffer.num_bufs;
16064ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
16074ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
16084ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt,
16094ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos			args->args_strm_freebuffer.hstream);
16104ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
16114ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
16124ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1613c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (num_bufs > MAX_BUFS)
1615c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1616c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1617c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL);
1618dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy	if (ap_buffer == NULL)
1619dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy		return -ENOMEM;
1620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1621c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(ap_buffer, args->args_strm_freebuffer.ap_buffer, status,
1622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  num_bufs);
1623c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
16244ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!status)
16254ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		status = strm_free_buffer(strm_res,
1626c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					  ap_buffer, num_bufs, pr_ctxt);
16274ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_freebuffer.ap_buffer, ap_buffer, status,
1629c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  num_bufs);
1630c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(ap_buffer);
1631c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1632c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1633c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1634c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1635c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1636c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_event_handle ========
1637c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16380cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated strmwrap_get_event_handle(union trapped_args * args,
1639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					   void *pr_ctxt)
1640c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1641c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
1642c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -ENOSYS;
1643c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1644c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1645c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1646c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_info ========
1647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16480cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_get_info(union trapped_args *args, void *pr_ctxt)
1649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1650c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct stream_info strm_info;
1652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_streaminfo user;
1653c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_streaminfo *temp;
16544ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
16554ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
16564ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt,
16574ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos			args->args_strm_getinfo.hstream);
16584ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
16594ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
16604ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1661c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1662c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&strm_info, args->args_strm_getinfo.stream_info, status, 1);
1663c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	temp = strm_info.user_strm;
1664c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1665c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	strm_info.user_strm = &user;
1666c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1667157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
16684ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		status = strm_get_info(strm_res->hstream,
1669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       &strm_info,
1670c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       args->args_strm_getinfo.
1671c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       stream_info_size);
1672c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(temp, strm_info.user_strm, status, 1);
1674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	strm_info.user_strm = temp;
1675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_getinfo.stream_info, &strm_info, status, 1);
1676c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1678c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1679c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1680c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_idle ========
1681c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16820cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_idle(union trapped_args *args, void *pr_ctxt)
1683c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1684c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
16854ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
16864ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
16874ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt, args->args_strm_idle.hstream);
1688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
16894ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
16904ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
16914ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
16924ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	ret = strm_idle(strm_res->hstream, args->args_strm_idle.flush_flag);
1693c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1694c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1695c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1696c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1697c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1698c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_issue ========
1699c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
17000cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_issue(union trapped_args *args, void *pr_ctxt)
1701c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1702c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
17034ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
17044ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17054ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt, args->args_strm_issue.hstream);
17064ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17074ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
17084ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1709c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1710c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_strm_issue.pbuffer)
1711c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EFAULT;
1712c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1713c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* No need of doing CP_FM_USR for the user buffer (pbuffer)
1714c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	   as this is done in Bridge internal function bridge_chnl_add_io_req
1715c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	   in chnl_sm.c */
17164ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	status = strm_issue(strm_res->hstream,
1717c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			    args->args_strm_issue.pbuffer,
1718c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			    args->args_strm_issue.dw_bytes,
1719c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			    args->args_strm_issue.dw_buf_size,
1720c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			    args->args_strm_issue.dw_arg);
1721c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1722c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1723c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1724c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1725c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1726c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_open ========
1727c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
17280cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_open(union trapped_args *args, void *pr_ctxt)
1729c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1730c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1731c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct strm_attr attr;
17324ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res_obj;
1733c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_streamattrin strm_attr_in;
17340624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	struct node_res_object *node_res;
1735084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos	int strmid;
17360624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
17370624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	find_node_handle(&node_res, pr_ctxt, args->args_strm_open.hnode);
17380624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos
17390624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	if (!node_res)
17400624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos		return -EFAULT;
1741c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1742c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&attr, args->args_strm_open.attr_in, status, 1);
1743c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1744c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (attr.stream_attr_in != NULL) {	/* Optional argument */
1745c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&strm_attr_in, attr.stream_attr_in, status, 1);
1746157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos		if (!status) {
1747c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			attr.stream_attr_in = &strm_attr_in;
1748c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (attr.stream_attr_in->strm_mode == STRMMODE_LDMA)
1749c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				return -ENOSYS;
1750c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1751c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1752c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
17530624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos	status = strm_open(node_res->hnode,
1754c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   args->args_strm_open.direction,
17554ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos			   args->args_strm_open.index, &attr, &strm_res_obj,
1756c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   pr_ctxt);
1757084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos	if (!status) {
1758084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos		strmid = strm_res_obj->id + 1;
1759084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos		CP_TO_USR(args->args_strm_open.ph_stream, &strmid, status, 1);
1760084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos	}
1761c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1762c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1763c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1764c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1765c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_reclaim ========
1766c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
17670cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_reclaim(union trapped_args *args, void *pr_ctxt)
1768c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1769c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1770c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *buf_ptr;
1771c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ul_bytes;
1772c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 dw_arg;
1773c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ul_buf_size;
17744ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
17754ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17764ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt, args->args_strm_reclaim.hstream);
17774ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
17784ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
17794ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1780c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
17814ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	status = strm_reclaim(strm_res->hstream, &buf_ptr,
1782c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			      &ul_bytes, &ul_buf_size, &dw_arg);
1783c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_reclaim.buf_ptr, &buf_ptr, status, 1);
1784c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_reclaim.bytes, &ul_bytes, status, 1);
1785c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_reclaim.pdw_arg, &dw_arg, status, 1);
1786c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1787c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_strm_reclaim.buf_size_ptr != NULL) {
1788c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_strm_reclaim.buf_size_ptr, &ul_buf_size,
1789c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1790c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1791c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1792c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1793c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1794c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1795c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1796c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_register_notify ========
1797c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
17980cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_register_notify(union trapped_args *args, void *pr_ctxt)
1799c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1800c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1801c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notification;
18024ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
18034ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
18044ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	find_strm_handle(&strm_res, pr_ctxt,
18054ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos			args->args_strm_registernotify.hstream);
18064ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
18074ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (!strm_res)
18084ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return -EFAULT;
1809c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1810c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Initialize the notification data structure */
1811c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.ps_name = NULL;
1812c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.handle = NULL;
1813c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
18144ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	status = strm_register_notify(strm_res->hstream,
1815c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_strm_registernotify.event_mask,
1816c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_strm_registernotify.
1817c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      notify_type, &notification);
1818c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_registernotify.hnotification, &notification,
1819c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
1820c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1821c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1822c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1823c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1824c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1825c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_select ========
1826c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
18270cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_select(union trapped_args *args, void *pr_ctxt)
1828c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1829c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 mask;
1830c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct strm_object *strm_tab[MAX_STREAMS];
1831c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
18324ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	struct strm_res_object *strm_res;
18334ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	int *ids[MAX_STREAMS];
18344ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	int i;
1835c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1836c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_strm_select.strm_num > MAX_STREAMS)
1837c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1838c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
18394ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	CP_FM_USR(ids, args->args_strm_select.stream_tab, status,
18404ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		args->args_strm_select.strm_num);
18414ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
18424ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	if (status)
18434ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		return status;
18444ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
18454ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	for (i = 0; i < args->args_strm_select.strm_num; i++) {
18464ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		find_strm_handle(&strm_res, pr_ctxt, ids[i]);
18474ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
18484ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		if (!strm_res)
18494ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos			return -EFAULT;
18504ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
18514ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos		strm_tab[i] = strm_res->hstream;
18524ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos	}
18534ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos
1854157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos	if (!status) {
1855c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = strm_select(strm_tab, args->args_strm_select.strm_num,
1856c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     &mask, args->args_strm_select.utimeout);
1857c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1858c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_select.pmask, &mask, status, 1);
1859c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1860c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1861c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1862c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* CMM */
1863c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1864c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1865c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_calloc_buf ========
1866c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
18670cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_calloc_buf(union trapped_args * args, void *pr_ctxt)
1868c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1869c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* This operation is done in kernel */
1870c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
1871c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -ENOSYS;
1872c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1873c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1874c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1875c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_free_buf ========
1876c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
18770cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_free_buf(union trapped_args * args, void *pr_ctxt)
1878c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1879c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* This operation is done in kernel */
1880c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
1881c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -ENOSYS;
1882c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1883c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1884c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1885c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_handle ========
1886c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
18870cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_handle(union trapped_args *args, void *pr_ctxt)
1888c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1889c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1890c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct cmm_object *hcmm_mgr;
18916bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	void *hprocessor = ((struct process_context *)pr_ctxt)->hprocessor;
1892c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
18936bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos	status = cmm_get_handle(hprocessor, &hcmm_mgr);
1894c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1895c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_cmm_gethandle.ph_cmm_mgr, &hcmm_mgr, status, 1);
1896c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1897c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1898c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1899c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1900c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1901c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_info ========
1902c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
19030cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_info(union trapped_args *args, void *pr_ctxt)
1904c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1905c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1906c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct cmm_info cmm_info_obj;
1907c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1908c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = cmm_get_info(args->args_cmm_getinfo.hcmm_mgr, &cmm_info_obj);
1909c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1910c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_cmm_getinfo.cmm_info_obj, &cmm_info_obj, status,
1911c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
1912c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1913c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1914c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1915