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 intel_context_set_ring_size(struct intel_context * ce,long sz)11int 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 intel_context_get_ring_size(struct intel_context * ce)50long 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 } 64