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/* ----------------------------------- OS Adaptation Layer */ 28c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/ntfy.h> 29c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 30c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* ----------------------------------- Platform Manager */ 31c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/chnl.h> 32c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dev.h> 33c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/drv.h> 34c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 35c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/proc.h> 36c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/strm.h> 37c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 38c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* ----------------------------------- Resource Manager */ 39c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/disp.h> 40c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/mgr.h> 41c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/node.h> 42c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/rmm.h> 43c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 44c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* ----------------------------------- Others */ 45c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/msg.h> 46c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/cmm.h> 47c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/io.h> 48c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 49c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* ----------------------------------- This */ 50c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dspapi.h> 51c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/dbdcd.h> 52c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 53c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#include <dspbridge/resourcecleanup.h> 54c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 55c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* ----------------------------------- Defines, Data Structures, Typedefs */ 56c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_TRACEBUFLEN 255 57c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_LOADARGS 16 58c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_NODES 64 59c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_STREAMS 16 60c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define MAX_BUFS 64 61c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 62c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Used to get dspbridge ioctl table */ 63c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define DB_GET_IOC_TABLE(cmd) (DB_GET_MODULE(cmd) >> DB_MODULE_SHIFT) 64c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 65c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Device IOCtl function pointer */ 66c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastruct api_cmd { 670cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiens u32(*fxn) (union trapped_args *args, void *pr_ctxt); 685108de0ae06190f2ab54b9a1da315b77b33be1e2Rene Sapiens u32 index; 69c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}; 70c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 71c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* ----------------------------------- Globals */ 72c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic u32 api_c_refs; 73c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 74c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 75c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Function tables. 76c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * The order of these functions MUST be the same as the order of the command 77c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * numbers defined in dspapi-ioctl.h This is how an IOCTL number in user mode 78c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * turns into a function call in kernel mode. 79c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 80c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 81c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* MGR wrapper functions */ 82c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd mgr_cmd[] = { 83c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {mgrwrap_enum_node_info}, /* MGR_ENUMNODE_INFO */ 84c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {mgrwrap_enum_proc_info}, /* MGR_ENUMPROC_INFO */ 85c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {mgrwrap_register_object}, /* MGR_REGISTEROBJECT */ 86c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {mgrwrap_unregister_object}, /* MGR_UNREGISTEROBJECT */ 87c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {mgrwrap_wait_for_bridge_events}, /* MGR_WAIT */ 88c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {mgrwrap_get_process_resources_info}, /* MGR_GET_PROC_RES */ 89c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}; 90c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 91c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* PROC wrapper functions */ 92c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd proc_cmd[] = { 93c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_attach}, /* PROC_ATTACH */ 94c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_ctrl}, /* PROC_CTRL */ 95c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_detach}, /* PROC_DETACH */ 96c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_enum_node_info}, /* PROC_ENUMNODE */ 97c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_enum_resources}, /* PROC_ENUMRESOURCES */ 98c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_get_state}, /* PROC_GET_STATE */ 99c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_get_trace}, /* PROC_GET_TRACE */ 100c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_load}, /* PROC_LOAD */ 101c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_register_notify}, /* PROC_REGISTERNOTIFY */ 102c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_start}, /* PROC_START */ 103c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_reserve_memory}, /* PROC_RSVMEM */ 104c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_un_reserve_memory}, /* PROC_UNRSVMEM */ 105c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_map}, /* PROC_MAPMEM */ 106c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_un_map}, /* PROC_UNMAPMEM */ 107c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_flush_memory}, /* PROC_FLUSHMEMORY */ 108c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_stop}, /* PROC_STOP */ 109c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_invalidate_memory}, /* PROC_INVALIDATEMEMORY */ 110c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_begin_dma}, /* PROC_BEGINDMA */ 111c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {procwrap_end_dma}, /* PROC_ENDDMA */ 112c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}; 113c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 114c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* NODE wrapper functions */ 115c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd node_cmd[] = { 116c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_allocate}, /* NODE_ALLOCATE */ 117c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_alloc_msg_buf}, /* NODE_ALLOCMSGBUF */ 118c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_change_priority}, /* NODE_CHANGEPRIORITY */ 119c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_connect}, /* NODE_CONNECT */ 120c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_create}, /* NODE_CREATE */ 121c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_delete}, /* NODE_DELETE */ 122c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_free_msg_buf}, /* NODE_FREEMSGBUF */ 123c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_get_attr}, /* NODE_GETATTR */ 124c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_get_message}, /* NODE_GETMESSAGE */ 125c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_pause}, /* NODE_PAUSE */ 126c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_put_message}, /* NODE_PUTMESSAGE */ 127c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_register_notify}, /* NODE_REGISTERNOTIFY */ 128c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_run}, /* NODE_RUN */ 129c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_terminate}, /* NODE_TERMINATE */ 130c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {nodewrap_get_uuid_props}, /* NODE_GETUUIDPROPS */ 131c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}; 132c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 133c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* STRM wrapper functions */ 134c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd strm_cmd[] = { 135c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_allocate_buffer}, /* STRM_ALLOCATEBUFFER */ 136c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_close}, /* STRM_CLOSE */ 137c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_free_buffer}, /* STRM_FREEBUFFER */ 138c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_get_event_handle}, /* STRM_GETEVENTHANDLE */ 139c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_get_info}, /* STRM_GETINFO */ 140c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_idle}, /* STRM_IDLE */ 141c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_issue}, /* STRM_ISSUE */ 142c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_open}, /* STRM_OPEN */ 143c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_reclaim}, /* STRM_RECLAIM */ 144c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_register_notify}, /* STRM_REGISTERNOTIFY */ 145c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {strmwrap_select}, /* STRM_SELECT */ 146c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}; 147c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 148c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* CMM wrapper functions */ 149c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic struct api_cmd cmm_cmd[] = { 150c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {cmmwrap_calloc_buf}, /* CMM_ALLOCBUF */ 151c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {cmmwrap_free_buf}, /* CMM_FREEBUF */ 152c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {cmmwrap_get_handle}, /* CMM_GETHANDLE */ 153c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna {cmmwrap_get_info}, /* CMM_GETINFO */ 154c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}; 155c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 156c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* Array used to store ioctl table sizes. It can hold up to 8 entries */ 157c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic u8 size_cmd[] = { 158c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ARRAY_SIZE(mgr_cmd), 159c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ARRAY_SIZE(proc_cmd), 160c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ARRAY_SIZE(node_cmd), 161c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ARRAY_SIZE(strm_cmd), 162c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ARRAY_SIZE(cmm_cmd), 163c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna}; 164c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 165c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic inline void _cp_fm_usr(void *to, const void __user * from, 166c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int *err, unsigned long bytes) 167c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 16851d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (*err) 169c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return; 170c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 171c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (unlikely(!from)) { 172c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *err = -EFAULT; 173c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return; 174c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 175c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 176c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (unlikely(copy_from_user(to, from, bytes))) 177c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *err = -EFAULT; 178c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 179c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 180c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define CP_FM_USR(to, from, err, n) \ 181c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna _cp_fm_usr(to, from, &(err), (n) * sizeof(*(to))) 182c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 183c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunastatic inline void _cp_to_usr(void __user *to, const void *from, 184c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int *err, unsigned long bytes) 185c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 18651d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (*err) 187c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return; 188c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 189c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (unlikely(!to)) { 190c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *err = -EFAULT; 191c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return; 192c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 193c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 194c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (unlikely(copy_to_user(to, from, bytes))) 195c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *err = -EFAULT; 196c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 197c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 198c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define CP_TO_USR(to, from, err, n) \ 199c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna _cp_to_usr(to, from, &(err), (n) * sizeof(*(from))) 200c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 201c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 202c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== api_call_dev_ioctl ======== 203c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Purpose: 204c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Call the (wrapper) function for the corresponding API IOCTL. 205c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 2060cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensinline int api_call_dev_ioctl(u32 cmd, union trapped_args *args, 207c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 *result, void *pr_ctxt) 208c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 2090cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiens u32(*ioctl_cmd) (union trapped_args *args, void *pr_ctxt) = NULL; 210c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int i; 211c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 212c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (_IOC_TYPE(cmd) != DB) { 213c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: Incompatible dspbridge ioctl number\n", __func__); 214c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto err; 215c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 216c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 217c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (DB_GET_IOC_TABLE(cmd) > ARRAY_SIZE(size_cmd)) { 218c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: undefined ioctl module\n", __func__); 219c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto err; 220c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 221c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 222c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Check the size of the required cmd table */ 223c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna i = DB_GET_IOC(cmd); 224c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (i > size_cmd[DB_GET_IOC_TABLE(cmd)]) { 225c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: requested ioctl %d out of bounds for table %d\n", 226c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna __func__, i, DB_GET_IOC_TABLE(cmd)); 227c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto err; 228c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 229c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 230c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna switch (DB_GET_MODULE(cmd)) { 231c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna case DB_MGR: 232c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ioctl_cmd = mgr_cmd[i].fxn; 233c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna break; 234c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna case DB_PROC: 235c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ioctl_cmd = proc_cmd[i].fxn; 236c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna break; 237c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna case DB_NODE: 238c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ioctl_cmd = node_cmd[i].fxn; 239c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna break; 240c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna case DB_STRM: 241c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ioctl_cmd = strm_cmd[i].fxn; 242c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna break; 243c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna case DB_CMM: 244c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ioctl_cmd = cmm_cmd[i].fxn; 245c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna break; 246c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 247c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 248c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!ioctl_cmd) { 249c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: requested ioctl not defined\n", __func__); 250c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto err; 251c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } else { 252c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna *result = (*ioctl_cmd) (args, pr_ctxt); 253c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 254c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 255c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return 0; 256c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 257c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunaerr: 258c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 259c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 260c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 261c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 262c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== api_exit ======== 263c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 264c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunavoid api_exit(void) 265c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 266c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna api_c_refs--; 267c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 268a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVÃctor Manuel Jáquez Leal if (api_c_refs == 0) 269c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna mgr_exit(); 270c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 271c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 272c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 273c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== api_init ======== 274c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Purpose: 275c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Module initialization used by Bridge API. 276c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 277c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunabool api_init(void) 278c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 279c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna bool ret = true; 280a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVÃctor Manuel Jáquez Leal 281a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVÃctor Manuel Jáquez Leal if (api_c_refs == 0) 282a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVÃctor Manuel Jáquez Leal ret = mgr_init(); 283a05c5dc3fc73c11fbb06c493b1ae6d77c4ac172eVÃctor Manuel Jáquez Leal 284c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (ret) 285c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna api_c_refs++; 286c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 287c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 288c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 289c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 290c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 291c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== api_init_complete2 ======== 292c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Purpose: 293c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Perform any required bridge initialization which cannot 294c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * be performed in api_init() or dev_start_device() due 295c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * to the fact that some services are not yet 296c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * completely initialized. 297c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Parameters: 298c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Returns: 299c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * 0: Allow this device to load 300c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * -EPERM: Failure. 301c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Requires: 302c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Bridge API initialized. 303c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * Ensures: 304c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 305c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunaint api_init_complete2(void) 306c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 307c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 308c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct cfg_devnode *dev_node; 309c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dev_object *hdev_obj; 3104a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos struct drv_data *drv_datap; 311c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 dev_type; 312c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 313c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Walk the list of DevObjects, get each devnode, and attempting to 314c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * autostart the board. Note that this requires COF loading, which 315c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * requires KFILE. */ 316c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna for (hdev_obj = dev_get_first(); hdev_obj != NULL; 317c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna hdev_obj = dev_get_next(hdev_obj)) { 31851d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (dev_get_dev_node(hdev_obj, &dev_node)) 319c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna continue; 320c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 32151d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (dev_get_dev_type(hdev_obj, &dev_type)) 322c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna continue; 323c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 3244a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos if ((dev_type == DSP_UNIT) || (dev_type == IVA_UNIT)) { 3254a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos drv_datap = dev_get_drvdata(bridge); 3264a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos 3274a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos if (drv_datap && drv_datap->base_img) 328c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna proc_auto_start(dev_node, hdev_obj); 3294a6595625c1688077047e508370cf5146d59f359Ivan Gomez Castellanos } 330c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 331c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 332c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 333c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 334c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 335c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* TODO: Remove deprecated and not implemented ioctl wrappers */ 336c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 337c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 338c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_enum_node_info ======== 339c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 3400cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_enum_node_info(union trapped_args *args, void *pr_ctxt) 341c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 342c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pndb_props; 343c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 num_nodes; 344c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 345121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens u32 size = args->args_mgr_enumnode_info.ndb_props_size; 346c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 347c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (size < sizeof(struct dsp_ndbprops)) 348c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 349c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 350c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pndb_props = kmalloc(size, GFP_KERNEL); 351c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pndb_props == NULL) 352c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 353c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 354157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 355c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 356c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna mgr_enum_node_info(args->args_mgr_enumnode_info.node_id, 357c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna (struct dsp_ndbprops *)pndb_props, size, 358c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &num_nodes); 359c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 360121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_TO_USR(args->args_mgr_enumnode_info.ndb_props, pndb_props, status, 361c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna size); 362121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_TO_USR(args->args_mgr_enumnode_info.num_nodes, &num_nodes, status, 363c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 364c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pndb_props); 365c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 366c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 367c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 368c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 369c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 370c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_enum_proc_info ======== 371c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 3720cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_enum_proc_info(union trapped_args *args, void *pr_ctxt) 373c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 374c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *processor_info; 375c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 num_procs; 376c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 377c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 size = args->args_mgr_enumproc_info.processor_info_size; 378c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 379c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (size < sizeof(struct dsp_processorinfo)) 380c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 381c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 382c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna processor_info = kmalloc(size, GFP_KERNEL); 383c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (processor_info == NULL) 384c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 385c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 386157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 387c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 388c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna mgr_enum_processor_info(args->args_mgr_enumproc_info. 389c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna processor_id, 390c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna (struct dsp_processorinfo *) 391c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna processor_info, size, &num_procs); 392c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 393c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_mgr_enumproc_info.processor_info, processor_info, 394c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, size); 395121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_TO_USR(args->args_mgr_enumproc_info.num_procs, &num_procs, 396c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 397c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(processor_info); 398c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 399c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 400c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 401c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 402c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna#define WRAP_MAP2CALLER(x) x 403c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 404c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_register_object ======== 405c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 4060cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_register_object(union trapped_args *args, void *pr_ctxt) 407c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 408c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 409c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_uuid uuid_obj; 410c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 path_size = 0; 411c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna char *psz_path_name = NULL; 412c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 413c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 414c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1); 41551d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) 416c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 417c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* path_size is increased by 1 to accommodate NULL */ 418c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna path_size = strlen_user((char *) 419121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_mgr_registerobject.sz_path_name) + 420c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1; 421c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna psz_path_name = kmalloc(path_size, GFP_KERNEL); 422cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall if (!psz_path_name) { 423cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall status = -ENOMEM; 424c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 425cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall } 426c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ret = strncpy_from_user(psz_path_name, 427c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna (char *)args->args_mgr_registerobject. 428121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens sz_path_name, path_size); 429c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!ret) { 430c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EFAULT; 431c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 432c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 433c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 434cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall if (args->args_mgr_registerobject.obj_type >= DSP_DCDMAXOBJTYPE) { 435cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall status = -EINVAL; 436cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall goto func_end; 437cc58cbb88569e3ecb9786b3da891e7d019d2cfffJulia Lawall } 438c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 439c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = dcd_register_object(&uuid_obj, 440c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_mgr_registerobject.obj_type, 441c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna (char *)psz_path_name); 442c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end: 443c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(psz_path_name); 444c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 445c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 446c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 447c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 448c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_unregister_object ======== 449c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 4500cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_unregister_object(union trapped_args *args, void *pr_ctxt) 451c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 452c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 453c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_uuid uuid_obj; 454c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 455c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&uuid_obj, args->args_mgr_registerobject.uuid_obj, status, 1); 45651d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) 457c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 458c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 459c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = dcd_unregister_object(&uuid_obj, 460c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_mgr_unregisterobject. 461c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna obj_type); 462c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end: 463c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 464c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 465c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 466c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 467c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 468c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== mgrwrap_wait_for_bridge_events ======== 469c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 4700cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 mgrwrap_wait_for_bridge_events(union trapped_args *args, void *pr_ctxt) 471c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 47235f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos int status = 0; 473c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_notification *anotifications[MAX_EVENTS]; 474c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_notification notifications[MAX_EVENTS]; 475c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 index, i; 476c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 count = args->args_mgr_wait.count; 477c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 478c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (count > MAX_EVENTS) 479c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EINVAL; 480c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 481c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* get the array of pointers to user structures */ 482c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(anotifications, args->args_mgr_wait.anotifications, 483c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, count); 484c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* get the events */ 485c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna for (i = 0; i < count; i++) { 486c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(¬ifications[i], anotifications[i], status, 1); 48735f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos if (status || !notifications[i].handle) { 48835f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos status = -EINVAL; 48935f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos break; 490c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 49135f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos /* set the array of pointers to kernel structures */ 49235f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos anotifications[i] = ¬ifications[i]; 493c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 494157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 49535f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos status = mgr_wait_for_bridge_events(anotifications, count, 496c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &index, 497c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_mgr_wait. 498a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens timeout); 499c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 500121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_TO_USR(args->args_mgr_wait.index, &index, status, 1); 50135f338e4f2fcd2614f6fdff33f38920cf9434f86Ernesto Ramos return status; 502c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 503c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 504c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 505c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== MGRWRAP_GetProcessResourceInfo ======== 506c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 5070cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated mgrwrap_get_process_resources_info(union trapped_args * args, 508c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *pr_ctxt) 509c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 510c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 511c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return 0; 512c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 513c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 514c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 515c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_attach ======== 516c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 5170cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_attach(union trapped_args *args, void *pr_ctxt) 518c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 519c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *processor; 520c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 521c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_processorattrin proc_attr_in, *attr_in = NULL; 522c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 523c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Optional argument */ 524c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_attach.attr_in) { 525c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&proc_attr_in, args->args_proc_attach.attr_in, status, 526c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 527157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 528c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna attr_in = &proc_attr_in; 529c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna else 530c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 531c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 532c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 533c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_attach(args->args_proc_attach.processor_id, attr_in, 534c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &processor, pr_ctxt); 535c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_attach.ph_processor, &processor, status, 1); 536c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end: 537c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 538c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 539c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 540c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 541c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_ctrl ======== 542c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 5430cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_ctrl(union trapped_args *args, void *pr_ctxt) 544c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 545c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 cb_data_size, __user * psize = (u32 __user *) 546121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_proc_ctrl.args; 547c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pargs = NULL; 548c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 549a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 550c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 551c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (psize) { 552c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (get_user(cb_data_size, psize)) { 553c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EPERM; 554c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 555c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 556c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size += sizeof(u32); 557c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pargs = kmalloc(cb_data_size, GFP_KERNEL); 558c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pargs == NULL) { 559c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_end; 561c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 562c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 563121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_FM_USR(pargs, args->args_proc_ctrl.args, status, 564c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size); 565c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 566157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 5676bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos status = proc_ctrl(hprocessor, 568b4da7fc381c51d42c231f97de912b89dbabe8928Rene Sapiens args->args_proc_ctrl.cmd, 569c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna (struct dsp_cbdata *)pargs); 570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 571c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 572121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens /* CP_TO_USR(args->args_proc_ctrl.args, pargs, status, 1); */ 573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pargs); 574c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_end: 575c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 577c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_detach ======== 580c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 5810cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated procwrap_detach(union trapped_args * args, void *pr_ctxt) 582c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 583c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* proc_detach called at bridge_release only */ 584c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 585c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return 0; 586c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 587c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 588c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 589c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_node_info ======== 590c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 5910cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_node_info(union trapped_args *args, void *pr_ctxt) 592c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 593c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 594c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *node_tab[MAX_NODES]; 595c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 num_nodes; 596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 alloc_cnt; 597a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 599c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!args->args_proc_enumnode_info.node_tab_size) 600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 601c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 6026bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos status = proc_enum_nodes(hprocessor, 603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna node_tab, 604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_enumnode_info.node_tab_size, 605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &num_nodes, &alloc_cnt); 606c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_enumnode_info.node_tab, node_tab, status, 607c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna num_nodes); 608121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_TO_USR(args->args_proc_enumnode_info.num_nodes, &num_nodes, 609c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 610121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_TO_USR(args->args_proc_enumnode_info.allocated, &alloc_cnt, 611c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 612c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 613c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 6150cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_end_dma(union trapped_args *args, void *pr_ctxt) 616c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 617c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 618c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 619c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_dma.dir >= DMA_NONE) 620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 621c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_end_dma(pr_ctxt, 623121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_proc_dma.mpu_addr, 624085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens args->args_proc_dma.size, 625c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_dma.dir); 626c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 627c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 6290cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_begin_dma(union trapped_args *args, void *pr_ctxt) 630c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 631c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 632c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 633c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_dma.dir >= DMA_NONE) 634c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 635c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 636c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_begin_dma(pr_ctxt, 637121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_proc_dma.mpu_addr, 638085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens args->args_proc_dma.size, 639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_dma.dir); 640c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 641c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 642c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 643c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 644c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_flush_memory ======== 645c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 6460cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_flush_memory(union trapped_args *args, void *pr_ctxt) 647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 648c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 650fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens if (args->args_proc_flushmemory.flags > 651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna PROC_WRITEBACK_INVALIDATE_MEM) 652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 653c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 654c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = proc_flush_memory(pr_ctxt, 655121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_proc_flushmemory.mpu_addr, 656085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens args->args_proc_flushmemory.size, 657fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens args->args_proc_flushmemory.flags); 658c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 659c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 660c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 661c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 662c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_invalidate_memory ======== 663c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 6640cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_invalidate_memory(union trapped_args *args, void *pr_ctxt) 665c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 666c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 667c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 668c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna proc_invalidate_memory(pr_ctxt, 670121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_proc_invalidatememory.mpu_addr, 671085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens args->args_proc_invalidatememory.size); 672c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 676c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_enum_resources ======== 677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 6780cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_enum_resources(union trapped_args *args, void *pr_ctxt) 679c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 680c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 681c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_resourceinfo resource_info; 682a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 683c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 684c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_enumresources.resource_info_size < 685c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna sizeof(struct dsp_resourceinfo)) 686c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 687c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 6896bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos proc_get_resource_info(hprocessor, 690c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_enumresources.resource_type, 691c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &resource_info, 692c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_enumresources. 693c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna resource_info_size); 694c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 695c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_enumresources.resource_info, &resource_info, 696c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 697c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 698c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 699c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 700c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 701c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 702c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 703c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_state ======== 704c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 7050cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_state(union trapped_args *args, void *pr_ctxt) 706c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 707c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 708c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_processorstate proc_state; 709a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 710c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 711c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_getstate.state_info_size < 712c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna sizeof(struct dsp_processorstate)) 713c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 714c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 7156bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos status = proc_get_state(hprocessor, &proc_state, 716c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_getstate.state_info_size); 717c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_proc_getstate.proc_state_obj, &proc_state, status, 718c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 719c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 720c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 721c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 722c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 723c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 724c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_get_trace ======== 725c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 7260cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_get_trace(union trapped_args *args, void *pr_ctxt) 727c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 728c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 729c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pbuf; 730a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 731c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 732c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_gettrace.max_size > MAX_TRACEBUFLEN) 733c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 734c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 735c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pbuf = kzalloc(args->args_proc_gettrace.max_size, GFP_KERNEL); 736c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pbuf != NULL) { 7376bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos status = proc_get_trace(hprocessor, pbuf, 738c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_gettrace.max_size); 739c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } else { 740c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 741c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 742ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens CP_TO_USR(args->args_proc_gettrace.buf, pbuf, status, 743c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_gettrace.max_size); 744c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pbuf); 745c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 746c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 747c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 748c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 749c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 750c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_load ======== 751c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 7520cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_load(union trapped_args *args, void *pr_ctxt) 753c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 754c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna s32 i, len; 755c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 756c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna char *temp; 757c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna s32 count = args->args_proc_load.argc_index; 758c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 **argv = NULL, **envp = NULL; 759a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 760c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 761c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (count <= 0 || count > MAX_LOADARGS) { 762c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EINVAL; 763c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 764c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 765c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 766c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna argv = kmalloc(count * sizeof(u8 *), GFP_KERNEL); 767c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!argv) { 768c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 769c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 770c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 771c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 772c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(argv, args->args_proc_load.user_args, status, count); 77351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 774c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(argv); 775c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna argv = NULL; 776c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 777c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 778c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 779c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna for (i = 0; i < count; i++) { 780c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (argv[i]) { 781c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* User space pointer to argument */ 782c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna temp = (char *)argv[i]; 783c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* len is increased by 1 to accommodate NULL */ 784c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna len = strlen_user((char *)temp) + 1; 785c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Kernel space pointer to argument */ 786c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna argv[i] = kmalloc(len, GFP_KERNEL); 787c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (argv[i]) { 788c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(argv[i], temp, status, len); 78951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 790c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(argv[i]); 791c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna argv[i] = NULL; 792c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 793c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 794c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } else { 795c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 796c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 797c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 798c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 799c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 800c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* TODO: validate this */ 801c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_proc_load.user_envp) { 802c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* number of elements in the envp array including NULL */ 803c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna count = 0; 804c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna do { 805b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov if (get_user(temp, 806b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov args->args_proc_load.user_envp + count)) { 807b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov status = -EFAULT; 808b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov goto func_cont; 809b04462a143afde542ad9e5a1df4fcfbff6d30249Vasiliy Kulikov } 810c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna count++; 811c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } while (temp); 812c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna envp = kmalloc(count * sizeof(u8 *), GFP_KERNEL); 813c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!envp) { 814c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 815c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 816c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 817c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 818c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(envp, args->args_proc_load.user_envp, status, count); 81951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 820c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(envp); 821c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna envp = NULL; 822c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 823c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 824c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna for (i = 0; envp[i]; i++) { 825c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* User space pointer to argument */ 826c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna temp = (char *)envp[i]; 827c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* len is increased by 1 to accommodate NULL */ 828c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna len = strlen_user((char *)temp) + 1; 829c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Kernel space pointer to argument */ 830c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna envp[i] = kmalloc(len, GFP_KERNEL); 831c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (envp[i]) { 832c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(envp[i], temp, status, len); 83351d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 834c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(envp[i]); 835c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna envp[i] = NULL; 836c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 837c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 838c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } else { 839c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 840c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 841c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 842c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 843c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 844c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 845157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 8466bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos status = proc_load(hprocessor, 847c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_load.argc_index, 848cd4f13c02a5d72e1fc367c51cc0fd955f65538e0Menon, Nishanth (const char **)argv, (const char **)envp); 849c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 850c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont: 851c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (envp) { 852c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna i = 0; 853c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna while (envp[i]) 854c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(envp[i++]); 855c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 856c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(envp); 857c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 858c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 859c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (argv) { 860c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna count = args->args_proc_load.argc_index; 861c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna for (i = 0; (i < count) && argv[i]; i++) 862c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(argv[i]); 863c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 864c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(argv); 865c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 866c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 867c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 868c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 869c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 870c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 871c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_map ======== 872c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 8730cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_map(union trapped_args *args, void *pr_ctxt) 874c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 875c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 876c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *map_addr; 877a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 878c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 879085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens if (!args->args_proc_mapmem.size) 880c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 881c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 882a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens status = proc_map(args->args_proc_mapmem.processor, 883121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_proc_mapmem.mpu_addr, 884085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens args->args_proc_mapmem.size, 885c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_mapmem.req_addr, &map_addr, 886121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_proc_mapmem.map_attr, pr_ctxt); 887157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 888121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens if (put_user(map_addr, args->args_proc_mapmem.map_addr)) { 889c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EINVAL; 8906bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos proc_un_map(hprocessor, map_addr, pr_ctxt); 891c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 892c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 893c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 894c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 895c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 896c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 897c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 898c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_register_notify ======== 899c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 9000cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_register_notify(union trapped_args *args, void *pr_ctxt) 901c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 902c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 903c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_notification notification; 904a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 905c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 906c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Initialize the notification data structure */ 907ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens notification.name = NULL; 908c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notification.handle = NULL; 909c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 9106bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos status = proc_register_notify(hprocessor, 911c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_register_notify.event_mask, 912c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_register_notify.notify_type, 913c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ¬ification); 914121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_TO_USR(args->args_proc_register_notify.notification, ¬ification, 915c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 916c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 917c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 918c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 919c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 920c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_reserve_memory ======== 921c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 9222fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contrerasu32 procwrap_reserve_memory(union trapped_args *args, void *pr_ctxt) 923c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 9242fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras int status; 9252fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras void *prsv_addr; 926a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 9272fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras 928085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens if ((args->args_proc_rsvmem.size <= 0) || 929085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens (args->args_proc_rsvmem.size & (PG_SIZE4K - 1)) != 0) 9302fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras return -EINVAL; 9312fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras 9322fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras status = proc_reserve_memory(hprocessor, 933085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens args->args_proc_rsvmem.size, &prsv_addr, 9342fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras pr_ctxt); 9352fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras if (!status) { 936121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens if (put_user(prsv_addr, args->args_proc_rsvmem.rsv_addr)) { 9372fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras status = -EINVAL; 9382fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras proc_un_reserve_memory(args->args_proc_rsvmem. 939a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens processor, prsv_addr, pr_ctxt); 9402fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras } 9412fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras } 9422fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras return status; 943c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 944c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 945c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 946c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_start ======== 947c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 9480cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_start(union trapped_args *args, void *pr_ctxt) 949c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 950c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 951c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 952a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens ret = proc_start(((struct process_context *)pr_ctxt)->processor); 953c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 954c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 955c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 956c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 957c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_map ======== 958c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 9590cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_un_map(union trapped_args *args, void *pr_ctxt) 960c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 961c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 962c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 963a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens status = proc_un_map(((struct process_context *)pr_ctxt)->processor, 964c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_proc_unmapmem.map_addr, pr_ctxt); 965c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 966c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 967c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 968c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 969c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_un_reserve_memory ======== 970c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 9712fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contrerasu32 procwrap_un_reserve_memory(union trapped_args *args, void *pr_ctxt) 972c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 9732fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras int status; 974a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 9752fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras 9762fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras status = proc_un_reserve_memory(hprocessor, 977121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_proc_unrsvmem.rsv_addr, 9782fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras pr_ctxt); 9792fa28a5182869968a388d34f8d809aa07a0d4046Felipe Contreras return status; 980c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 981c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 982c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 983c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== procwrap_stop ======== 984c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 9850cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 procwrap_stop(union trapped_args *args, void *pr_ctxt) 986c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 987c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 988c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 989a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens ret = proc_stop(((struct process_context *)pr_ctxt)->processor); 990c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 991c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 992c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 993c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 994c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 9950624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos * ======== find_handle ========= 9960624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos */ 9970624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramosinline void find_node_handle(struct node_res_object **noderes, 9980624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos void *pr_ctxt, void *hnode) 9990624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos{ 10000624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos rcu_read_lock(); 10010624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos *noderes = idr_find(((struct process_context *)pr_ctxt)->node_id, 10028df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos (int)hnode - 1); 10030624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos rcu_read_unlock(); 10040624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return; 10050624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos} 10060624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 10070624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 10080624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos/* 1009c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_allocate ======== 1010c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 10110cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_allocate(union trapped_args *args, void *pr_ctxt) 1012c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1013c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1014c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_uuid node_uuid; 1015c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 cb_data_size = 0; 1016121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens u32 __user *psize = (u32 __user *) args->args_node_allocate.args; 1017c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pargs = NULL; 1018c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_nodeattrin proc_attr_in, *attr_in = NULL; 10190624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 10208df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos int nodeid; 1021a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 1022c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1023c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Optional argument */ 1024c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (psize) { 1025c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (get_user(cb_data_size, psize)) 1026c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EPERM; 1027c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1028c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size += sizeof(u32); 1029157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1030c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pargs = kmalloc(cb_data_size, GFP_KERNEL); 1031c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pargs == NULL) 1032c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 1033c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1034c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1035121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_FM_USR(pargs, args->args_node_allocate.args, status, 1036c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size); 1037c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1038c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&node_uuid, args->args_node_allocate.node_id_ptr, status, 1); 103951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) 1040c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 1041c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Optional argument */ 1042c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_node_allocate.attr_in) { 1043c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&proc_attr_in, args->args_node_allocate.attr_in, 1044c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1045157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 1046c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna attr_in = &proc_attr_in; 1047c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna else 1048c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 1049c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1050c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1051157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 10526bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos status = node_allocate(hprocessor, 1053c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &node_uuid, (struct dsp_cbdata *)pargs, 10540624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos attr_in, &node_res, pr_ctxt); 1055c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1056157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 10578df327c3904d34527b89d4881bd3ce2966f0e07fErnesto Ramos nodeid = node_res->id + 1; 1058fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_TO_USR(args->args_node_allocate.node, &nodeid, 10590624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos status, 1); 106051d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 1061c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EFAULT; 10620624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos node_delete(node_res, pr_ctxt); 1063c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1064c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1065c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont: 1066c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pargs); 1067c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1068c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1069c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1070c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1071c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1072c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_alloc_msg_buf ======== 1073c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 10740cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_alloc_msg_buf(union trapped_args *args, void *pr_ctxt) 1075c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1076c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1077c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_bufferattr *pattr = NULL; 1078c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_bufferattr attr; 1079c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pbuffer = NULL; 10800624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 10810624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 10820624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos find_node_handle(&node_res, pr_ctxt, 1083ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_node_allocmsgbuf.node); 10840624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 10850624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 10860624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 1087c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1088fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens if (!args->args_node_allocmsgbuf.size) 1089c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 1090c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1091fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens if (args->args_node_allocmsgbuf.attr) { /* Optional argument */ 1092fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_FM_USR(&attr, args->args_node_allocmsgbuf.attr, status, 1); 1093157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 1094c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattr = &attr; 1095c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1096c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1097e6bf74f06f5178fcccb66acf51d1f6ebc4e6c5d0Menon, Nishanth /* argument */ 1098ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens CP_FM_USR(&pbuffer, args->args_node_allocmsgbuf.buffer, status, 1); 1099157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1100ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = node_alloc_msg_buf(node_res->node, 1101fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens args->args_node_allocmsgbuf.size, 1102c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattr, &pbuffer); 1103c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1104ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens CP_TO_USR(args->args_node_allocmsgbuf.buffer, &pbuffer, status, 1); 1105c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1106c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1107c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1108c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1109c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_change_priority ======== 1110c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 11110cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_change_priority(union trapped_args *args, void *pr_ctxt) 1112c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1113c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 11140624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 1115c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 11160624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos find_node_handle(&node_res, pr_ctxt, 1117ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_node_changepriority.node); 11180624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 11190624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 11200624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 11210624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1122ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens ret = node_change_priority(node_res->node, 1123c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_changepriority.prio); 1124c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1125c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1126c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1127c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1128c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1129c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_connect ======== 1130c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 11310cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_connect(union trapped_args *args, void *pr_ctxt) 1132c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1133c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1134c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_strmattr attrs; 1135c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_strmattr *pattrs = NULL; 1136c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 cb_data_size; 1137c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 __user *psize = (u32 __user *) args->args_node_connect.conn_param; 1138c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *pargs = NULL; 11390624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res1, *node_res2; 11400624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_object *node1 = NULL, *node2 = NULL; 11410624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1142ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens if ((int)args->args_node_connect.node != DSP_HGPPNODE) { 11430624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos find_node_handle(&node_res1, pr_ctxt, 1144ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_node_connect.node); 11450624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (node_res1) 1146ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens node1 = node_res1->node; 11470624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos } else { 1148ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens node1 = args->args_node_connect.node; 11490624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos } 11500624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 11510624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if ((int)args->args_node_connect.other_node != DSP_HGPPNODE) { 11520624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos find_node_handle(&node_res2, pr_ctxt, 11530624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos args->args_node_connect.other_node); 11540624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (node_res2) 1155ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens node2 = node_res2->node; 11560624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos } else { 11570624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos node2 = args->args_node_connect.other_node; 11580624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos } 11590624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 11600624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node1 || !node2) 11610624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 1162c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1163c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Optional argument */ 1164c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (psize) { 1165c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (get_user(cb_data_size, psize)) 1166c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EPERM; 1167c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1168c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size += sizeof(u32); 1169157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1170c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pargs = kmalloc(cb_data_size, GFP_KERNEL); 1171c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pargs == NULL) { 1172c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 1173c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 1174c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1175c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1176c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1177c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(pargs, args->args_node_connect.conn_param, status, 1178c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna cb_data_size); 117951d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) 1180c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 1181c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1182fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens if (args->args_node_connect.attrs) { /* Optional argument */ 1183fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_FM_USR(&attrs, args->args_node_connect.attrs, status, 1); 1184157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 1185c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattrs = &attrs; 1186c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1187c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1188157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 11890624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos status = node_connect(node1, 1190c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_connect.stream_id, 11910624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos node2, 1192c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_connect.other_stream, 1193c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattrs, (struct dsp_cbdata *)pargs); 1194c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1195c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont: 1196c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pargs); 1197c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1198c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1199c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1200c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1201c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1202c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_create ======== 1203c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12040cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_create(union trapped_args *args, void *pr_ctxt) 1205c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1206c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 12070624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 12080624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1209ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_node_create.node); 1210c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 12110624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 12120624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 12130624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1214ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens ret = node_create(node_res->node); 1215c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1216c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1217c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1218c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1219c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1220c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_delete ======== 1221c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12220cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_delete(union trapped_args *args, void *pr_ctxt) 1223c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1224c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 12250624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 12260624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1227ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_node_delete.node); 12280624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 12290624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 12300624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 1231c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 12320624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos ret = node_delete(node_res, pr_ctxt); 1233c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1234c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1235c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1236c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1237c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1238c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_free_msg_buf ======== 1239c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12400cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_free_msg_buf(union trapped_args *args, void *pr_ctxt) 1241c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1242c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1243c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_bufferattr *pattr = NULL; 1244c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_bufferattr attr; 12450624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 12460624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1247ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_node_freemsgbuf.node); 12480624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 12490624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 12500624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 12510624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1252fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens if (args->args_node_freemsgbuf.attr) { /* Optional argument */ 1253fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_FM_USR(&attr, args->args_node_freemsgbuf.attr, status, 1); 1254157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) 1255c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattr = &attr; 1256c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1257c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1258c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1259ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens if (!args->args_node_freemsgbuf.buffer) 1260c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EFAULT; 1261c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1262157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1263ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = node_free_msg_buf(node_res->node, 1264ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_node_freemsgbuf.buffer, 1265c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pattr); 1266c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1267c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1268c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1269c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1270c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1271c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1272c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_attr ======== 1273c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12740cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_attr(union trapped_args *args, void *pr_ctxt) 1275c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1276c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1277c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_nodeattr attr; 12780624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 1279c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1280ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_node_getattr.node); 12810624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 12820624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 12830624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 12840624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1285ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = node_get_attr(node_res->node, &attr, 1286c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_getattr.attr_size); 1287fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_TO_USR(args->args_node_getattr.attr, &attr, status, 1); 1288c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1289c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1290c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1291c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1292c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1293c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_message ======== 1294c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 12950cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_message(union trapped_args *args, void *pr_ctxt) 1296c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1297c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 1298c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_msg msg; 12990624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 13000624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1301ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_node_getmessage.node); 1302c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 13030624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 13040624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 13050624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1306ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = node_get_message(node_res->node, &msg, 1307a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens args->args_node_getmessage.timeout); 1308c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1309c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_node_getmessage.message, &msg, status, 1); 1310c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1311c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1312c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1313c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1314c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1315c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_pause ======== 1316c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 13170cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_pause(union trapped_args *args, void *pr_ctxt) 1318c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1319c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 13200624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 13210624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1322ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_node_pause.node); 13230624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 13240624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 13250624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 1326c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1327ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens ret = node_pause(node_res->node); 1328c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1329c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1330c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1331c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1332c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1333c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_put_message ======== 1334c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 13350cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_put_message(union trapped_args *args, void *pr_ctxt) 1336c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1337c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1338c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_msg msg; 13390624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 13400624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1341ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_node_putmessage.node); 13420624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 13430624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 13440624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 1345c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1346c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&msg, args->args_node_putmessage.message, status, 1); 1347c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1348157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1349c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 1350ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens node_put_message(node_res->node, &msg, 1351a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens args->args_node_putmessage.timeout); 1352c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1353c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1354c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1355c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1356c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1357c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1358c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_register_notify ======== 1359c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 13600cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_register_notify(union trapped_args *args, void *pr_ctxt) 1361c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1362c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1363c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_notification notification; 13640624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 13650624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 13660624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos find_node_handle(&node_res, pr_ctxt, 1367ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_node_registernotify.node); 13680624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 13690624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 13700624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 1371c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1372c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Initialize the notification data structure */ 1373ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens notification.name = NULL; 1374c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notification.handle = NULL; 1375c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1376c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (!args->args_proc_register_notify.event_mask) 1377c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(¬ification, 1378121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens args->args_proc_register_notify.notification, 1379c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1380c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1381ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = node_register_notify(node_res->node, 1382c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_registernotify.event_mask, 1383c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_node_registernotify. 1384c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notify_type, ¬ification); 1385121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_TO_USR(args->args_node_registernotify.notification, ¬ification, 1386c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1387c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1388c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1389c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1390c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1391c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_run ======== 1392c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 13930cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_run(union trapped_args *args, void *pr_ctxt) 1394c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1395c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 13960624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 13970624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1398ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_node_run.node); 13990624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 14000624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 14010624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 1402c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1403ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens ret = node_run(node_res->node); 1404c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1405c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1406c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1407c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1408c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1409c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_terminate ======== 1410c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 14110cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_terminate(union trapped_args *args, void *pr_ctxt) 1412c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1413c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 1414c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int tempstatus; 14150624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 1416c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1417ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_node_terminate.node); 14180624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 14190624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 14200624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 14210624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1422ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = node_terminate(node_res->node, &tempstatus); 1423c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1424fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_TO_USR(args->args_node_terminate.status, &tempstatus, status, 1); 1425c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1426c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1427c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1428c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1429c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1430c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== nodewrap_get_uuid_props ======== 1431c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 14320cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 nodewrap_get_uuid_props(union trapped_args *args, void *pr_ctxt) 1433c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1434c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1435c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_uuid node_uuid; 1436c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_ndbprops *pnode_props = NULL; 1437a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 1438c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1439c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&node_uuid, args->args_node_getuuidprops.node_id_ptr, status, 1440c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 144151d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) 1442c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna goto func_cont; 1443c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pnode_props = kmalloc(sizeof(struct dsp_ndbprops), GFP_KERNEL); 1444c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (pnode_props != NULL) { 1445c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = 14466bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos node_get_uuid_props(hprocessor, &node_uuid, pnode_props); 1447c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_node_getuuidprops.node_props, pnode_props, 1448c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1449c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } else 1450c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -ENOMEM; 1451c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Lunafunc_cont: 1452c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(pnode_props); 1453c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1454c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1455c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1456c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 14574ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos * ======== find_strm_handle ========= 14584ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos */ 14594ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramosinline void find_strm_handle(struct strm_res_object **strmres, 14604ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos void *pr_ctxt, void *hstream) 14614ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos{ 14624ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos rcu_read_lock(); 14634ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos *strmres = idr_find(((struct process_context *)pr_ctxt)->stream_id, 1464084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos (int)hstream - 1); 14654ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos rcu_read_unlock(); 14664ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return; 14674ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos} 14684ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 14694ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos/* 1470c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_allocate_buffer ======== 1471c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 14720cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_allocate_buffer(union trapped_args *args, void *pr_ctxt) 1473c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1474c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status; 1475c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 **ap_buffer = NULL; 1476c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 num_bufs = args->args_strm_allocatebuffer.num_bufs; 14774ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res; 14784ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 14794ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos find_strm_handle(&strm_res, pr_ctxt, 1480ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_strm_allocatebuffer.stream); 14814ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 14824ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!strm_res) 14834ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return -EFAULT; 1484c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1485c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (num_bufs > MAX_BUFS) 1486c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 1487c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1488c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL); 1489dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy if (ap_buffer == NULL) 1490dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy return -ENOMEM; 1491c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 14924ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos status = strm_allocate_buffer(strm_res, 1493fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens args->args_strm_allocatebuffer.size, 1494c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer, num_bufs, pr_ctxt); 1495157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1496c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_allocatebuffer.ap_buffer, ap_buffer, 1497c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, num_bufs); 149851d5e099cc9a21960e59bcaee6cc5e2620ea6bb2Ernesto Ramos if (status) { 1499c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = -EFAULT; 15004ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos strm_free_buffer(strm_res, 1501c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer, num_bufs, pr_ctxt); 1502c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1503c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1504c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(ap_buffer); 1505c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1506c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1507c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1508c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1509c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1510c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_close ======== 1511c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 15120cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_close(union trapped_args *args, void *pr_ctxt) 1513c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 15144ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res; 15154ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 1516ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_strm_handle(&strm_res, pr_ctxt, args->args_strm_close.stream); 15174ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 15184ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!strm_res) 15194ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return -EFAULT; 15204ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 15214ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return strm_close(strm_res, pr_ctxt); 1522c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1523c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1524c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1525c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_free_buffer ======== 1526c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 15270cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_free_buffer(union trapped_args *args, void *pr_ctxt) 1528c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1529c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1530c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 **ap_buffer = NULL; 1531c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 num_bufs = args->args_strm_freebuffer.num_bufs; 15324ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res; 15334ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 15344ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos find_strm_handle(&strm_res, pr_ctxt, 1535ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_strm_freebuffer.stream); 15364ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 15374ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!strm_res) 15384ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return -EFAULT; 1539c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1540c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (num_bufs > MAX_BUFS) 1541c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 1542c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1543c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer = kmalloc((num_bufs * sizeof(u8 *)), GFP_KERNEL); 1544dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy if (ap_buffer == NULL) 1545dd85c9911d6eb44f398d07006a3c4ce57d36b7b9Kulikov Vasiliy return -ENOMEM; 1546c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1547c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(ap_buffer, args->args_strm_freebuffer.ap_buffer, status, 1548c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna num_bufs); 1549c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 15504ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!status) 15514ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos status = strm_free_buffer(strm_res, 1552c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna ap_buffer, num_bufs, pr_ctxt); 15534ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 1554c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_freebuffer.ap_buffer, ap_buffer, status, 1555c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna num_bufs); 1556c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna kfree(ap_buffer); 1557c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1558c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1559c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1560c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1561c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1562c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_event_handle ======== 1563c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 15640cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated strmwrap_get_event_handle(union trapped_args * args, 1565c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna void *pr_ctxt) 1566c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1567c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 1568c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -ENOSYS; 1569c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1570c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1571c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1572c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_get_info ======== 1573c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 15740cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_get_info(union trapped_args *args, void *pr_ctxt) 1575c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1576c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1577c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct stream_info strm_info; 1578c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_streaminfo user; 1579c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_streaminfo *temp; 15804ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res; 15814ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 15824ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos find_strm_handle(&strm_res, pr_ctxt, 1583ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_strm_getinfo.stream); 15844ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 15854ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!strm_res) 15864ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return -EFAULT; 1587c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1588c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&strm_info, args->args_strm_getinfo.stream_info, status, 1); 1589c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna temp = strm_info.user_strm; 1590c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1591c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna strm_info.user_strm = &user; 1592c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1593157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1594ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = strm_get_info(strm_res->stream, 1595c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &strm_info, 1596c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_getinfo. 1597c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna stream_info_size); 1598c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1599c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(temp, strm_info.user_strm, status, 1); 1600c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna strm_info.user_strm = temp; 1601c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_getinfo.stream_info, &strm_info, status, 1); 1602c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1603c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1604c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1605c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1606c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_idle ======== 1607c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 16080cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_idle(union trapped_args *args, void *pr_ctxt) 1609c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1610c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ret; 16114ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res; 16124ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 1613ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_strm_handle(&strm_res, pr_ctxt, args->args_strm_idle.stream); 1614c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 16154ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!strm_res) 16164ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return -EFAULT; 16174ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 1618ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens ret = strm_idle(strm_res->stream, args->args_strm_idle.flush_flag); 1619c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1620c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return ret; 1621c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1622c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1623c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1624c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_issue ======== 1625c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 16260cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_issue(union trapped_args *args, void *pr_ctxt) 1627c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1628c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 16294ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res; 16304ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 1631ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_strm_handle(&strm_res, pr_ctxt, args->args_strm_issue.stream); 16324ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 16334ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!strm_res) 16344ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return -EFAULT; 1635c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1636ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens if (!args->args_strm_issue.buffer) 1637c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EFAULT; 1638c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1639c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* No need of doing CP_FM_USR for the user buffer (pbuffer) 1640c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna as this is done in Bridge internal function bridge_chnl_add_io_req 1641c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna in chnl_sm.c */ 1642ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = strm_issue(strm_res->stream, 1643ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_strm_issue.buffer, 1644fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens args->args_strm_issue.bytes, 1645fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens args->args_strm_issue.buf_size, 1646b4da7fc381c51d42c231f97de912b89dbabe8928Rene Sapiens args->args_strm_issue.arg); 1647c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1648c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1649c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1650c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1651c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1652c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_open ======== 1653c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 16540cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_open(union trapped_args *args, void *pr_ctxt) 1655c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1656c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1657c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct strm_attr attr; 16584ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res_obj; 1659c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_streamattrin strm_attr_in; 16600624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos struct node_res_object *node_res; 1661084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos int strmid; 16620624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 1663ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_node_handle(&node_res, pr_ctxt, args->args_strm_open.node); 16640624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos 16650624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos if (!node_res) 16660624f52f77e11a6edfc48827a12190f874d572b8Ernesto Ramos return -EFAULT; 1667c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1668c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&attr, args->args_strm_open.attr_in, status, 1); 1669c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1670c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (attr.stream_attr_in != NULL) { /* Optional argument */ 1671c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_FM_USR(&strm_attr_in, attr.stream_attr_in, status, 1); 1672157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1673c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna attr.stream_attr_in = &strm_attr_in; 1674c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (attr.stream_attr_in->strm_mode == STRMMODE_LDMA) 1675c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -ENOSYS; 1676c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1677c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1678c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1679ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = strm_open(node_res->node, 1680c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_open.direction, 16814ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos args->args_strm_open.index, &attr, &strm_res_obj, 1682c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_ctxt); 1683084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos if (!status) { 1684084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos strmid = strm_res_obj->id + 1; 1685fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_TO_USR(args->args_strm_open.stream, &strmid, status, 1); 1686084f70ee096d385e363bd5d309cc7ff24fb98c53Ernesto Ramos } 1687c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1688c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1689c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1690c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1691c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_reclaim ======== 1692c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 16930cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_reclaim(union trapped_args *args, void *pr_ctxt) 1694c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1695c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1696c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u8 *buf_ptr; 1697c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ul_bytes; 1698c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 dw_arg; 1699c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 ul_buf_size; 17004ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res; 17014ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 1702ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens find_strm_handle(&strm_res, pr_ctxt, args->args_strm_reclaim.stream); 17034ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 17044ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!strm_res) 17054ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return -EFAULT; 1706c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1707ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = strm_reclaim(strm_res->stream, &buf_ptr, 1708c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna &ul_bytes, &ul_buf_size, &dw_arg); 1709c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_reclaim.buf_ptr, &buf_ptr, status, 1); 1710c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_reclaim.bytes, &ul_bytes, status, 1); 1711fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_TO_USR(args->args_strm_reclaim.arg, &dw_arg, status, 1); 1712c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1713c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_strm_reclaim.buf_size_ptr != NULL) { 1714c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_strm_reclaim.buf_size_ptr, &ul_buf_size, 1715c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1716c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1717c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1718c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1719c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1720c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1721c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1722c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_register_notify ======== 1723c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 17240cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_register_notify(union trapped_args *args, void *pr_ctxt) 1725c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1726c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1727c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct dsp_notification notification; 17284ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res; 17294ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 17304ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos find_strm_handle(&strm_res, pr_ctxt, 1731ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens args->args_strm_registernotify.stream); 17324ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 17334ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!strm_res) 17344ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return -EFAULT; 1735c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1736c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* Initialize the notification data structure */ 1737ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens notification.name = NULL; 1738c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notification.handle = NULL; 1739c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1740ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens status = strm_register_notify(strm_res->stream, 1741c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_registernotify.event_mask, 1742c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna args->args_strm_registernotify. 1743c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna notify_type, ¬ification); 1744121e8f9b9fca6a05602cea1245450e653f0d4ba1Rene Sapiens CP_TO_USR(args->args_strm_registernotify.notification, ¬ification, 1745c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status, 1); 1746c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1747c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1748c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1749c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1750c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1751c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== strmwrap_select ======== 1752c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 17530cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 strmwrap_select(union trapped_args *args, void *pr_ctxt) 1754c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1755c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna u32 mask; 1756c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct strm_object *strm_tab[MAX_STREAMS]; 1757c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 17584ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos struct strm_res_object *strm_res; 17594ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos int *ids[MAX_STREAMS]; 17604ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos int i; 1761c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1762c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna if (args->args_strm_select.strm_num > MAX_STREAMS) 1763c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -EINVAL; 1764c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 17654ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos CP_FM_USR(ids, args->args_strm_select.stream_tab, status, 17664ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos args->args_strm_select.strm_num); 17674ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 17684ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (status) 17694ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return status; 17704ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 17714ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos for (i = 0; i < args->args_strm_select.strm_num; i++) { 17724ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos find_strm_handle(&strm_res, pr_ctxt, ids[i]); 17734ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 17744ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos if (!strm_res) 17754ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos return -EFAULT; 17764ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 1777ee4317f78c24cf85efd067f4c09319e281c4fa4aRene Sapiens strm_tab[i] = strm_res->stream; 17784ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos } 17794ec09714a0a5861c3e786967024ddfff00b0add6Ernesto Ramos 1780157990f0d7f70aaa2b0158f959994eb0f65c05c0Ernesto Ramos if (!status) { 1781c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna status = strm_select(strm_tab, args->args_strm_select.strm_num, 1782a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens &mask, args->args_strm_select.timeout); 1783c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna } 1784fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_TO_USR(args->args_strm_select.mask, &mask, status, 1); 1785c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1786c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1787c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1788c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* CMM */ 1789c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1790c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1791c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_calloc_buf ======== 1792c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 17930cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_calloc_buf(union trapped_args * args, void *pr_ctxt) 1794c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1795c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* This operation is done in kernel */ 1796c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 1797c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -ENOSYS; 1798c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1799c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1800c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1801c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_free_buf ======== 1802c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 18030cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 __deprecated cmmwrap_free_buf(union trapped_args * args, void *pr_ctxt) 1804c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1805c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna /* This operation is done in kernel */ 1806c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna pr_err("%s: deprecated dspbridge ioctl\n", __func__); 1807c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return -ENOSYS; 1808c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1809c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1810c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1811c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_handle ======== 1812c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 18130cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_handle(union trapped_args *args, void *pr_ctxt) 1814c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1815c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1816c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct cmm_object *hcmm_mgr; 1817a534f17bd50834188b24e0a573c22c3285e7b1bbRene Sapiens void *hprocessor = ((struct process_context *)pr_ctxt)->processor; 1818c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 18196bcc9beed2d46c0db479a3750af4b2cbd7a92401Ernesto Ramos status = cmm_get_handle(hprocessor, &hcmm_mgr); 1820c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1821fbbb4959eee4762a2fa60c6352be2284ebb1cb67Rene Sapiens CP_TO_USR(args->args_cmm_gethandle.cmm_mgr, &hcmm_mgr, status, 1); 1822c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1823c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1824c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1825c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1826c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna/* 1827c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna * ======== cmmwrap_get_info ======== 1828c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna */ 18290cd343a42f60a965cece191efaefe51e01e58f64Rene Sapiensu32 cmmwrap_get_info(union trapped_args *args, void *pr_ctxt) 1830c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna{ 1831c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna int status = 0; 1832c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna struct cmm_info cmm_info_obj; 1833c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1834085467b8f5e60a2fe9ef85031ab40bd8724fcac6Rene Sapiens status = cmm_get_info(args->args_cmm_getinfo.cmm_mgr, &cmm_info_obj); 1835c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1836c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna CP_TO_USR(args->args_cmm_getinfo.cmm_info_obj, &cmm_info_obj, status, 1837c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1); 1838c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna 1839c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna return status; 1840c4ca3d5a4b02b484fdb1bab59489699b94998fadOmar Ramirez Luna} 1841