2019-06-19 20:13:43 -04:00
/* SPDX-License-Identifier: MIT */
2020-01-15 06:34:21 +10:00
# ifndef __NVKM_FLCNEN_H__
# define __NVKM_FLCNEN_H__
2015-08-20 14:54:19 +10:00
# define nvkm_falcon(p) container_of((p), struct nvkm_falcon, engine)
# include <core/engine.h>
2015-08-20 14:54:18 +10:00
struct nvkm_fifo_chan ;
2012-11-21 21:02:32 +10:00
2016-12-13 17:11:19 +09:00
enum nvkm_falcon_dmaidx {
FALCON_DMAIDX_UCODE = 0 ,
FALCON_DMAIDX_VIRT = 1 ,
FALCON_DMAIDX_PHYS_VID = 2 ,
FALCON_DMAIDX_PHYS_SYS_COH = 3 ,
FALCON_DMAIDX_PHYS_SYS_NCOH = 4 ,
2017-01-26 16:57:24 +09:00
FALCON_SEC2_DMAIDX_UCODE = 6 ,
2016-12-13 17:11:19 +09:00
} ;
2015-01-14 14:11:21 +10:00
struct nvkm_falcon {
2015-08-20 14:54:18 +10:00
const struct nvkm_falcon_func * func ;
2016-12-13 17:11:19 +09:00
const struct nvkm_subdev * owner ;
const char * name ;
2012-11-21 21:02:32 +10:00
u32 addr ;
2016-12-13 17:11:19 +09:00
struct mutex mutex ;
2017-01-19 12:11:15 +09:00
struct mutex dmem_mutex ;
2020-01-15 06:34:21 +10:00
bool oneinit ;
2016-12-13 17:11:19 +09:00
const struct nvkm_subdev * user ;
u8 version ;
u8 secret ;
bool debug ;
2012-11-21 21:02:32 +10:00
2015-08-20 14:54:17 +10:00
struct nvkm_memory * core ;
2012-11-21 21:02:32 +10:00
bool external ;
struct {
u32 limit ;
u32 * data ;
u32 size ;
2016-12-13 17:11:19 +09:00
u8 ports ;
2012-11-21 21:02:32 +10:00
} code ;
struct {
u32 limit ;
u32 * data ;
u32 size ;
2016-12-13 17:11:19 +09:00
u8 ports ;
2012-11-21 21:02:32 +10:00
} data ;
2016-12-13 17:11:19 +09:00
struct nvkm_engine engine ;
2012-11-21 21:02:32 +10:00
} ;
2016-12-13 17:11:19 +09:00
int nvkm_falcon_get ( struct nvkm_falcon * , const struct nvkm_subdev * ) ;
void nvkm_falcon_put ( struct nvkm_falcon * , const struct nvkm_subdev * ) ;
2021-02-04 08:40:52 +10:00
int nvkm_falcon_new_ ( const struct nvkm_falcon_func * , struct nvkm_device * ,
2021-02-04 08:30:30 +10:00
enum nvkm_subdev_type , int inst , bool enable , u32 addr , struct nvkm_engine * * ) ;
2015-08-20 14:54:21 +10:00
2015-08-20 14:54:18 +10:00
struct nvkm_falcon_func {
2015-08-20 14:54:21 +10:00
struct {
u32 * data ;
u32 size ;
} code ;
struct {
u32 * data ;
u32 size ;
} data ;
void ( * init ) ( struct nvkm_falcon * ) ;
2015-08-20 14:54:18 +10:00
void ( * intr ) ( struct nvkm_falcon * , struct nvkm_fifo_chan * ) ;
2020-01-15 06:34:21 +10:00
2020-01-15 06:34:21 +10:00
u32 debug ;
2020-01-15 06:34:21 +10:00
u32 fbif ;
2016-12-13 17:11:19 +09:00
void ( * load_imem ) ( struct nvkm_falcon * , void * , u32 , u32 , u16 , u8 , bool ) ;
void ( * load_dmem ) ( struct nvkm_falcon * , void * , u32 , u32 , u8 ) ;
void ( * read_dmem ) ( struct nvkm_falcon * , u32 , u32 , u8 , void * ) ;
2020-01-15 06:34:21 +10:00
u32 emem_addr ;
2017-11-01 03:56:19 +10:00
void ( * bind_context ) ( struct nvkm_falcon * , struct nvkm_memory * ) ;
2016-12-13 17:11:19 +09:00
int ( * wait_for_halt ) ( struct nvkm_falcon * , u32 ) ;
int ( * clear_interrupt ) ( struct nvkm_falcon * , u32 ) ;
void ( * set_start_addr ) ( struct nvkm_falcon * , u32 start_addr ) ;
void ( * start ) ( struct nvkm_falcon * ) ;
int ( * enable ) ( struct nvkm_falcon * falcon ) ;
void ( * disable ) ( struct nvkm_falcon * falcon ) ;
2020-01-15 06:34:22 +10:00
int ( * reset ) ( struct nvkm_falcon * ) ;
2016-12-13 17:11:19 +09:00
2020-01-15 06:34:21 +10:00
struct {
u32 head ;
u32 tail ;
u32 stride ;
} cmdq , msgq ;
2015-08-20 14:54:19 +10:00
struct nvkm_sclass sclass [ ] ;
2015-08-20 14:54:18 +10:00
} ;
2016-12-13 17:11:19 +09:00
static inline u32
nvkm_falcon_rd32 ( struct nvkm_falcon * falcon , u32 addr )
{
return nvkm_rd32 ( falcon - > owner - > device , falcon - > addr + addr ) ;
}
static inline void
nvkm_falcon_wr32 ( struct nvkm_falcon * falcon , u32 addr , u32 data )
{
nvkm_wr32 ( falcon - > owner - > device , falcon - > addr + addr , data ) ;
}
static inline u32
nvkm_falcon_mask ( struct nvkm_falcon * falcon , u32 addr , u32 mask , u32 val )
{
struct nvkm_device * device = falcon - > owner - > device ;
return nvkm_mask ( device , falcon - > addr + addr , mask , val ) ;
}
void nvkm_falcon_load_imem ( struct nvkm_falcon * , void * , u32 , u32 , u16 , u8 ,
bool ) ;
void nvkm_falcon_load_dmem ( struct nvkm_falcon * , void * , u32 , u32 , u8 ) ;
void nvkm_falcon_read_dmem ( struct nvkm_falcon * , u32 , u32 , u8 , void * ) ;
2017-11-01 03:56:19 +10:00
void nvkm_falcon_bind_context ( struct nvkm_falcon * , struct nvkm_memory * ) ;
2016-12-13 17:11:19 +09:00
void nvkm_falcon_set_start_addr ( struct nvkm_falcon * , u32 ) ;
void nvkm_falcon_start ( struct nvkm_falcon * ) ;
int nvkm_falcon_wait_for_halt ( struct nvkm_falcon * , u32 ) ;
int nvkm_falcon_clear_interrupt ( struct nvkm_falcon * , u32 ) ;
int nvkm_falcon_enable ( struct nvkm_falcon * ) ;
void nvkm_falcon_disable ( struct nvkm_falcon * ) ;
int nvkm_falcon_reset ( struct nvkm_falcon * ) ;
2012-11-21 21:02:32 +10:00
# endif