1 #ifndef __NOUVEAU_LIBDRM_PRIVATE_H__ 2 #define __NOUVEAU_LIBDRM_PRIVATE_H__ 3 4 #include <stdio.h> 5 6 #include <libdrm_macros.h> 7 #include <xf86drm.h> 8 #include <xf86atomic.h> 9 #include <pthread.h> 10 #include "nouveau_drm.h" 11 12 #include "nouveau.h" 13 14 /* 15 * 0x00000001 dump all pushbuffers 16 * 0x00000002 submit pushbuffers synchronously 17 * 0x80000000 if compiled with SIMULATE return -EINVAL for all pb submissions 18 */ 19 drm_private extern uint32_t nouveau_debug; 20 drm_private extern FILE *nouveau_out; 21 #define dbg_on(lvl) (nouveau_debug & (1 << lvl)) 22 #define dbg(lvl, fmt, args...) do { \ 23 if (dbg_on((lvl))) \ 24 fprintf(nouveau_out, "nouveau: "fmt, ##args); \ 25 } while(0) 26 #define err(fmt, args...) fprintf(nouveau_out, "nouveau: "fmt, ##args) 27 28 struct nouveau_client_kref { 29 struct drm_nouveau_gem_pushbuf_bo *kref; 30 struct nouveau_pushbuf *push; 31 }; 32 33 struct nouveau_client_priv { 34 struct nouveau_client base; 35 struct nouveau_client_kref *kref; 36 unsigned kref_nr; 37 }; 38 39 static inline struct nouveau_client_priv * 40 nouveau_client(struct nouveau_client *client) 41 { 42 return (struct nouveau_client_priv *)client; 43 } 44 45 static inline struct drm_nouveau_gem_pushbuf_bo * 46 cli_kref_get(struct nouveau_client *client, struct nouveau_bo *bo) 47 { 48 struct nouveau_client_priv *pcli = nouveau_client(client); 49 struct drm_nouveau_gem_pushbuf_bo *kref = NULL; 50 if (pcli->kref_nr > bo->handle) 51 kref = pcli->kref[bo->handle].kref; 52 return kref; 53 } 54 55 static inline struct nouveau_pushbuf * 56 cli_push_get(struct nouveau_client *client, struct nouveau_bo *bo) 57 { 58 struct nouveau_client_priv *pcli = nouveau_client(client); 59 struct nouveau_pushbuf *push = NULL; 60 if (pcli->kref_nr > bo->handle) 61 push = pcli->kref[bo->handle].push; 62 return push; 63 } 64 65 static inline void 66 cli_kref_set(struct nouveau_client *client, struct nouveau_bo *bo, 67 struct drm_nouveau_gem_pushbuf_bo *kref, 68 struct nouveau_pushbuf *push) 69 { 70 struct nouveau_client_priv *pcli = nouveau_client(client); 71 if (pcli->kref_nr <= bo->handle) { 72 pcli->kref = realloc(pcli->kref, 73 sizeof(*pcli->kref) * bo->handle * 2); 74 while (pcli->kref_nr < bo->handle * 2) { 75 pcli->kref[pcli->kref_nr].kref = NULL; 76 pcli->kref[pcli->kref_nr].push = NULL; 77 pcli->kref_nr++; 78 } 79 } 80 pcli->kref[bo->handle].kref = kref; 81 pcli->kref[bo->handle].push = push; 82 } 83 84 struct nouveau_bo_priv { 85 struct nouveau_bo base; 86 struct nouveau_list head; 87 atomic_t refcnt; 88 uint64_t map_handle; 89 uint32_t name; 90 uint32_t access; 91 }; 92 93 static inline struct nouveau_bo_priv * 94 nouveau_bo(struct nouveau_bo *bo) 95 { 96 return (struct nouveau_bo_priv *)bo; 97 } 98 99 struct nouveau_device_priv { 100 struct nouveau_device base; 101 int close; 102 pthread_mutex_t lock; 103 struct nouveau_list bo_list; 104 uint32_t *client; 105 int nr_client; 106 bool have_bo_usage; 107 int gart_limit_percent, vram_limit_percent; 108 }; 109 110 static inline struct nouveau_device_priv * 111 nouveau_device(struct nouveau_device *dev) 112 { 113 return (struct nouveau_device_priv *)dev; 114 } 115 116 int 117 nouveau_device_open_existing(struct nouveau_device **, int, int, drm_context_t); 118 119 /* abi16.c */ 120 drm_private bool abi16_object(struct nouveau_object *, int (**)(struct nouveau_object *)); 121 drm_private void abi16_delete(struct nouveau_object *); 122 drm_private int abi16_sclass(struct nouveau_object *, struct nouveau_sclass **); 123 drm_private void abi16_bo_info(struct nouveau_bo *, struct drm_nouveau_gem_info *); 124 drm_private int abi16_bo_init(struct nouveau_bo *, uint32_t alignment, 125 union nouveau_bo_config *); 126 127 #endif 128