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