1 /* 2 * Copyright 2001-2008 Texas Instruments - http://www.ti.com/ 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 /* 19 * ======== wcdioctl.h ======== 20 * DSP-BIOS Bridge driver support functions for TI OMAP processors. 21 * Purpose: 22 * Contains structures and commands that are used for interaction 23 * between the DDSP API and class driver. 24 * 25 *! Revision History 26 *! ================ 27 *! 19-Apr-2004 sb Aligned DMM definitions with Symbian 28 *! 08-Mar-2004 sb Added the Dynamic Memory Mapping structs & offsets 29 *! 15-Oct-2002 kc Updated definitions for private PERF module. 30 *! 16-Aug-2002 map Added ARGS_MGR_REGISTEROBJECT & ARGS_MGR_UNREGISTEROBJECT 31 *! Added CMD_MGR_REGISTEROBJECT_OFFSET & 32 *! CMD_MGR_UNREGISTEROBJECT_OFFSET 33 *! 15-Jan-2002 ag Added actaul bufSize to ARGS_STRM_[RECLAIM][ISSUE]. 34 *! 15-Nov-2001 ag change to STRMINFO in ARGS_STRM_GETINFO. 35 *! 11-Sep-2001 ag ARGS_CMM_GETHANDLE defn uses DSP_HPROCESSOR. 36 *! 23-Apr-2001 jeh Added pStatus to NODE_TERMINATE args. 37 *! 13-Feb-2001 kc DSP/BIOS Bridge name updates. 38 *! 22-Nov-2000 kc: Added CMD_MGR_GETPERF_DATA_OFFSET for acquiring PERF stats. 39 *! 27-Oct-2000 jeh Added timeouts to NODE_GETMESSAGE, NODE_PUTMESSAGE args. 40 *! Removed NODE_GETMESSAGESTRM args. 41 *! 11-Oct-2000 ag: Added SM mgr(CMM) args. 42 *! 27-Sep-2000 jeh Removed struct DSP_BUFFERATTR param from ARGS_STRM_ALLOCATEBUFFER. 43 *! 25-Sep-2000 rr: Updated to Version 0.9 44 *! 07-Sep-2000 jeh Changed HANDLE to DSP_HNOTIFICATION in RegisterNotify args. 45 *! Added DSP_STRMATTR to DSPNode_Connect args. 46 *! 04-Aug-2000 rr: MEM and UTIL added to RM. 47 *! 27-Jul-2000 rr: NODE, MGR,STRM and PROC added 48 *! 27-Jun-2000 rr: Modifed to Use either PM or DSP/BIOS Bridge 49 *! IFDEF to build for PM or DSP/BIOS Bridge 50 *! 28-Jan-2000 rr: NT_CMD_FROM_OFFSET moved out to dsptrap.h 51 *! 24-Jan-2000 rr: Merged with Scott's code. 52 *! 21-Jan-2000 sg: In ARGS_CHNL_GETMODE changed mode to be ULONG to be 53 *! consistent with chnldefs.h. 54 *! 11-Jan-2000 rr: CMD_CFG_GETCDVERSION_OFFSET added. 55 *! 12-Nov-1999 rr: CMD_BRD_MONITOR_OFFSET added 56 *! 09-Nov-1999 kc: Added MEMRY and enabled CMD_BRD_IOCTL_OFFSET. 57 *! 05-Nov-1999 ag: Added CHNL. 58 *! 02-Nov-1999 kc: Removed field from ARGS_UTIL_TESTDLL. 59 *! 29-Oct-1999 kc: Cleaned up for code review. 60 *! 08-Oct-1999 rr: Util control offsets added. 61 *! 13-Sep-1999 kc: Added ARGS_UTIL_TESTDLL for PM test infrastructure. 62 *! 19-Aug-1999 rr: Created from WSX. Minimal Implementaion of BRD_Start and BRD 63 *! and BRD_Stop. IOCTL Offsets and CTRL Code. 64 */ 65 66 #ifndef WCDIOCTL_ 67 #define WCDIOCTL_ 68 69 #include <mem.h> 70 #include <cmm.h> 71 #include <strmdefs.h> 72 #include <dbdcd.h> 73 74 typedef union { 75 76 /* MGR Module */ 77 struct { 78 UINT uNode; 79 struct DSP_NDBPROPS *pNDBProps; 80 UINT uNDBPropsSize; 81 UINT *puNumNodes; 82 } ARGS_MGR_ENUMNODE_INFO; 83 84 struct { 85 UINT uProcessor; 86 struct DSP_PROCESSORINFO *pProcessorInfo; 87 UINT uProcessorInfoSize; 88 UINT *puNumProcs; 89 } ARGS_MGR_ENUMPROC_INFO; 90 91 struct { 92 struct DSP_UUID *pUuid; 93 DSP_DCDOBJTYPE objType; 94 CHAR *pszPathName; 95 } ARGS_MGR_REGISTEROBJECT; 96 97 struct { 98 struct DSP_UUID *pUuid; 99 DSP_DCDOBJTYPE objType; 100 } ARGS_MGR_UNREGISTEROBJECT; 101 102 struct { 103 struct DSP_NOTIFICATION* *aNotifications; 104 UINT uCount; 105 UINT *puIndex; 106 UINT uTimeout; 107 } ARGS_MGR_WAIT; 108 109 /* PROC Module */ 110 struct { 111 UINT uProcessor; 112 struct DSP_PROCESSORATTRIN *pAttrIn; 113 DSP_HPROCESSOR *phProcessor; 114 } ARGS_PROC_ATTACH; 115 116 struct { 117 DSP_HPROCESSOR hProcessor; 118 ULONG dwCmd; 119 struct DSP_CBDATA *pArgs; 120 } ARGS_PROC_CTRL; 121 122 struct { 123 DSP_HPROCESSOR hProcessor; 124 } ARGS_PROC_DETACH; 125 126 struct { 127 DSP_HPROCESSOR hProcessor; 128 DSP_HNODE *aNodeTab; 129 UINT uNodeTabSize; 130 UINT *puNumNodes; 131 UINT *puAllocated; 132 } ARGS_PROC_ENUMNODE_INFO; 133 134 struct { 135 DSP_HPROCESSOR hProcessor; 136 UINT uResourceType; 137 struct DSP_RESOURCEINFO *pResourceInfo; 138 UINT uResourceInfoSize; 139 } ARGS_PROC_ENUMRESOURCES; 140 141 struct { 142 DSP_HPROCESSOR hProcessor; 143 struct DSP_PROCESSORSTATE *pProcStatus; 144 UINT uStateInfoSize; 145 } ARGS_PROC_GETSTATE; 146 147 struct { 148 DSP_HPROCESSOR hProcessor; 149 BYTE *pBuf; 150 151 #ifndef RES_CLEANUP_DISABLE 152 BYTE * pSize; 153 #endif 154 UINT uMaxSize; 155 } ARGS_PROC_GETTRACE; 156 157 struct { 158 DSP_HPROCESSOR hProcessor; 159 INT iArgc; 160 CHAR **aArgv; 161 CHAR **aEnvp; 162 } ARGS_PROC_LOAD; 163 164 struct { 165 DSP_HPROCESSOR hProcessor; 166 UINT uEventMask; 167 UINT uNotifyType; 168 struct DSP_NOTIFICATION* hNotification; 169 } ARGS_PROC_REGISTER_NOTIFY; 170 171 struct { 172 DSP_HPROCESSOR hProcessor; 173 } ARGS_PROC_START; 174 175 struct { 176 DSP_HPROCESSOR hProcessor; 177 ULONG ulSize; 178 PVOID *ppRsvAddr; 179 } ARGS_PROC_RSVMEM; 180 181 struct { 182 DSP_HPROCESSOR hProcessor; 183 ULONG ulSize; 184 PVOID pRsvAddr; 185 } ARGS_PROC_UNRSVMEM; 186 187 struct { 188 DSP_HPROCESSOR hProcessor; 189 PVOID pMpuAddr; 190 ULONG ulSize; 191 PVOID pReqAddr; 192 PVOID *ppMapAddr; 193 ULONG ulMapAttr; 194 } ARGS_PROC_MAPMEM; 195 196 struct { 197 DSP_HPROCESSOR hProcessor; 198 ULONG ulSize; 199 PVOID pMapAddr; 200 } ARGS_PROC_UNMAPMEM; 201 202 struct { 203 DSP_HPROCESSOR hProcessor; 204 PVOID pMpuAddr; 205 ULONG ulSize; 206 ULONG ulFlags; 207 } ARGS_PROC_FLUSHMEMORY; 208 209 struct { 210 DSP_HPROCESSOR hProcessor; 211 } ARGS_PROC_STOP; 212 213 struct { 214 DSP_HPROCESSOR hProcessor; 215 PVOID pMpuAddr; 216 ULONG ulSize; 217 } ARGS_PROC_INVALIDATEMEMORY; 218 219 220 /* NODE Module */ 221 struct { 222 DSP_HPROCESSOR hProcessor; 223 struct DSP_UUID *pNodeID; 224 struct DSP_CBDATA *pArgs; 225 struct DSP_NODEATTRIN *pAttrIn; 226 DSP_HNODE *phNode; 227 } ARGS_NODE_ALLOCATE; 228 229 struct { 230 DSP_HNODE hNode; 231 UINT uSize; 232 struct DSP_BUFFERATTR *pAttr; 233 BYTE **pBuffer; 234 } ARGS_NODE_ALLOCMSGBUF; 235 236 struct { 237 DSP_HNODE hNode; 238 INT iPriority; 239 } ARGS_NODE_CHANGEPRIORITY; 240 241 struct { 242 DSP_HNODE hNode; 243 UINT uStream; 244 DSP_HNODE hOtherNode; 245 UINT uOtherStream; 246 struct DSP_STRMATTR *pAttrs; 247 struct DSP_CBDATA *pConnParam; 248 } ARGS_NODE_CONNECT; 249 250 struct { 251 DSP_HNODE hNode; 252 } ARGS_NODE_CREATE; 253 254 struct { 255 DSP_HNODE hNode; 256 } ARGS_NODE_DELETE; 257 258 struct { 259 DSP_HNODE hNode; 260 struct DSP_BUFFERATTR *pAttr; 261 BYTE *pBuffer; 262 } ARGS_NODE_FREEMSGBUF; 263 264 struct { 265 DSP_HNODE hNode; 266 struct DSP_NODEATTR *pAttr; 267 UINT uAttrSize; 268 } ARGS_NODE_GETATTR; 269 270 struct { 271 DSP_HNODE hNode; 272 struct DSP_MSG *pMessage; 273 UINT uTimeout; 274 } ARGS_NODE_GETMESSAGE; 275 276 struct { 277 DSP_HNODE hNode; 278 } ARGS_NODE_PAUSE; 279 280 struct { 281 DSP_HNODE hNode; 282 struct DSP_MSG *pMessage; 283 UINT uTimeout; 284 } ARGS_NODE_PUTMESSAGE; 285 286 struct { 287 DSP_HNODE hNode; 288 UINT uEventMask; 289 UINT uNotifyType; 290 struct DSP_NOTIFICATION* hNotification; 291 } ARGS_NODE_REGISTERNOTIFY; 292 293 struct { 294 DSP_HNODE hNode; 295 } ARGS_NODE_RUN; 296 297 struct { 298 DSP_HNODE hNode; 299 DSP_STATUS *pStatus; 300 } ARGS_NODE_TERMINATE; 301 302 struct { 303 DSP_HPROCESSOR hProcessor; 304 struct DSP_UUID *pNodeID; 305 struct DSP_NDBPROPS *pNodeProps; 306 } ARGS_NODE_GETUUIDPROPS; 307 308 /* STRM module */ 309 310 struct { 311 DSP_HSTREAM hStream; 312 UINT uSize; 313 BYTE **apBuffer; 314 UINT uNumBufs; 315 } ARGS_STRM_ALLOCATEBUFFER; 316 317 struct { 318 DSP_HSTREAM hStream; 319 } ARGS_STRM_CLOSE; 320 321 struct { 322 DSP_HSTREAM hStream; 323 BYTE **apBuffer; 324 UINT uNumBufs; 325 } ARGS_STRM_FREEBUFFER; 326 327 struct { 328 DSP_HSTREAM hStream; 329 HANDLE *phEvent; 330 } ARGS_STRM_GETEVENTHANDLE; 331 332 struct { 333 DSP_HSTREAM hStream; 334 struct STRM_INFO *pStreamInfo; 335 UINT uStreamInfoSize; 336 } ARGS_STRM_GETINFO; 337 338 struct { 339 DSP_HSTREAM hStream; 340 bool bFlush; 341 } ARGS_STRM_IDLE; 342 343 struct { 344 DSP_HSTREAM hStream; 345 BYTE *pBuffer; 346 ULONG dwBytes; 347 ULONG dwBufSize; 348 DWORD dwArg; 349 } ARGS_STRM_ISSUE; 350 351 struct { 352 DSP_HNODE hNode; 353 UINT uDirection; 354 UINT uIndex; 355 struct STRM_ATTR *pAttrIn; 356 DSP_HSTREAM *phStream; 357 } ARGS_STRM_OPEN; 358 359 struct { 360 DSP_HSTREAM hStream; 361 BYTE **pBufPtr; 362 ULONG *pBytes; 363 ULONG *pBufSize; 364 DWORD *pdwArg; 365 } ARGS_STRM_RECLAIM; 366 367 struct { 368 DSP_HSTREAM hStream; 369 UINT uEventMask; 370 UINT uNotifyType; 371 struct DSP_NOTIFICATION* hNotification; 372 } ARGS_STRM_REGISTERNOTIFY; 373 374 struct { 375 DSP_HSTREAM *aStreamTab; 376 UINT nStreams; 377 UINT *pMask; 378 UINT uTimeout; 379 } ARGS_STRM_SELECT; 380 381 /* CMM Module */ 382 struct { 383 struct CMM_OBJECT* hCmmMgr; 384 UINT uSize; 385 struct CMM_ATTRS *pAttrs; 386 OUT PVOID *ppBufVA; 387 } ARGS_CMM_ALLOCBUF; 388 389 struct { 390 struct CMM_OBJECT* hCmmMgr; 391 PVOID pBufPA; 392 ULONG ulSegId; 393 } ARGS_CMM_FREEBUF; 394 395 struct { 396 DSP_HPROCESSOR hProcessor; 397 struct CMM_OBJECT* *phCmmMgr; 398 } ARGS_CMM_GETHANDLE; 399 400 struct { 401 struct CMM_OBJECT* hCmmMgr; 402 struct CMM_INFO *pCmmInfo; 403 } ARGS_CMM_GETINFO; 404 405 /* MEM Module */ 406 struct { 407 ULONG cBytes; 408 MEM_POOLATTRS type; 409 PVOID pMem; 410 } ARGS_MEM_ALLOC; 411 412 struct { 413 ULONG cBytes; 414 MEM_POOLATTRS type; 415 PVOID pMem; 416 } ARGS_MEM_CALLOC; 417 418 struct { 419 PVOID pMem; 420 } ARGS_MEM_FREE; 421 422 struct { 423 PVOID pBuffer; 424 ULONG cSize; 425 PVOID pLockedBuffer; 426 } ARGS_MEM_PAGELOCK; 427 428 struct { 429 PVOID pBuffer; 430 ULONG cSize; 431 } ARGS_MEM_PAGEUNLOCK; 432 433 /* UTIL module */ 434 struct { 435 INT cArgc; 436 CHAR **ppArgv; 437 } ARGS_UTIL_TESTDLL; 438 439 } Trapped_Args; 440 441 #define CMD_BASE 1 442 443 /* MGR module offsets */ 444 #define CMD_MGR_BASE_OFFSET CMD_BASE 445 #define CMD_MGR_ENUMNODE_INFO_OFFSET (CMD_MGR_BASE_OFFSET + 0) 446 #define CMD_MGR_ENUMPROC_INFO_OFFSET (CMD_MGR_BASE_OFFSET + 1) 447 #define CMD_MGR_REGISTEROBJECT_OFFSET (CMD_MGR_BASE_OFFSET + 2) 448 #define CMD_MGR_UNREGISTEROBJECT_OFFSET (CMD_MGR_BASE_OFFSET + 3) 449 #define CMD_MGR_WAIT_OFFSET (CMD_MGR_BASE_OFFSET + 4) 450 451 #ifndef RES_CLEANUP_DISABLE 452 #define CMD_MGR_RESOUCES_OFFSET (CMD_MGR_BASE_OFFSET + 5) 453 #define CMD_MGR_END_OFFSET CMD_MGR_RESOUCES_OFFSET 454 #else 455 #define CMD_MGR_END_OFFSET CMD_MGR_WAIT_OFFSET 456 #endif 457 458 #define CMD_PROC_BASE_OFFSET (CMD_MGR_END_OFFSET + 1) 459 #define CMD_PROC_ATTACH_OFFSET (CMD_PROC_BASE_OFFSET + 0) 460 #define CMD_PROC_CTRL_OFFSET (CMD_PROC_BASE_OFFSET + 1) 461 #define CMD_PROC_DETACH_OFFSET (CMD_PROC_BASE_OFFSET + 2) 462 #define CMD_PROC_ENUMNODE_OFFSET (CMD_PROC_BASE_OFFSET + 3) 463 #define CMD_PROC_ENUMRESOURCES_OFFSET (CMD_PROC_BASE_OFFSET + 4) 464 #define CMD_PROC_GETSTATE_OFFSET (CMD_PROC_BASE_OFFSET + 5) 465 #define CMD_PROC_GETTRACE_OFFSET (CMD_PROC_BASE_OFFSET + 6) 466 #define CMD_PROC_LOAD_OFFSET (CMD_PROC_BASE_OFFSET + 7) 467 #define CMD_PROC_REGISTERNOTIFY_OFFSET (CMD_PROC_BASE_OFFSET + 8) 468 #define CMD_PROC_START_OFFSET (CMD_PROC_BASE_OFFSET + 9) 469 #define CMD_PROC_RSVMEM_OFFSET (CMD_PROC_BASE_OFFSET + 10) 470 #define CMD_PROC_UNRSVMEM_OFFSET (CMD_PROC_BASE_OFFSET + 11) 471 #define CMD_PROC_MAPMEM_OFFSET (CMD_PROC_BASE_OFFSET + 12) 472 #define CMD_PROC_UNMAPMEM_OFFSET (CMD_PROC_BASE_OFFSET + 13) 473 #define CMD_PROC_FLUSHMEMORY_OFFSET (CMD_PROC_BASE_OFFSET + 14) 474 #define CMD_PROC_STOP_OFFSET (CMD_PROC_BASE_OFFSET + 15) 475 #define CMD_PROC_INVALIDATEMEMORY_OFFSET (CMD_PROC_BASE_OFFSET + 16) 476 #define CMD_PROC_END_OFFSET CMD_PROC_INVALIDATEMEMORY_OFFSET 477 478 479 #define CMD_NODE_BASE_OFFSET (CMD_PROC_END_OFFSET + 1) 480 #define CMD_NODE_ALLOCATE_OFFSET (CMD_NODE_BASE_OFFSET + 0) 481 #define CMD_NODE_ALLOCMSGBUF_OFFSET (CMD_NODE_BASE_OFFSET + 1) 482 #define CMD_NODE_CHANGEPRIORITY_OFFSET (CMD_NODE_BASE_OFFSET + 2) 483 #define CMD_NODE_CONNECT_OFFSET (CMD_NODE_BASE_OFFSET + 3) 484 #define CMD_NODE_CREATE_OFFSET (CMD_NODE_BASE_OFFSET + 4) 485 #define CMD_NODE_DELETE_OFFSET (CMD_NODE_BASE_OFFSET + 5) 486 #define CMD_NODE_FREEMSGBUF_OFFSET (CMD_NODE_BASE_OFFSET + 6) 487 #define CMD_NODE_GETATTR_OFFSET (CMD_NODE_BASE_OFFSET + 7) 488 #define CMD_NODE_GETMESSAGE_OFFSET (CMD_NODE_BASE_OFFSET + 8) 489 #define CMD_NODE_PAUSE_OFFSET (CMD_NODE_BASE_OFFSET + 9) 490 #define CMD_NODE_PUTMESSAGE_OFFSET (CMD_NODE_BASE_OFFSET + 10) 491 #define CMD_NODE_REGISTERNOTIFY_OFFSET (CMD_NODE_BASE_OFFSET + 11) 492 #define CMD_NODE_RUN_OFFSET (CMD_NODE_BASE_OFFSET + 12) 493 #define CMD_NODE_TERMINATE_OFFSET (CMD_NODE_BASE_OFFSET + 13) 494 #define CMD_NODE_GETUUIDPROPS_OFFSET (CMD_NODE_BASE_OFFSET + 14) 495 #define CMD_NODE_END_OFFSET CMD_NODE_GETUUIDPROPS_OFFSET 496 497 #define CMD_STRM_BASE_OFFSET (CMD_NODE_END_OFFSET + 1) 498 #define CMD_STRM_ALLOCATEBUFFER_OFFSET (CMD_STRM_BASE_OFFSET + 0) 499 #define CMD_STRM_CLOSE_OFFSET (CMD_STRM_BASE_OFFSET + 1) 500 #define CMD_STRM_FREEBUFFER_OFFSET (CMD_STRM_BASE_OFFSET + 2) 501 #define CMD_STRM_GETEVENTHANDLE_OFFSET (CMD_STRM_BASE_OFFSET + 3) 502 #define CMD_STRM_GETINFO_OFFSET (CMD_STRM_BASE_OFFSET + 4) 503 #define CMD_STRM_IDLE_OFFSET (CMD_STRM_BASE_OFFSET + 5) 504 #define CMD_STRM_ISSUE_OFFSET (CMD_STRM_BASE_OFFSET + 6) 505 #define CMD_STRM_OPEN_OFFSET (CMD_STRM_BASE_OFFSET + 7) 506 #define CMD_STRM_RECLAIM_OFFSET (CMD_STRM_BASE_OFFSET + 8) 507 #define CMD_STRM_REGISTERNOTIFY_OFFSET (CMD_STRM_BASE_OFFSET + 9) 508 #define CMD_STRM_SELECT_OFFSET (CMD_STRM_BASE_OFFSET + 10) 509 #define CMD_STRM_END_OFFSET CMD_STRM_SELECT_OFFSET 510 511 /* Communication Memory Manager (UCMM) */ 512 #define CMD_CMM_BASE_OFFSET (CMD_STRM_END_OFFSET + 1) 513 #define CMD_CMM_ALLOCBUF_OFFSET (CMD_CMM_BASE_OFFSET + 0) 514 #define CMD_CMM_FREEBUF_OFFSET (CMD_CMM_BASE_OFFSET + 1) 515 #define CMD_CMM_GETHANDLE_OFFSET (CMD_CMM_BASE_OFFSET + 2) 516 #define CMD_CMM_GETINFO_OFFSET (CMD_CMM_BASE_OFFSET + 3) 517 #define CMD_CMM_END_OFFSET CMD_CMM_GETINFO_OFFSET 518 519 /* MEMRY module offsets */ 520 #define CMD_MEM_BASE_OFFSET (CMD_CMM_END_OFFSET + 1) 521 #define CMD_MEM_ALLOC_OFFSET (CMD_MEM_BASE_OFFSET + 0) 522 #define CMD_MEM_CALLOC_OFFSET (CMD_MEM_BASE_OFFSET + 1) 523 #define CMD_MEM_FREE_OFFSET (CMD_MEM_BASE_OFFSET + 2) 524 #define CMD_MEM_PAGELOCK_OFFSET (CMD_MEM_BASE_OFFSET + 3) 525 #define CMD_MEM_PAGEUNLOCK_OFFSET (CMD_MEM_BASE_OFFSET + 4) 526 #define CMD_MEM_END_OFFSET CMD_MEM_PAGEUNLOCK_OFFSET 527 528 /* UTIL module */ 529 #define CMD_UTIL_BASE_OFFSET (CMD_MEM_END_OFFSET + 1) 530 #define CMD_UTIL_TESTDLL_OFFSET (CMD_UTIL_BASE_OFFSET + 0) 531 #define CMD_UTIL_END_OFFSET CMD_UTIL_TESTDLL_OFFSET 532 533 /* !!! place all command modules before CMD_BASE_END_OFFSET */ 534 #define CMD_BASE_END_OFFSET CMD_UTIL_END_OFFSET 535 536 #endif /* WCDIOCTL_ */ 537