1821b3e2302a59332f96767b54040720dc0b83a13Vinson Lee#include <stdio.h>
22737350157cf048b436d7b64d420881ff6df9223Vinson Lee#include <sys/ioctl.h>
32737350157cf048b436d7b64d420881ff6df9223Vinson Lee
42737350157cf048b436d7b64d420881ff6df9223Vinson Lee#include "i915_drm.h"
5935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
6c7015877beedd9831402755dbc58afddcbbd5339Jakob Bornecrantz#include "state_tracker/drm_driver.h"
7935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
8bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz#include "i915_drm_winsys.h"
9c7015877beedd9831402755dbc58afddcbbd5339Jakob Bornecrantz#include "i915_drm_public.h"
10935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz#include "util/u_memory.h"
11935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
12935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
13935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz/*
14935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz * Helper functions
15935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz */
16935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
17935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
18935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantzstatic void
192737350157cf048b436d7b64d420881ff6df9223Vinson Leei915_drm_get_device_id(int fd, unsigned int *device_id)
20935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz{
210fbb64a52931ba5871aa2c5eb01b81d391f678d1Daniel Vetter   int ret;
220fbb64a52931ba5871aa2c5eb01b81d391f678d1Daniel Vetter   struct drm_i915_getparam gp;
230fbb64a52931ba5871aa2c5eb01b81d391f678d1Daniel Vetter
240fbb64a52931ba5871aa2c5eb01b81d391f678d1Daniel Vetter   gp.param = I915_PARAM_CHIPSET_ID;
252737350157cf048b436d7b64d420881ff6df9223Vinson Lee   gp.value = (int *)device_id;
260fbb64a52931ba5871aa2c5eb01b81d391f678d1Daniel Vetter
270fbb64a52931ba5871aa2c5eb01b81d391f678d1Daniel Vetter   ret = ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp));
280fbb64a52931ba5871aa2c5eb01b81d391f678d1Daniel Vetter   assert(ret == 0);
29935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz}
30935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
31935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantzstatic void
32bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzi915_drm_winsys_destroy(struct i915_winsys *iws)
33935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz{
34bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_winsys *idws = i915_drm_winsys(iws);
35935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
36c8fca58d9d5b3f25cb1ac2056ac2b437b79c04eeDaniel Vetter   drm_intel_bufmgr_destroy(idws->gem_manager);
37935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
38935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   FREE(idws);
39935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz}
40935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
41c7015877beedd9831402755dbc58afddcbbd5339Jakob Bornecrantzstruct i915_winsys *
42c7015877beedd9831402755dbc58afddcbbd5339Jakob Bornecrantzi915_drm_winsys_create(int drmFD)
43935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz{
44bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_winsys *idws;
45935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   unsigned int deviceID;
46935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
47bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   idws = CALLOC_STRUCT(i915_drm_winsys);
48935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   if (!idws)
49935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz      return NULL;
50935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
512737350157cf048b436d7b64d420881ff6df9223Vinson Lee   i915_drm_get_device_id(drmFD, &deviceID);
52935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
53bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   i915_drm_winsys_init_batchbuffer_functions(idws);
54bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   i915_drm_winsys_init_buffer_functions(idws);
55bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   i915_drm_winsys_init_fence_functions(idws);
56935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
57935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   idws->fd = drmFD;
58835f5a65a11ae9ca9f4b36ceb6656c77041ec901Jakob Bornecrantz   idws->base.pci_id = deviceID;
59935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   idws->max_batch_size = 16 * 4096;
60935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
61bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   idws->base.destroy = i915_drm_winsys_destroy;
62935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
63c8fca58d9d5b3f25cb1ac2056ac2b437b79c04eeDaniel Vetter   idws->gem_manager = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size);
64c8fca58d9d5b3f25cb1ac2056ac2b437b79c04eeDaniel Vetter   drm_intel_bufmgr_gem_enable_reuse(idws->gem_manager);
65135b083461f8a5a220d86f57af018f6f0316d2bbDaniel Vetter   drm_intel_bufmgr_gem_enable_fenced_relocs(idws->gem_manager);
66935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
67095e99ddf6187aacf520944dabababdfd7b9a974Jakob Bornecrantz   idws->dump_cmd = debug_get_bool_option("I915_DUMP_CMD", FALSE);
68e20c3255e29b9f94840d1f23439ab29060c94e3fDaniel Vetter   idws->dump_raw_file = debug_get_option("I915_DUMP_RAW_FILE", NULL);
69095e99ddf6187aacf520944dabababdfd7b9a974Jakob Bornecrantz   idws->send_cmd = !debug_get_bool_option("I915_NO_HW", FALSE);
70935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
71c7015877beedd9831402755dbc58afddcbbd5339Jakob Bornecrantz   return &idws->base;
72935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz}
73