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