1 #include <stdio.h>
2 #include <sys/ioctl.h>
3
4 #include "drm-uapi/i915_drm.h"
5
6 #include "frontend/drm_driver.h"
7
8 #include "i915_drm_winsys.h"
9 #include "i915_drm_public.h"
10 #include "util/u_memory.h"
11
12 #include "intel/common/intel_gem.h"
13
14 /*
15 * Helper functions
16 */
17
18
19 static void
i915_drm_get_device_id(int fd,unsigned int * device_id)20 i915_drm_get_device_id(int fd, unsigned int *device_id)
21 {
22 ASSERTED bool ret = intel_gem_get_param(fd, I915_PARAM_CHIPSET_ID, (int *)device_id);
23 assert(ret);
24 }
25
26 static int
i915_drm_aperture_size(struct i915_winsys * iws)27 i915_drm_aperture_size(struct i915_winsys *iws)
28 {
29 struct i915_drm_winsys *idws = i915_drm_winsys(iws);
30 size_t aper_size, mappable_size;
31
32 drm_intel_get_aperture_sizes(idws->fd, &mappable_size, &aper_size);
33
34 return aper_size >> 20;
35 }
36
37 static void
i915_drm_winsys_destroy(struct i915_winsys * iws)38 i915_drm_winsys_destroy(struct i915_winsys *iws)
39 {
40 struct i915_drm_winsys *idws = i915_drm_winsys(iws);
41
42 drm_intel_bufmgr_destroy(idws->gem_manager);
43
44 FREE(idws);
45 }
46
47 static int
i915_drm_winsys_get_fd(struct i915_winsys * iws)48 i915_drm_winsys_get_fd(struct i915_winsys *iws)
49 {
50 struct i915_drm_winsys *idws = i915_drm_winsys(iws);
51
52 return idws->fd;
53 }
54
55 struct i915_winsys *
i915_drm_winsys_create(int drmFD)56 i915_drm_winsys_create(int drmFD)
57 {
58 struct i915_drm_winsys *idws;
59 unsigned int deviceID = 0;
60
61 idws = CALLOC_STRUCT(i915_drm_winsys);
62 if (!idws)
63 return NULL;
64
65 i915_drm_get_device_id(drmFD, &deviceID);
66
67 i915_drm_winsys_init_batchbuffer_functions(idws);
68 i915_drm_winsys_init_buffer_functions(idws);
69 i915_drm_winsys_init_fence_functions(idws);
70
71 idws->fd = drmFD;
72 idws->base.pci_id = deviceID;
73 idws->max_batch_size = 1 * 4096;
74
75 idws->base.aperture_size = i915_drm_aperture_size;
76 idws->base.destroy = i915_drm_winsys_destroy;
77 idws->base.get_fd = i915_drm_winsys_get_fd;
78
79 idws->gem_manager = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size);
80 drm_intel_bufmgr_gem_enable_reuse(idws->gem_manager);
81 drm_intel_bufmgr_gem_enable_fenced_relocs(idws->gem_manager);
82
83 idws->dump_cmd = debug_get_bool_option("I915_DUMP_CMD", false);
84 idws->dump_raw_file = debug_get_option("I915_DUMP_RAW_FILE", NULL);
85 idws->send_cmd = !debug_get_bool_option("I915_NO_HW", false);
86
87 return &idws->base;
88 }
89