183827f40a2d97261528087331b0bee6ce2cf27c5root/**************************************************************************
283827f40a2d97261528087331b0bee6ce2cf27c5root *
383827f40a2d97261528087331b0bee6ce2cf27c5root * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
483827f40a2d97261528087331b0bee6ce2cf27c5root * All Rights Reserved.
583827f40a2d97261528087331b0bee6ce2cf27c5root * Copyright 2009 Vmware, Inc., Palo Alto, CA., USA
683827f40a2d97261528087331b0bee6ce2cf27c5root * All Rights Reserved.
783827f40a2d97261528087331b0bee6ce2cf27c5root *
883827f40a2d97261528087331b0bee6ce2cf27c5root * Permission is hereby granted, free of charge, to any person obtaining a
983827f40a2d97261528087331b0bee6ce2cf27c5root * copy of this software and associated documentation files (the
1083827f40a2d97261528087331b0bee6ce2cf27c5root * "Software"), to deal in the Software without restriction, including
1183827f40a2d97261528087331b0bee6ce2cf27c5root * without limitation the rights to use, copy, modify, merge, publish,
1283827f40a2d97261528087331b0bee6ce2cf27c5root * distribute, sub license, and/or sell copies of the Software, and to
1383827f40a2d97261528087331b0bee6ce2cf27c5root * permit persons to whom the Software is furnished to do so, subject to
1483827f40a2d97261528087331b0bee6ce2cf27c5root * the following conditions:
1583827f40a2d97261528087331b0bee6ce2cf27c5root *
1683827f40a2d97261528087331b0bee6ce2cf27c5root * The above copyright notice and this permission notice (including the
1783827f40a2d97261528087331b0bee6ce2cf27c5root * next paragraph) shall be included in all copies or substantial portions
1883827f40a2d97261528087331b0bee6ce2cf27c5root * of the Software.
1983827f40a2d97261528087331b0bee6ce2cf27c5root *
2083827f40a2d97261528087331b0bee6ce2cf27c5root * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2183827f40a2d97261528087331b0bee6ce2cf27c5root * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2283827f40a2d97261528087331b0bee6ce2cf27c5root * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
2383827f40a2d97261528087331b0bee6ce2cf27c5root * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
2483827f40a2d97261528087331b0bee6ce2cf27c5root * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2583827f40a2d97261528087331b0bee6ce2cf27c5root * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2683827f40a2d97261528087331b0bee6ce2cf27c5root * USE OR OTHER DEALINGS IN THE SOFTWARE.
2783827f40a2d97261528087331b0bee6ce2cf27c5root *
2883827f40a2d97261528087331b0bee6ce2cf27c5root **************************************************************************/
2983827f40a2d97261528087331b0bee6ce2cf27c5root/*
3083827f40a2d97261528087331b0bee6ce2cf27c5root * Authors: Thomas Hellstr�m <thomas-at-tungstengraphics-dot-com>
3183827f40a2d97261528087331b0bee6ce2cf27c5root *          Keith Whitwell <keithw-at-tungstengraphics-dot-com>
3283827f40a2d97261528087331b0bee6ce2cf27c5root */
3383827f40a2d97261528087331b0bee6ce2cf27c5root
3483827f40a2d97261528087331b0bee6ce2cf27c5root#ifndef _WSBM_MANAGER_H_
3583827f40a2d97261528087331b0bee6ce2cf27c5root#define _WSBM_MANAGER_H_
3683827f40a2d97261528087331b0bee6ce2cf27c5root#include "wsbm_fencemgr.h"
3783827f40a2d97261528087331b0bee6ce2cf27c5root#include "wsbm_util.h"
3883827f40a2d97261528087331b0bee6ce2cf27c5root#include "wsbm_driver.h"
3983827f40a2d97261528087331b0bee6ce2cf27c5root
4083827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_VERSION_MAJOR 1
4183827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_VERSION_MINOR 1
4283827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_VERSION_PL 0
4383827f40a2d97261528087331b0bee6ce2cf27c5root
4483827f40a2d97261528087331b0bee6ce2cf27c5rootstruct _WsbmFenceObject;
4583827f40a2d97261528087331b0bee6ce2cf27c5rootstruct _WsbmBufferObject;
4683827f40a2d97261528087331b0bee6ce2cf27c5rootstruct _WsbmBufferPool;
4783827f40a2d97261528087331b0bee6ce2cf27c5rootstruct _WsbmBufferList;
4883827f40a2d97261528087331b0bee6ce2cf27c5root
4983827f40a2d97261528087331b0bee6ce2cf27c5root/*
5083827f40a2d97261528087331b0bee6ce2cf27c5root * These flags mimics the TTM closely, but since
5183827f40a2d97261528087331b0bee6ce2cf27c5root * this library is not dependant on TTM, we need to
5283827f40a2d97261528087331b0bee6ce2cf27c5root * replicate them here, and if there is a discrepancy,
5383827f40a2d97261528087331b0bee6ce2cf27c5root * that needs to be resolved in the buffer pool using
5483827f40a2d97261528087331b0bee6ce2cf27c5root * the TTM flags.
5583827f40a2d97261528087331b0bee6ce2cf27c5root */
5683827f40a2d97261528087331b0bee6ce2cf27c5root
5783827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_MASK_MEM         0x0000FFFF
5883827f40a2d97261528087331b0bee6ce2cf27c5root
5983827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_SYSTEM      (1 << 0)
6083827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_TT          (1 << 1)
6183827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_VRAM        (1 << 2)
6283827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_PRIV0       (1 << 3)
6383827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_SWAPPED     (1 << 15)
6483827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_CACHED      (1 << 16)
6583827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_UNCACHED    (1 << 17)
6683827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_WC          (1 << 18)
6783827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_SHARED      (1 << 20)
6883827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_PL_FLAG_NO_EVICT    (1 << 21)
6983827f40a2d97261528087331b0bee6ce2cf27c5root
7083827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_ACCESS_READ         (1 << 0)
7183827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_ACCESS_WRITE        (1 << 1)
7283827f40a2d97261528087331b0bee6ce2cf27c5root
7383827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_SYNCCPU_READ        WSBM_ACCESS_READ
7483827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_SYNCCPU_WRITE       WSBM_ACCESS_WRITE
7583827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_SYNCCPU_DONT_BLOCK  (1 << 2)
7683827f40a2d97261528087331b0bee6ce2cf27c5root#define WSBM_SYNCCPU_TRY_CACHED  (1 << 3)
7783827f40a2d97261528087331b0bee6ce2cf27c5root
7883827f40a2d97261528087331b0bee6ce2cf27c5rootextern void *wsbmBOMap(struct _WsbmBufferObject *buf, unsigned mode);
7983827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmBOUnmap(struct _WsbmBufferObject *buf);
8083827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOSyncForCpu(struct _WsbmBufferObject *buf, unsigned mode);
8183827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmBOReleaseFromCpu(struct _WsbmBufferObject *buf,
8283827f40a2d97261528087331b0bee6ce2cf27c5root				 unsigned mode);
8383827f40a2d97261528087331b0bee6ce2cf27c5root
8483827f40a2d97261528087331b0bee6ce2cf27c5rootextern unsigned long wsbmBOOffsetHint(struct _WsbmBufferObject *buf);
8583827f40a2d97261528087331b0bee6ce2cf27c5rootextern unsigned long wsbmBOPoolOffset(struct _WsbmBufferObject *buf);
8683827f40a2d97261528087331b0bee6ce2cf27c5root
8783827f40a2d97261528087331b0bee6ce2cf27c5rootextern uint32_t wsbmBOPlacementHint(struct _WsbmBufferObject *buf);
8883827f40a2d97261528087331b0bee6ce2cf27c5rootextern struct _WsbmBufferObject *wsbmBOReference(struct _WsbmBufferObject
8983827f40a2d97261528087331b0bee6ce2cf27c5root						 *buf);
9083827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmBOUnreference(struct _WsbmBufferObject **p_buf);
9183827f40a2d97261528087331b0bee6ce2cf27c5root
9283827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOData(struct _WsbmBufferObject *r_buf,
9383827f40a2d97261528087331b0bee6ce2cf27c5root		      unsigned size, const void *data,
9483827f40a2d97261528087331b0bee6ce2cf27c5root		      struct _WsbmBufferPool *pool, uint32_t placement);
958acea2d0d04b7aff3fb59bb071cc7a69c47b9929Fei Jiang
968acea2d0d04b7aff3fb59bb071cc7a69c47b9929Fei Jiangextern int wsbmBODataUB(struct _WsbmBufferObject *buf,
978acea2d0d04b7aff3fb59bb071cc7a69c47b9929Fei Jiang            unsigned size, const void *data, struct _WsbmBufferPool *newPool,
98ac747113d4f6739b1462ca7fb40f2091691e209bVinil Cheeramvelil            uint32_t placement, const unsigned long *user_ptr, int fd);
998acea2d0d04b7aff3fb59bb071cc7a69c47b9929Fei Jiang
10083827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOSetStatus(struct _WsbmBufferObject *buf,
10183827f40a2d97261528087331b0bee6ce2cf27c5root			   uint32_t setPlacement, uint32_t clrPlacement);
10283827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOSubData(struct _WsbmBufferObject *buf,
10383827f40a2d97261528087331b0bee6ce2cf27c5root			 unsigned long offset, unsigned long size,
10483827f40a2d97261528087331b0bee6ce2cf27c5root			 const void *data,
10583827f40a2d97261528087331b0bee6ce2cf27c5root			 int (*accelCopy) (struct _WsbmBufferObject *,
10683827f40a2d97261528087331b0bee6ce2cf27c5root					   struct _WsbmBufferObject *));
10783827f40a2d97261528087331b0bee6ce2cf27c5rootextern struct _WsbmBufferObject *wsbmBOClone(struct _WsbmBufferObject *buf,
10883827f40a2d97261528087331b0bee6ce2cf27c5root					     int (*accelCopy) (struct
10983827f40a2d97261528087331b0bee6ce2cf27c5root							       _WsbmBufferObject
11083827f40a2d97261528087331b0bee6ce2cf27c5root							       *,
11183827f40a2d97261528087331b0bee6ce2cf27c5root							       struct
11283827f40a2d97261528087331b0bee6ce2cf27c5root							       _WsbmBufferObject
11383827f40a2d97261528087331b0bee6ce2cf27c5root							       *));
11483827f40a2d97261528087331b0bee6ce2cf27c5root
11583827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOGetSubData(struct _WsbmBufferObject *buf,
11683827f40a2d97261528087331b0bee6ce2cf27c5root			    unsigned long offset, unsigned long size,
11783827f40a2d97261528087331b0bee6ce2cf27c5root			    void *data);
11883827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmGenBuffers(struct _WsbmBufferPool *pool,
11983827f40a2d97261528087331b0bee6ce2cf27c5root			  unsigned n,
12083827f40a2d97261528087331b0bee6ce2cf27c5root			  struct _WsbmBufferObject *buffers[],
12183827f40a2d97261528087331b0bee6ce2cf27c5root			  unsigned alignment, uint32_t placement);
12283827f40a2d97261528087331b0bee6ce2cf27c5root
12383827f40a2d97261528087331b0bee6ce2cf27c5rootstruct _WsbmBufferObject *wsbmBOCreateSimple(struct _WsbmBufferPool *pool,
12483827f40a2d97261528087331b0bee6ce2cf27c5root					     unsigned long size,
12583827f40a2d97261528087331b0bee6ce2cf27c5root					     uint32_t placement,
12683827f40a2d97261528087331b0bee6ce2cf27c5root					     unsigned alignment,
12783827f40a2d97261528087331b0bee6ce2cf27c5root					     size_t extra_size,
12883827f40a2d97261528087331b0bee6ce2cf27c5root					     size_t * offset);
12983827f40a2d97261528087331b0bee6ce2cf27c5root
13083827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmDeleteBuffers(unsigned n,
13183827f40a2d97261528087331b0bee6ce2cf27c5root			      struct _WsbmBufferObject *buffers[]);
13283827f40a2d97261528087331b0bee6ce2cf27c5rootextern struct _WsbmBufferList *wsbmBOCreateList(int target,
13383827f40a2d97261528087331b0bee6ce2cf27c5root						int hasKernelBuffers);
13483827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOResetList(struct _WsbmBufferList *list);
13583827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOAddListItem(struct _WsbmBufferList *list,
13683827f40a2d97261528087331b0bee6ce2cf27c5root			     struct _WsbmBufferObject *buf,
13783827f40a2d97261528087331b0bee6ce2cf27c5root			     uint64_t flags, uint64_t mask, int *itemLoc,
13883827f40a2d97261528087331b0bee6ce2cf27c5root			     struct _ValidateNode **node);
13983827f40a2d97261528087331b0bee6ce2cf27c5root
14083827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmBOFreeList(struct _WsbmBufferList *list);
14183827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOFenceUserList(struct _WsbmBufferList *list,
14283827f40a2d97261528087331b0bee6ce2cf27c5root			       struct _WsbmFenceObject *fence);
14383827f40a2d97261528087331b0bee6ce2cf27c5root
14483827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOUnrefUserList(struct _WsbmBufferList *list);
14583827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOValidateUserList(struct _WsbmBufferList *list);
14683827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOUnvalidateUserList(struct _WsbmBufferList *list);
14783827f40a2d97261528087331b0bee6ce2cf27c5root
14883827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmBOFence(struct _WsbmBufferObject *buf,
14983827f40a2d97261528087331b0bee6ce2cf27c5root			struct _WsbmFenceObject *fence);
15083827f40a2d97261528087331b0bee6ce2cf27c5root
15183827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmPoolTakeDown(struct _WsbmBufferPool *pool);
15283827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOSetReferenced(struct _WsbmBufferObject *buf,
15383827f40a2d97261528087331b0bee6ce2cf27c5root			       unsigned long handle);
15483827f40a2d97261528087331b0bee6ce2cf27c5rootunsigned long wsbmBOSize(struct _WsbmBufferObject *buf);
15583827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmBOWaitIdle(struct _WsbmBufferObject *buf, int lazy);
15683827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmBOOnList(const struct _WsbmBufferObject *buf);
15783827f40a2d97261528087331b0bee6ce2cf27c5root
15883827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmPoolTakeDown(struct _WsbmBufferPool *pool);
15983827f40a2d97261528087331b0bee6ce2cf27c5root
16083827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmReadLockKernelBO(void);
16183827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmReadUnlockKernelBO(void);
16283827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmWriteLockKernelBO(void);
16383827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmWriteUnlockKernelBO(void);
16483827f40a2d97261528087331b0bee6ce2cf27c5root
16583827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmInit(struct _WsbmThreadFuncs *tf, struct _WsbmVNodeFuncs *vf);
16683827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmTakedown(void);
16783827f40a2d97261528087331b0bee6ce2cf27c5rootextern int wsbmIsInitialized(void);
16883827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmCommonDataSet(void *d);
16983827f40a2d97261528087331b0bee6ce2cf27c5rootextern void *wsbmCommonDataGet(void);
17083827f40a2d97261528087331b0bee6ce2cf27c5root
17183827f40a2d97261528087331b0bee6ce2cf27c5rootextern struct _ValidateList *wsbmGetKernelValidateList(struct _WsbmBufferList
17283827f40a2d97261528087331b0bee6ce2cf27c5root						       *list);
17383827f40a2d97261528087331b0bee6ce2cf27c5rootextern struct _ValidateList *wsbmGetUserValidateList(struct _WsbmBufferList
17483827f40a2d97261528087331b0bee6ce2cf27c5root						     *list);
17583827f40a2d97261528087331b0bee6ce2cf27c5root
17683827f40a2d97261528087331b0bee6ce2cf27c5rootextern struct _ValidateNode *validateListNode(void *iterator);
17783827f40a2d97261528087331b0bee6ce2cf27c5rootextern void *validateListIterator(struct _ValidateList *list);
17883827f40a2d97261528087331b0bee6ce2cf27c5rootextern void *validateListNext(struct _ValidateList *list, void *iterator);
17983827f40a2d97261528087331b0bee6ce2cf27c5root
18083827f40a2d97261528087331b0bee6ce2cf27c5rootextern uint32_t wsbmKBufHandle(const struct _WsbmKernelBuf *);
18183827f40a2d97261528087331b0bee6ce2cf27c5rootextern void wsbmUpdateKBuf(struct _WsbmKernelBuf *,
18283827f40a2d97261528087331b0bee6ce2cf27c5root			   uint64_t gpuOffset,
18383827f40a2d97261528087331b0bee6ce2cf27c5root			   uint32_t placement, uint32_t fence_flags);
18483827f40a2d97261528087331b0bee6ce2cf27c5root
18583827f40a2d97261528087331b0bee6ce2cf27c5rootextern struct _WsbmKernelBuf *wsbmKBuf(const struct _WsbmBufferObject *buf);
18683827f40a2d97261528087331b0bee6ce2cf27c5root
18783827f40a2d97261528087331b0bee6ce2cf27c5root#endif
188