| /*************************************************************************/ /*! |
| @File |
| @Title Transport Layer internals |
| @Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved |
| @Description Transport Layer header used by TL internally |
| @License Dual MIT/GPLv2 |
| |
| The contents of this file are subject to the MIT license as set out below. |
| |
| Permission is hereby granted, free of charge, to any person obtaining a copy |
| of this software and associated documentation files (the "Software"), to deal |
| in the Software without restriction, including without limitation the rights |
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| copies of the Software, and to permit persons to whom the Software is |
| furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be included in |
| all copies or substantial portions of the Software. |
| |
| Alternatively, the contents of this file may be used under the terms of |
| the GNU General Public License Version 2 ("GPL") in which case the provisions |
| of GPL are applicable instead of those above. |
| |
| If you wish to allow use of your version of this file only under the terms of |
| GPL, and not to allow others to use your version of this file under the terms |
| of the MIT license, indicate your decision by deleting the provisions above |
| and replace them with the notice and other provisions required by GPL as set |
| out in the file called "GPL-COPYING" included in this distribution. If you do |
| not delete the provisions above, a recipient may use your version of this file |
| under the terms of either the MIT license or GPL. |
| |
| This License is also included in this distribution in the file called |
| "MIT-COPYING". |
| |
| EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS |
| PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
| BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
| PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR |
| COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| */ /**************************************************************************/ |
| #ifndef __TLINTERN_H__ |
| #define __TLINTERN_H__ |
| |
| |
| #include "devicemem_typedefs.h" |
| #include "pvrsrv_tlcommon.h" |
| #include "device.h" |
| #include "lock.h" |
| |
| /* Forward declarations */ |
| typedef struct _TL_SNODE_* PTL_SNODE; |
| |
| /*! TL stream structure container. |
| * pbyBuffer holds the circular buffer. |
| * ui32Read points to the beginning of the buffer, ie to where data to |
| * Read begin. |
| * ui32Write points to the end of data that have been committed, ie this is |
| * where new data will be written. |
| * ui32Pending number of bytes reserved in last reserve call which have not |
| * yet been submitted. Therefore these data are not ready to |
| * be transported. |
| * hStreamLock - provides atomic protection for the ui32Pending & ui32Write |
| * members of the structure for when they are checked and/or |
| * updated in the context of a stream writer (producer) |
| * calling DoTLStreamReserve() & TLStreamCommit(). |
| * - Reader context is not multi-threaded, only one client per |
| * stream is allowed. Also note the read context may be in an |
| * ISR which prevents a design where locks can be held in the |
| * AcquireData/ReleaseData() calls. Thus this lock only |
| * protects the stream members from simultaneous writers. |
| * |
| * ui32Read < ui32Write <= ui32Pending |
| * where < and <= operators are overloaded to make sense in a circular way. |
| */ |
| typedef struct _TL_STREAM_ |
| { |
| IMG_CHAR szName[PRVSRVTL_MAX_STREAM_NAME_SIZE]; /*!< String name identifier */ |
| IMG_BOOL bDrop; /*!< Flag: When buffer is full drop new data instead of |
| overwriting older data */ |
| IMG_BOOL bBlock; /*!< Flag: When buffer is full reserve will block until there is |
| enough free space in the buffer to fullfil the request. */ |
| IMG_BOOL bWaitForEmptyOnDestroy; /*!< Flag: On destroying a non empty stream block until |
| stream is drained. */ |
| IMG_BOOL bNoSignalOnCommit; /*!< Flag: Used to avoid the TL signalling waiting consumers |
| that new data is available on every commit. Producers |
| using this flag will need to manually signal when |
| appropriate using the TLStreamSync() API */ |
| |
| void (*pfOnReaderOpenCallback)(void *); /*!< Optional on reader connect callback */ |
| void *pvOnReaderOpenUserData; /*!< On reader connect user data */ |
| void (*pfProducerCallback)(void); /*!< Optional producer callback of type TL_STREAM_SOURCECB */ |
| void *pvProducerUserData; /*!< Producer callback user data */ |
| |
| volatile IMG_UINT32 ui32Read; /*!< Pointer to the beginning of available data */ |
| volatile IMG_UINT32 ui32Write; /*!< Pointer to already committed data which are ready to be |
| copied to user space*/ |
| IMG_UINT32 ui32BufferUt; /*!< Buffer utilisation high watermark, see |
| * TL_BUFFER_UTILIZATION in tlstream.c */ |
| IMG_UINT32 ui32Pending; /*!< Count pending bytes reserved in buffer */ |
| IMG_UINT32 ui32Size; /*!< Buffer size */ |
| IMG_BYTE *pbyBuffer; /*!< Actual data buffer */ |
| |
| PTL_SNODE psNode; /*!< Ptr to parent stream node */ |
| DEVMEM_MEMDESC *psStreamMemDesc; /*!< MemDescriptor used to allocate buffer space through PMR */ |
| |
| IMG_HANDLE hProducerEvent; /*!< Handle to wait on if there is not enough space */ |
| IMG_HANDLE hProducerEventObj; /*!< Handle to signal blocked reserve calls */ |
| |
| POS_LOCK hStreamLock; /*!< Writers Lock for ui32Pending & ui32Write*/ |
| } TL_STREAM, *PTL_STREAM; |
| |
| /* there need to be enough space reserved in the buffer for 2 minimal packets |
| * and it needs to be aligned the same way the buffer is or there will be a |
| * compile error.*/ |
| #define BUFFER_RESERVED_SPACE 2*PVRSRVTL_PACKET_ALIGNMENT |
| |
| /* ensure the space reserved follows the buffer's alignment */ |
| static_assert(!(BUFFER_RESERVED_SPACE&(PVRSRVTL_PACKET_ALIGNMENT-1)), |
| "BUFFER_RESERVED_SPACE must be a multiple of PVRSRVTL_PACKET_ALIGNMENT"); |
| |
| /* Define the largest value that a uint that matches the |
| * PVRSRVTL_PACKET_ALIGNMENT size can hold */ |
| #define MAX_UINT 0xffffFFFF |
| |
| /*! Defines the value used for TL_STREAM.ui32Pending when no reserve is |
| * outstanding on the stream. */ |
| #define NOTHING_PENDING IMG_UINT32_MAX |
| |
| |
| /* |
| * Transport Layer Stream Descriptor types/defs |
| */ |
| typedef struct _TL_STREAM_DESC_ |
| { |
| PTL_SNODE psNode; /*!< Ptr to parent stream node */ |
| IMG_UINT32 ui32Flags; |
| IMG_HANDLE hReadEvent; /*!< For wait call (only used/set in reader descriptors) */ |
| IMG_INT uiRefCount; /*!< Reference count to the SD */ |
| } TL_STREAM_DESC, *PTL_STREAM_DESC; |
| |
| PTL_STREAM_DESC TLMakeStreamDesc(PTL_SNODE f1, IMG_UINT32 f2, IMG_HANDLE f3); |
| |
| #define TL_STREAM_KM_FLAG_MASK 0xFFFF0000 |
| #define TL_STREAM_FLAG_TEST 0x10000000 |
| #define TL_STREAM_FLAG_WRAPREAD 0x00010000 |
| |
| #define TL_STREAM_UM_FLAG_MASK 0x0000FFFF |
| |
| /* |
| * Transport Layer stream list node |
| */ |
| typedef struct _TL_SNODE_ |
| { |
| struct _TL_SNODE_* psNext; /*!< Linked list next element */ |
| IMG_HANDLE hReadEventObj; /*!< Readers 'wait for data' event */ |
| PTL_STREAM psStream; /*!< TL Stream object */ |
| IMG_INT uiWRefCount; /*!< Stream writer reference count */ |
| PTL_STREAM_DESC psRDesc; /*!< Stream reader 0 or ptr only */ |
| PTL_STREAM_DESC psWDesc; /*!< Stream writer 0 or ptr only */ |
| } TL_SNODE; |
| |
| PTL_SNODE TLMakeSNode(IMG_HANDLE f2, TL_STREAM *f3, TL_STREAM_DESC *f4); |
| |
| /* |
| * Transport Layer global top types and variables |
| * Use access function to obtain pointer. |
| * |
| * hTLGDLock - provides atomicity over read/check/write operations and |
| * sequence of operations on uiClientCnt, psHead list of SNODEs and |
| * the immediate members in a list element SNODE structure. |
| * - This larger scope of responsibility for this lock helps avoid |
| * the need for a lock in the SNODE structure. |
| * - Lock held in the client (reader) context when streams are |
| * opened/closed and in the server (writer) context when streams |
| * are created/open/closed. |
| */ |
| typedef struct _TL_GDATA_ |
| { |
| void *psRgxDevNode; /* Device node to use for buffer allocations */ |
| IMG_HANDLE hTLEventObj; /* Global TL signal object, new streams, etc */ |
| |
| IMG_UINT uiClientCnt; /* Counter to track the number of client stream connections. */ |
| PTL_SNODE psHead; /* List of TL streams and associated client handle */ |
| |
| POS_LOCK hTLGDLock; /* Lock for structure AND psHead SNODE list */ |
| } TL_GLOBAL_DATA, *PTL_GLOBAL_DATA; |
| |
| /* |
| * Transport Layer Internal Kernel-Mode Server API |
| */ |
| TL_GLOBAL_DATA* TLGGD(void); /* TLGetGlobalData() */ |
| |
| PVRSRV_ERROR TLInit(PVRSRV_DEVICE_NODE *psDevNode); |
| void TLDeInit(PVRSRV_DEVICE_NODE *psDevNode); |
| |
| PVRSRV_DEVICE_NODE* TLGetGlobalRgxDevice(void); |
| |
| void TLAddStreamNode(PTL_SNODE psAdd); |
| PTL_SNODE TLFindStreamNodeByName(const IMG_CHAR *pszName); |
| PTL_SNODE TLFindStreamNodeByDesc(PTL_STREAM_DESC psDesc); |
| IMG_UINT32 TLDiscoverStreamNodes(const IMG_CHAR *pszNamePattern, |
| IMG_UINT32 *pui32Streams, |
| IMG_UINT32 ui32Max); |
| PTL_SNODE TLFindAndGetStreamNodeByDesc(PTL_STREAM_DESC psDesc); |
| void TLReturnStreamNode(PTL_SNODE psNode); |
| |
| /**************************************************************************************** |
| Function Name : TLTryRemoveStreamAndFreeStreamNode |
| |
| Inputs : PTL_SNODE Pointer to the TL_SNODE whose stream is requested |
| to be removed from TL_GLOBAL_DATA's list |
| |
| Return Value : IMG_TRUE - If the stream was made NULL and this |
| TL_SNODE was removed from the |
| TL_GLOBAL_DATA's list |
| |
| IMG_FALSE - If the stream wasn't made NULL as there |
| is a client connected to this stream |
| |
| Description : If there is no client currently connected to this stream then, |
| This function removes this TL_SNODE from the |
| TL_GLOBAL_DATA's list. The caller is responsible for the |
| cleanup of the TL_STREAM whose TL_SNODE may be removed |
| |
| Otherwise, this function does nothing |
| *****************************************************************************************/ |
| IMG_BOOL TLTryRemoveStreamAndFreeStreamNode(PTL_SNODE psRemove); |
| |
| /***************************************************************************************** |
| Function Name : TLUnrefDescAndTryFreeStreamNode |
| |
| Inputs : PTL_SNODE Pointer to the TL_SNODE whose descriptor is |
| requested to be removed |
| : PTL_STREAM_DESC Pointer to the STREAM_DESC |
| |
| Return Value : IMG_TRUE - If this TL_SNODE was removed from the |
| TL_GLOBAL_DATA's list |
| |
| IMG_FALSE - Otherwise |
| |
| Description : This function removes the stream descriptor from this TL_SNODE |
| and, |
| If there is no writer (producer context) currently bound to this stream, |
| This function removes this TL_SNODE from the |
| TL_GLOBAL_DATA's list. The caller is responsible for the |
| cleanup of the TL_STREAM whose TL_SNODE may be removed |
| ******************************************************************************************/ |
| IMG_BOOL TLUnrefDescAndTryFreeStreamNode(PTL_SNODE psRemove, PTL_STREAM_DESC psSD); |
| |
| /* |
| * Transport Layer stream interface to server part declared here to avoid |
| * circular dependency. |
| */ |
| IMG_UINT32 TLStreamAcquireReadPos(PTL_STREAM psStream, IMG_UINT32* puiReadOffset); |
| void TLStreamAdvanceReadPos(PTL_STREAM psStream, IMG_UINT32 uiReadLen); |
| |
| DEVMEM_MEMDESC* TLStreamGetBufferPointer(PTL_STREAM psStream); |
| IMG_BOOL TLStreamEOS(PTL_STREAM psStream); |
| |
| /**************************************************************************************** |
| Function Name : TLStreamDestroy |
| |
| Inputs : PTL_STREAM Pointer to the TL_STREAM to be destroyed |
| |
| Description : This function performs all the clean-up operations required for |
| destruction of this stream |
| *****************************************************************************************/ |
| void TLStreamDestroy (PTL_STREAM); |
| |
| /* |
| * Test related functions |
| */ |
| PVRSRV_ERROR TUtilsInit (PVRSRV_DEVICE_NODE *psDeviceNode); |
| PVRSRV_ERROR TUtilsDeinit (PVRSRV_DEVICE_NODE *psDeviceNode); |
| |
| |
| #endif /* __TLINTERN_H__ */ |
| /****************************************************************************** |
| End of file (tlintern.h) |
| ******************************************************************************/ |
| |