diff options
author | Saurabh Bipin Chandra | 2013-07-31 09:50:49 -0500 |
---|---|---|
committer | Saurabh Bipin Chandra | 2013-08-27 16:12:42 -0500 |
commit | 17668bcb5a1f7f9db2ba225b1825bc55365c3e66 (patch) | |
tree | 20a4d47c840afbb44a6c232e6aac05e0c8ffa77a /dce_rpc.h | |
parent | 2bda487ad3ce775777d03cf2b7cfd31d9ec9329a (diff) | |
download | hardware-ti-libdce-17668bcb5a1f7f9db2ba225b1825bc55365c3e66.tar.gz hardware-ti-libdce-17668bcb5a1f7f9db2ba225b1825bc55365c3e66.tar.xz hardware-ti-libdce-17668bcb5a1f7f9db2ba225b1825bc55365c3e66.zip |
[DCE] Modify approach to pass parameters to IPC
Three approaches were followed for IPC MmRpc calls.
1. All the parameters which need to be sent and received to/from IPU are coupled in a struct
allocated from Shared/Tiler Memory. Only the adrress of the struct is passed to MmRpc
as a pointer argument. This approach is useful as MmRpc in some cases to avoid multiple
translations. This approach is followed for :
Engine_open(), Engine_close(), create(), control(), delete()
2. All the parameters which need to be sent are given as separate arguments to
MmRpc. This approach is needed when you need to translate an address which is
ofsetted from a pointer which in itself needs to be translated.
This apporach is followed for : process()
For understanding, take the example of inbufs argument in process call(). Inbufs
allocated in Shared memory and needs to be translated, has the address of Input
buffer (allocated from Tiler). It is not possible to give the Input buffer as an argument
to Mmrpc for translation until inbufs is given as a parameter to Mmrpc. Therefore inbuf
can't be populated inside another Shared/Tiler memory struct.
3. This approach is a workaround to use approach [1] by solving the issue posed by [2].
This approach is followed for : get_version()
Taking the example of inbufs to explain, the Input buffer address will be one of the
parameters of the struct (explained in [1]) along with inbufs address. Therefore the
Input buffer address will get translated here. At the IPU, this address needs to be
copied back to inbufs.
This patch aligns all DCE calls except Engine_Open to use Approach [2].
Engine_open still follows Approach [1] because:
1. Engine open takes in pointers to Engine_attrs and Error_code structures. The client may
set both, none or either one of them to NULL (as allowed by CE). So that implies either
I'll have to pass NULL as param_pointer to IPU or decide not to pass them at all. In the
second case, I'll have to pass extra arguments to inform IPU that I have not passed Attrs
or ErrorCode or both.
I tried passing NULL but mmrpc_write failed.
Dependent on ipumm patch:
https://gerrit.ext.ti.com/gerrit/omap/#/c/12773
Change-Id: Ic770aaa99a56ea559efe9446e6e98d70726cc7c5
Signed-off-by: Saurabh Bipin Chandra <a0131926@ti.com>
Diffstat (limited to 'dce_rpc.h')
-rw-r--r-- | dce_rpc.h | 77 |
1 files changed, 8 insertions, 69 deletions
@@ -44,6 +44,11 @@ | |||
44 | 44 | ||
45 | #define DCE_DEVICE_NAME "rpmsg-dce" | 45 | #define DCE_DEVICE_NAME "rpmsg-dce" |
46 | 46 | ||
47 | #define MAX_NAME_LENGTH 32 | ||
48 | #define MAX_INPUT_BUF 2 // Need to confirm for interlaced YUVs for Encoders | ||
49 | #define MAX_OUTPUT_BUF 2 | ||
50 | #define MAX_TOTAl_BUF (MAX_INPUT_BUF + MAX_OUTPUT_BUF) | ||
51 | |||
47 | /* Message-Ids: | 52 | /* Message-Ids: |
48 | */ | 53 | */ |
49 | //#define DCE_RPC_CONNECT (0x80000000 | 00) Connect not needed anymore. | 54 | //#define DCE_RPC_CONNECT (0x80000000 | 00) Connect not needed anymore. |
@@ -70,76 +75,10 @@ typedef struct dce_connect { | |||
70 | } dce_connect; | 75 | } dce_connect; |
71 | 76 | ||
72 | typedef struct dce_engine_open { | 77 | typedef struct dce_engine_open { |
73 | char name[32]; /* engine name (in) */ | 78 | char name[MAX_NAME_LENGTH]; /* engine name (in) */ |
74 | Engine_Error error_code; /* error code (out) */ | 79 | Engine_Attrs *engine_attrs; /* engine attributes (out) */ |
75 | Engine_Handle eng_handle; /* engine handle (out) */ | 80 | Engine_Error error_code; /* error code (out) */ |
76 | } dce_engine_open; | 81 | } dce_engine_open; |
77 | 82 | ||
78 | typedef struct dce_engine_close { | ||
79 | Engine_Handle eng_handle; /* engine handle (in) */ | ||
80 | } dce_engine_close; | ||
81 | |||
82 | typedef struct dce_codec_create { | ||
83 | Engine_Handle engine; | ||
84 | char codec_name[32]; | ||
85 | void *static_params; | ||
86 | dce_codec_type codec_id; | ||
87 | void *codec_handle; | ||
88 | } dce_codec_create; | ||
89 | |||
90 | typedef struct dce_codec_control { | ||
91 | void *codec_handle; | ||
92 | uint32_t cmd_id; | ||
93 | void *dyn_params; | ||
94 | void *status; | ||
95 | dce_codec_type codec_id; | ||
96 | int32_t result; | ||
97 | } dce_codec_control; | ||
98 | |||
99 | typedef struct dce_codec_get_version { | ||
100 | void *codec_handle; | ||
101 | void *dyn_params; | ||
102 | void *status; | ||
103 | void *version; | ||
104 | dce_codec_type codec_id; | ||
105 | int32_t result; | ||
106 | } dce_codec_get_version; | ||
107 | |||
108 | typedef struct dce_codec_delete { | ||
109 | void *codec_handle; | ||
110 | dce_codec_type codec_id; | ||
111 | } dce_codec_delete; | ||
112 | |||
113 | /* ---------------------- For GLP DCE -----------------------------*/ | ||
114 | /* NOTE: CODEC_PROCESS does somewhat more than the other ioctls, in that it | ||
115 | * handles buffer mapping/unmapping. So the inBufs/outBufs are copied inline | ||
116 | * (with translated addresses in the copy sent inline with codec_process_req). | ||
117 | * Since we need the inputID from inArgs, and it is a small struct, it is also | ||
118 | * copied inline. | ||
119 | * | ||
120 | * Therefore, the variable length data[] section has the format: | ||
121 | * uint8_t reloc[reloc_length * 4]; | ||
122 | * uint8_t inargs[in_args_length * 4]; | ||
123 | * uint8_t outbufs[in_bufs_length * 4]; | ||
124 | * uint8_t inbufs[in_bufs_length * 4]; | ||
125 | */ | ||
126 | |||
127 | #define MAX_INPUT_BUF 2 // Need to confirm for interlaced YUVs for Encoders | ||
128 | #define MAX_OUTPUT_BUF 2 | ||
129 | #define MAX_TOTAl_BUF (MAX_INPUT_BUF + MAX_OUTPUT_BUF) | ||
130 | |||
131 | /* Struct to be used if approach [3] of Mmrpc call is followed */ | ||
132 | typedef struct dce_codec_process { | ||
133 | void *codec_handle; | ||
134 | void *inBufs; | ||
135 | void *outBufs; | ||
136 | void *inArgs; | ||
137 | void *outArgs; | ||
138 | int32_t input_Buf[MAX_INPUT_BUF]; | ||
139 | int32_t output_Buf[MAX_OUTPUT_BUF]; | ||
140 | dce_codec_type codec_id; | ||
141 | int32_t result; | ||
142 | } dce_codec_process; | ||
143 | |||
144 | #endif /* __DCE_RPC_H__ */ | 83 | #endif /* __DCE_RPC_H__ */ |
145 | 84 | ||