xref: /openbmc/linux/drivers/gpu/drm/tegra/falcon.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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