| #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 |