summaryrefslogtreecommitdiff
path: root/shared-core/mach64_irq.c
AgeCommit message (Collapse)Author
2007-07-16drm: remove drmP.h internal typedefsDave Airlie
2005-11-28Assert an MIT copyright on sis_drm.h, since one was lacking and I createdEric Anholt
that particular file. Its contents have changed a good bit since the original sis code, and the original sis code didn't care much about attribution since it routinely disclaims Precision Insight/VA Linux from responsibility. Also, adjust formatting around license headers (have a comment open immediately before the "Copyright" line, not as a runon of any previous comments) for automatic processing into FreeBSD, where /*- is used to signal the beginning of license headers for automatic compilation of license lists.
2004-09-30Lindent of core build. Drivers checked for no binary diffs. A few filesJon Smirl
weren't Lindent's because their comments didn't convert very well. A bunch of other minor clean up with no code implact included.
2004-09-27First check in for DRM that splits core from personality modulesJon Smirl
2004-08-24Merged drmfntbl-0-0-2Dave Airlie
2004-04-12Add mach64 to the trunkDave Airlie
7'>107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
/**************************************************************************
 * 
 * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA.
 * All Rights Reserved.
 * 
 * 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, sub license, 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 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 NON-INFRINGEMENT. IN NO EVENT SHALL
 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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.
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 * 
 * 
 **************************************************************************/

#ifndef _XF86MM_H_
#define _XF86MM_H_
#include <stddef.h>
#include <stdint.h>
#include "drm.h"

/*
 * Note on multithreaded applications using this interface.
 * Libdrm is not threadsafe, so common buffer, TTM, and fence objects need to
 * be protected using an external mutex.
 *
 * Note: Don't protect the following functions, as it may lead to deadlocks:
 * drmBOUnmap().
 * The kernel is synchronizing and refcounting buffer maps. 
 * User space only needs to refcount object usage within the same application.
 */


/*
 * List macros heavily inspired by the Linux kernel
 * list handling. No list looping yet.
 */

typedef struct _drmMMListHead
{
    struct _drmMMListHead *prev;
    struct _drmMMListHead *next;
} drmMMListHead;

#define DRMINITLISTHEAD(__item)		       \
  do{					       \
    (__item)->prev = (__item);		       \
    (__item)->next = (__item);		       \
  } while (0)

#define DRMLISTADD(__item, __list)		\
  do {						\
    (__item)->prev = (__list);			\
    (__item)->next = (__list)->next;		\
    (__list)->next->prev = (__item);		\
    (__list)->next = (__item);			\
  } while (0)

#define DRMLISTADDTAIL(__item, __list)		\
  do {						\
    (__item)->next = (__list);			\
    (__item)->prev = (__list)->prev;		\
    (__list)->prev->next = (__item);		\
    (__list)->prev = (__item);			\
  } while(0)

#define DRMLISTDEL(__item)			\
  do {						\
    (__item)->prev->next = (__item)->next;	\
    (__item)->next->prev = (__item)->prev;	\
  } while(0)

#define DRMLISTDELINIT(__item)			\
  do {						\
    (__item)->prev->next = (__item)->next;	\
    (__item)->next->prev = (__item)->prev;	\
    (__item)->next = (__item);			\
    (__item)->prev = (__item);			\
  } while(0)

#define DRMLISTENTRY(__type, __item, __field)   \
    ((__type *)(((char *) (__item)) - offsetof(__type, __field)))

#define DRMLISTEMPTY(__item) ((__item)->next == (__item))

#define DRMLISTFOREACHSAFE(__item, __temp, __list)			\
	for ((__item) = (__list)->next, (__temp) = (__item)->next;	\
	     (__item) != (__list);					\
	     (__item) = (__temp), (__temp) = (__item)->next)

#define DRMLISTFOREACHSAFEREVERSE(__item, __temp, __list)		\
	for ((__item) = (__list)->prev, (__temp) = (__item)->prev;	\
	     (__item) != (__list);					\
	     (__item) = (__temp), (__temp) = (__item)->prev)

typedef struct _drmFence
{
    unsigned handle;
    int fence_class;
    unsigned type; 
    unsigned flags;
    unsigned signaled;
    uint32_t sequence;
    unsigned pad[4]; /* for future expansion */
} drmFence;

typedef struct _drmBO
{
    unsigned handle;
    uint64_t mapHandle;
    uint64_t flags;
    uint64_t proposedFlags;
    unsigned mapFlags;
    unsigned long size;
    unsigned long offset;
    unsigned long start;
    unsigned replyFlags;
    unsigned fenceFlags;
    unsigned pageAlignment;
    unsigned tileInfo;
    unsigned hwTileStride;
    unsigned desiredTileStride;
    void *virtual;
    void *mapVirtual;
    int mapCount;
    unsigned pad[8];     /* for future expansion */
} drmBO;

/*
 * Fence functions.
 */

extern int drmFenceCreate(int fd, unsigned flags, int fence_class,
                          unsigned type, drmFence *fence);
extern int drmFenceReference(int fd, unsigned handle, drmFence *fence);
extern int drmFenceUnreference(int fd, const drmFence *fence);
extern int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type);
extern int drmFenceSignaled(int fd, drmFence *fence, 
                            unsigned fenceType, int *signaled);
extern int drmFenceWait(int fd, unsigned flags, drmFence *fence, 
                        unsigned flush_type);
extern int drmFenceEmit(int fd, unsigned flags, drmFence *fence, 
                        unsigned emit_type);
extern int drmFenceBuffers(int fd, unsigned flags, uint32_t fence_class, drmFence *fence);


/*
 * Buffer object functions.
 */

extern int drmBOCreate(int fd, unsigned long size,
		       unsigned pageAlignment, void *user_buffer,
		       uint64_t mask, unsigned hint, drmBO *buf);
extern int drmBOReference(int fd, unsigned handle, drmBO *buf);
extern int drmBOUnreference(int fd, drmBO *buf);
extern int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
		    void **address);
extern int drmBOUnmap(int fd, drmBO *buf);
extern int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle);
extern int drmBOInfo(int fd, drmBO *buf);
extern int drmBOBusy(int fd, drmBO *buf, int *busy);

extern int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint);

/*
 * Initialization functions.
 */

extern int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
		     unsigned memType);
extern int drmMMTakedown(int fd, unsigned memType);
extern int drmMMLock(int fd, unsigned memType, int lockBM, int ignoreNoEvict);
extern int drmMMUnlock(int fd, unsigned memType, int unlockBM);
extern int drmMMInfo(int fd, unsigned memType, uint64_t *size);
extern int drmBOSetStatus(int fd, drmBO *buf, 
			  uint64_t flags, uint64_t mask,
			  unsigned int hint, 
			  unsigned int desired_tile_stride,
			  unsigned int tile_info);
extern int drmBOVersion(int fd, unsigned int *major,
			unsigned int *minor,
			unsigned int *patchlevel);


#endif