2015-04-20 16:55:21 -04:00
/*
* Copyright 2014 Advanced Micro Devices , Inc .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE COPYRIGHT HOLDER ( S ) OR AUTHOR ( S ) BE LIABLE FOR ANY CLAIM , DAMAGES OR
* OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
* ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE .
*
*/
# ifndef __AMDGPU_IRQ_H__
# define __AMDGPU_IRQ_H__
2015-11-06 01:29:08 -05:00
# include <linux/irqdomain.h>
2015-04-20 16:55:21 -04:00
# include "amdgpu_ih.h"
# define AMDGPU_MAX_IRQ_SRC_ID 0x100
2016-03-29 18:28:50 -04:00
# define AMDGPU_MAX_IRQ_CLIENT_ID 0x100
2015-04-20 16:55:21 -04:00
struct amdgpu_device ;
struct amdgpu_iv_entry ;
enum amdgpu_interrupt_state {
AMDGPU_IRQ_STATE_DISABLE ,
AMDGPU_IRQ_STATE_ENABLE ,
} ;
struct amdgpu_irq_src {
unsigned num_types ;
atomic_t * enabled_types ;
const struct amdgpu_irq_src_funcs * funcs ;
2015-07-28 14:24:53 -04:00
void * data ;
2015-04-20 16:55:21 -04:00
} ;
2016-03-29 18:28:50 -04:00
struct amdgpu_irq_client {
struct amdgpu_irq_src * * sources ;
} ;
2015-04-20 16:55:21 -04:00
/* provided by interrupt generating IP blocks */
struct amdgpu_irq_src_funcs {
int ( * set ) ( struct amdgpu_device * adev , struct amdgpu_irq_src * source ,
unsigned type , enum amdgpu_interrupt_state state ) ;
int ( * process ) ( struct amdgpu_device * adev ,
struct amdgpu_irq_src * source ,
struct amdgpu_iv_entry * entry ) ;
} ;
struct amdgpu_irq {
bool installed ;
spinlock_t lock ;
/* interrupt sources */
2016-03-29 18:28:50 -04:00
struct amdgpu_irq_client client [ AMDGPU_IH_CLIENTID_MAX ] ;
2015-04-20 16:55:21 -04:00
/* status, etc. */
bool msi_enabled ; /* msi enabled */
/* interrupt ring */
struct amdgpu_ih_ring ih ;
const struct amdgpu_ih_funcs * ih_funcs ;
2015-11-06 01:29:08 -05:00
/* gen irq stuff */
struct irq_domain * domain ; /* GPU irq controller domain */
unsigned virq [ AMDGPU_MAX_IRQ_SRC_ID ] ;
2016-07-18 17:02:57 +08:00
uint32_t srbm_soft_reset ;
2015-04-20 16:55:21 -04:00
} ;
2018-01-18 19:05:36 -05:00
void amdgpu_irq_disable_all ( struct amdgpu_device * adev ) ;
2015-04-20 16:55:21 -04:00
irqreturn_t amdgpu_irq_handler ( int irq , void * arg ) ;
int amdgpu_irq_init ( struct amdgpu_device * adev ) ;
void amdgpu_irq_fini ( struct amdgpu_device * adev ) ;
2016-03-29 18:28:50 -04:00
int amdgpu_irq_add_id ( struct amdgpu_device * adev ,
unsigned client_id , unsigned src_id ,
2015-04-20 16:55:21 -04:00
struct amdgpu_irq_src * source ) ;
void amdgpu_irq_dispatch ( struct amdgpu_device * adev ,
struct amdgpu_iv_entry * entry ) ;
int amdgpu_irq_update ( struct amdgpu_device * adev , struct amdgpu_irq_src * src ,
unsigned type ) ;
int amdgpu_irq_get ( struct amdgpu_device * adev , struct amdgpu_irq_src * src ,
unsigned type ) ;
int amdgpu_irq_put ( struct amdgpu_device * adev , struct amdgpu_irq_src * src ,
unsigned type ) ;
bool amdgpu_irq_enabled ( struct amdgpu_device * adev , struct amdgpu_irq_src * src ,
unsigned type ) ;
2016-06-16 16:54:53 +08:00
void amdgpu_irq_gpu_reset_resume_helper ( struct amdgpu_device * adev ) ;
2015-04-20 16:55:21 -04:00
2015-11-06 01:29:08 -05:00
int amdgpu_irq_add_domain ( struct amdgpu_device * adev ) ;
void amdgpu_irq_remove_domain ( struct amdgpu_device * adev ) ;
unsigned amdgpu_irq_create_mapping ( struct amdgpu_device * adev , unsigned src_id ) ;
2015-04-20 16:55:21 -04:00
# endif