aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'nouveau/nouveau.c')
-rw-r--r--nouveau/nouveau.c46
1 files changed, 21 insertions, 25 deletions
diff --git a/nouveau/nouveau.c b/nouveau/nouveau.c
index 2b163513..d129ae82 100644
--- a/nouveau/nouveau.c
+++ b/nouveau/nouveau.c
@@ -244,39 +244,36 @@ nouveau_device_open_existing(struct nouveau_device **pdev, int close, int fd,
244int 244int
245nouveau_device_wrap(int fd, int close, struct nouveau_device **pdev) 245nouveau_device_wrap(int fd, int close, struct nouveau_device **pdev)
246{ 246{
247 struct nouveau_device_priv *nvdev = calloc(1, sizeof(*nvdev)); 247 struct nouveau_drm *drm;
248 struct nouveau_device *dev = &nvdev->base; 248 struct nouveau_device_priv *nvdev;
249 struct nouveau_device *dev;
249 uint64_t chipset, vram, gart, bousage; 250 uint64_t chipset, vram, gart, bousage;
250 drmVersionPtr ver;
251 int ret; 251 int ret;
252 char *tmp; 252 char *tmp;
253 253
254#ifdef DEBUG 254 if (!(nvdev = calloc(1, sizeof(*nvdev))))
255 debug_init(getenv("NOUVEAU_LIBDRM_DEBUG"));
256#endif
257
258 if (!nvdev)
259 return -ENOMEM; 255 return -ENOMEM;
256 dev = &nvdev->base;
257
260 ret = pthread_mutex_init(&nvdev->lock, NULL); 258 ret = pthread_mutex_init(&nvdev->lock, NULL);
261 if (ret) { 259 if (ret) {
262 free(nvdev); 260 free(nvdev);
263 return ret; 261 return ret;
264 } 262 }
265 263
266 nvdev->base.fd = fd; 264 ret = nouveau_drm_new(fd, &drm);
267 265 if (ret) {
268 ver = drmGetVersion(fd);
269 if (ver) dev->drm_version = (ver->version_major << 24) |
270 (ver->version_minor << 8) |
271 ver->version_patchlevel;
272 drmFreeVersion(ver);
273
274 if ( dev->drm_version != 0x00000010 &&
275 (dev->drm_version < 0x01000000 ||
276 dev->drm_version >= 0x02000000)) {
277 nouveau_device_del(&dev); 266 nouveau_device_del(&dev);
278 return -EINVAL; 267 return ret;
279 } 268 }
269 drm->nvif = false;
270
271 nvdev->base.object.parent = &drm->client;
272 nvdev->base.object.oclass = NOUVEAU_DEVICE_CLASS;
273 nvdev->base.object.length = ~0;
274 nvdev->base.fd = drm->fd;
275 nvdev->base.drm_version = drm->drm_version;
276 nvdev->base.lib_version = drm->lib_version;
280 277
281 ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_CHIPSET_ID, &chipset); 278 ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_CHIPSET_ID, &chipset);
282 if (ret == 0) 279 if (ret == 0)
@@ -305,9 +302,6 @@ nouveau_device_wrap(int fd, int close, struct nouveau_device **pdev)
305 else 302 else
306 nvdev->gart_limit_percent = 80; 303 nvdev->gart_limit_percent = 80;
307 DRMINITLISTHEAD(&nvdev->bo_list); 304 DRMINITLISTHEAD(&nvdev->bo_list);
308 nvdev->base.object.oclass = NOUVEAU_DEVICE_CLASS;
309 nvdev->base.object.length = ~0;
310 nvdev->base.lib_version = 0x01000000;
311 nvdev->base.chipset = chipset; 305 nvdev->base.chipset = chipset;
312 nvdev->base.vram_size = vram; 306 nvdev->base.vram_size = vram;
313 nvdev->base.gart_size = gart; 307 nvdev->base.gart_size = gart;
@@ -337,10 +331,12 @@ nouveau_device_del(struct nouveau_device **pdev)
337{ 331{
338 struct nouveau_device_priv *nvdev = nouveau_device(*pdev); 332 struct nouveau_device_priv *nvdev = nouveau_device(*pdev);
339 if (nvdev) { 333 if (nvdev) {
340 if (nvdev->close) 334 struct nouveau_drm *drm = nouveau_drm(&nvdev->base.object);
341 drmClose(nvdev->base.fd);
342 free(nvdev->client); 335 free(nvdev->client);
336 nouveau_drm_del(&drm);
343 pthread_mutex_destroy(&nvdev->lock); 337 pthread_mutex_destroy(&nvdev->lock);
338 if (nvdev->close)
339 drmClose(nvdev->base.fd);
344 free(nvdev); 340 free(nvdev);
345 *pdev = NULL; 341 *pdev = NULL;
346 } 342 }