1 | // SPDX-License-Identifier: MIT |
2 | /* |
3 | * Copyright 2023, Intel Corporation. |
4 | */ |
5 | |
6 | #include "gem/i915_gem_internal.h" |
7 | #include "gem/i915_gem_lmem.h" |
8 | #include "i915_drv.h" |
9 | #include "i915_vma.h" |
10 | #include "intel_display_types.h" |
11 | #include "intel_dsb_buffer.h" |
12 | |
13 | u32 intel_dsb_buffer_ggtt_offset(struct intel_dsb_buffer *dsb_buf) |
14 | { |
15 | return i915_ggtt_offset(vma: dsb_buf->vma); |
16 | } |
17 | |
18 | void intel_dsb_buffer_write(struct intel_dsb_buffer *dsb_buf, u32 idx, u32 val) |
19 | { |
20 | dsb_buf->cmd_buf[idx] = val; |
21 | } |
22 | |
23 | u32 intel_dsb_buffer_read(struct intel_dsb_buffer *dsb_buf, u32 idx) |
24 | { |
25 | return dsb_buf->cmd_buf[idx]; |
26 | } |
27 | |
28 | void intel_dsb_buffer_memset(struct intel_dsb_buffer *dsb_buf, u32 idx, u32 val, size_t size) |
29 | { |
30 | WARN_ON(idx > (dsb_buf->buf_size - size) / sizeof(*dsb_buf->cmd_buf)); |
31 | |
32 | memset(&dsb_buf->cmd_buf[idx], val, size); |
33 | } |
34 | |
35 | bool intel_dsb_buffer_create(struct intel_crtc *crtc, struct intel_dsb_buffer *dsb_buf, size_t size) |
36 | { |
37 | struct drm_i915_private *i915 = to_i915(dev: crtc->base.dev); |
38 | struct drm_i915_gem_object *obj; |
39 | struct i915_vma *vma; |
40 | u32 *buf; |
41 | |
42 | if (HAS_LMEM(i915)) { |
43 | obj = i915_gem_object_create_lmem(i915, PAGE_ALIGN(size), |
44 | I915_BO_ALLOC_CONTIGUOUS); |
45 | if (IS_ERR(ptr: obj)) |
46 | return false; |
47 | } else { |
48 | obj = i915_gem_object_create_internal(i915, PAGE_ALIGN(size)); |
49 | if (IS_ERR(ptr: obj)) |
50 | return false; |
51 | |
52 | i915_gem_object_set_cache_coherency(obj, cache_level: I915_CACHE_NONE); |
53 | } |
54 | |
55 | vma = i915_gem_object_ggtt_pin(obj, NULL, size: 0, alignment: 0, flags: 0); |
56 | if (IS_ERR(ptr: vma)) { |
57 | i915_gem_object_put(obj); |
58 | return false; |
59 | } |
60 | |
61 | buf = i915_gem_object_pin_map_unlocked(obj: vma->obj, type: I915_MAP_WC); |
62 | if (IS_ERR(ptr: buf)) { |
63 | i915_vma_unpin_and_release(p_vma: &vma, I915_VMA_RELEASE_MAP); |
64 | return false; |
65 | } |
66 | |
67 | dsb_buf->vma = vma; |
68 | dsb_buf->cmd_buf = buf; |
69 | dsb_buf->buf_size = size; |
70 | |
71 | return true; |
72 | } |
73 | |
74 | void intel_dsb_buffer_cleanup(struct intel_dsb_buffer *dsb_buf) |
75 | { |
76 | i915_vma_unpin_and_release(p_vma: &dsb_buf->vma, I915_VMA_RELEASE_MAP); |
77 | } |
78 | |
79 | void intel_dsb_buffer_flush_map(struct intel_dsb_buffer *dsb_buf) |
80 | { |
81 | i915_gem_object_flush_map(obj: dsb_buf->vma->obj); |
82 | } |
83 | |