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_IH_H__
# define __AMDGPU_IH_H__
struct amdgpu_device ;
2017-03-09 11:34:42 -05:00
/*
* vega10 + IH clients
*/
enum amdgpu_ih_clientid
{
AMDGPU_IH_CLIENTID_IH = 0x00 ,
AMDGPU_IH_CLIENTID_ACP = 0x01 ,
AMDGPU_IH_CLIENTID_ATHUB = 0x02 ,
AMDGPU_IH_CLIENTID_BIF = 0x03 ,
AMDGPU_IH_CLIENTID_DCE = 0x04 ,
AMDGPU_IH_CLIENTID_ISP = 0x05 ,
AMDGPU_IH_CLIENTID_PCIE0 = 0x06 ,
AMDGPU_IH_CLIENTID_RLC = 0x07 ,
AMDGPU_IH_CLIENTID_SDMA0 = 0x08 ,
AMDGPU_IH_CLIENTID_SDMA1 = 0x09 ,
AMDGPU_IH_CLIENTID_SE0SH = 0x0a ,
AMDGPU_IH_CLIENTID_SE1SH = 0x0b ,
AMDGPU_IH_CLIENTID_SE2SH = 0x0c ,
AMDGPU_IH_CLIENTID_SE3SH = 0x0d ,
AMDGPU_IH_CLIENTID_SYSHUB = 0x0e ,
AMDGPU_IH_CLIENTID_THM = 0x0f ,
AMDGPU_IH_CLIENTID_UVD = 0x10 ,
AMDGPU_IH_CLIENTID_VCE0 = 0x11 ,
AMDGPU_IH_CLIENTID_VMC = 0x12 ,
AMDGPU_IH_CLIENTID_XDMA = 0x13 ,
AMDGPU_IH_CLIENTID_GRBM_CP = 0x14 ,
AMDGPU_IH_CLIENTID_ATS = 0x15 ,
AMDGPU_IH_CLIENTID_ROM_SMUIO = 0x16 ,
AMDGPU_IH_CLIENTID_DF = 0x17 ,
AMDGPU_IH_CLIENTID_VCE1 = 0x18 ,
AMDGPU_IH_CLIENTID_PWR = 0x19 ,
AMDGPU_IH_CLIENTID_UTCL2 = 0x1b ,
AMDGPU_IH_CLIENTID_EA = 0x1c ,
AMDGPU_IH_CLIENTID_UTCL2LOG = 0x1d ,
AMDGPU_IH_CLIENTID_MP0 = 0x1e ,
AMDGPU_IH_CLIENTID_MP1 = 0x1f ,
2015-04-20 16:55:21 -04:00
2017-03-09 11:34:42 -05:00
AMDGPU_IH_CLIENTID_MAX
2016-03-29 18:28:50 -04:00
2017-03-09 11:34:42 -05:00
} ;
# define AMDGPU_IH_CLIENTID_LEGACY 0
2016-03-29 18:28:50 -04:00
2015-04-20 16:55:21 -04:00
/*
* R6xx + IH ring
*/
struct amdgpu_ih_ring {
struct amdgpu_bo * ring_obj ;
volatile uint32_t * ring ;
unsigned rptr ;
unsigned ring_size ;
uint64_t gpu_addr ;
uint32_t ptr_mask ;
atomic_t lock ;
bool enabled ;
unsigned wptr_offs ;
unsigned rptr_offs ;
u32 doorbell_index ;
bool use_doorbell ;
bool use_bus_addr ;
dma_addr_t rb_dma_addr ; /* only used when use_bus_addr = true */
} ;
2016-11-29 18:02:12 -05:00
# define AMDGPU_IH_SRC_DATA_MAX_SIZE_DW 4
2015-04-20 16:55:21 -04:00
struct amdgpu_iv_entry {
2016-03-29 18:28:50 -04:00
unsigned client_id ;
2015-04-20 16:55:21 -04:00
unsigned src_id ;
unsigned ring_id ;
unsigned vm_id ;
2016-03-29 18:28:50 -04:00
unsigned vm_id_src ;
2017-03-03 15:08:30 -05:00
uint64_t timestamp ;
unsigned timestamp_src ;
2015-04-20 16:55:21 -04:00
unsigned pas_id ;
2017-03-03 15:08:30 -05:00
unsigned pasid_src ;
unsigned src_data [ AMDGPU_IH_SRC_DATA_MAX_SIZE_DW ] ;
2015-07-28 14:24:53 -04:00
const uint32_t * iv_entry ;
2015-04-20 16:55:21 -04:00
} ;
int amdgpu_ih_ring_init ( struct amdgpu_device * adev , unsigned ring_size ,
bool use_bus_addr ) ;
void amdgpu_ih_ring_fini ( struct amdgpu_device * adev ) ;
int amdgpu_ih_process ( struct amdgpu_device * adev ) ;
# endif