linux/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: MIT */
   2/*
   3 * Copyright © 2019 Intel Corporation
   4 */
   5
   6#ifndef __INTEL_BREADCRUMBS_TYPES__
   7#define __INTEL_BREADCRUMBS_TYPES__
   8
   9#include <linux/irq_work.h>
  10#include <linux/list.h>
  11#include <linux/spinlock.h>
  12#include <linux/types.h>
  13
  14/*
  15 * Rather than have every client wait upon all user interrupts,
  16 * with the herd waking after every interrupt and each doing the
  17 * heavyweight seqno dance, we delegate the task (of being the
  18 * bottom-half of the user interrupt) to the first client. After
  19 * every interrupt, we wake up one client, who does the heavyweight
  20 * coherent seqno read and either goes back to sleep (if incomplete),
  21 * or wakes up all the completed clients in parallel, before then
  22 * transferring the bottom-half status to the next client in the queue.
  23 *
  24 * Compared to walking the entire list of waiters in a single dedicated
  25 * bottom-half, we reduce the latency of the first waiter by avoiding
  26 * a context switch, but incur additional coherent seqno reads when
  27 * following the chain of request breadcrumbs. Since it is most likely
  28 * that we have a single client waiting on each seqno, then reducing
  29 * the overhead of waking that client is much preferred.
  30 */
  31struct intel_breadcrumbs {
  32        atomic_t active;
  33
  34        spinlock_t signalers_lock; /* protects the list of signalers */
  35        struct list_head signalers;
  36        struct llist_head signaled_requests;
  37        atomic_t signaler_active;
  38
  39        spinlock_t irq_lock; /* protects the interrupt from hardirq context */
  40        struct irq_work irq_work; /* for use from inside irq_lock */
  41        unsigned int irq_enabled;
  42        bool irq_armed;
  43
  44        /* Not all breadcrumbs are attached to physical HW */
  45        struct intel_engine_cs *irq_engine;
  46};
  47
  48#endif /* __INTEL_BREADCRUMBS_TYPES__ */
  49