1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 28746f659SArto Merilainen /* 38746f659SArto Merilainen * Copyright (c) 2015, NVIDIA Corporation. 48746f659SArto Merilainen */ 58746f659SArto Merilainen 68746f659SArto Merilainen #ifndef _FALCON_H_ 78746f659SArto Merilainen #define _FALCON_H_ 88746f659SArto Merilainen 98746f659SArto Merilainen #include <linux/types.h> 108746f659SArto Merilainen 118746f659SArto Merilainen #define FALCON_UCLASS_METHOD_OFFSET 0x00000040 128746f659SArto Merilainen 138746f659SArto Merilainen #define FALCON_UCLASS_METHOD_DATA 0x00000044 148746f659SArto Merilainen 158746f659SArto Merilainen #define FALCON_IRQMSET 0x00001010 168746f659SArto Merilainen #define FALCON_IRQMSET_WDTMR (1 << 1) 178746f659SArto Merilainen #define FALCON_IRQMSET_HALT (1 << 4) 188746f659SArto Merilainen #define FALCON_IRQMSET_EXTERR (1 << 5) 198746f659SArto Merilainen #define FALCON_IRQMSET_SWGEN0 (1 << 6) 208746f659SArto Merilainen #define FALCON_IRQMSET_SWGEN1 (1 << 7) 218746f659SArto Merilainen #define FALCON_IRQMSET_EXT(v) (((v) & 0xff) << 8) 228746f659SArto Merilainen 238746f659SArto Merilainen #define FALCON_IRQDEST 0x0000101c 248746f659SArto Merilainen #define FALCON_IRQDEST_HALT (1 << 4) 258746f659SArto Merilainen #define FALCON_IRQDEST_EXTERR (1 << 5) 268746f659SArto Merilainen #define FALCON_IRQDEST_SWGEN0 (1 << 6) 278746f659SArto Merilainen #define FALCON_IRQDEST_SWGEN1 (1 << 7) 288746f659SArto Merilainen #define FALCON_IRQDEST_EXT(v) (((v) & 0xff) << 8) 298746f659SArto Merilainen 308746f659SArto Merilainen #define FALCON_ITFEN 0x00001048 318746f659SArto Merilainen #define FALCON_ITFEN_CTXEN (1 << 0) 328746f659SArto Merilainen #define FALCON_ITFEN_MTHDEN (1 << 1) 338746f659SArto Merilainen 348746f659SArto Merilainen #define FALCON_IDLESTATE 0x0000104c 358746f659SArto Merilainen 368746f659SArto Merilainen #define FALCON_CPUCTL 0x00001100 378746f659SArto Merilainen #define FALCON_CPUCTL_STARTCPU (1 << 1) 388746f659SArto Merilainen 398746f659SArto Merilainen #define FALCON_BOOTVEC 0x00001104 408746f659SArto Merilainen 418746f659SArto Merilainen #define FALCON_DMACTL 0x0000110c 428746f659SArto Merilainen #define FALCON_DMACTL_DMEM_SCRUBBING (1 << 1) 438746f659SArto Merilainen #define FALCON_DMACTL_IMEM_SCRUBBING (1 << 2) 448746f659SArto Merilainen 458746f659SArto Merilainen #define FALCON_DMATRFBASE 0x00001110 468746f659SArto Merilainen 478746f659SArto Merilainen #define FALCON_DMATRFMOFFS 0x00001114 488746f659SArto Merilainen 498746f659SArto Merilainen #define FALCON_DMATRFCMD 0x00001118 508746f659SArto Merilainen #define FALCON_DMATRFCMD_IDLE (1 << 1) 518746f659SArto Merilainen #define FALCON_DMATRFCMD_IMEM (1 << 4) 528746f659SArto Merilainen #define FALCON_DMATRFCMD_SIZE_256B (6 << 8) 53*e078d8d6SMikko Perttunen #define FALCON_DMATRFCMD_DMACTX(v) (((v) & 0x7) << 12) 548746f659SArto Merilainen 558746f659SArto Merilainen #define FALCON_DMATRFFBOFFS 0x0000111c 568746f659SArto Merilainen 578746f659SArto Merilainen struct falcon_fw_bin_header_v1 { 588746f659SArto Merilainen u32 magic; /* 0x10de */ 598746f659SArto Merilainen u32 version; /* version of bin format (1) */ 608746f659SArto Merilainen u32 size; /* entire image size including this header */ 618746f659SArto Merilainen u32 os_header_offset; 628746f659SArto Merilainen u32 os_data_offset; 638746f659SArto Merilainen u32 os_size; 648746f659SArto Merilainen }; 658746f659SArto Merilainen 668746f659SArto Merilainen struct falcon_fw_os_app_v1 { 678746f659SArto Merilainen u32 offset; 688746f659SArto Merilainen u32 size; 698746f659SArto Merilainen }; 708746f659SArto Merilainen 718746f659SArto Merilainen struct falcon_fw_os_header_v1 { 728746f659SArto Merilainen u32 code_offset; 738746f659SArto Merilainen u32 code_size; 748746f659SArto Merilainen u32 data_offset; 758746f659SArto Merilainen u32 data_size; 768746f659SArto Merilainen }; 778746f659SArto Merilainen 788746f659SArto Merilainen struct falcon_firmware_section { 798746f659SArto Merilainen unsigned long offset; 808746f659SArto Merilainen size_t size; 818746f659SArto Merilainen }; 828746f659SArto Merilainen 838746f659SArto Merilainen struct falcon_firmware { 848746f659SArto Merilainen /* Firmware after it is read but not loaded */ 858746f659SArto Merilainen const struct firmware *firmware; 868746f659SArto Merilainen 878746f659SArto Merilainen /* Raw firmware data */ 88d972d624SThierry Reding dma_addr_t iova; 89d972d624SThierry Reding dma_addr_t phys; 90d972d624SThierry Reding void *virt; 918746f659SArto Merilainen size_t size; 928746f659SArto Merilainen 938746f659SArto Merilainen /* Parsed firmware information */ 948746f659SArto Merilainen struct falcon_firmware_section bin_data; 958746f659SArto Merilainen struct falcon_firmware_section data; 968746f659SArto Merilainen struct falcon_firmware_section code; 978746f659SArto Merilainen }; 988746f659SArto Merilainen 998746f659SArto Merilainen struct falcon { 1008746f659SArto Merilainen /* Set by falcon client */ 1018746f659SArto Merilainen struct device *dev; 1028746f659SArto Merilainen void __iomem *regs; 1038746f659SArto Merilainen 1048746f659SArto Merilainen struct falcon_firmware firmware; 1058746f659SArto Merilainen }; 1068746f659SArto Merilainen 1078746f659SArto Merilainen int falcon_init(struct falcon *falcon); 1088746f659SArto Merilainen void falcon_exit(struct falcon *falcon); 1098746f659SArto Merilainen int falcon_read_firmware(struct falcon *falcon, const char *firmware_name); 1108746f659SArto Merilainen int falcon_load_firmware(struct falcon *falcon); 1118746f659SArto Merilainen int falcon_boot(struct falcon *falcon); 1128746f659SArto Merilainen void falcon_execute_method(struct falcon *falcon, u32 method, u32 data); 1138746f659SArto Merilainen int falcon_wait_idle(struct falcon *falcon); 1148746f659SArto Merilainen 1158746f659SArto Merilainen #endif /* _FALCON_H_ */ 116