dspapi.c revision 35f338e4f2fcd2614f6fdff33f38920cf9434f86
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{ 17351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (*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{ 19151d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (*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)) { 39451d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (dev_get_dev_node(hdev_obj, &dev_node)) 395c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna continue; 396c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 39751d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (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 428157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 429c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 430c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna mgr_enum_node_info(args->args_mgr_enumnode_info.node_id, 431c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna (struct dsp_ndbprops *)pndb_props, size, 432c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &num_nodes); 433c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 434c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_mgr_enumnode_info.pndb_props, pndb_props, status, 435c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna size); 436c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_mgr_enumnode_info.pu_num_nodes, &num_nodes, status, 437c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 438c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pndb_props); 439c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 440c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 441c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 442c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 443c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 444c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_enum_proc_info ======== 445c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 4460cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_enum_proc_info(union trapped_args *args, void *pr_ctxt) 447c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 448c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *processor_info; 449c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 num_procs; 450c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 451c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 size = args->args_mgr_enumproc_info.processor_info_size; 452c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 453c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (size < sizeof(struct dsp_processorinfo)) 454c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 455c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 456c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna processor_info = kmalloc(size, GFP_KERNEL); 457c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (processor_info == NULL) 458c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 459c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 460157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 461c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 462c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna mgr_enum_processor_info(args->args_mgr_enumproc_info. 463c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna processor_id, 464c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna (struct dsp_processorinfo *) 465c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna processor_info, size, &num_procs); 466c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 467c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_mgr_enumproc_info.processor_info, processor_info, 468c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, size); 469c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_mgr_enumproc_info.pu_num_procs, &num_procs, 470c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 471c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(processor_info); 472c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 473c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 474c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 475c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 476c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define WRAP_MAP2CALLER(x) x 477c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 478c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_register_object ======== 479c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 4800cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_register_object(union trapped_args *args, void *pr_ctxt) 481c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 482c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 483c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_uuid uuid_obj; 484c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 path_size = 0; 485c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna char *psz_path_name = NULL; 486c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 487c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 488c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1); 48951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) 490c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 491c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* path_size is increased by 1 to accommodate NULL */ 492c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna path_size = strlen_user((char *) 493c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_mgr_registerobject.psz_path_name) + 494c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1; 495c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna psz_path_name = kmalloc(path_size, GFP_KERNEL); 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); 52651d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (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{ 54235f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos int 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); 55735f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos if (status || !notifications[i].handle) { 55835f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos status = -EINVAL; 55935f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos break; 560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 56135f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos /* set the array of pointers to kernel structures */ 56235f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos anotifications[i] = ¬ifications[i]; 563c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 564157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 56535f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos status = mgr_wait_for_bridge_events(anotifications, count, 566c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &index, 567c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_mgr_wait. 568c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna utimeout); 569c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_mgr_wait.pu_index, &index, status, 1); 57135f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos return status; 572c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 574c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 575c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== MGRWRAP_GetProcessResourceInfo ======== 576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 5770cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated mgrwrap_get_process_resources_info(union trapped_args * args, 578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *pr_ctxt) 579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 580c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 581c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return 0; 582c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 583c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 584c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 585c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_attach ======== 586c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 5870cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_attach(union trapped_args *args, void *pr_ctxt) 588c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 589c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *processor; 590c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 591c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_processorattrin proc_attr_in, *attr_in = NULL; 592c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 593c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Optional argument */ 594c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_attach.attr_in) { 595c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&proc_attr_in, args->args_proc_attach.attr_in, status, 596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 597157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna attr_in = &proc_attr_in; 599c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna else 600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 601c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 602c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_attach(args->args_proc_attach.processor_id, attr_in, 604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &processor, pr_ctxt); 605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_attach.ph_processor, &processor, status, 1); 606c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end: 607c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 608c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 609c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 610c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 611c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_ctrl ======== 612c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 6130cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_ctrl(union trapped_args *args, void *pr_ctxt) 614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 615c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 cb_data_size, __user * psize = (u32 __user *) 616c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_ctrl.pargs; 617c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pargs = NULL; 618c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 619c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (psize) { 621c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (get_user(cb_data_size, psize)) { 622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EPERM; 623c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 624c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 625c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size += sizeof(u32); 626c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pargs = kmalloc(cb_data_size, GFP_KERNEL); 627c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pargs == NULL) { 628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 629c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 630c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 631c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 632c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(pargs, args->args_proc_ctrl.pargs, status, 633c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size); 634c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 635157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 636c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_ctrl(args->args_proc_ctrl.hprocessor, 637c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_ctrl.dw_cmd, 638c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna (struct dsp_cbdata *)pargs); 639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 640c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 641c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* CP_TO_USR(args->args_proc_ctrl.pargs, pargs, status, 1); */ 642c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pargs); 643c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end: 644c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 645c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 646c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 648c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_detach ======== 649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 6500cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated procwrap_detach(union trapped_args * args, void *pr_ctxt) 651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* proc_detach called at bridge_release only */ 653c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 654c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return 0; 655c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 656c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 657c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 658c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_node_info ======== 659c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 6600cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_node_info(union trapped_args *args, void *pr_ctxt) 661c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 662c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 663c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *node_tab[MAX_NODES]; 664c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 num_nodes; 665c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 alloc_cnt; 666c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 667c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!args->args_proc_enumnode_info.node_tab_size) 668c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 670c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_enum_nodes(args->args_proc_enumnode_info.hprocessor, 671c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna node_tab, 672c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_enumnode_info.node_tab_size, 673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &num_nodes, &alloc_cnt); 674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_enumnode_info.node_tab, node_tab, status, 675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna num_nodes); 676c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_enumnode_info.pu_num_nodes, &num_nodes, 677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 678c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_enumnode_info.pu_allocated, &alloc_cnt, 679c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 680c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 681c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 682c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 6830cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_end_dma(union trapped_args *args, void *pr_ctxt) 684c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 685c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 686c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 687c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_dma.dir >= DMA_NONE) 688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 689c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 690c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_end_dma(pr_ctxt, 691c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_dma.pmpu_addr, 692c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_dma.ul_size, 693c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_dma.dir); 694c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 695c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 696c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 6970cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_begin_dma(union trapped_args *args, void *pr_ctxt) 698c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 699c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 700c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 701c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_dma.dir >= DMA_NONE) 702c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 703c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 704c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_begin_dma(pr_ctxt, 705c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_dma.pmpu_addr, 706c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_dma.ul_size, 707c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_dma.dir); 708c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 709c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 710c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 711c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 712c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_flush_memory ======== 713c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 7140cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_flush_memory(union trapped_args *args, void *pr_ctxt) 715c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 716c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 717c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 718c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_flushmemory.ul_flags > 719c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna PROC_WRITEBACK_INVALIDATE_MEM) 720c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 721c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 722c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_flush_memory(pr_ctxt, 723c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_flushmemory.pmpu_addr, 724c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_flushmemory.ul_size, 725c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_flushmemory.ul_flags); 726c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 727c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 728c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 729c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 730c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_invalidate_memory ======== 731c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 7320cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_invalidate_memory(union trapped_args *args, void *pr_ctxt) 733c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 734c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 735c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 736c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 737c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna proc_invalidate_memory(pr_ctxt, 738c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_invalidatememory.pmpu_addr, 739c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_invalidatememory.ul_size); 740c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 741c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 742c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 743c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 744c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_resources ======== 745c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 7460cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_resources(union trapped_args *args, void *pr_ctxt) 747c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 748c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 749c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_resourceinfo resource_info; 750c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 751c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_enumresources.resource_info_size < 752c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna sizeof(struct dsp_resourceinfo)) 753c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 754c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 755c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 756c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna proc_get_resource_info(args->args_proc_enumresources.hprocessor, 757c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_enumresources.resource_type, 758c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &resource_info, 759c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_enumresources. 760c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna resource_info_size); 761c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 762c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_enumresources.resource_info, &resource_info, 763c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 764c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 765c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 766c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 767c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 768c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 769c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 770c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_state ======== 771c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 7720cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_state(union trapped_args *args, void *pr_ctxt) 773c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 774c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 775c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_processorstate proc_state; 776c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 777c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_getstate.state_info_size < 778c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna sizeof(struct dsp_processorstate)) 779c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 780c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 781c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 782c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna proc_get_state(args->args_proc_getstate.hprocessor, &proc_state, 783c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_getstate.state_info_size); 784c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_getstate.proc_state_obj, &proc_state, status, 785c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 786c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 787c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 788c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 789c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 790c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 791c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_trace ======== 792c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 7930cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_trace(union trapped_args *args, void *pr_ctxt) 794c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 795c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 796c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pbuf; 797c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 798c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_gettrace.max_size > MAX_TRACEBUFLEN) 799c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 800c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 801c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pbuf = kzalloc(args->args_proc_gettrace.max_size, GFP_KERNEL); 802c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pbuf != NULL) { 803c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_get_trace(args->args_proc_gettrace.hprocessor, 804c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pbuf, 805c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_gettrace.max_size); 806c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } else { 807c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 808c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 809c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_gettrace.pbuf, pbuf, status, 810c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_gettrace.max_size); 811c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pbuf); 812c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 813c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 814c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 815c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 816c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 817c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_load ======== 818c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 8190cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_load(union trapped_args *args, void *pr_ctxt) 820c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 821c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna s32 i, len; 822c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 823c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna char *temp; 824c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna s32 count = args->args_proc_load.argc_index; 825c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 **argv = NULL, **envp = NULL; 826c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 827c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (count <= 0 || count > MAX_LOADARGS) { 828c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EINVAL; 829c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 830c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 831c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 832c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna argv = kmalloc(count * sizeof(u8 *), GFP_KERNEL); 833c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!argv) { 834c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 835c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 836c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 837c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 838c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(argv, args->args_proc_load.user_args, status, count); 83951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 840c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(argv); 841c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna argv = NULL; 842c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 843c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 844c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 845c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna for (i = 0; i < count; i++) { 846c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (argv[i]) { 847c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* User space pointer to argument */ 848c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna temp = (char *)argv[i]; 849c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* len is increased by 1 to accommodate NULL */ 850c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna len = strlen_user((char *)temp) + 1; 851c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Kernel space pointer to argument */ 852c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna argv[i] = kmalloc(len, GFP_KERNEL); 853c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (argv[i]) { 854c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(argv[i], temp, status, len); 85551d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 856c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(argv[i]); 857c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna argv[i] = NULL; 858c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 859c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 860c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } else { 861c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 862c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 863c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 864c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 865c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 866c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* TODO: validate this */ 867c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_load.user_envp) { 868c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* number of elements in the envp array including NULL */ 869c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna count = 0; 870c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna do { 871c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna get_user(temp, args->args_proc_load.user_envp + count); 872c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna count++; 873c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } while (temp); 874c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna envp = kmalloc(count * sizeof(u8 *), GFP_KERNEL); 875c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!envp) { 876c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 877c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 878c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 879c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 880c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(envp, args->args_proc_load.user_envp, status, count); 88151d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 882c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(envp); 883c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna envp = NULL; 884c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 885c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 886c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna for (i = 0; envp[i]; i++) { 887c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* User space pointer to argument */ 888c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna temp = (char *)envp[i]; 889c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* len is increased by 1 to accommodate NULL */ 890c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna len = strlen_user((char *)temp) + 1; 891c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Kernel space pointer to argument */ 892c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna envp[i] = kmalloc(len, GFP_KERNEL); 893c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (envp[i]) { 894c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(envp[i], temp, status, len); 89551d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 896c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(envp[i]); 897c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna envp[i] = NULL; 898c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 899c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 900c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } else { 901c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 902c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 903c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 904c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 905c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 906c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 907157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 908c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_load(args->args_proc_load.hprocessor, 909c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_load.argc_index, 910cd4f13c02a5d72e1fc367c51cc0fd955f65538e0Menon, Nishanth (const char **)argv, (const char **)envp); 911c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 912c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont: 913c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (envp) { 914c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna i = 0; 915c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna while (envp[i]) 916c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(envp[i++]); 917c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 918c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(envp); 919c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 920c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 921c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (argv) { 922c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna count = args->args_proc_load.argc_index; 923c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna for (i = 0; (i < count) && argv[i]; i++) 924c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(argv[i]); 925c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 926c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(argv); 927c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 928c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 929c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 930c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 931c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 932c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 933c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_map ======== 934c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 9350cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_map(union trapped_args *args, void *pr_ctxt) 936c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 937c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 938c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *map_addr; 939c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 940c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!args->args_proc_mapmem.ul_size) 941c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 942c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 943c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_map(args->args_proc_mapmem.hprocessor, 944c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_mapmem.pmpu_addr, 945c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_mapmem.ul_size, 946c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_mapmem.req_addr, &map_addr, 947c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_mapmem.ul_map_attr, pr_ctxt); 948157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 949c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (put_user(map_addr, args->args_proc_mapmem.pp_map_addr)) { 950c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EINVAL; 951c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna proc_un_map(args->args_proc_mapmem.hprocessor, 952c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna map_addr, pr_ctxt); 953c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 954c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 955c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 956c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 957c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 958c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 959c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 960c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_register_notify ======== 961c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 9620cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_register_notify(union trapped_args *args, void *pr_ctxt) 963c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 964c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 965c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_notification notification; 966c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 967c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Initialize the notification data structure */ 968c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notification.ps_name = NULL; 969c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notification.handle = NULL; 970c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 971c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 972c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna proc_register_notify(args->args_proc_register_notify.hprocessor, 973c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_register_notify.event_mask, 974c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_register_notify.notify_type, 975c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ¬ification); 976c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_register_notify.hnotification, ¬ification, 977c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 978c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 979c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 980c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 981c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 982c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_reserve_memory ======== 983c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 9840cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_reserve_memory(union trapped_args *args, void *pr_ctxt) 985c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 986c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 987c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *prsv_addr; 988c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 989c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if ((args->args_proc_rsvmem.ul_size <= 0) || 990c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna (args->args_proc_rsvmem.ul_size & (PG_SIZE4K - 1)) != 0) 991c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 992c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 993c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_reserve_memory(args->args_proc_rsvmem.hprocessor, 994c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_rsvmem.ul_size, &prsv_addr, 995c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_ctxt); 996157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 997c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (put_user(prsv_addr, args->args_proc_rsvmem.pp_rsv_addr)) { 998c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EINVAL; 999c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna proc_un_reserve_memory(args->args_proc_rsvmem. 1000c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna hprocessor, prsv_addr, pr_ctxt); 1001c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1002c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1003c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1004c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1005c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1006c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1007c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_start ======== 1008c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 10090cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_start(union trapped_args *args, void *pr_ctxt) 1010c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1011c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 1012c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1013c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ret = proc_start(args->args_proc_start.hprocessor); 1014c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1015c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1016c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1017c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1018c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_map ======== 1019c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 10200cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_un_map(union trapped_args *args, void *pr_ctxt) 1021c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1022c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 1023c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1024c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_un_map(args->args_proc_unmapmem.hprocessor, 1025c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_unmapmem.map_addr, pr_ctxt); 1026c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1027c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1028c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1029c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1030c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_reserve_memory ======== 1031c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 10320cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_un_reserve_memory(union trapped_args *args, void *pr_ctxt) 1033c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1034c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 1035c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1036c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_un_reserve_memory(args->args_proc_unrsvmem.hprocessor, 1037c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_unrsvmem.prsv_addr, 1038c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_ctxt); 1039c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1040c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1041c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1042c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1043c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_stop ======== 1044c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 10450cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_stop(union trapped_args *args, void *pr_ctxt) 1046c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1047c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 1048c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1049c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ret = proc_stop(args->args_proc_stop.hprocessor); 1050c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1051c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1052c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1053c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1054c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1055c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_allocate ======== 1056c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 10570cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_allocate(union trapped_args *args, void *pr_ctxt) 1058c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1059c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1060c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_uuid node_uuid; 1061c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 cb_data_size = 0; 1062c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 __user *psize = (u32 __user *) args->args_node_allocate.pargs; 1063c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pargs = NULL; 1064c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_nodeattrin proc_attr_in, *attr_in = NULL; 1065c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct node_object *hnode; 1066c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1067c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Optional argument */ 1068c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (psize) { 1069c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (get_user(cb_data_size, psize)) 1070c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EPERM; 1071c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1072c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size += sizeof(u32); 1073157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1074c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pargs = kmalloc(cb_data_size, GFP_KERNEL); 1075c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pargs == NULL) 1076c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 1077c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1078c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1079c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(pargs, args->args_node_allocate.pargs, status, 1080c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size); 1081c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1082c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&node_uuid, args->args_node_allocate.node_id_ptr, status, 1); 108351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) 1084c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 1085c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Optional argument */ 1086c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_node_allocate.attr_in) { 1087c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&proc_attr_in, args->args_node_allocate.attr_in, 1088c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1089157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 1090c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna attr_in = &proc_attr_in; 1091c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna else 1092c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 1093c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1094c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1095157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1096c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = node_allocate(args->args_node_allocate.hprocessor, 1097c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &node_uuid, (struct dsp_cbdata *)pargs, 1098c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna attr_in, &hnode, pr_ctxt); 1099c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1100157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1101c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_node_allocate.ph_node, &hnode, status, 1); 110251d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 1103c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EFAULT; 1104c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna node_delete(hnode, pr_ctxt); 1105c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1106c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1107c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont: 1108c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pargs); 1109c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1110c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1111c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1112c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1113c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1114c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_alloc_msg_buf ======== 1115c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 11160cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_alloc_msg_buf(union trapped_args *args, void *pr_ctxt) 1117c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1118c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1119c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_bufferattr *pattr = NULL; 1120c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_bufferattr attr; 1121c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pbuffer = NULL; 1122c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1123c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!args->args_node_allocmsgbuf.usize) 1124c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 1125c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1126c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_node_allocmsgbuf.pattr) { /* Optional argument */ 1127c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&attr, args->args_node_allocmsgbuf.pattr, status, 1); 1128157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 1129c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattr = &attr; 1130c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1131c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1132e6bf74f06f5178fcccb66acf51d1f6ebc4e6c5d0Menon, Nishanth /* argument */ 1133c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&pbuffer, args->args_node_allocmsgbuf.pbuffer, status, 1); 1134157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1135c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = node_alloc_msg_buf(args->args_node_allocmsgbuf.hnode, 1136c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_allocmsgbuf.usize, 1137c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattr, &pbuffer); 1138c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1139c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_node_allocmsgbuf.pbuffer, &pbuffer, status, 1); 1140c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1141c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1142c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1143c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1144c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_change_priority ======== 1145c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 11460cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_change_priority(union trapped_args *args, void *pr_ctxt) 1147c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1148c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 1149c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1150c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ret = node_change_priority(args->args_node_changepriority.hnode, 1151c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_changepriority.prio); 1152c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1153c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1154c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1155c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1156c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1157c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_connect ======== 1158c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 11590cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_connect(union trapped_args *args, void *pr_ctxt) 1160c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1161c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1162c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_strmattr attrs; 1163c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_strmattr *pattrs = NULL; 1164c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 cb_data_size; 1165c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 __user *psize = (u32 __user *) args->args_node_connect.conn_param; 1166c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pargs = NULL; 1167c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1168c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Optional argument */ 1169c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (psize) { 1170c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (get_user(cb_data_size, psize)) 1171c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EPERM; 1172c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1173c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size += sizeof(u32); 1174157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1175c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pargs = kmalloc(cb_data_size, GFP_KERNEL); 1176c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pargs == NULL) { 1177c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 1178c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 1179c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1180c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1181c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1182c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(pargs, args->args_node_connect.conn_param, status, 1183c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size); 118451d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) 1185c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 1186c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1187c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_node_connect.pattrs) { /* Optional argument */ 1188c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&attrs, args->args_node_connect.pattrs, status, 1); 1189157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 1190c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattrs = &attrs; 1191c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1192c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1193157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1194c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = node_connect(args->args_node_connect.hnode, 1195c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_connect.stream_id, 1196c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_connect.other_node, 1197c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_connect.other_stream, 1198c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattrs, (struct dsp_cbdata *)pargs); 1199c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1200c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont: 1201c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pargs); 1202c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1203c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1204c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1205c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1206c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1207c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_create ======== 1208c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12090cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_create(union trapped_args *args, void *pr_ctxt) 1210c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1211c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 1212c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1213c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ret = node_create(args->args_node_create.hnode); 1214c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1215c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1216c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1217c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1218c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1219c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_delete ======== 1220c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12210cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_delete(union trapped_args *args, void *pr_ctxt) 1222c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1223c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 1224c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1225c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ret = node_delete(args->args_node_delete.hnode, pr_ctxt); 1226c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1227c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1228c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1229c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1230c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1231c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_free_msg_buf ======== 1232c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12330cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_free_msg_buf(union trapped_args *args, void *pr_ctxt) 1234c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1235c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1236c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_bufferattr *pattr = NULL; 1237c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_bufferattr attr; 1238c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_node_freemsgbuf.pattr) { /* Optional argument */ 1239c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&attr, args->args_node_freemsgbuf.pattr, status, 1); 1240157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 1241c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattr = &attr; 1242c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1243c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1244c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1245c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!args->args_node_freemsgbuf.pbuffer) 1246c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EFAULT; 1247c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1248157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1249c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = node_free_msg_buf(args->args_node_freemsgbuf.hnode, 1250c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_freemsgbuf.pbuffer, 1251c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattr); 1252c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1253c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1254c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1255c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1256c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1257c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1258c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_attr ======== 1259c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12600cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_attr(union trapped_args *args, void *pr_ctxt) 1261c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1262c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1263c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_nodeattr attr; 1264c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1265c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = node_get_attr(args->args_node_getattr.hnode, &attr, 1266c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_getattr.attr_size); 1267c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_node_getattr.pattr, &attr, status, 1); 1268c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1269c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1270c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1271c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1272c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1273c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_message ======== 1274c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12750cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_message(union trapped_args *args, void *pr_ctxt) 1276c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1277c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 1278c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_msg msg; 1279c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1280c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = node_get_message(args->args_node_getmessage.hnode, &msg, 1281c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_getmessage.utimeout); 1282c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1283c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_node_getmessage.message, &msg, status, 1); 1284c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1285c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1286c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1287c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1288c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1289c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_pause ======== 1290c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12910cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_pause(union trapped_args *args, void *pr_ctxt) 1292c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1293c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 1294c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1295c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ret = node_pause(args->args_node_pause.hnode); 1296c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1297c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1298c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1299c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1300c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1301c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_put_message ======== 1302c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 13030cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_put_message(union trapped_args *args, void *pr_ctxt) 1304c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1305c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1306c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_msg msg; 1307c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1308c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&msg, args->args_node_putmessage.message, status, 1); 1309c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1310157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1311c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 1312c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna node_put_message(args->args_node_putmessage.hnode, &msg, 1313c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_putmessage.utimeout); 1314c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1315c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1316c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1317c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1318c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1319c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1320c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_register_notify ======== 1321c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 13220cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_register_notify(union trapped_args *args, void *pr_ctxt) 1323c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1324c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1325c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_notification notification; 1326c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1327c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Initialize the notification data structure */ 1328c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notification.ps_name = NULL; 1329c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notification.handle = NULL; 1330c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1331c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!args->args_proc_register_notify.event_mask) 1332c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(¬ification, 1333c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_register_notify.hnotification, 1334c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1335c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1336c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = node_register_notify(args->args_node_registernotify.hnode, 1337c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_registernotify.event_mask, 1338c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_registernotify. 1339c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notify_type, ¬ification); 1340c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_node_registernotify.hnotification, ¬ification, 1341c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1342c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1343c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1344c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1345c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1346c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_run ======== 1347c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 13480cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_run(union trapped_args *args, void *pr_ctxt) 1349c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1350c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 1351c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1352c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ret = node_run(args->args_node_run.hnode); 1353c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1354c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1355c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1356c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1357c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1358c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_terminate ======== 1359c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 13600cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_terminate(union trapped_args *args, void *pr_ctxt) 1361c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1362c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 1363c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int tempstatus; 1364c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1365c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = node_terminate(args->args_node_terminate.hnode, &tempstatus); 1366c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1367c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_node_terminate.pstatus, &tempstatus, status, 1); 1368c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1369c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1370c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1371c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1372c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1373c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_uuid_props ======== 1374c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 13750cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_uuid_props(union trapped_args *args, void *pr_ctxt) 1376c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1377c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1378c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_uuid node_uuid; 1379c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_ndbprops *pnode_props = NULL; 1380c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1381c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&node_uuid, args->args_node_getuuidprops.node_id_ptr, status, 1382c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 138351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) 1384c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 1385c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pnode_props = kmalloc(sizeof(struct dsp_ndbprops), GFP_KERNEL); 1386c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pnode_props != NULL) { 1387c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 1388c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna node_get_uuid_props(args->args_node_getuuidprops.hprocessor, 1389c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &node_uuid, pnode_props); 1390c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_node_getuuidprops.node_props, pnode_props, 1391c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1392c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } else 1393c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 1394c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont: 1395c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pnode_props); 1396c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1397c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1398c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1399c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1400c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_allocate_buffer ======== 1401c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 14020cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_allocate_buffer(union trapped_args *args, void *pr_ctxt) 1403c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1404c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 1405c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 **ap_buffer = NULL; 1406c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 num_bufs = args->args_strm_allocatebuffer.num_bufs; 1407c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1408c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (num_bufs > MAX_BUFS) 1409c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 1410c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1411c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL); 1412dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy if (ap_buffer == NULL) 1413dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy return -ENOMEM; 1414c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1415c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = strm_allocate_buffer(args->args_strm_allocatebuffer.hstream, 1416c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_allocatebuffer.usize, 1417c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer, num_bufs, pr_ctxt); 1418157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1419c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_allocatebuffer.ap_buffer, ap_buffer, 1420c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, num_bufs); 142151d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 1422c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EFAULT; 1423c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna strm_free_buffer(args->args_strm_allocatebuffer.hstream, 1424c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer, num_bufs, pr_ctxt); 1425c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1426c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1427c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(ap_buffer); 1428c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1429c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1430c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1431c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1432c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1433c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_close ======== 1434c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 14350cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_close(union trapped_args *args, void *pr_ctxt) 1436c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1437c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return strm_close(args->args_strm_close.hstream, pr_ctxt); 1438c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1439c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1440c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1441c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_free_buffer ======== 1442c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 14430cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_free_buffer(union trapped_args *args, void *pr_ctxt) 1444c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1445c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1446c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 **ap_buffer = NULL; 1447c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 num_bufs = args->args_strm_freebuffer.num_bufs; 1448c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1449c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (num_bufs > MAX_BUFS) 1450c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 1451c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1452c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL); 1453dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy if (ap_buffer == NULL) 1454dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy return -ENOMEM; 1455c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1456c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(ap_buffer, args->args_strm_freebuffer.ap_buffer, status, 1457c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna num_bufs); 1458c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1459157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1460c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = strm_free_buffer(args->args_strm_freebuffer.hstream, 1461c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer, num_bufs, pr_ctxt); 1462c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1463c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_freebuffer.ap_buffer, ap_buffer, status, 1464c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna num_bufs); 1465c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(ap_buffer); 1466c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1467c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1468c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1469c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1470c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1471c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_event_handle ======== 1472c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 14730cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated strmwrap_get_event_handle(union trapped_args * args, 1474c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *pr_ctxt) 1475c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1476c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 1477c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -ENOSYS; 1478c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1479c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1480c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1481c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_info ======== 1482c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 14830cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_get_info(union trapped_args *args, void *pr_ctxt) 1484c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1485c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1486c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct stream_info strm_info; 1487c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_streaminfo user; 1488c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_streaminfo *temp; 1489c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1490c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&strm_info, args->args_strm_getinfo.stream_info, status, 1); 1491c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna temp = strm_info.user_strm; 1492c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1493c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna strm_info.user_strm = &user; 1494c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1495157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1496c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = strm_get_info(args->args_strm_getinfo.hstream, 1497c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &strm_info, 1498c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_getinfo. 1499c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna stream_info_size); 1500c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1501c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(temp, strm_info.user_strm, status, 1); 1502c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna strm_info.user_strm = temp; 1503c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_getinfo.stream_info, &strm_info, status, 1); 1504c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1505c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1506c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1507c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1508c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_idle ======== 1509c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 15100cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_idle(union trapped_args *args, void *pr_ctxt) 1511c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1512c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 1513c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1514c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ret = strm_idle(args->args_strm_idle.hstream, 1515c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_idle.flush_flag); 1516c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1517c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1518c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1519c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1520c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1521c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_issue ======== 1522c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 15230cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_issue(union trapped_args *args, void *pr_ctxt) 1524c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1525c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1526c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1527c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!args->args_strm_issue.pbuffer) 1528c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EFAULT; 1529c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1530c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* No need of doing CP_FM_USR for the user buffer (pbuffer) 1531c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna as this is done in Bridge internal function bridge_chnl_add_io_req 1532c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna in chnl_sm.c */ 1533c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = strm_issue(args->args_strm_issue.hstream, 1534c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_issue.pbuffer, 1535c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_issue.dw_bytes, 1536c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_issue.dw_buf_size, 1537c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_issue.dw_arg); 1538c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1539c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1540c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1541c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1542c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1543c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_open ======== 1544c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 15450cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_open(union trapped_args *args, void *pr_ctxt) 1546c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1547c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1548c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct strm_attr attr; 1549c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct strm_object *strm_obj; 1550c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_streamattrin strm_attr_in; 1551c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1552c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&attr, args->args_strm_open.attr_in, status, 1); 1553c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1554c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (attr.stream_attr_in != NULL) { /* Optional argument */ 1555c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&strm_attr_in, attr.stream_attr_in, status, 1); 1556157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1557c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna attr.stream_attr_in = &strm_attr_in; 1558c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (attr.stream_attr_in->strm_mode == STRMMODE_LDMA) 1559c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -ENOSYS; 1560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1561c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1562c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1563c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = strm_open(args->args_strm_open.hnode, 1564c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_open.direction, 1565c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_open.index, &attr, &strm_obj, 1566c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_ctxt); 1567c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_open.ph_stream, &strm_obj, status, 1); 1568c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1569c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1571c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1572c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_reclaim ======== 1573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 15740cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_reclaim(union trapped_args *args, void *pr_ctxt) 1575c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1577c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *buf_ptr; 1578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ul_bytes; 1579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 dw_arg; 1580c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ul_buf_size; 1581c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1582c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = strm_reclaim(args->args_strm_reclaim.hstream, &buf_ptr, 1583c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &ul_bytes, &ul_buf_size, &dw_arg); 1584c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_reclaim.buf_ptr, &buf_ptr, status, 1); 1585c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_reclaim.bytes, &ul_bytes, status, 1); 1586c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_reclaim.pdw_arg, &dw_arg, status, 1); 1587c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1588c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_strm_reclaim.buf_size_ptr != NULL) { 1589c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_reclaim.buf_size_ptr, &ul_buf_size, 1590c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1591c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1592c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1593c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1594c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1595c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1597c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_register_notify ======== 1598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 15990cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_register_notify(union trapped_args *args, void *pr_ctxt) 1600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1601c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1602c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_notification notification; 1603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Initialize the notification data structure */ 1605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notification.ps_name = NULL; 1606c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notification.handle = NULL; 1607c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1608c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = strm_register_notify(args->args_strm_registernotify.hstream, 1609c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_registernotify.event_mask, 1610c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_registernotify. 1611c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notify_type, ¬ification); 1612c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_registernotify.hnotification, ¬ification, 1613c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1615c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1616c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1617c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1618c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1619c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_select ======== 1620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 16210cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_select(union trapped_args *args, void *pr_ctxt) 1622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1623c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 mask; 1624c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct strm_object *strm_tab[MAX_STREAMS]; 1625c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1626c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1627c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_strm_select.strm_num > MAX_STREAMS) 1628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 1629c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1630c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(strm_tab, args->args_strm_select.stream_tab, status, 1631c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_select.strm_num); 1632157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1633c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = strm_select(strm_tab, args->args_strm_select.strm_num, 1634c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &mask, args->args_strm_select.utimeout); 1635c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1636c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_select.pmask, &mask, status, 1); 1637c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1638c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1640c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* CMM */ 1641c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1642c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1643c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_calloc_buf ======== 1644c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 16450cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_calloc_buf(union trapped_args * args, void *pr_ctxt) 1646c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* This operation is done in kernel */ 1648c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 1649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -ENOSYS; 1650c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1653c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_free_buf ======== 1654c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 16550cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_free_buf(union trapped_args * args, void *pr_ctxt) 1656c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1657c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* This operation is done in kernel */ 1658c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 1659c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -ENOSYS; 1660c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1661c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1662c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1663c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_handle ======== 1664c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 16650cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_handle(union trapped_args *args, void *pr_ctxt) 1666c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1667c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1668c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct cmm_object *hcmm_mgr; 1669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1670c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = cmm_get_handle(args->args_cmm_gethandle.hprocessor, &hcmm_mgr); 1671c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1672c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_cmm_gethandle.ph_cmm_mgr, &hcmm_mgr, status, 1); 1673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1676c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1678c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_info ======== 1679c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 16800cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_info(union trapped_args *args, void *pr_ctxt) 1681c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1682c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1683c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct cmm_info cmm_info_obj; 1684c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1685c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = cmm_get_info(args->args_cmm_getinfo.hcmm_mgr, &cmm_info_obj); 1686c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1687c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_cmm_getinfo.cmm_info_obj, &cmm_info_obj, status, 1688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 1689c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1690c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1691c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1692