linux/drivers/gpu/drm/msm/msm_ringbuffer.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2013 Red Hat
   4 * Author: Rob Clark <robdclark@gmail.com>
   5 */
   6
   7#ifndef __MSM_RINGBUFFER_H__
   8#define __MSM_RINGBUFFER_H__
   9
  10#include "msm_drv.h"
  11
  12#define rbmemptr(ring, member)  \
  13        ((ring)->memptrs_iova + offsetof(struct msm_rbmemptrs, member))
  14
  15#define rbmemptr_stats(ring, index, member) \
  16        (rbmemptr((ring), stats) + \
  17         ((index) * sizeof(struct msm_gpu_submit_stats)) + \
  18         offsetof(struct msm_gpu_submit_stats, member))
  19
  20struct msm_gpu_submit_stats {
  21        u64 cpcycles_start;
  22        u64 cpcycles_end;
  23        u64 alwayson_start;
  24        u64 alwayson_end;
  25};
  26
  27#define MSM_GPU_SUBMIT_STATS_COUNT 64
  28
  29struct msm_rbmemptrs {
  30        volatile uint32_t rptr;
  31        volatile uint32_t fence;
  32
  33        volatile struct msm_gpu_submit_stats stats[MSM_GPU_SUBMIT_STATS_COUNT];
  34        volatile u64 ttbr0;
  35};
  36
  37struct msm_ringbuffer {
  38        struct msm_gpu *gpu;
  39        int id;
  40        struct drm_gem_object *bo;
  41        uint32_t *start, *end, *cur, *next;
  42
  43        /*
  44         * List of in-flight submits on this ring.  Protected by submit_lock.
  45         */
  46        struct list_head submits;
  47        spinlock_t submit_lock;
  48
  49        uint64_t iova;
  50        uint32_t seqno;
  51        uint32_t hangcheck_fence;
  52        struct msm_rbmemptrs *memptrs;
  53        uint64_t memptrs_iova;
  54        struct msm_fence_context *fctx;
  55
  56        /*
  57         * preempt_lock protects preemption and serializes wptr updates against
  58         * preemption.  Can be aquired from irq context.
  59         */
  60        spinlock_t preempt_lock;
  61};
  62
  63struct msm_ringbuffer *msm_ringbuffer_new(struct msm_gpu *gpu, int id,
  64                void *memptrs, uint64_t memptrs_iova);
  65void msm_ringbuffer_destroy(struct msm_ringbuffer *ring);
  66
  67/* ringbuffer helpers (the parts that are same for a3xx/a2xx/z180..) */
  68
  69static inline void
  70OUT_RING(struct msm_ringbuffer *ring, uint32_t data)
  71{
  72        /*
  73         * ring->next points to the current command being written - it won't be
  74         * committed as ring->cur until the flush
  75         */
  76        if (ring->next == ring->end)
  77                ring->next = ring->start;
  78        *(ring->next++) = data;
  79}
  80
  81#endif /* __MSM_RINGBUFFER_H__ */
  82