dspapi.c revision e6bf74f06f5178fcccb66acf51d1f6ebc4e6c5d0
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/cfg.h>
32c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/ntfy.h>
33c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/services.h>
34c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
35c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Platform Manager */
36c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/chnl.h>
37c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dev.h>
38c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/drv.h>
39c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
40c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/proc.h>
41c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/strm.h>
42c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
43c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Resource Manager */
44c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/disp.h>
45c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/mgr.h>
46c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/node.h>
47c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/rmm.h>
48c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
49c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Others */
50c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/msg.h>
51c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/cmm.h>
52c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/io.h>
53c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
54c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- This */
55c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dspapi.h>
56c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dbdcd.h>
57c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
58c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/resourcecleanup.h>
59c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
60c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Defines, Data Structures, Typedefs */
61c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_TRACEBUFLEN 255
62c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_LOADARGS    16
63c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_NODES       64
64c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_STREAMS     16
65c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_BUFS	64
66c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
67c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Used to get dspbridge ioctl table */
68c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define DB_GET_IOC_TABLE(cmd)	(DB_GET_MODULE(cmd) >> DB_MODULE_SHIFT)
69c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
70c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Device IOCtl function pointer */
71c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastruct api_cmd {
720cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiens	u32(*fxn) (union trapped_args *args, void *pr_ctxt);
73c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 dw_index;
74c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
75c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
76c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*  ----------------------------------- Globals */
77c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic u32 api_c_refs;
78c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
79c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
80c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Function tables.
81c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  The order of these functions MUST be the same as the order of the command
82c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  numbers defined in dspapi-ioctl.h  This is how an IOCTL number in user mode
83c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  turns into a function call in kernel mode.
84c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
85c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
86c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* MGR wrapper functions */
87c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd mgr_cmd[] = {
88c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_enum_node_info},	/* MGR_ENUMNODE_INFO */
89c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_enum_proc_info},	/* MGR_ENUMPROC_INFO */
90c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_register_object},	/* MGR_REGISTEROBJECT */
91c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_unregister_object},	/* MGR_UNREGISTEROBJECT */
92c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_wait_for_bridge_events},	/* MGR_WAIT */
93c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{mgrwrap_get_process_resources_info},	/* MGR_GET_PROC_RES */
94c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
95c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
96c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* PROC wrapper functions */
97c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd proc_cmd[] = {
98c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_attach},	/* PROC_ATTACH */
99c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_ctrl},	/* PROC_CTRL */
100c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_detach},	/* PROC_DETACH */
101c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_enum_node_info},	/* PROC_ENUMNODE */
102c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_enum_resources},	/* PROC_ENUMRESOURCES */
103c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_get_state},	/* PROC_GET_STATE */
104c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_get_trace},	/* PROC_GET_TRACE */
105c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_load},	/* PROC_LOAD */
106c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_register_notify},	/* PROC_REGISTERNOTIFY */
107c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_start},	/* PROC_START */
108c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_reserve_memory},	/* PROC_RSVMEM */
109c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_un_reserve_memory},	/* PROC_UNRSVMEM */
110c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_map},		/* PROC_MAPMEM */
111c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_un_map},	/* PROC_UNMAPMEM */
112c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_flush_memory},	/* PROC_FLUSHMEMORY */
113c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_stop},	/* PROC_STOP */
114c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_invalidate_memory},	/* PROC_INVALIDATEMEMORY */
115c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_begin_dma},	/* PROC_BEGINDMA */
116c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{procwrap_end_dma},	/* PROC_ENDDMA */
117c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
118c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
119c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* NODE wrapper functions */
120c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd node_cmd[] = {
121c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_allocate},	/* NODE_ALLOCATE */
122c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_alloc_msg_buf},	/* NODE_ALLOCMSGBUF */
123c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_change_priority},	/* NODE_CHANGEPRIORITY */
124c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_connect},	/* NODE_CONNECT */
125c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_create},	/* NODE_CREATE */
126c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_delete},	/* NODE_DELETE */
127c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_free_msg_buf},	/* NODE_FREEMSGBUF */
128c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_get_attr},	/* NODE_GETATTR */
129c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_get_message},	/* NODE_GETMESSAGE */
130c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_pause},	/* NODE_PAUSE */
131c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_put_message},	/* NODE_PUTMESSAGE */
132c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_register_notify},	/* NODE_REGISTERNOTIFY */
133c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_run},		/* NODE_RUN */
134c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_terminate},	/* NODE_TERMINATE */
135c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{nodewrap_get_uuid_props},	/* NODE_GETUUIDPROPS */
136c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
137c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
138c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* STRM wrapper functions */
139c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd strm_cmd[] = {
140c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_allocate_buffer},	/* STRM_ALLOCATEBUFFER */
141c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_close},	/* STRM_CLOSE */
142c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_free_buffer},	/* STRM_FREEBUFFER */
143c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_get_event_handle},	/* STRM_GETEVENTHANDLE */
144c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_get_info},	/* STRM_GETINFO */
145c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_idle},	/* STRM_IDLE */
146c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_issue},	/* STRM_ISSUE */
147c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_open},	/* STRM_OPEN */
148c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_reclaim},	/* STRM_RECLAIM */
149c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_register_notify},	/* STRM_REGISTERNOTIFY */
150c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{strmwrap_select},	/* STRM_SELECT */
151c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
152c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
153c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* CMM wrapper functions */
154c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd cmm_cmd[] = {
155c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_calloc_buf},	/* CMM_ALLOCBUF */
156c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_free_buf},	/* CMM_FREEBUF */
157c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_get_handle},	/* CMM_GETHANDLE */
158c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	{cmmwrap_get_info},	/* CMM_GETINFO */
159c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
160c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
161c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Array used to store ioctl table sizes. It can hold up to 8 entries */
162c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic u8 size_cmd[] = {
163c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(mgr_cmd),
164c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(proc_cmd),
165c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(node_cmd),
166c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(strm_cmd),
167c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ARRAY_SIZE(cmm_cmd),
168c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna};
169c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
170c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic inline void _cp_fm_usr(void *to, const void __user * from,
171c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			      int *err, unsigned long bytes)
172c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
173c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_FAILED(*err))
174c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
175c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
176c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(!from)) {
177c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
178c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
179c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
180c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
181c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(copy_from_user(to, from, bytes)))
182c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
183c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
184c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
185c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define CP_FM_USR(to, from, err, n)				\
186c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	_cp_fm_usr(to, from, &(err), (n) * sizeof(*(to)))
187c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
188c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic inline void _cp_to_usr(void __user *to, const void *from,
189c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			      int *err, unsigned long bytes)
190c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
191c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_FAILED(*err))
192c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
193c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
194c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(!to)) {
195c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
196c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return;
197c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
198c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
199c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (unlikely(copy_to_user(to, from, bytes)))
200c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*err = -EFAULT;
201c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
202c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
203c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define CP_TO_USR(to, from, err, n)				\
204c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	_cp_to_usr(to, from, &(err), (n) * sizeof(*(from)))
205c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
206c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
207c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_call_dev_ioctl ========
208c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Purpose:
209c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Call the (wrapper) function for the corresponding API IOCTL.
210c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
2110cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensinline int api_call_dev_ioctl(u32 cmd, union trapped_args *args,
212c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      u32 *result, void *pr_ctxt)
213c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
2140cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiens	u32(*ioctl_cmd) (union trapped_args *args, void *pr_ctxt) = NULL;
215c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int i;
216c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
217c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (_IOC_TYPE(cmd) != DB) {
218c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: Incompatible dspbridge ioctl number\n", __func__);
219c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
220c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
221c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
222c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DB_GET_IOC_TABLE(cmd) > ARRAY_SIZE(size_cmd)) {
223c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: undefined ioctl module\n", __func__);
224c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
225c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
226c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
227c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Check the size of the required cmd table */
228c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	i = DB_GET_IOC(cmd);
229c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (i > size_cmd[DB_GET_IOC_TABLE(cmd)]) {
230c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: requested ioctl %d out of bounds for table %d\n",
231c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		       __func__, i, DB_GET_IOC_TABLE(cmd));
232c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
233c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
234c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
235c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	switch (DB_GET_MODULE(cmd)) {
236c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_MGR:
237c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = mgr_cmd[i].fxn;
238c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
239c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_PROC:
240c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = proc_cmd[i].fxn;
241c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
242c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_NODE:
243c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = node_cmd[i].fxn;
244c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
245c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_STRM:
246c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = strm_cmd[i].fxn;
247c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
248c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	case DB_CMM:
249c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ioctl_cmd = cmm_cmd[i].fxn;
250c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		break;
251c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
252c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
253c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!ioctl_cmd) {
254c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pr_err("%s: requested ioctl not defined\n", __func__);
255c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto err;
256c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	} else {
257c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		*result = (*ioctl_cmd) (args, pr_ctxt);
258c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
259c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
260c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return 0;
261c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
262c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunaerr:
263c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -EINVAL;
264c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
265c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
266c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
267c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_exit ========
268c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
269c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunavoid api_exit(void)
270c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
271c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	DBC_REQUIRE(api_c_refs > 0);
272c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	api_c_refs--;
273c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
274c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (api_c_refs == 0) {
275c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		/* Release all modules initialized in api_init(). */
276c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cod_exit();
277c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		dev_exit();
278c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		chnl_exit();
279c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		msg_exit();
280c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		io_exit();
281c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		strm_exit();
282c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		disp_exit();
283c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		node_exit();
284c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		proc_exit();
285c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		mgr_exit();
286c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		rmm_exit();
287c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		drv_exit();
288c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
289c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	DBC_ENSURE(api_c_refs >= 0);
290c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
291c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
292c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
293c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_init ========
294c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Purpose:
295c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Module initialization used by Bridge API.
296c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
297c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunabool api_init(void)
298c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
299c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	bool ret = true;
300c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	bool fdrv, fdev, fcod, fchnl, fmsg, fio;
301c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	bool fmgr, fproc, fnode, fdisp, fstrm, frmm;
302c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
303c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (api_c_refs == 0) {
304c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		/* initialize driver and other modules */
305c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fdrv = drv_init();
306c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fmgr = mgr_init();
307c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fproc = proc_init();
308c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fnode = node_init();
309c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fdisp = disp_init();
310c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fstrm = strm_init();
311c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		frmm = rmm_init();
312c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fchnl = chnl_init();
313c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fmsg = msg_mod_init();
314c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fio = io_init();
315c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fdev = dev_init();
316c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		fcod = cod_init();
317c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ret = fdrv && fdev && fchnl && fcod && fmsg && fio;
318c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		ret = ret && fmgr && fproc && frmm;
319c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (!ret) {
320c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fdrv)
321c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				drv_exit();
322c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
323c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fmgr)
324c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				mgr_exit();
325c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
326c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fstrm)
327c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				strm_exit();
328c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
329c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fproc)
330c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				proc_exit();
331c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
332c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fnode)
333c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				node_exit();
334c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
335c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fdisp)
336c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				disp_exit();
337c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
338c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fchnl)
339c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				chnl_exit();
340c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
341c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fmsg)
342c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				msg_exit();
343c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
344c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fio)
345c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				io_exit();
346c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
347c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fdev)
348c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				dev_exit();
349c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
350c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (fcod)
351c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				cod_exit();
352c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
353c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (frmm)
354c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				rmm_exit();
355c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
356c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
357c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
358c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (ret)
359c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		api_c_refs++;
360c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
361c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
362c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
363c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
364c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
365c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== api_init_complete2 ========
366c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Purpose:
367c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Perform any required bridge initialization which cannot
368c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      be performed in api_init() or dev_start_device() due
369c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      to the fact that some services are not yet
370c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      completely initialized.
371c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Parameters:
372c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Returns:
373c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      0:	Allow this device to load
374c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      -EPERM:      Failure.
375c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Requires:
376c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *      Bridge API initialized.
377c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  Ensures:
378c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
379c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunaint api_init_complete2(void)
380c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
381c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
382c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct cfg_devnode *dev_node;
383c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dev_object *hdev_obj;
384c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 dev_type;
385c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 tmp;
386c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
387c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	DBC_REQUIRE(api_c_refs > 0);
388c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
389c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/*  Walk the list of DevObjects, get each devnode, and attempting to
390c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	 *  autostart the board. Note that this requires COF loading, which
391c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	 *  requires KFILE. */
392c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	for (hdev_obj = dev_get_first(); hdev_obj != NULL;
393c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	     hdev_obj = dev_get_next(hdev_obj)) {
394c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_FAILED(dev_get_dev_node(hdev_obj, &dev_node)))
395c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			continue;
396c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
397c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_FAILED(dev_get_dev_type(hdev_obj, &dev_type)))
398c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			continue;
399c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
400c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if ((dev_type == DSP_UNIT) || (dev_type == IVA_UNIT))
401c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (cfg_get_auto_start(dev_node, &tmp) == 0
402c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna									&& tmp)
403c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				proc_auto_start(dev_node, hdev_obj);
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
428c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(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
460c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(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);
489c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_FAILED(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);
496c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!psz_path_name)
497c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
498c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = strncpy_from_user(psz_path_name,
499c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				(char *)args->args_mgr_registerobject.
500c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				psz_path_name, path_size);
501c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!ret) {
502c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -EFAULT;
503c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
504c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
505c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
506c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_mgr_registerobject.obj_type >= DSP_DCDMAXOBJTYPE)
507c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
508c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
509c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = dcd_register_object(&uuid_obj,
510c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     args->args_mgr_registerobject.obj_type,
511c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     (char *)psz_path_name);
512c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
513c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(psz_path_name);
514c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
515c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
516c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
517c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
518c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_unregister_object ========
519c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5200cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_unregister_object(union trapped_args *args, void *pr_ctxt)
521c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
522c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
523c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid uuid_obj;
524c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
525c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1);
526c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_FAILED(status))
527c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_end;
528c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
529c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = dcd_unregister_object(&uuid_obj,
530c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       args->args_mgr_unregisterobject.
531c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       obj_type);
532c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
533c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
534c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
535c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
536c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
537c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
538c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_wait_for_bridge_events ========
539c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5400cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_wait_for_bridge_events(union trapped_args *args, void *pr_ctxt)
541c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
542c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0, real_status = 0;
543c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification *anotifications[MAX_EVENTS];
544c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notifications[MAX_EVENTS];
545c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 index, i;
546c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 count = args->args_mgr_wait.count;
547c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
548c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (count > MAX_EVENTS)
549c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -EINVAL;
550c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
551c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* get the array of pointers to user structures */
552c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(anotifications, args->args_mgr_wait.anotifications,
553c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, count);
554c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* get the events */
555c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	for (i = 0; i < count; i++) {
556c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&notifications[i], anotifications[i], status, 1);
557c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_SUCCEEDED(status)) {
558c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* set the array of pointers to kernel structures */
559c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			anotifications[i] = &notifications[i];
560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
561c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
562c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
563c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		real_status = mgr_wait_for_bridge_events(anotifications, count,
564c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna							 &index,
565c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna							 args->args_mgr_wait.
566c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna							 utimeout);
567c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
568c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_mgr_wait.pu_index, &index, status, 1);
569c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return real_status;
570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
571c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
572c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== MGRWRAP_GetProcessResourceInfo ========
574c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5750cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated mgrwrap_get_process_resources_info(union trapped_args * args,
576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna						    void *pr_ctxt)
577c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return 0;
580c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
581c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
582c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
583c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_attach ========
584c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
5850cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_attach(union trapped_args *args, void *pr_ctxt)
586c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
587c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *processor;
588c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
589c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_processorattrin proc_attr_in, *attr_in = NULL;
590c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
591c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
592c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_attach.attr_in) {
593c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&proc_attr_in, args->args_proc_attach.attr_in, status,
594c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  1);
595c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_SUCCEEDED(status))
596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			attr_in = &proc_attr_in;
597c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		else
598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_end;
599c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
601c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_attach(args->args_proc_attach.processor_id, attr_in,
602c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			     &processor, pr_ctxt);
603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_attach.ph_processor, &processor, status, 1);
604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
606c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
607c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
608c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
609c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_ctrl ========
610c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
6110cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_ctrl(union trapped_args *args, void *pr_ctxt)
612c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
613c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 cb_data_size, __user * psize = (u32 __user *)
614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    args->args_proc_ctrl.pargs;
615c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pargs = NULL;
616c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
617c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
618c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (psize) {
619c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (get_user(cb_data_size, psize)) {
620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EPERM;
621c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_end;
622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
623c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cb_data_size += sizeof(u32);
624c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		pargs = kmalloc(cb_data_size, GFP_KERNEL);
625c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (pargs == NULL) {
626c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -ENOMEM;
627c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_end;
628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
629c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
630c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(pargs, args->args_proc_ctrl.pargs, status,
631c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  cb_data_size);
632c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
633c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
634c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = proc_ctrl(args->args_proc_ctrl.hprocessor,
635c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_ctrl.dw_cmd,
636c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   (struct dsp_cbdata *)pargs);
637c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
638c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* CP_TO_USR(args->args_proc_ctrl.pargs, pargs, status, 1); */
640c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pargs);
641c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end:
642c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
643c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
644c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
645c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
646c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_detach ========
647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
6480cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated procwrap_detach(union trapped_args * args, void *pr_ctxt)
649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
650c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* proc_detach called at bridge_release only */
651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return 0;
653c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
654c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
655c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
656c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_node_info ========
657c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
6580cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_node_info(union trapped_args *args, void *pr_ctxt)
659c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
660c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
661c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *node_tab[MAX_NODES];
662c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_nodes;
663c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 alloc_cnt;
664c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
665c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_proc_enumnode_info.node_tab_size)
666c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
667c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
668c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_enum_nodes(args->args_proc_enumnode_info.hprocessor,
669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 node_tab,
670c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 args->args_proc_enumnode_info.node_tab_size,
671c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 &num_nodes, &alloc_cnt);
672c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumnode_info.node_tab, node_tab, status,
673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  num_nodes);
674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumnode_info.pu_num_nodes, &num_nodes,
675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
676c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumnode_info.pu_allocated, &alloc_cnt,
677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
678c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
679c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
680c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
6810cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_end_dma(union trapped_args *args, void *pr_ctxt)
682c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
683c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
684c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
685c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_dma.dir >= DMA_NONE)
686c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
687c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_end_dma(pr_ctxt,
689c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.pmpu_addr,
690c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.ul_size,
691c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.dir);
692c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
693c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
694c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
6950cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_begin_dma(union trapped_args *args, void *pr_ctxt)
696c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
697c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
698c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
699c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_dma.dir >= DMA_NONE)
700c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
701c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
702c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_begin_dma(pr_ctxt,
703c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.pmpu_addr,
704c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.ul_size,
705c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_dma.dir);
706c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
707c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
708c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
709c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
710c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_flush_memory ========
711c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7120cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_flush_memory(union trapped_args *args, void *pr_ctxt)
713c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
714c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
715c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
716c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_flushmemory.ul_flags >
717c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    PROC_WRITEBACK_INVALIDATE_MEM)
718c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
719c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
720c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_flush_memory(pr_ctxt,
721c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_flushmemory.pmpu_addr,
722c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_flushmemory.ul_size,
723c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_flushmemory.ul_flags);
724c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
725c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
726c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
727c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
728c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_invalidate_memory ========
729c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7300cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_invalidate_memory(union trapped_args *args, void *pr_ctxt)
731c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
732c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
733c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
734c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status =
735c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    proc_invalidate_memory(pr_ctxt,
736c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_invalidatememory.pmpu_addr,
737c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_invalidatememory.ul_size);
738c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
739c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
740c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
741c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
742c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_resources ========
743c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7440cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_resources(union trapped_args *args, void *pr_ctxt)
745c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
746c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
747c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_resourceinfo resource_info;
748c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
749c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_enumresources.resource_info_size <
750c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    sizeof(struct dsp_resourceinfo))
751c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
752c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
753c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status =
754c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    proc_get_resource_info(args->args_proc_enumresources.hprocessor,
755c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_enumresources.resource_type,
756c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   &resource_info,
757c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_enumresources.
758c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   resource_info_size);
759c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
760c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_enumresources.resource_info, &resource_info,
761c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
762c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
763c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
764c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
765c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
766c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
767c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
768c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_state ========
769c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7700cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_state(union trapped_args *args, void *pr_ctxt)
771c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
772c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
773c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_processorstate proc_state;
774c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
775c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_getstate.state_info_size <
776c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    sizeof(struct dsp_processorstate))
777c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
778c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
779c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status =
780c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    proc_get_state(args->args_proc_getstate.hprocessor, &proc_state,
781c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   args->args_proc_getstate.state_info_size);
782c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_getstate.proc_state_obj, &proc_state, status,
783c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
784c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
785c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
786c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
787c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
788c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
789c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_trace ========
790c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
7910cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_trace(union trapped_args *args, void *pr_ctxt)
792c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
793c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
794c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pbuf;
795c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
796c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_gettrace.max_size > MAX_TRACEBUFLEN)
797c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
798c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
799c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pbuf = kzalloc(args->args_proc_gettrace.max_size, GFP_KERNEL);
800c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (pbuf != NULL) {
801c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = proc_get_trace(args->args_proc_gettrace.hprocessor,
802c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					pbuf,
803c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					args->args_proc_gettrace.max_size);
804c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	} else {
805c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
806c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
807c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_gettrace.pbuf, pbuf, status,
808c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  args->args_proc_gettrace.max_size);
809c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pbuf);
810c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
811c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
812c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
813c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
814c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
815c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_load ========
816c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
8170cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_load(union trapped_args *args, void *pr_ctxt)
818c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
819c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	s32 i, len;
820c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
821c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	char *temp;
822c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	s32 count = args->args_proc_load.argc_index;
823c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 **argv = NULL, **envp = NULL;
824c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
825c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (count <= 0 || count > MAX_LOADARGS) {
826c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -EINVAL;
827c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
828c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
829c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
830c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	argv = kmalloc(count * sizeof(u8 *), GFP_KERNEL);
831c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!argv) {
832c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
833c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
834c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
835c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
836c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(argv, args->args_proc_load.user_args, status, count);
837c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_FAILED(status)) {
838c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		kfree(argv);
839c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		argv = NULL;
840c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
841c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
842c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
843c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	for (i = 0; i < count; i++) {
844c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (argv[i]) {
845c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* User space pointer to argument */
846c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			temp = (char *)argv[i];
847c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* len is increased by 1 to accommodate NULL */
848c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			len = strlen_user((char *)temp) + 1;
849c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* Kernel space pointer to argument */
850c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			argv[i] = kmalloc(len, GFP_KERNEL);
851c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (argv[i]) {
852c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				CP_FM_USR(argv[i], temp, status, len);
853c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				if (DSP_FAILED(status)) {
854c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					kfree(argv[i]);
855c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					argv[i] = NULL;
856c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					goto func_cont;
857c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				}
858c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			} else {
859c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
860c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				goto func_cont;
861c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			}
862c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
863c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
864c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* TODO: validate this */
865c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_proc_load.user_envp) {
866c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		/* number of elements in the envp array including NULL */
867c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		count = 0;
868c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		do {
869c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			get_user(temp, args->args_proc_load.user_envp + count);
870c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			count++;
871c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		} while (temp);
872c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		envp = kmalloc(count * sizeof(u8 *), GFP_KERNEL);
873c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (!envp) {
874c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -ENOMEM;
875c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_cont;
876c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
877c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
878c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(envp, args->args_proc_load.user_envp, status, count);
879c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_FAILED(status)) {
880c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			kfree(envp);
881c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			envp = NULL;
882c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_cont;
883c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
884c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		for (i = 0; envp[i]; i++) {
885c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* User space pointer to argument */
886c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			temp = (char *)envp[i];
887c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* len is increased by 1 to accommodate NULL */
888c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			len = strlen_user((char *)temp) + 1;
889c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			/* Kernel space pointer to argument */
890c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			envp[i] = kmalloc(len, GFP_KERNEL);
891c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (envp[i]) {
892c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				CP_FM_USR(envp[i], temp, status, len);
893c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				if (DSP_FAILED(status)) {
894c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					kfree(envp[i]);
895c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					envp[i] = NULL;
896c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					goto func_cont;
897c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				}
898c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			} else {
899c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
900c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				goto func_cont;
901c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			}
902c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
903c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
904c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
905c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
906c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = proc_load(args->args_proc_load.hprocessor,
907c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_proc_load.argc_index,
908cd4f13c02a5d72e1fc367c51cc0fd955f65538e0Menon, Nishanth				   (const char **)argv, (const char **)envp);
909c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
910c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
911c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (envp) {
912c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		i = 0;
913c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		while (envp[i])
914c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			kfree(envp[i++]);
915c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
916c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		kfree(envp);
917c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
918c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
919c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (argv) {
920c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		count = args->args_proc_load.argc_index;
921c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		for (i = 0; (i < count) && argv[i]; i++)
922c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			kfree(argv[i]);
923c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
924c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		kfree(argv);
925c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
926c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
927c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
928c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
929c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
930c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
931c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_map ========
932c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9330cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_map(union trapped_args *args, void *pr_ctxt)
934c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
935c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
936c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *map_addr;
937c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
938c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_proc_mapmem.ul_size)
939c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
940c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
941c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_map(args->args_proc_mapmem.hprocessor,
942c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_mapmem.pmpu_addr,
943c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_mapmem.ul_size,
944c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_mapmem.req_addr, &map_addr,
945c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_mapmem.ul_map_attr, pr_ctxt);
946c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
947c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (put_user(map_addr, args->args_proc_mapmem.pp_map_addr)) {
948c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EINVAL;
949c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			proc_un_map(args->args_proc_mapmem.hprocessor,
950c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				    map_addr, pr_ctxt);
951c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
952c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
953c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
954c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
955c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
956c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
957c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
958c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_register_notify ========
959c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9600cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_register_notify(union trapped_args *args, void *pr_ctxt)
961c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
962c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
963c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notification;
964c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
965c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Initialize the notification data structure */
966c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.ps_name = NULL;
967c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.handle = NULL;
968c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
969c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status =
970c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    proc_register_notify(args->args_proc_register_notify.hprocessor,
971c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 args->args_proc_register_notify.event_mask,
972c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 args->args_proc_register_notify.notify_type,
973c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				 &notification);
974c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_proc_register_notify.hnotification, &notification,
975c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
976c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
977c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
978c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
979c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
980c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_reserve_memory ========
981c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
9820cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_reserve_memory(union trapped_args *args, void *pr_ctxt)
983c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
984c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
985c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	void *prsv_addr;
986c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
987c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if ((args->args_proc_rsvmem.ul_size <= 0) ||
988c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	    (args->args_proc_rsvmem.ul_size & (PG_SIZE4K - 1)) != 0)
989c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
990c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
991c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_reserve_memory(args->args_proc_rsvmem.hprocessor,
992c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     args->args_proc_rsvmem.ul_size, &prsv_addr,
993c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     pr_ctxt);
994c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
995c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (put_user(prsv_addr, args->args_proc_rsvmem.pp_rsv_addr)) {
996c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EINVAL;
997c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			proc_un_reserve_memory(args->args_proc_rsvmem.
998c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					       hprocessor, prsv_addr, pr_ctxt);
999c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1000c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1001c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1002c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1003c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1004c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1005c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_start ========
1006c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10070cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_start(union trapped_args *args, void *pr_ctxt)
1008c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1009c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1010c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1011c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = proc_start(args->args_proc_start.hprocessor);
1012c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1013c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1014c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1015c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1016c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_map ========
1017c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10180cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_un_map(union trapped_args *args, void *pr_ctxt)
1019c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1020c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1021c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1022c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_un_map(args->args_proc_unmapmem.hprocessor,
1023c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			     args->args_proc_unmapmem.map_addr, pr_ctxt);
1024c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1025c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1026c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1027c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1028c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_reserve_memory ========
1029c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10300cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_un_reserve_memory(union trapped_args *args, void *pr_ctxt)
1031c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1032c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1033c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1034c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = proc_un_reserve_memory(args->args_proc_unrsvmem.hprocessor,
1035c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					args->args_proc_unrsvmem.prsv_addr,
1036c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					pr_ctxt);
1037c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1038c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1039c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1040c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1041c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_stop ========
1042c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10430cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_stop(union trapped_args *args, void *pr_ctxt)
1044c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1045c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1046c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1047c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = proc_stop(args->args_proc_stop.hprocessor);
1048c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1049c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1050c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1051c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1052c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1053c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_allocate ========
1054c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
10550cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_allocate(union trapped_args *args, void *pr_ctxt)
1056c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1057c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1058c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid node_uuid;
1059c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 cb_data_size = 0;
1060c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 __user *psize = (u32 __user *) args->args_node_allocate.pargs;
1061c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pargs = NULL;
1062c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_nodeattrin proc_attr_in, *attr_in = NULL;
1063c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct node_object *hnode;
1064c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1065c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
1066c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (psize) {
1067c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (get_user(cb_data_size, psize))
1068c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EPERM;
1069c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1070c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cb_data_size += sizeof(u32);
1071c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_SUCCEEDED(status)) {
1072c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pargs = kmalloc(cb_data_size, GFP_KERNEL);
1073c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (pargs == NULL)
1074c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
1075c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1076c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1077c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(pargs, args->args_node_allocate.pargs, status,
1078c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  cb_data_size);
1079c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1080c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&node_uuid, args->args_node_allocate.node_id_ptr, status, 1);
1081c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_FAILED(status))
1082c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
1083c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
1084c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_node_allocate.attr_in) {
1085c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&proc_attr_in, args->args_node_allocate.attr_in,
1086c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1087c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_SUCCEEDED(status))
1088c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			attr_in = &proc_attr_in;
1089c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		else
1090c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -ENOMEM;
1091c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1092c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1093c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1094c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = node_allocate(args->args_node_allocate.hprocessor,
1095c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       &node_uuid, (struct dsp_cbdata *)pargs,
1096c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       attr_in, &hnode, pr_ctxt);
1097c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1098c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1099c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_node_allocate.ph_node, &hnode, status, 1);
1100c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_FAILED(status)) {
1101c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EFAULT;
1102c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			node_delete(hnode, pr_ctxt);
1103c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1104c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1105c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
1106c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pargs);
1107c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1108c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1109c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1110c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1111c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1112c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== nodewrap_alloc_msg_buf ========
1113c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
11140cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_alloc_msg_buf(union trapped_args *args, void *pr_ctxt)
1115c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1116c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1117c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr *pattr = NULL;
1118c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr attr;
1119c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pbuffer = NULL;
1120c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1121c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_node_allocmsgbuf.usize)
1122c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1123c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1124c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_node_allocmsgbuf.pattr) {	/* Optional argument */
1125c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&attr, args->args_node_allocmsgbuf.pattr, status, 1);
1126c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_SUCCEEDED(status))
1127c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pattr = &attr;
1128c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1129c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1130e6bf74f06f5178fcccb66acf51d1f6ebc4e6c5d0Menon, Nishanth	/* argument */
1131c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&pbuffer, args->args_node_allocmsgbuf.pbuffer, status, 1);
1132c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1133c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = node_alloc_msg_buf(args->args_node_allocmsgbuf.hnode,
1134c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    args->args_node_allocmsgbuf.usize,
1135c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					    pattr, &pbuffer);
1136c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1137c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_allocmsgbuf.pbuffer, &pbuffer, status, 1);
1138c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1139c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1140c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1141c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1142c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_change_priority ========
1143c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
11440cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_change_priority(union trapped_args *args, void *pr_ctxt)
1145c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1146c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1147c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1148c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = node_change_priority(args->args_node_changepriority.hnode,
1149c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				   args->args_node_changepriority.prio);
1150c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1151c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1152c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1153c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1154c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1155c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_connect ========
1156c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
11570cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_connect(union trapped_args *args, void *pr_ctxt)
1158c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1159c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1160c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_strmattr attrs;
1161c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_strmattr *pattrs = NULL;
1162c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 cb_data_size;
1163c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 __user *psize = (u32 __user *) args->args_node_connect.conn_param;
1164c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *pargs = NULL;
1165c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1166c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Optional argument */
1167c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (psize) {
1168c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (get_user(cb_data_size, psize))
1169c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EPERM;
1170c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1171c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		cb_data_size += sizeof(u32);
1172c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_SUCCEEDED(status)) {
1173c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pargs = kmalloc(cb_data_size, GFP_KERNEL);
1174c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (pargs == NULL) {
1175c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				status = -ENOMEM;
1176c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				goto func_cont;
1177c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			}
1178c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1179c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1180c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(pargs, args->args_node_connect.conn_param, status,
1181c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  cb_data_size);
1182c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_FAILED(status))
1183c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			goto func_cont;
1184c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1185c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_node_connect.pattrs) {	/* Optional argument */
1186c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&attrs, args->args_node_connect.pattrs, status, 1);
1187c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_SUCCEEDED(status))
1188c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pattrs = &attrs;
1189c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1190c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1191c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1192c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = node_connect(args->args_node_connect.hnode,
1193c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_connect.stream_id,
1194c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_connect.other_node,
1195c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_connect.other_stream,
1196c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      pattrs, (struct dsp_cbdata *)pargs);
1197c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1198c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
1199c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pargs);
1200c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1201c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1202c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1203c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1204c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1205c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_create ========
1206c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12070cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_create(union trapped_args *args, void *pr_ctxt)
1208c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1209c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1210c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1211c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = node_create(args->args_node_create.hnode);
1212c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1213c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1214c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1215c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1216c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1217c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_delete ========
1218c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12190cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_delete(union trapped_args *args, void *pr_ctxt)
1220c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1221c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1222c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1223c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = node_delete(args->args_node_delete.hnode, pr_ctxt);
1224c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1225c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1226c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1227c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1228c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1229c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *  ======== nodewrap_free_msg_buf ========
1230c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12310cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_free_msg_buf(union trapped_args *args, void *pr_ctxt)
1232c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1233c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1234c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr *pattr = NULL;
1235c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_bufferattr attr;
1236c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_node_freemsgbuf.pattr) {	/* Optional argument */
1237c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&attr, args->args_node_freemsgbuf.pattr, status, 1);
1238c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_SUCCEEDED(status))
1239c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			pattr = &attr;
1240c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1241c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1242c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1243c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_node_freemsgbuf.pbuffer)
1244c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EFAULT;
1245c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1246c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1247c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = node_free_msg_buf(args->args_node_freemsgbuf.hnode,
1248c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					   args->args_node_freemsgbuf.pbuffer,
1249c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					   pattr);
1250c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1251c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1252c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1253c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1254c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1255c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1256c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_attr ========
1257c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12580cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_attr(union trapped_args *args, void *pr_ctxt)
1259c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1260c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1261c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_nodeattr attr;
1262c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1263c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = node_get_attr(args->args_node_getattr.hnode, &attr,
1264c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			       args->args_node_getattr.attr_size);
1265c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_getattr.pattr, &attr, status, 1);
1266c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1267c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1268c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1269c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1270c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1271c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_message ========
1272c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12730cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_message(union trapped_args *args, void *pr_ctxt)
1274c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1275c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1276c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_msg msg;
1277c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1278c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = node_get_message(args->args_node_getmessage.hnode, &msg,
1279c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				  args->args_node_getmessage.utimeout);
1280c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1281c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_getmessage.message, &msg, status, 1);
1282c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1283c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1284c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1285c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1286c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1287c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_pause ========
1288c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
12890cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_pause(union trapped_args *args, void *pr_ctxt)
1290c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1291c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1292c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1293c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = node_pause(args->args_node_pause.hnode);
1294c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1295c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1296c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1297c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1298c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1299c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_put_message ========
1300c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13010cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_put_message(union trapped_args *args, void *pr_ctxt)
1302c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1303c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1304c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_msg msg;
1305c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1306c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&msg, args->args_node_putmessage.message, status, 1);
1307c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1308c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1309c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
1310c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		    node_put_message(args->args_node_putmessage.hnode, &msg,
1311c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     args->args_node_putmessage.utimeout);
1312c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1313c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1314c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1315c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1316c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1317c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1318c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_register_notify ========
1319c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13200cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_register_notify(union trapped_args *args, void *pr_ctxt)
1321c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1322c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1323c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notification;
1324c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1325c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Initialize the notification data structure */
1326c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.ps_name = NULL;
1327c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.handle = NULL;
1328c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1329c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_proc_register_notify.event_mask)
1330c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&notification,
1331c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  args->args_proc_register_notify.hnotification,
1332c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1333c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1334c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = node_register_notify(args->args_node_registernotify.hnode,
1335c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_registernotify.event_mask,
1336c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_node_registernotify.
1337c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      notify_type, &notification);
1338c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_registernotify.hnotification, &notification,
1339c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
1340c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1341c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1342c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1343c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1344c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_run ========
1345c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13460cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_run(union trapped_args *args, void *pr_ctxt)
1347c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1348c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1349c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1350c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = node_run(args->args_node_run.hnode);
1351c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1352c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1353c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1354c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1355c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1356c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_terminate ========
1357c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13580cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_terminate(union trapped_args *args, void *pr_ctxt)
1359c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1360c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1361c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int tempstatus;
1362c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1363c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = node_terminate(args->args_node_terminate.hnode, &tempstatus);
1364c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1365c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_node_terminate.pstatus, &tempstatus, status, 1);
1366c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1367c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1368c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1369c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1370c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1371c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_uuid_props ========
1372c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
13730cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_uuid_props(union trapped_args *args, void *pr_ctxt)
1374c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1375c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1376c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_uuid node_uuid;
1377c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_ndbprops *pnode_props = NULL;
1378c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1379c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&node_uuid, args->args_node_getuuidprops.node_id_ptr, status,
1380c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
1381c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_FAILED(status))
1382c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		goto func_cont;
1383c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pnode_props = kmalloc(sizeof(struct dsp_ndbprops), GFP_KERNEL);
1384c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (pnode_props != NULL) {
1385c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status =
1386c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		    node_get_uuid_props(args->args_node_getuuidprops.hprocessor,
1387c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					&node_uuid, pnode_props);
1388c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_node_getuuidprops.node_props, pnode_props,
1389c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1390c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	} else
1391c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = -ENOMEM;
1392c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont:
1393c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(pnode_props);
1394c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1395c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1396c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1397c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1398c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_allocate_buffer ========
1399c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14000cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_allocate_buffer(union trapped_args *args, void *pr_ctxt)
1401c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1402c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status;
1403c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 **ap_buffer = NULL;
1404c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_bufs = args->args_strm_allocatebuffer.num_bufs;
1405c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1406c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (num_bufs > MAX_BUFS)
1407c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1408c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1409c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL);
1410dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy	if (ap_buffer == NULL)
1411dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy		return -ENOMEM;
1412c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1413c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = strm_allocate_buffer(args->args_strm_allocatebuffer.hstream,
1414c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_strm_allocatebuffer.usize,
1415c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      ap_buffer, num_bufs, pr_ctxt);
1416c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1417c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_strm_allocatebuffer.ap_buffer, ap_buffer,
1418c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, num_bufs);
1419c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_FAILED(status)) {
1420c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			status = -EFAULT;
1421c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			strm_free_buffer(args->args_strm_allocatebuffer.hstream,
1422c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					 ap_buffer, num_bufs, pr_ctxt);
1423c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1424c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1425c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(ap_buffer);
1426c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1427c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1428c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1429c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1430c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1431c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_close ========
1432c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14330cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_close(union trapped_args *args, void *pr_ctxt)
1434c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1435c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return strm_close(args->args_strm_close.hstream, pr_ctxt);
1436c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1437c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1438c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1439c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_free_buffer ========
1440c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14410cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_free_buffer(union trapped_args *args, void *pr_ctxt)
1442c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1443c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1444c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 **ap_buffer = NULL;
1445c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 num_bufs = args->args_strm_freebuffer.num_bufs;
1446c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1447c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (num_bufs > MAX_BUFS)
1448c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1449c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1450c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL);
1451dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy	if (ap_buffer == NULL)
1452dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy		return -ENOMEM;
1453c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1454c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(ap_buffer, args->args_strm_freebuffer.ap_buffer, status,
1455c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  num_bufs);
1456c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1457c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1458c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = strm_free_buffer(args->args_strm_freebuffer.hstream,
1459c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					  ap_buffer, num_bufs, pr_ctxt);
1460c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1461c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_freebuffer.ap_buffer, ap_buffer, status,
1462c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  num_bufs);
1463c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	kfree(ap_buffer);
1464c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1465c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1466c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1467c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1468c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1469c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_event_handle ========
1470c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14710cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated strmwrap_get_event_handle(union trapped_args * args,
1472c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna					   void *pr_ctxt)
1473c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1474c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
1475c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -ENOSYS;
1476c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1477c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1478c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1479c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_info ========
1480c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
14810cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_get_info(union trapped_args *args, void *pr_ctxt)
1482c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1483c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1484c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct stream_info strm_info;
1485c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_streaminfo user;
1486c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_streaminfo *temp;
1487c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1488c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&strm_info, args->args_strm_getinfo.stream_info, status, 1);
1489c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	temp = strm_info.user_strm;
1490c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1491c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	strm_info.user_strm = &user;
1492c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1493c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1494c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = strm_get_info(args->args_strm_getinfo.hstream,
1495c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       &strm_info,
1496c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       args->args_strm_getinfo.
1497c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				       stream_info_size);
1498c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1499c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(temp, strm_info.user_strm, status, 1);
1500c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	strm_info.user_strm = temp;
1501c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_getinfo.stream_info, &strm_info, status, 1);
1502c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1503c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1504c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1505c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1506c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_idle ========
1507c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15080cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_idle(union trapped_args *args, void *pr_ctxt)
1509c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1510c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ret;
1511c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1512c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	ret = strm_idle(args->args_strm_idle.hstream,
1513c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			args->args_strm_idle.flush_flag);
1514c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1515c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return ret;
1516c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1517c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1518c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1519c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_issue ========
1520c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15210cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_issue(union trapped_args *args, void *pr_ctxt)
1522c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1523c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1524c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1525c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (!args->args_strm_issue.pbuffer)
1526c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EFAULT;
1527c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1528c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* No need of doing CP_FM_USR for the user buffer (pbuffer)
1529c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	   as this is done in Bridge internal function bridge_chnl_add_io_req
1530c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	   in chnl_sm.c */
1531c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = strm_issue(args->args_strm_issue.hstream,
1532c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			    args->args_strm_issue.pbuffer,
1533c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			    args->args_strm_issue.dw_bytes,
1534c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			    args->args_strm_issue.dw_buf_size,
1535c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			    args->args_strm_issue.dw_arg);
1536c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1537c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1538c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1539c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1540c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1541c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_open ========
1542c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15430cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_open(union trapped_args *args, void *pr_ctxt)
1544c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1545c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1546c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct strm_attr attr;
1547c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct strm_object *strm_obj;
1548c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_streamattrin strm_attr_in;
1549c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1550c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(&attr, args->args_strm_open.attr_in, status, 1);
1551c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1552c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (attr.stream_attr_in != NULL) {	/* Optional argument */
1553c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_FM_USR(&strm_attr_in, attr.stream_attr_in, status, 1);
1554c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		if (DSP_SUCCEEDED(status)) {
1555c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			attr.stream_attr_in = &strm_attr_in;
1556c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			if (attr.stream_attr_in->strm_mode == STRMMODE_LDMA)
1557c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				return -ENOSYS;
1558c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		}
1559c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1561c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = strm_open(args->args_strm_open.hnode,
1562c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   args->args_strm_open.direction,
1563c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   args->args_strm_open.index, &attr, &strm_obj,
1564c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			   pr_ctxt);
1565c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_open.ph_stream, &strm_obj, status, 1);
1566c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1567c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1568c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1569c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_reclaim ========
1571c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15720cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_reclaim(union trapped_args *args, void *pr_ctxt)
1573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1574c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1575c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u8 *buf_ptr;
1576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ul_bytes;
1577c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 dw_arg;
1578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 ul_buf_size;
1579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1580c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = strm_reclaim(args->args_strm_reclaim.hstream, &buf_ptr,
1581c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			      &ul_bytes, &ul_buf_size, &dw_arg);
1582c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_reclaim.buf_ptr, &buf_ptr, status, 1);
1583c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_reclaim.bytes, &ul_bytes, status, 1);
1584c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_reclaim.pdw_arg, &dw_arg, status, 1);
1585c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1586c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_strm_reclaim.buf_size_ptr != NULL) {
1587c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		CP_TO_USR(args->args_strm_reclaim.buf_size_ptr, &ul_buf_size,
1588c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna			  status, 1);
1589c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1590c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1591c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1592c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1593c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1594c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1595c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_register_notify ========
1596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
15970cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_register_notify(union trapped_args *args, void *pr_ctxt)
1598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1599c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct dsp_notification notification;
1601c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1602c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* Initialize the notification data structure */
1603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.ps_name = NULL;
1604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	notification.handle = NULL;
1605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1606c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = strm_register_notify(args->args_strm_registernotify.hstream,
1607c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_strm_registernotify.event_mask,
1608c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      args->args_strm_registernotify.
1609c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				      notify_type, &notification);
1610c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_registernotify.hnotification, &notification,
1611c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  status, 1);
1612c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1613c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1615c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1616c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1617c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_select ========
1618c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16190cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_select(union trapped_args *args, void *pr_ctxt)
1620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1621c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	u32 mask;
1622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct strm_object *strm_tab[MAX_STREAMS];
1623c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1624c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1625c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (args->args_strm_select.strm_num > MAX_STREAMS)
1626c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		return -EINVAL;
1627c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_FM_USR(strm_tab, args->args_strm_select.stream_tab, status,
1629c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  args->args_strm_select.strm_num);
1630c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	if (DSP_SUCCEEDED(status)) {
1631c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		status = strm_select(strm_tab, args->args_strm_select.strm_num,
1632c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna				     &mask, args->args_strm_select.utimeout);
1633c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	}
1634c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_strm_select.pmask, &mask, status, 1);
1635c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1636c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1637c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1638c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* CMM */
1639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1640c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1641c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_calloc_buf ========
1642c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16430cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_calloc_buf(union trapped_args * args, void *pr_ctxt)
1644c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1645c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* This operation is done in kernel */
1646c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
1647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -ENOSYS;
1648c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1650c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_free_buf ========
1652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16530cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_free_buf(union trapped_args * args, void *pr_ctxt)
1654c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1655c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	/* This operation is done in kernel */
1656c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	pr_err("%s: deprecated dspbridge ioctl\n", __func__);
1657c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return -ENOSYS;
1658c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1659c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1660c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1661c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_handle ========
1662c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16630cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_handle(union trapped_args *args, void *pr_ctxt)
1664c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1665c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1666c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct cmm_object *hcmm_mgr;
1667c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1668c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = cmm_get_handle(args->args_cmm_gethandle.hprocessor, &hcmm_mgr);
1669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1670c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_cmm_gethandle.ph_cmm_mgr, &hcmm_mgr, status, 1);
1671c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1672c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/*
1676c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_info ========
1677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */
16780cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_info(union trapped_args *args, void *pr_ctxt)
1679c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{
1680c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	int status = 0;
1681c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	struct cmm_info cmm_info_obj;
1682c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1683c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	status = cmm_get_info(args->args_cmm_getinfo.hcmm_mgr, &cmm_info_obj);
1684c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1685c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	CP_TO_USR(args->args_cmm_getinfo.cmm_info_obj, &cmm_info_obj, status,
1686c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna		  1);
1687c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna
1688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna	return status;
1689c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}
1690