| // SPDX-License-Identifier: MIT |
| /* |
| * Copyright © 2019 Intel Corporation |
| */ |
| |
| #include "i915_active.h" |
| #include "intel_context.h" |
| #include "intel_context_param.h" |
| #include "intel_ring.h" |
| |
| int intel_context_set_ring_size(struct intel_context *ce, long sz) |
| { |
| int err; |
| |
| if (intel_context_lock_pinned(ce)) |
| return -EINTR; |
| |
| err = i915_active_wait(&ce->active); |
| if (err < 0) |
| goto unlock; |
| |
| if (intel_context_is_pinned(ce)) { |
| err = -EBUSY; /* In active use, come back later! */ |
| goto unlock; |
| } |
| |
| if (test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) { |
| struct intel_ring *ring; |
| |
| /* Replace the existing ringbuffer */ |
| ring = intel_engine_create_ring(ce->engine, sz); |
| if (IS_ERR(ring)) { |
| err = PTR_ERR(ring); |
| goto unlock; |
| } |
| |
| intel_ring_put(ce->ring); |
| ce->ring = ring; |
| |
| /* Context image will be updated on next pin */ |
| } else { |
| ce->ring = __intel_context_ring_size(sz); |
| } |
| |
| unlock: |
| intel_context_unlock_pinned(ce); |
| return err; |
| } |
| |
| long intel_context_get_ring_size(struct intel_context *ce) |
| { |
| long sz = (unsigned long)READ_ONCE(ce->ring); |
| |
| if (test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) { |
| if (intel_context_lock_pinned(ce)) |
| return -EINTR; |
| |
| sz = ce->ring->size; |
| intel_context_unlock_pinned(ce); |
| } |
| |
| return sz; |
| } |