drm/i915/adlp: Add ADL-P GuC/HuC firmware files
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / gt / intel_context_param.c
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2019 Intel Corporation
4  */
5
6 #include "i915_active.h"
7 #include "intel_context.h"
8 #include "intel_context_param.h"
9 #include "intel_ring.h"
10
11 int intel_context_set_ring_size(struct intel_context *ce, long sz)
12 {
13         int err;
14
15         if (intel_context_lock_pinned(ce))
16                 return -EINTR;
17
18         err = i915_active_wait(&ce->active);
19         if (err < 0)
20                 goto unlock;
21
22         if (intel_context_is_pinned(ce)) {
23                 err = -EBUSY; /* In active use, come back later! */
24                 goto unlock;
25         }
26
27         if (test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) {
28                 struct intel_ring *ring;
29
30                 /* Replace the existing ringbuffer */
31                 ring = intel_engine_create_ring(ce->engine, sz);
32                 if (IS_ERR(ring)) {
33                         err = PTR_ERR(ring);
34                         goto unlock;
35                 }
36
37                 intel_ring_put(ce->ring);
38                 ce->ring = ring;
39
40                 /* Context image will be updated on next pin */
41         } else {
42                 ce->ring = __intel_context_ring_size(sz);
43         }
44
45 unlock:
46         intel_context_unlock_pinned(ce);
47         return err;
48 }
49
50 long intel_context_get_ring_size(struct intel_context *ce)
51 {
52         long sz = (unsigned long)READ_ONCE(ce->ring);
53
54         if (test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) {
55                 if (intel_context_lock_pinned(ce))
56                         return -EINTR;
57
58                 sz = ce->ring->size;
59                 intel_context_unlock_pinned(ce);
60         }
61
62         return sz;
63 }