xref: /linux/drivers/accel/ivpu/vpu_boot_api.h (revision c34e9ab9a612ee8b18273398ef75c207b01f516d)
102d5b0aaSJacek Lawrynowicz /* SPDX-License-Identifier: MIT */
202d5b0aaSJacek Lawrynowicz /*
3*a4293cc7SAndrzej Kacprowski  * Copyright (c) 2020-2024, Intel Corporation.
402d5b0aaSJacek Lawrynowicz  */
502d5b0aaSJacek Lawrynowicz 
602d5b0aaSJacek Lawrynowicz #ifndef VPU_BOOT_API_H
702d5b0aaSJacek Lawrynowicz #define VPU_BOOT_API_H
802d5b0aaSJacek Lawrynowicz 
902d5b0aaSJacek Lawrynowicz /*
10284a8908SAndrew Kreimer  *  The below values will be used to construct the version info this way:
1102d5b0aaSJacek Lawrynowicz  *  fw_bin_header->api_version[VPU_BOOT_API_VER_ID] = (VPU_BOOT_API_VER_MAJOR << 16) |
1202d5b0aaSJacek Lawrynowicz  *  VPU_BOOT_API_VER_MINOR;
138c63b474SKrystian Pradzynski  *  VPU_BOOT_API_VER_PATCH will be ignored. KMD and compatibility is not affected if this changes
148c63b474SKrystian Pradzynski  *  This information is collected by using vpuip_2/application/vpuFirmware/make_std_fw_image.py
158c63b474SKrystian Pradzynski  *  If a header is missing this info we ignore the header, if a header is missing or contains
168c63b474SKrystian Pradzynski  *  partial info a build error will be generated.
1702d5b0aaSJacek Lawrynowicz  */
1802d5b0aaSJacek Lawrynowicz 
1902d5b0aaSJacek Lawrynowicz /*
2002d5b0aaSJacek Lawrynowicz  * Major version changes that break backward compatibility.
2102d5b0aaSJacek Lawrynowicz  * Major version must start from 1 and can only be incremented.
2202d5b0aaSJacek Lawrynowicz  */
2302d5b0aaSJacek Lawrynowicz #define VPU_BOOT_API_VER_MAJOR 3
2402d5b0aaSJacek Lawrynowicz 
2502d5b0aaSJacek Lawrynowicz /*
2602d5b0aaSJacek Lawrynowicz  * Minor version changes when API backward compatibility is preserved.
2702d5b0aaSJacek Lawrynowicz  * Resets to 0 if Major version is incremented.
2802d5b0aaSJacek Lawrynowicz  */
29*a4293cc7SAndrzej Kacprowski #define VPU_BOOT_API_VER_MINOR 28
3002d5b0aaSJacek Lawrynowicz 
3102d5b0aaSJacek Lawrynowicz /*
3202d5b0aaSJacek Lawrynowicz  * API header changed (field names, documentation, formatting) but API itself has not been changed
3302d5b0aaSJacek Lawrynowicz  */
34*a4293cc7SAndrzej Kacprowski #define VPU_BOOT_API_VER_PATCH 3
3502d5b0aaSJacek Lawrynowicz 
3602d5b0aaSJacek Lawrynowicz /*
3702d5b0aaSJacek Lawrynowicz  * Index in the API version table
3802d5b0aaSJacek Lawrynowicz  * Must be unique for each API
3902d5b0aaSJacek Lawrynowicz  */
4002d5b0aaSJacek Lawrynowicz #define VPU_BOOT_API_VER_INDEX 0
4102d5b0aaSJacek Lawrynowicz 
423bd0edf8SJacek Lawrynowicz #pragma pack(push, 4)
4302d5b0aaSJacek Lawrynowicz 
4402d5b0aaSJacek Lawrynowicz /*
4502d5b0aaSJacek Lawrynowicz  * Firmware image header format
4602d5b0aaSJacek Lawrynowicz  */
4702d5b0aaSJacek Lawrynowicz #define VPU_FW_HEADER_SIZE    4096
4802d5b0aaSJacek Lawrynowicz #define VPU_FW_HEADER_VERSION 0x1
4902d5b0aaSJacek Lawrynowicz #define VPU_FW_VERSION_SIZE   32
5002d5b0aaSJacek Lawrynowicz #define VPU_FW_API_VER_NUM    16
5102d5b0aaSJacek Lawrynowicz 
5202d5b0aaSJacek Lawrynowicz struct vpu_firmware_header {
5302d5b0aaSJacek Lawrynowicz 	u32 header_version;
5402d5b0aaSJacek Lawrynowicz 	u32 image_format;
5502d5b0aaSJacek Lawrynowicz 	u64 image_load_address;
5602d5b0aaSJacek Lawrynowicz 	u32 image_size;
5702d5b0aaSJacek Lawrynowicz 	u64 entry_point;
5802d5b0aaSJacek Lawrynowicz 	u8 vpu_version[VPU_FW_VERSION_SIZE];
5902d5b0aaSJacek Lawrynowicz 	u32 compression_type;
6002d5b0aaSJacek Lawrynowicz 	u64 firmware_version_load_address;
6102d5b0aaSJacek Lawrynowicz 	u32 firmware_version_size;
6202d5b0aaSJacek Lawrynowicz 	u64 boot_params_load_address;
6302d5b0aaSJacek Lawrynowicz 	u32 api_version[VPU_FW_API_VER_NUM];
6402d5b0aaSJacek Lawrynowicz 	/* Size of memory require for firmware execution */
6502d5b0aaSJacek Lawrynowicz 	u32 runtime_size;
6602d5b0aaSJacek Lawrynowicz 	u32 shave_nn_fw_size;
673bd0edf8SJacek Lawrynowicz 	/*
683bd0edf8SJacek Lawrynowicz 	 * Size of primary preemption buffer, assuming a 2-job submission queue.
693bd0edf8SJacek Lawrynowicz 	 * NOTE: host driver is expected to adapt size accordingly to actual
703bd0edf8SJacek Lawrynowicz 	 * submission queue size and device capabilities.
713bd0edf8SJacek Lawrynowicz 	 */
728c63b474SKrystian Pradzynski 	u32 preemption_buffer_1_size;
733bd0edf8SJacek Lawrynowicz 	/*
743bd0edf8SJacek Lawrynowicz 	 * Size of secondary preemption buffer, assuming a 2-job submission queue.
753bd0edf8SJacek Lawrynowicz 	 * NOTE: host driver is expected to adapt size accordingly to actual
763bd0edf8SJacek Lawrynowicz 	 * submission queue size and device capabilities.
773bd0edf8SJacek Lawrynowicz 	 */
788c63b474SKrystian Pradzynski 	u32 preemption_buffer_2_size;
798c63b474SKrystian Pradzynski 	/*
808c63b474SKrystian Pradzynski 	 * Maximum preemption buffer size that the FW can use: no need for the host
81f1432983SWachowski, Karol 	 * driver to allocate more space than that specified by these fields.
82f1432983SWachowski, Karol 	 * A value of 0 means no declared limit.
83f1432983SWachowski, Karol 	 */
84f1432983SWachowski, Karol 	u32 preemption_buffer_1_max_size;
85f1432983SWachowski, Karol 	u32 preemption_buffer_2_max_size;
8602d5b0aaSJacek Lawrynowicz 	/* Space reserved for future preemption-related fields. */
8702d5b0aaSJacek Lawrynowicz 	u32 preemption_reserved[4];
8802d5b0aaSJacek Lawrynowicz 	/* FW image read only section start address, 4KB aligned */
8902d5b0aaSJacek Lawrynowicz 	u64 ro_section_start_address;
9002d5b0aaSJacek Lawrynowicz 	/* FW image read only section size, 4KB aligned */
9102d5b0aaSJacek Lawrynowicz 	u32 ro_section_size;
9202d5b0aaSJacek Lawrynowicz 	u32 reserved;
9302d5b0aaSJacek Lawrynowicz };
9402d5b0aaSJacek Lawrynowicz 
9502d5b0aaSJacek Lawrynowicz /*
9602d5b0aaSJacek Lawrynowicz  * Firmware boot parameters format
9702d5b0aaSJacek Lawrynowicz  */
9802d5b0aaSJacek Lawrynowicz 
9902d5b0aaSJacek Lawrynowicz #define VPU_BOOT_PLL_COUNT     3
10002d5b0aaSJacek Lawrynowicz #define VPU_BOOT_PLL_OUT_COUNT 4
10102d5b0aaSJacek Lawrynowicz 
10202d5b0aaSJacek Lawrynowicz /** Values for boot_type field */
10302d5b0aaSJacek Lawrynowicz #define VPU_BOOT_TYPE_COLDBOOT 0
10402d5b0aaSJacek Lawrynowicz #define VPU_BOOT_TYPE_WARMBOOT 1
10502d5b0aaSJacek Lawrynowicz 
10602d5b0aaSJacek Lawrynowicz /** Value for magic filed */
10702d5b0aaSJacek Lawrynowicz #define VPU_BOOT_PARAMS_MAGIC 0x10000
10802d5b0aaSJacek Lawrynowicz 
10902d5b0aaSJacek Lawrynowicz /** VPU scheduling mode. By default, OS scheduling is used. */
11002d5b0aaSJacek Lawrynowicz #define VPU_SCHEDULING_MODE_OS 0
11102d5b0aaSJacek Lawrynowicz #define VPU_SCHEDULING_MODE_HW 1
1128c63b474SKrystian Pradzynski 
1138c63b474SKrystian Pradzynski enum VPU_BOOT_L2_CACHE_CFG_TYPE {
1148c63b474SKrystian Pradzynski 	VPU_BOOT_L2_CACHE_CFG_UPA = 0,
1158c63b474SKrystian Pradzynski 	VPU_BOOT_L2_CACHE_CFG_NN = 1,
1168c63b474SKrystian Pradzynski 	VPU_BOOT_L2_CACHE_CFG_NUM = 2
1178c63b474SKrystian Pradzynski };
1188c63b474SKrystian Pradzynski 
1198c63b474SKrystian Pradzynski /** VPU MCA ECC signalling mode. By default, no signalling is used */
12002d5b0aaSJacek Lawrynowicz enum VPU_BOOT_MCA_ECC_SIGNAL_TYPE {
12102d5b0aaSJacek Lawrynowicz 	VPU_BOOT_MCA_ECC_NONE = 0,
12202d5b0aaSJacek Lawrynowicz 	VPU_BOOT_MCA_ECC_CORR = 1,
12302d5b0aaSJacek Lawrynowicz 	VPU_BOOT_MCA_ECC_FATAL = 2,
12402d5b0aaSJacek Lawrynowicz 	VPU_BOOT_MCA_ECC_BOTH = 3
12502d5b0aaSJacek Lawrynowicz };
12602d5b0aaSJacek Lawrynowicz 
12702d5b0aaSJacek Lawrynowicz /**
12802d5b0aaSJacek Lawrynowicz  * Logging destinations.
12902d5b0aaSJacek Lawrynowicz  *
13002d5b0aaSJacek Lawrynowicz  * Logging output can be directed to different logging destinations. This enum
13102d5b0aaSJacek Lawrynowicz  * defines the list of logging destinations supported by the VPU firmware (NOTE:
13202d5b0aaSJacek Lawrynowicz  * a specific VPU FW binary may support only a subset of such output
13302d5b0aaSJacek Lawrynowicz  * destinations, depending on the target platform and compile options).
13402d5b0aaSJacek Lawrynowicz  */
13502d5b0aaSJacek Lawrynowicz enum vpu_trace_destination {
13602d5b0aaSJacek Lawrynowicz 	VPU_TRACE_DESTINATION_PIPEPRINT = 0x1,
13702d5b0aaSJacek Lawrynowicz 	VPU_TRACE_DESTINATION_VERBOSE_TRACING = 0x2,
13802d5b0aaSJacek Lawrynowicz 	VPU_TRACE_DESTINATION_NORTH_PEAK = 0x4,
13902d5b0aaSJacek Lawrynowicz };
14002d5b0aaSJacek Lawrynowicz 
14102d5b0aaSJacek Lawrynowicz /*
14202d5b0aaSJacek Lawrynowicz  * Processor bit shifts (for loggable HW components).
14302d5b0aaSJacek Lawrynowicz  */
14402d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_RESERVED  0
14502d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_LRT	     1
14602d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_LNN	     2
14702d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_0     3
14802d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_1     4
14902d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_2     5
15002d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_3     6
15102d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_4     7
15202d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_5     8
15302d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_6     9
15402d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_7     10
15502d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_8     11
15602d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_9     12
15702d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_10    13
15802d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_11    14
15902d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_12    15
16002d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_13    16
16102d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_SHV_14    17
1628c63b474SKrystian Pradzynski #define VPU_TRACE_PROC_BIT_SHV_15    18
1638c63b474SKrystian Pradzynski #define VPU_TRACE_PROC_BIT_ACT_SHV_0 19
1648c63b474SKrystian Pradzynski #define VPU_TRACE_PROC_BIT_ACT_SHV_1 20
16502d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_ACT_SHV_2 21
16602d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_ACT_SHV_3 22
16702d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_NO_OF_HW_DEVS 23
16802d5b0aaSJacek Lawrynowicz 
16902d5b0aaSJacek Lawrynowicz /* VPU 30xx HW component IDs are sequential, so define first and last IDs. */
17002d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_30XX_FIRST VPU_TRACE_PROC_BIT_LRT
17102d5b0aaSJacek Lawrynowicz #define VPU_TRACE_PROC_BIT_30XX_LAST  VPU_TRACE_PROC_BIT_SHV_15
17202d5b0aaSJacek Lawrynowicz 
17302d5b0aaSJacek Lawrynowicz struct vpu_boot_l2_cache_config {
17402d5b0aaSJacek Lawrynowicz 	u8 use;
17502d5b0aaSJacek Lawrynowicz 	u8 cfg;
17602d5b0aaSJacek Lawrynowicz };
17702d5b0aaSJacek Lawrynowicz 
17802d5b0aaSJacek Lawrynowicz struct vpu_warm_boot_section {
1798c63b474SKrystian Pradzynski 	u32 src;
1808c63b474SKrystian Pradzynski 	u32 dst;
1818c63b474SKrystian Pradzynski 	u32 size;
1828c63b474SKrystian Pradzynski 	u32 core_id;
1838c63b474SKrystian Pradzynski 	u32 is_clear_op;
1848c63b474SKrystian Pradzynski };
1858c63b474SKrystian Pradzynski 
1868c63b474SKrystian Pradzynski /*
1878c63b474SKrystian Pradzynski  * When HW scheduling mode is enabled, a present period is defined.
1888c63b474SKrystian Pradzynski  * It will be used by VPU to swap between normal and focus priorities
1898c63b474SKrystian Pradzynski  * to prevent starving of normal priority band (when implemented).
1908c63b474SKrystian Pradzynski  * Host must provide a valid value at boot time in
1918c63b474SKrystian Pradzynski  * `vpu_focus_present_timer_ms`. If the value provided by the host is not within the
1928c63b474SKrystian Pradzynski  * defined range a default value will be used. Here we define the min. and max.
1933bd0edf8SJacek Lawrynowicz  * allowed values and the and default value of the present period. Units are milliseconds.
1948c63b474SKrystian Pradzynski  */
1958c63b474SKrystian Pradzynski #define VPU_PRESENT_CALL_PERIOD_MS_DEFAULT 50
1963bd0edf8SJacek Lawrynowicz #define VPU_PRESENT_CALL_PERIOD_MS_MIN	   16
1978c63b474SKrystian Pradzynski #define VPU_PRESENT_CALL_PERIOD_MS_MAX	   10000
198*a4293cc7SAndrzej Kacprowski 
199*a4293cc7SAndrzej Kacprowski /**
200*a4293cc7SAndrzej Kacprowski  * Macros to enable various power profiles within the NPU.
201*a4293cc7SAndrzej Kacprowski  * To be defined as part of 32 bit mask.
202*a4293cc7SAndrzej Kacprowski  */
203*a4293cc7SAndrzej Kacprowski #define POWER_PROFILE_SURVIVABILITY 0x1
204*a4293cc7SAndrzej Kacprowski 
205*a4293cc7SAndrzej Kacprowski /**
206*a4293cc7SAndrzej Kacprowski  * Enum for dvfs_mode boot param.
207*a4293cc7SAndrzej Kacprowski  */
208*a4293cc7SAndrzej Kacprowski enum vpu_governor {
20902d5b0aaSJacek Lawrynowicz 	VPU_GOV_DEFAULT = 0, /* Default Governor for the system */
21002d5b0aaSJacek Lawrynowicz 	VPU_GOV_MAX_PERFORMANCE = 1, /* Maximum performance governor */
21102d5b0aaSJacek Lawrynowicz 	VPU_GOV_ON_DEMAND = 2, /* On Demand frequency control governor */
21202d5b0aaSJacek Lawrynowicz 	VPU_GOV_POWER_SAVE = 3, /* Power save governor */
21302d5b0aaSJacek Lawrynowicz 	VPU_GOV_ON_DEMAND_PRIORITY_AWARE = 4 /* On Demand priority based governor */
21402d5b0aaSJacek Lawrynowicz };
21502d5b0aaSJacek Lawrynowicz 
21602d5b0aaSJacek Lawrynowicz struct vpu_boot_params {
21702d5b0aaSJacek Lawrynowicz 	u32 magic;
21802d5b0aaSJacek Lawrynowicz 	u32 vpu_id;
21902d5b0aaSJacek Lawrynowicz 	u32 vpu_count;
22002d5b0aaSJacek Lawrynowicz 	u32 pad0[5];
22102d5b0aaSJacek Lawrynowicz 	/* Clock frequencies: 0x20 - 0xFF */
22202d5b0aaSJacek Lawrynowicz 	u32 frequency;
22302d5b0aaSJacek Lawrynowicz 	u32 pll[VPU_BOOT_PLL_COUNT][VPU_BOOT_PLL_OUT_COUNT];
22402d5b0aaSJacek Lawrynowicz 	u32 perf_clk_frequency;
22502d5b0aaSJacek Lawrynowicz 	u32 pad1[42];
22602d5b0aaSJacek Lawrynowicz 	/* Memory regions: 0x100 - 0x1FF */
22702d5b0aaSJacek Lawrynowicz 	u64 ipc_header_area_start;
22802d5b0aaSJacek Lawrynowicz 	u32 ipc_header_area_size;
22902d5b0aaSJacek Lawrynowicz 	u64 shared_region_base;
23002d5b0aaSJacek Lawrynowicz 	u32 shared_region_size;
23102d5b0aaSJacek Lawrynowicz 	u64 ipc_payload_area_start;
23202d5b0aaSJacek Lawrynowicz 	u32 ipc_payload_area_size;
23302d5b0aaSJacek Lawrynowicz 	u64 global_aliased_pio_base;
23402d5b0aaSJacek Lawrynowicz 	u32 global_aliased_pio_size;
23502d5b0aaSJacek Lawrynowicz 	u32 autoconfig;
23602d5b0aaSJacek Lawrynowicz 	struct vpu_boot_l2_cache_config cache_defaults[VPU_BOOT_L2_CACHE_CFG_NUM];
23702d5b0aaSJacek Lawrynowicz 	u64 global_memory_allocator_base;
23802d5b0aaSJacek Lawrynowicz 	u32 global_memory_allocator_size;
23902d5b0aaSJacek Lawrynowicz 	/**
24002d5b0aaSJacek Lawrynowicz 	 * ShaveNN FW section VPU base address
24102d5b0aaSJacek Lawrynowicz 	 * On VPU2.7 HW this address must be within 2GB range starting from L2C_PAGE_TABLE base
24202d5b0aaSJacek Lawrynowicz 	 */
24302d5b0aaSJacek Lawrynowicz 	u64 shave_nn_fw_base;
24402d5b0aaSJacek Lawrynowicz 	u64 save_restore_ret_address; /* stores the address of FW's restore entry point */
24502d5b0aaSJacek Lawrynowicz 	u32 pad2[43];
24602d5b0aaSJacek Lawrynowicz 	/* IRQ re-direct numbers: 0x200 - 0x2FF */
24702d5b0aaSJacek Lawrynowicz 	s32 watchdog_irq_mss;
24802d5b0aaSJacek Lawrynowicz 	s32 watchdog_irq_nce;
24902d5b0aaSJacek Lawrynowicz 	/* ARM -> VPU doorbell interrupt. ARM is notifying VPU of async command or compute job. */
25002d5b0aaSJacek Lawrynowicz 	u32 host_to_vpu_irq;
25102d5b0aaSJacek Lawrynowicz 	/* VPU -> ARM job done interrupt. VPU is notifying ARM of compute job completion. */
25202d5b0aaSJacek Lawrynowicz 	u32 job_done_irq;
25302d5b0aaSJacek Lawrynowicz 	/* VPU -> ARM IRQ line to use to request MMU update. */
25402d5b0aaSJacek Lawrynowicz 	u32 mmu_update_request_irq;
25502d5b0aaSJacek Lawrynowicz 	/* ARM -> VPU IRQ line to use to notify of MMU update completion. */
25602d5b0aaSJacek Lawrynowicz 	u32 mmu_update_done_irq;
25702d5b0aaSJacek Lawrynowicz 	/* ARM -> VPU IRQ line to use to request power level change. */
25802d5b0aaSJacek Lawrynowicz 	u32 set_power_level_irq;
25902d5b0aaSJacek Lawrynowicz 	/* VPU -> ARM IRQ line to use to notify of power level change completion. */
26002d5b0aaSJacek Lawrynowicz 	u32 set_power_level_done_irq;
26102d5b0aaSJacek Lawrynowicz 	/* VPU -> ARM IRQ line to use to notify of VPU idle state change */
26202d5b0aaSJacek Lawrynowicz 	u32 set_vpu_idle_update_irq;
26302d5b0aaSJacek Lawrynowicz 	/* VPU -> ARM IRQ line to use to request counter reset. */
26402d5b0aaSJacek Lawrynowicz 	u32 metric_query_event_irq;
26502d5b0aaSJacek Lawrynowicz 	/* ARM -> VPU IRQ line to use to notify of counter reset completion. */
26602d5b0aaSJacek Lawrynowicz 	u32 metric_query_event_done_irq;
26702d5b0aaSJacek Lawrynowicz 	/* VPU -> ARM IRQ line to use to notify of preemption completion. */
26802d5b0aaSJacek Lawrynowicz 	u32 preemption_done_irq;
26902d5b0aaSJacek Lawrynowicz 	/* Padding. */
27002d5b0aaSJacek Lawrynowicz 	u32 pad3[52];
27102d5b0aaSJacek Lawrynowicz 	/* Silicon information: 0x300 - 0x3FF */
27202d5b0aaSJacek Lawrynowicz 	u32 host_version_id;
27302d5b0aaSJacek Lawrynowicz 	u32 si_stepping;
27402d5b0aaSJacek Lawrynowicz 	u64 device_id;
27502d5b0aaSJacek Lawrynowicz 	u64 feature_exclusion;
27602d5b0aaSJacek Lawrynowicz 	u64 sku;
27702d5b0aaSJacek Lawrynowicz 	/** PLL ratio for minimum clock frequency */
27802d5b0aaSJacek Lawrynowicz 	u32 min_freq_pll_ratio;
2798c63b474SKrystian Pradzynski 	/** PLL ratio for maximum clock frequency */
28002d5b0aaSJacek Lawrynowicz 	u32 max_freq_pll_ratio;
28102d5b0aaSJacek Lawrynowicz 	/**
28202d5b0aaSJacek Lawrynowicz 	 * Initial log level threshold (messages with log level severity less than
28302d5b0aaSJacek Lawrynowicz 	 * the threshold will not be logged); applies to every enabled logging
28402d5b0aaSJacek Lawrynowicz 	 * destination and loggable HW component. See 'mvLog_t' enum for acceptable
28502d5b0aaSJacek Lawrynowicz 	 * values.
28602d5b0aaSJacek Lawrynowicz 	 * TODO: EISW-33556: Move log level definition (mvLog_t) to this file.
28702d5b0aaSJacek Lawrynowicz 	 */
28802d5b0aaSJacek Lawrynowicz 	u32 default_trace_level;
28902d5b0aaSJacek Lawrynowicz 	u32 boot_type;
29002d5b0aaSJacek Lawrynowicz 	u64 punit_telemetry_sram_base;
29102d5b0aaSJacek Lawrynowicz 	u64 punit_telemetry_sram_size;
29202d5b0aaSJacek Lawrynowicz 	u32 vpu_telemetry_enable;
29302d5b0aaSJacek Lawrynowicz 	u64 crit_tracing_buff_addr;
29402d5b0aaSJacek Lawrynowicz 	u32 crit_tracing_buff_size;
29502d5b0aaSJacek Lawrynowicz 	u64 verbose_tracing_buff_addr;
29602d5b0aaSJacek Lawrynowicz 	u32 verbose_tracing_buff_size;
29702d5b0aaSJacek Lawrynowicz 	u64 verbose_tracing_sw_component_mask; /* TO BE REMOVED */
29802d5b0aaSJacek Lawrynowicz 	/**
29902d5b0aaSJacek Lawrynowicz 	 * Mask of destinations to which logging messages are delivered; bitwise OR
30002d5b0aaSJacek Lawrynowicz 	 * of values defined in vpu_trace_destination enum.
30102d5b0aaSJacek Lawrynowicz 	 */
30202d5b0aaSJacek Lawrynowicz 	u32 trace_destination_mask;
30302d5b0aaSJacek Lawrynowicz 	/**
30402d5b0aaSJacek Lawrynowicz 	 * Mask of hardware components for which logging is enabled; bitwise OR of
30502d5b0aaSJacek Lawrynowicz 	 * bits defined by the VPU_TRACE_PROC_BIT_* macros.
30602d5b0aaSJacek Lawrynowicz 	 */
30702d5b0aaSJacek Lawrynowicz 	u64 trace_hw_component_mask;
30802d5b0aaSJacek Lawrynowicz 	/** Mask of trace message formats supported by the driver */
30902d5b0aaSJacek Lawrynowicz 	u64 tracing_buff_message_format_mask;
31002d5b0aaSJacek Lawrynowicz 	u64 trace_reserved_1[2];
311*a4293cc7SAndrzej Kacprowski 	/**
312*a4293cc7SAndrzej Kacprowski 	 * Period at which the VPU reads the temp sensor values into MMIO, on
313*a4293cc7SAndrzej Kacprowski 	 * platforms where that is necessary (in ms). 0 to disable reads.
314*a4293cc7SAndrzej Kacprowski 	 */
315*a4293cc7SAndrzej Kacprowski 	u32 temp_sensor_period_ms;
316*a4293cc7SAndrzej Kacprowski 	/** PLL ratio for efficient clock frequency */
317*a4293cc7SAndrzej Kacprowski 	u32 pn_freq_pll_ratio;
318*a4293cc7SAndrzej Kacprowski 	/**
3198c63b474SKrystian Pradzynski 	 * DVFS Mode:
3208c63b474SKrystian Pradzynski 	 * 0 - Default, DVFS mode selected by the firmware
3218c63b474SKrystian Pradzynski 	 * 1 - Max Performance
3228c63b474SKrystian Pradzynski 	 * 2 - On Demand
3238c63b474SKrystian Pradzynski 	 * 3 - Power Save
3248c63b474SKrystian Pradzynski 	 * 4 - On Demand Priority Aware
3258c63b474SKrystian Pradzynski 	 */
3268c63b474SKrystian Pradzynski 	u32 dvfs_mode;
3278c63b474SKrystian Pradzynski 	/**
3288c63b474SKrystian Pradzynski 	 * Depending on DVFS Mode:
3298c63b474SKrystian Pradzynski 	 * On-demand: Default if 0.
3308c63b474SKrystian Pradzynski 	 *    Bit 0-7   - uint8_t: Highest residency percent
3318c63b474SKrystian Pradzynski 	 *    Bit 8-15  - uint8_t: High residency percent
3328c63b474SKrystian Pradzynski 	 *    Bit 16-23 - uint8_t: Low residency percent
3338c63b474SKrystian Pradzynski 	 *    Bit 24-31 - uint8_t: Lowest residency percent
3348c63b474SKrystian Pradzynski 	 *    Bit 32-35 - unsigned 4b: PLL Ratio increase amount on highest residency
3358c63b474SKrystian Pradzynski 	 *    Bit 36-39 - unsigned 4b: PLL Ratio increase amount on high residency
3368c63b474SKrystian Pradzynski 	 *    Bit 40-43 - unsigned 4b: PLL Ratio decrease amount on low residency
3378c63b474SKrystian Pradzynski 	 *    Bit 44-47 - unsigned 4b: PLL Ratio decrease amount on lowest frequency
3388c63b474SKrystian Pradzynski 	 *    Bit 48-55 - uint8_t: Period (ms) for residency decisions
3398c63b474SKrystian Pradzynski 	 *    Bit 56-63 - uint8_t: Averaging windows (as multiples of period. Max: 30 decimal)
3408c63b474SKrystian Pradzynski 	 * Power Save/Max Performance: Unused
3418c63b474SKrystian Pradzynski 	 */
3428c63b474SKrystian Pradzynski 	u64 dvfs_param;
3438c63b474SKrystian Pradzynski 	/**
3448c63b474SKrystian Pradzynski 	 * D0i3 delayed entry
3458c63b474SKrystian Pradzynski 	 * Bit0: Disable CPU state save on D0i2 entry flow.
3468c63b474SKrystian Pradzynski 	 *       0: Every D0i2 entry saves state. Save state IPC message ignored.
3473bd0edf8SJacek Lawrynowicz 	 *       1: IPC message required to save state on D0i3 entry flow.
3483bd0edf8SJacek Lawrynowicz 	 */
349*a4293cc7SAndrzej Kacprowski 	u32 d0i3_delayed_entry;
350*a4293cc7SAndrzej Kacprowski 	/* Time spent by VPU in D0i3 state */
3513bd0edf8SJacek Lawrynowicz 	u64 d0i3_residency_time_us;
3523bd0edf8SJacek Lawrynowicz 	/* Value of VPU perf counter at the time of entering D0i3 state . */
3533bd0edf8SJacek Lawrynowicz 	u64 d0i3_entry_vpu_ts;
3543bd0edf8SJacek Lawrynowicz 	/*
355f1432983SWachowski, Karol 	 * The system time of the host operating system in microseconds.
356f1432983SWachowski, Karol 	 * E.g the number of microseconds since 1st of January 1970, or whatever
357f1432983SWachowski, Karol 	 * date the host operating system uses to maintain system time.
358f1432983SWachowski, Karol 	 * This value will be used to track system time on the VPU.
359f1432983SWachowski, Karol 	 * The KMD is required to update this value on every VPU reset.
360f1432983SWachowski, Karol 	 */
361f1432983SWachowski, Karol 	u64 system_time_us;
362f1432983SWachowski, Karol 	u32 pad4[2];
36302d5b0aaSJacek Lawrynowicz 	/*
36402d5b0aaSJacek Lawrynowicz 	 * The delta between device monotonic time and the current value of the
36502d5b0aaSJacek Lawrynowicz 	 * HW timestamp register, in ticks. Written by the firmware during boot.
36602d5b0aaSJacek Lawrynowicz 	 * Can be used by the KMD to calculate device time.
36702d5b0aaSJacek Lawrynowicz 	 */
36802d5b0aaSJacek Lawrynowicz 	u64 device_time_delta_ticks;
36902d5b0aaSJacek Lawrynowicz 	u32 pad7[14];
37002d5b0aaSJacek Lawrynowicz 	/* Warm boot information: 0x400 - 0x43F */
37102d5b0aaSJacek Lawrynowicz 	u32 warm_boot_sections_count;
37202d5b0aaSJacek Lawrynowicz 	u32 warm_boot_start_address_reference;
37302d5b0aaSJacek Lawrynowicz 	u32 warm_boot_section_info_address_offset;
37402d5b0aaSJacek Lawrynowicz 	u32 pad5[13];
37502d5b0aaSJacek Lawrynowicz 	/* Power States transitions timestamps: 0x440 - 0x46F*/
37602d5b0aaSJacek Lawrynowicz 	struct {
37702d5b0aaSJacek Lawrynowicz 		/* VPU_IDLE -> VPU_ACTIVE transition initiated timestamp */
37802d5b0aaSJacek Lawrynowicz 		u64 vpu_active_state_requested;
37902d5b0aaSJacek Lawrynowicz 		/* VPU_IDLE -> VPU_ACTIVE transition completed timestamp */
38002d5b0aaSJacek Lawrynowicz 		u64 vpu_active_state_achieved;
38102d5b0aaSJacek Lawrynowicz 		/* VPU_ACTIVE -> VPU_IDLE transition initiated timestamp */
38202d5b0aaSJacek Lawrynowicz 		u64 vpu_idle_state_requested;
38302d5b0aaSJacek Lawrynowicz 		/* VPU_ACTIVE -> VPU_IDLE transition completed timestamp */
38402d5b0aaSJacek Lawrynowicz 		u64 vpu_idle_state_achieved;
38502d5b0aaSJacek Lawrynowicz 		/* VPU_IDLE -> VPU_STANDBY transition initiated timestamp */
38602d5b0aaSJacek Lawrynowicz 		u64 vpu_standby_state_requested;
3878c63b474SKrystian Pradzynski 		/* VPU_IDLE -> VPU_STANDBY transition completed timestamp */
3888c63b474SKrystian Pradzynski 		u64 vpu_standby_state_achieved;
3893bd0edf8SJacek Lawrynowicz 	} power_states_timestamps;
3903bd0edf8SJacek Lawrynowicz 	/* VPU scheduling mode. Values defined by VPU_SCHEDULING_MODE_* macros. */
3913bd0edf8SJacek Lawrynowicz 	u32 vpu_scheduling_mode;
3923bd0edf8SJacek Lawrynowicz 	/* Present call period in milliseconds. */
3933bd0edf8SJacek Lawrynowicz 	u32 vpu_focus_present_timer_ms;
3943bd0edf8SJacek Lawrynowicz 	/* VPU ECC Signaling */
3953bd0edf8SJacek Lawrynowicz 	u32 vpu_uses_ecc_mca_signal;
3963bd0edf8SJacek Lawrynowicz 	/* Values defined by POWER_PROFILE* macros */
39702d5b0aaSJacek Lawrynowicz 	u32 power_profile;
39802d5b0aaSJacek Lawrynowicz 	/* Microsecond value for DCT active cycle */
399*a4293cc7SAndrzej Kacprowski 	u32 dct_active_us;
40002d5b0aaSJacek Lawrynowicz 	/* Microsecond value for DCT inactive cycle */
40102d5b0aaSJacek Lawrynowicz 	u32 dct_inactive_us;
40202d5b0aaSJacek Lawrynowicz 	/* Unused/reserved: 0x488 - 0xFFF */
40302d5b0aaSJacek Lawrynowicz 	u32 pad6[734];
40402d5b0aaSJacek Lawrynowicz };
40502d5b0aaSJacek Lawrynowicz 
40602d5b0aaSJacek Lawrynowicz /* Magic numbers set between host and vpu to detect corruption of tracing init */
40702d5b0aaSJacek Lawrynowicz #define VPU_TRACING_BUFFER_CANARY (0xCAFECAFE)
40802d5b0aaSJacek Lawrynowicz 
40902d5b0aaSJacek Lawrynowicz /* Tracing buffer message format definitions */
41002d5b0aaSJacek Lawrynowicz #define VPU_TRACING_FORMAT_STRING 0
41102d5b0aaSJacek Lawrynowicz #define VPU_TRACING_FORMAT_MIPI	  2
41202d5b0aaSJacek Lawrynowicz /*
41302d5b0aaSJacek Lawrynowicz  * Header of the tracing buffer.
41402d5b0aaSJacek Lawrynowicz  * The below defined header will be stored at the beginning of
41502d5b0aaSJacek Lawrynowicz  * each allocated tracing buffer, followed by a series of 256b
41602d5b0aaSJacek Lawrynowicz  * of ASCII trace message entries.
41702d5b0aaSJacek Lawrynowicz  */
41802d5b0aaSJacek Lawrynowicz struct vpu_tracing_buffer_header {
419*a4293cc7SAndrzej Kacprowski 	/**
420*a4293cc7SAndrzej Kacprowski 	 * Magic number set by host to detect corruption
421*a4293cc7SAndrzej Kacprowski 	 * @see VPU_TRACING_BUFFER_CANARY
42202d5b0aaSJacek Lawrynowicz 	 */
42302d5b0aaSJacek Lawrynowicz 	u32 host_canary_start;
42402d5b0aaSJacek Lawrynowicz 	/* offset from start of buffer for trace entries */
42502d5b0aaSJacek Lawrynowicz 	u32 read_index;
42602d5b0aaSJacek Lawrynowicz 	/* keeps track of wrapping on the reader side */
42702d5b0aaSJacek Lawrynowicz 	u32 read_wrap_count;
42802d5b0aaSJacek Lawrynowicz 	u32 pad_to_cache_line_size_0[13];
42902d5b0aaSJacek Lawrynowicz 	/* End of first cache line */
43002d5b0aaSJacek Lawrynowicz 
43102d5b0aaSJacek Lawrynowicz 	/**
43202d5b0aaSJacek Lawrynowicz 	 * Magic number set by host to detect corruption
43302d5b0aaSJacek Lawrynowicz 	 * @see VPU_TRACING_BUFFER_CANARY
43402d5b0aaSJacek Lawrynowicz 	 */
43502d5b0aaSJacek Lawrynowicz 	u32 vpu_canary_start;
43602d5b0aaSJacek Lawrynowicz 	/* offset from start of buffer from write start */
43702d5b0aaSJacek Lawrynowicz 	u32 write_index;
43802d5b0aaSJacek Lawrynowicz 	/* counter for buffer wrapping */
43902d5b0aaSJacek Lawrynowicz 	u32 wrap_count;
44002d5b0aaSJacek Lawrynowicz 	/* legacy field - do not use */
44102d5b0aaSJacek Lawrynowicz 	u32 reserved_0;
44202d5b0aaSJacek Lawrynowicz 	/**
44302d5b0aaSJacek Lawrynowicz 	 * Size of the log buffer include this header (@header_size) and space
44402d5b0aaSJacek Lawrynowicz 	 * reserved for all messages. If @alignment` is greater that 0 the @Size
44502d5b0aaSJacek Lawrynowicz 	 * must be multiple of @Alignment.
44602d5b0aaSJacek Lawrynowicz 	 */
44702d5b0aaSJacek Lawrynowicz 	u32 size;
44802d5b0aaSJacek Lawrynowicz 	/* Header version */
44902d5b0aaSJacek Lawrynowicz 	u16 header_version;
45002d5b0aaSJacek Lawrynowicz 	/* Header size */
45102d5b0aaSJacek Lawrynowicz 	u16 header_size;
45202d5b0aaSJacek Lawrynowicz 	/*
45302d5b0aaSJacek Lawrynowicz 	 * Format of the messages in the trace buffer
45402d5b0aaSJacek Lawrynowicz 	 * 0 - null terminated string
45502d5b0aaSJacek Lawrynowicz 	 * 1 - size + null terminated string
45602d5b0aaSJacek Lawrynowicz 	 * 2 - MIPI-SysT encoding
45702d5b0aaSJacek Lawrynowicz 	 */
45802d5b0aaSJacek Lawrynowicz 	u32 format;
45902d5b0aaSJacek Lawrynowicz 	/*
46002d5b0aaSJacek Lawrynowicz 	 * Message alignment
46102d5b0aaSJacek Lawrynowicz 	 * 0 - messages are place 1 after another
46202d5b0aaSJacek Lawrynowicz 	 * n - every message starts and multiple on offset
46302d5b0aaSJacek Lawrynowicz 	 */
46402d5b0aaSJacek Lawrynowicz 	u32 alignment; /* 64, 128, 256 */
46502d5b0aaSJacek Lawrynowicz 	/* Name of the logging entity, i.e "LRT", "LNN", "SHV0", etc */
46602d5b0aaSJacek Lawrynowicz 	char name[16];
467 	u32 pad_to_cache_line_size_1[4];
468 	/* End of second cache line */
469 };
470 
471 #pragma pack(pop)
472 
473 #endif
474