linux/drivers/gpu/drm/amd/include/cgs_linux.h
<<
>>
Prefs
   1/*
   2 * Copyright 2015 Advanced Micro Devices, Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 *
  23 */
  24#ifndef _CGS_LINUX_H
  25#define _CGS_LINUX_H
  26
  27#include "cgs_common.h"
  28
  29/**
  30 * cgs_irq_source_set_func() - Callback for enabling/disabling interrupt sources
  31 * @private_data:  private data provided to cgs_add_irq_source
  32 * @src_id:        interrupt source ID
  33 * @type:          interrupt type
  34 * @enabled:       0 = disable source, non-0 = enable source
  35 *
  36 * Return:  0 on success, -errno otherwise
  37 */
  38typedef int (*cgs_irq_source_set_func_t)(void *private_data,
  39                                         unsigned src_id, unsigned type,
  40                                         int enabled);
  41
  42/**
  43 * cgs_irq_handler_func() - Interrupt handler callback
  44 * @private_data:  private data provided to cgs_add_irq_source
  45 * @src_id:        interrupt source ID
  46 * @iv_entry:      pointer to raw ih ring entry
  47 *
  48 * This callback runs in interrupt context.
  49 *
  50 * Return:  0 on success, -errno otherwise
  51 */
  52typedef int (*cgs_irq_handler_func_t)(void *private_data,
  53                                      unsigned src_id, const uint32_t *iv_entry);
  54
  55/**
  56 * cgs_add_irq_source() - Add an IRQ source
  57 * @cgs_device:    opaque device handle
  58 * @src_id:        interrupt source ID
  59 * @num_types:     number of interrupt types that can be independently enabled
  60 * @set:           callback function to enable/disable an interrupt type
  61 * @handler:       interrupt handler callback
  62 * @private_data:  private data to pass to callback functions
  63 *
  64 * The same IRQ source can be added only once. Adding an IRQ source
  65 * indicates ownership of that IRQ source and all its IRQ types.
  66 *
  67 * Return:  0 on success, -errno otherwise
  68 */
  69typedef int (*cgs_add_irq_source_t)(struct cgs_device *cgs_device, unsigned src_id,
  70                                    unsigned num_types,
  71                                    cgs_irq_source_set_func_t set,
  72                                    cgs_irq_handler_func_t handler,
  73                                    void *private_data);
  74
  75/**
  76 * cgs_irq_get() - Request enabling an IRQ source and type
  77 * @cgs_device:  opaque device handle
  78 * @src_id:      interrupt source ID
  79 * @type:        interrupt type
  80 *
  81 * cgs_irq_get and cgs_irq_put calls must be balanced. They count
  82 * "references" to IRQ sources.
  83 *
  84 * Return:  0 on success, -errno otherwise
  85 */
  86typedef int (*cgs_irq_get_t)(struct cgs_device *cgs_device, unsigned src_id, unsigned type);
  87
  88/**
  89 * cgs_irq_put() - Indicate IRQ source is no longer needed
  90 * @cgs_device:  opaque device handle
  91 * @src_id:      interrupt source ID
  92 * @type:        interrupt type
  93 *
  94 * cgs_irq_get and cgs_irq_put calls must be balanced. They count
  95 * "references" to IRQ sources. Even after cgs_irq_put is called, the
  96 * IRQ handler may still be called if there are more refecences to
  97 * the IRQ source.
  98 *
  99 * Return:  0 on success, -errno otherwise
 100 */
 101typedef int (*cgs_irq_put_t)(struct cgs_device *cgs_device, unsigned src_id, unsigned type);
 102
 103struct cgs_os_ops {
 104        /* IRQ handling */
 105        cgs_add_irq_source_t add_irq_source;
 106        cgs_irq_get_t irq_get;
 107        cgs_irq_put_t irq_put;
 108};
 109
 110#define cgs_add_irq_source(dev,src_id,num_types,set,handler,private_data) \
 111        CGS_OS_CALL(add_irq_source,dev,src_id,num_types,set,handler,    \
 112                    private_data)
 113#define cgs_irq_get(dev,src_id,type)            \
 114        CGS_OS_CALL(irq_get,dev,src_id,type)
 115#define cgs_irq_put(dev,src_id,type)            \
 116        CGS_OS_CALL(irq_put,dev,src_id,type)
 117
 118#endif /* _CGS_LINUX_H */
 119