#ifndef __NOUVEAU_LIBDRM_PRIVATE_H__ #define __NOUVEAU_LIBDRM_PRIVATE_H__ #include <libdrm_macros.h> #include <xf86drm.h> #include <xf86atomic.h> #include <pthread.h> #include "nouveau_drm.h" #include "nouveau.h" #ifdef DEBUG drm_private uint32_t nouveau_debug; #define dbg_on(lvl) (nouveau_debug & (1 << lvl)) #define dbg(lvl, fmt, args...) do { \ if (dbg_on((lvl))) \ fprintf(stderr, "nouveau: "fmt, ##args); \ } while(0) #else #define dbg_on(lvl) (0) #define dbg(lvl, fmt, args...) #endif #define err(fmt, args...) fprintf(stderr, "nouveau: "fmt, ##args) struct nouveau_client_kref { struct drm_nouveau_gem_pushbuf_bo *kref; struct nouveau_pushbuf *push; }; struct nouveau_client_priv { struct nouveau_client base; struct nouveau_client_kref *kref; unsigned kref_nr; }; static inline struct nouveau_client_priv * nouveau_client(struct nouveau_client *client) { return (struct nouveau_client_priv *)client; } static inline struct drm_nouveau_gem_pushbuf_bo * cli_kref_get(struct nouveau_client *client, struct nouveau_bo *bo) { struct nouveau_client_priv *pcli = nouveau_client(client); struct drm_nouveau_gem_pushbuf_bo *kref = NULL; if (pcli->kref_nr > bo->handle) kref = pcli->kref[bo->handle].kref; return kref; } static inline struct nouveau_pushbuf * cli_push_get(struct nouveau_client *client, struct nouveau_bo *bo) { struct nouveau_client_priv *pcli = nouveau_client(client); struct nouveau_pushbuf *push = NULL; if (pcli->kref_nr > bo->handle) push = pcli->kref[bo->handle].push; return push; } static inline void cli_kref_set(struct nouveau_client *client, struct nouveau_bo *bo, struct drm_nouveau_gem_pushbuf_bo *kref, struct nouveau_pushbuf *push) { struct nouveau_client_priv *pcli = nouveau_client(client); if (pcli->kref_nr <= bo->handle) { pcli->kref = realloc(pcli->kref, sizeof(*pcli->kref) * bo->handle * 2); while (pcli->kref_nr < bo->handle * 2) { pcli->kref[pcli->kref_nr].kref = NULL; pcli->kref[pcli->kref_nr].push = NULL; pcli->kref_nr++; } } pcli->kref[bo->handle].kref = kref; pcli->kref[bo->handle].push = push; } struct nouveau_bo_priv { struct nouveau_bo base; struct nouveau_list head; atomic_t refcnt; uint64_t map_handle; uint32_t name; uint32_t access; }; static inline struct nouveau_bo_priv * nouveau_bo(struct nouveau_bo *bo) { return (struct nouveau_bo_priv *)bo; } struct nouveau_device_priv { struct nouveau_device base; int close; pthread_mutex_t lock; struct nouveau_list bo_list; uint32_t *client; int nr_client; bool have_bo_usage; int gart_limit_percent, vram_limit_percent; }; static inline struct nouveau_device_priv * nouveau_device(struct nouveau_device *dev) { return (struct nouveau_device_priv *)dev; } int nouveau_device_open_existing(struct nouveau_device **, int, int, drm_context_t); /* abi16.c */ drm_private bool abi16_object(struct nouveau_object *, int (**)(struct nouveau_object *)); drm_private void abi16_delete(struct nouveau_object *); drm_private int abi16_sclass(struct nouveau_object *, struct nouveau_sclass **); drm_private void abi16_bo_info(struct nouveau_bo *, struct drm_nouveau_gem_info *); drm_private int abi16_bo_init(struct nouveau_bo *, uint32_t alignment, union nouveau_bo_config *); #endif