summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/nvgpu_common.c
diff options
context:
space:
mode:
authorAlex Waterman <alexw@nvidia.com>2016-11-08 14:28:35 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-01-04 18:53:55 -0500
commit9e2f7d98d4cf2845d3dfea1653f3d6bedd4fb1e6 (patch)
tree5849b8c4f3f120337d945770fc8a73e61873e22a /drivers/gpu/nvgpu/nvgpu_common.c
parent91d977ced46f5db02da077df8703e958c5e2af4e (diff)
gpu: nvgpu: Move deferred interrupt wait code
Move the code that waits for deferred interrupts to nvgpu_common.c and make it global. Also rename that function to use nvgpu_ as the function prefix. Bug 1816516 Bug 1807277 Change-Id: I42c4982ea853af5489051534219bfe8b253c2784 Signed-off-by: Alex Waterman <alexw@nvidia.com> Reviewed-on: http://git-master/r/1250027 (cherry picked from commit cb6fb03e20b08e5c3606ae8a5a9c237bfdf9e7da) Reviewed-on: http://git-master/r/1274475 GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/nvgpu_common.c')
-rw-r--r--drivers/gpu/nvgpu/nvgpu_common.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/nvgpu_common.c b/drivers/gpu/nvgpu/nvgpu_common.c
index a1f4832b..a2673b26 100644
--- a/drivers/gpu/nvgpu/nvgpu_common.c
+++ b/drivers/gpu/nvgpu/nvgpu_common.c
@@ -231,3 +231,42 @@ const struct firmware *nvgpu_request_firmware(struct gk20a *g,
231 231
232 return fw; 232 return fw;
233} 233}
234
235/**
236 * cyclic_delta - Returns delta of cyclic integers a and b.
237 *
238 * @a - First integer
239 * @b - Second integer
240 *
241 * Note: if a is ahead of b, delta is positive.
242 */
243static int cyclic_delta(int a, int b)
244{
245 return a - b;
246}
247
248/**
249 * nvgpu_wait_for_deferred_interrupts - Wait for interrupts to complete
250 *
251 * @g - The GPU to wait on.
252 *
253 * Waits until all interrupt handlers that have been scheduled to run have
254 * completed.
255 */
256void nvgpu_wait_for_deferred_interrupts(struct gk20a *g)
257{
258 int stall_irq_threshold = atomic_read(&g->hw_irq_stall_count);
259 int nonstall_irq_threshold = atomic_read(&g->hw_irq_nonstall_count);
260
261 /* wait until all stalling irqs are handled */
262 wait_event(g->sw_irq_stall_last_handled_wq,
263 cyclic_delta(stall_irq_threshold,
264 atomic_read(&g->sw_irq_stall_last_handled))
265 <= 0);
266
267 /* wait until all non-stalling irqs are handled */
268 wait_event(g->sw_irq_nonstall_last_handled_wq,
269 cyclic_delta(nonstall_irq_threshold,
270 atomic_read(&g->sw_irq_nonstall_last_handled))
271 <= 0);
272}