diff options
author | Ben Skeggs | 2015-11-23 18:45:01 -0600 |
---|---|---|
committer | Ben Skeggs | 2015-12-21 21:22:24 -0600 |
commit | cdf9029f5f2d3d7c7b77eda2a5d3ef3b44a82cdf (patch) | |
tree | 639af381476cbe6462aab6bc021f98f9d5114b34 /nouveau | |
parent | b845d61de93c762f73463a67a634ecb1ae8c4c35 (diff) | |
download | external-libdrm-cdf9029f5f2d3d7c7b77eda2a5d3ef3b44a82cdf.tar.gz external-libdrm-cdf9029f5f2d3d7c7b77eda2a5d3ef3b44a82cdf.tar.xz external-libdrm-cdf9029f5f2d3d7c7b77eda2a5d3ef3b44a82cdf.zip |
nouveau: stack legacy nouveau_device on top of nouveau_drm
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Tested-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Diffstat (limited to 'nouveau')
-rw-r--r-- | nouveau/nouveau.c | 46 |
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, | |||
244 | int | 244 | int |
245 | nouveau_device_wrap(int fd, int close, struct nouveau_device **pdev) | 245 | nouveau_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 | } |