1 /* SPDX-License-Identifier: GPL-2.0
3 * Copyright 2016-2019 HabanaLabs, Ltd.
11 #include <uapi/misc/habanalabs.h>
12 #include "habanalabs.h"
13 #include "include/hl_boot_if.h"
14 #include "include/goya/goya_packets.h"
15 #include "include/goya/goya.h"
16 #include "include/goya/goya_async_events.h"
17 #include "include/goya/goya_fw_if.h"
19 #define NUMBER_OF_CMPLT_QUEUES 5
20 #define NUMBER_OF_EXT_HW_QUEUES 5
21 #define NUMBER_OF_CPU_HW_QUEUES 1
22 #define NUMBER_OF_INT_HW_QUEUES 9
23 #define NUMBER_OF_HW_QUEUES (NUMBER_OF_EXT_HW_QUEUES + \
24 NUMBER_OF_CPU_HW_QUEUES + \
25 NUMBER_OF_INT_HW_QUEUES)
28 * Number of MSIX interrupts IDS:
29 * Each completion queue has 1 ID
30 * The event queue has 1 ID
32 #define NUMBER_OF_INTERRUPTS (NUMBER_OF_CMPLT_QUEUES + 1)
34 #if (NUMBER_OF_HW_QUEUES >= HL_MAX_QUEUES)
35 #error "Number of H/W queues must be smaller than HL_MAX_QUEUES"
38 #if (NUMBER_OF_INTERRUPTS > GOYA_MSIX_ENTRIES)
39 #error "Number of MSIX interrupts must be smaller or equal to GOYA_MSIX_ENTRIES"
42 #define QMAN_FENCE_TIMEOUT_USEC 10000 /* 10 ms */
44 #define QMAN_STOP_TIMEOUT_USEC 100000 /* 100 ms */
46 #define TPC_ENABLED_MASK 0xFF
48 #define PLL_HIGH_DEFAULT 1575000000 /* 1.575 GHz */
50 #define GOYA_ARMCP_INFO_TIMEOUT 10000000 /* 10s */
52 #define DRAM_PHYS_DEFAULT_SIZE 0x100000000ull /* 4GB */
56 #define CPU_FW_IMAGE_SIZE 0x10000000 /* 256MB */
57 #define MMU_PAGE_TABLES_SIZE 0x0E000000 /* 224MB */
58 #define MMU_CACHE_MNG_SIZE 0x00001000 /* 4KB */
59 #define CPU_PQ_PKT_SIZE 0x00001000 /* 4KB */
60 #define CPU_PQ_DATA_SIZE 0x01FFE000 /* 32MB - 8KB */
62 #define CPU_FW_IMAGE_ADDR DRAM_PHYS_BASE
63 #define MMU_PAGE_TABLES_ADDR (CPU_FW_IMAGE_ADDR + CPU_FW_IMAGE_SIZE)
64 #define MMU_CACHE_MNG_ADDR (MMU_PAGE_TABLES_ADDR + MMU_PAGE_TABLES_SIZE)
65 #define CPU_PQ_PKT_ADDR (MMU_CACHE_MNG_ADDR + MMU_CACHE_MNG_SIZE)
66 #define CPU_PQ_DATA_ADDR (CPU_PQ_PKT_ADDR + CPU_PQ_PKT_SIZE)
67 #define DRAM_BASE_ADDR_USER (CPU_PQ_DATA_ADDR + CPU_PQ_DATA_SIZE)
69 #if (DRAM_BASE_ADDR_USER != 0x20000000)
70 #error "KMD must reserve 512MB"
74 * SRAM Memory Map for KMD
76 * KMD occupies KMD_SRAM_SIZE bytes from the start of SRAM. It is used for
81 #define MME_QMAN_BASE_OFFSET 0x000000 /* Must be 0 */
82 #define MME_QMAN_LENGTH 64
83 #define TPC_QMAN_LENGTH 64
85 #define TPC0_QMAN_BASE_OFFSET (MME_QMAN_BASE_OFFSET + \
86 (MME_QMAN_LENGTH * QMAN_PQ_ENTRY_SIZE))
87 #define TPC1_QMAN_BASE_OFFSET (TPC0_QMAN_BASE_OFFSET + \
88 (TPC_QMAN_LENGTH * QMAN_PQ_ENTRY_SIZE))
89 #define TPC2_QMAN_BASE_OFFSET (TPC1_QMAN_BASE_OFFSET + \
90 (TPC_QMAN_LENGTH * QMAN_PQ_ENTRY_SIZE))
91 #define TPC3_QMAN_BASE_OFFSET (TPC2_QMAN_BASE_OFFSET + \
92 (TPC_QMAN_LENGTH * QMAN_PQ_ENTRY_SIZE))
93 #define TPC4_QMAN_BASE_OFFSET (TPC3_QMAN_BASE_OFFSET + \
94 (TPC_QMAN_LENGTH * QMAN_PQ_ENTRY_SIZE))
95 #define TPC5_QMAN_BASE_OFFSET (TPC4_QMAN_BASE_OFFSET + \
96 (TPC_QMAN_LENGTH * QMAN_PQ_ENTRY_SIZE))
97 #define TPC6_QMAN_BASE_OFFSET (TPC5_QMAN_BASE_OFFSET + \
98 (TPC_QMAN_LENGTH * QMAN_PQ_ENTRY_SIZE))
99 #define TPC7_QMAN_BASE_OFFSET (TPC6_QMAN_BASE_OFFSET + \
100 (TPC_QMAN_LENGTH * QMAN_PQ_ENTRY_SIZE))
102 #define SRAM_KMD_RES_OFFSET (TPC7_QMAN_BASE_OFFSET + \
103 (TPC_QMAN_LENGTH * QMAN_PQ_ENTRY_SIZE))
105 #if (SRAM_KMD_RES_OFFSET >= GOYA_KMD_SRAM_RESERVED_SIZE_FROM_START)
106 #error "MME/TPC QMANs SRAM space exceeds limit"
109 #define SRAM_USER_BASE_OFFSET GOYA_KMD_SRAM_RESERVED_SIZE_FROM_START
111 /* Virtual address space */
112 #define VA_HOST_SPACE_START 0x1000000000000ull /* 256TB */
113 #define VA_HOST_SPACE_END 0x3FF8000000000ull /* 1PB - 1TB */
114 #define VA_HOST_SPACE_SIZE (VA_HOST_SPACE_END - \
115 VA_HOST_SPACE_START) /* 767TB */
117 #define VA_DDR_SPACE_START 0x800000000ull /* 32GB */
118 #define VA_DDR_SPACE_END 0x2000000000ull /* 128GB */
119 #define VA_DDR_SPACE_SIZE (VA_DDR_SPACE_END - \
120 VA_DDR_SPACE_START) /* 128GB */
122 #define DMA_MAX_TRANSFER_SIZE 0xFFFFFFFF
124 #define HW_CAP_PLL 0x00000001
125 #define HW_CAP_DDR_0 0x00000002
126 #define HW_CAP_DDR_1 0x00000004
127 #define HW_CAP_MME 0x00000008
128 #define HW_CAP_CPU 0x00000010
129 #define HW_CAP_DMA 0x00000020
130 #define HW_CAP_MSIX 0x00000040
131 #define HW_CAP_CPU_Q 0x00000080
132 #define HW_CAP_MMU 0x00000100
133 #define HW_CAP_TPC_MBIST 0x00000200
134 #define HW_CAP_GOLDEN 0x00000400
135 #define HW_CAP_TPC 0x00000800
137 #define CPU_PKT_SHIFT 5
138 #define CPU_PKT_SIZE (1 << CPU_PKT_SHIFT)
139 #define CPU_PKT_MASK (~((1 << CPU_PKT_SHIFT) - 1))
140 #define CPU_MAX_PKTS_IN_CB 32
141 #define CPU_CB_SIZE (CPU_PKT_SIZE * CPU_MAX_PKTS_IN_CB)
142 #define CPU_ACCESSIBLE_MEM_SIZE (HL_QUEUE_LENGTH * CPU_CB_SIZE)
144 enum goya_fw_component {
150 int (*test_cpu_queue)(struct hl_device *hdev);
152 /* TODO: remove hw_queues_lock after moving to scheduler code */
153 spinlock_t hw_queues_lock;
154 u64 ddr_bar_cur_addr;
155 u32 events_stat[GOYA_ASYNC_EVENT_ID_SIZE];
156 u32 hw_cap_initialized;
159 int goya_test_cpu_queue(struct hl_device *hdev);
160 int goya_send_cpu_message(struct hl_device *hdev, u32 *msg, u16 len,
161 u32 timeout, long *result);
162 void goya_init_security(struct hl_device *hdev);
164 #endif /* GOYAP_H_ */