Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpu: host1x: Tegra234 device data and headers

Add device data and chip headers for Tegra234.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>

authored by

Mikko Perttunen and committed by
Thierry Reding
9abdd497 7afd1194

+354 -1
+2 -1
drivers/gpu/host1x/Makefile
··· 15 15 hw/host1x04.o \ 16 16 hw/host1x05.o \ 17 17 hw/host1x06.o \ 18 - hw/host1x07.o 18 + hw/host1x07.o \ 19 + hw/host1x08.o 19 20 20 21 host1x-$(CONFIG_IOMMU_API) += \ 21 22 context.o
+42
drivers/gpu/host1x/dev.c
··· 39 39 #include "hw/host1x05.h" 40 40 #include "hw/host1x06.h" 41 41 #include "hw/host1x07.h" 42 + #include "hw/host1x08.h" 42 43 43 44 void host1x_common_writel(struct host1x *host1x, u32 v, u32 r) 44 45 { ··· 206 205 .reserve_vblank_syncpts = false, 207 206 }; 208 207 208 + /* 209 + * Tegra234 has two stream ID protection tables, one for setting stream IDs 210 + * through the channel path via SETSTREAMID, and one for setting them via 211 + * MMIO. We program each engine's data stream ID in the channel path table 212 + * and firmware stream ID in the MMIO path table. 213 + */ 214 + static const struct host1x_sid_entry tegra234_sid_table[] = { 215 + { 216 + /* VIC channel */ 217 + .base = 0x17b8, 218 + .offset = 0x30, 219 + .limit = 0x30 220 + }, 221 + { 222 + /* VIC MMIO */ 223 + .base = 0x1688, 224 + .offset = 0x34, 225 + .limit = 0x34 226 + }, 227 + }; 228 + 229 + static const struct host1x_info host1x08_info = { 230 + .nb_channels = 63, 231 + .nb_pts = 1024, 232 + .nb_mlocks = 24, 233 + .nb_bases = 0, 234 + .init = host1x08_init, 235 + .sync_offset = 0x0, 236 + .dma_mask = DMA_BIT_MASK(40), 237 + .has_wide_gather = true, 238 + .has_hypervisor = true, 239 + .has_common = true, 240 + .num_sid_entries = ARRAY_SIZE(tegra234_sid_table), 241 + .sid_table = tegra234_sid_table, 242 + .streamid_vm_table = { 0x1004, 128 }, 243 + .classid_vm_table = { 0x1404, 25 }, 244 + .mmio_vm_table = { 0x1504, 25 }, 245 + .reserve_vblank_syncpts = false, 246 + }; 247 + 209 248 static const struct of_device_id host1x_of_match[] = { 249 + { .compatible = "nvidia,tegra234-host1x", .data = &host1x08_info, }, 210 250 { .compatible = "nvidia,tegra194-host1x", .data = &host1x07_info, }, 211 251 { .compatible = "nvidia,tegra186-host1x", .data = &host1x06_info, }, 212 252 { .compatible = "nvidia,tegra210-host1x", .data = &host1x05_info, },
+33
drivers/gpu/host1x/hw/host1x08.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Host1x init for Tegra234 SoCs 4 + * 5 + * Copyright (c) 2022 NVIDIA Corporation. 6 + */ 7 + 8 + /* include hw specification */ 9 + #include "host1x08.h" 10 + #include "host1x08_hardware.h" 11 + 12 + /* include code */ 13 + #define HOST1X_HW 8 14 + 15 + #include "cdma_hw.c" 16 + #include "channel_hw.c" 17 + #include "debug_hw.c" 18 + #include "intr_hw.c" 19 + #include "syncpt_hw.c" 20 + 21 + #include "../dev.h" 22 + 23 + int host1x08_init(struct host1x *host) 24 + { 25 + host->channel_op = &host1x_channel_ops; 26 + host->cdma_op = &host1x_cdma_ops; 27 + host->cdma_pb_op = &host1x_pushbuffer_ops; 28 + host->syncpt_op = &host1x_syncpt_ops; 29 + host->intr_op = &host1x_intr_ops; 30 + host->debug_op = &host1x_debug_ops; 31 + 32 + return 0; 33 + }
+15
drivers/gpu/host1x/hw/host1x08.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Host1x init for Tegra234 SoCs 4 + * 5 + * Copyright (c) 2018 NVIDIA Corporation. 6 + */ 7 + 8 + #ifndef HOST1X_HOST1X08_H 9 + #define HOST1X_HOST1X08_H 10 + 11 + struct host1x; 12 + 13 + int host1x08_init(struct host1x *host); 14 + 15 + #endif
+21
drivers/gpu/host1x/hw/host1x08_hardware.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Tegra host1x Register Offsets for Tegra234 4 + * 5 + * Copyright (c) 2022 NVIDIA Corporation. 6 + */ 7 + 8 + #ifndef __HOST1X_HOST1X08_HARDWARE_H 9 + #define __HOST1X_HOST1X08_HARDWARE_H 10 + 11 + #include <linux/types.h> 12 + #include <linux/bitops.h> 13 + 14 + #include "hw_host1x08_uclass.h" 15 + #include "hw_host1x08_vm.h" 16 + #include "hw_host1x08_hypervisor.h" 17 + #include "hw_host1x08_common.h" 18 + 19 + #include "opcodes.h" 20 + 21 + #endif
+11
drivers/gpu/host1x/hw/hw_host1x08_channel.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022 NVIDIA Corporation. 4 + */ 5 + 6 + #ifndef HOST1X_HW_HOST1X08_CHANNEL_H 7 + #define HOST1X_HW_HOST1X08_CHANNEL_H 8 + 9 + #define HOST1X_CHANNEL_SMMU_STREAMID 0x084 10 + 11 + #endif
+4
drivers/gpu/host1x/hw/hw_host1x08_common.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022 NVIDIA Corporation. 4 + */
+9
drivers/gpu/host1x/hw/hw_host1x08_hypervisor.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022 NVIDIA Corporation. 4 + */ 5 + 6 + #define HOST1X_HV_SYNCPT_PROT_EN 0x1724 7 + #define HOST1X_HV_SYNCPT_PROT_EN_CH_EN BIT(1) 8 + #define HOST1X_HV_CH_MLOCK_EN(x) (0x1700 + (x * 4)) 9 + #define HOST1X_HV_CH_KERNEL_FILTER_GBUFFER(x) (0x1710 + (x * 4))
+181
drivers/gpu/host1x/hw/hw_host1x08_uclass.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2018 NVIDIA Corporation. 4 + */ 5 + 6 + /* 7 + * Function naming determines intended use: 8 + * 9 + * <x>_r(void) : Returns the offset for register <x>. 10 + * 11 + * <x>_w(void) : Returns the word offset for word (4 byte) element <x>. 12 + * 13 + * <x>_<y>_s(void) : Returns size of field <y> of register <x> in bits. 14 + * 15 + * <x>_<y>_f(u32 v) : Returns a value based on 'v' which has been shifted 16 + * and masked to place it at field <y> of register <x>. This value 17 + * can be |'d with others to produce a full register value for 18 + * register <x>. 19 + * 20 + * <x>_<y>_m(void) : Returns a mask for field <y> of register <x>. This 21 + * value can be ~'d and then &'d to clear the value of field <y> for 22 + * register <x>. 23 + * 24 + * <x>_<y>_<z>_f(void) : Returns the constant value <z> after being shifted 25 + * to place it at field <y> of register <x>. This value can be |'d 26 + * with others to produce a full register value for <x>. 27 + * 28 + * <x>_<y>_v(u32 r) : Returns the value of field <y> from a full register 29 + * <x> value 'r' after being shifted to place its LSB at bit 0. 30 + * This value is suitable for direct comparison with other unshifted 31 + * values appropriate for use in field <y> of register <x>. 32 + * 33 + * <x>_<y>_<z>_v(void) : Returns the constant value for <z> defined for 34 + * field <y> of register <x>. This value is suitable for direct 35 + * comparison with unshifted values appropriate for use in field <y> 36 + * of register <x>. 37 + */ 38 + 39 + #ifndef HOST1X_HW_HOST1X08_UCLASS_H 40 + #define HOST1X_HW_HOST1X08_UCLASS_H 41 + 42 + static inline u32 host1x_uclass_incr_syncpt_r(void) 43 + { 44 + return 0x0; 45 + } 46 + #define HOST1X_UCLASS_INCR_SYNCPT \ 47 + host1x_uclass_incr_syncpt_r() 48 + static inline u32 host1x_uclass_incr_syncpt_cond_f(u32 v) 49 + { 50 + return (v & 0xff) << 10; 51 + } 52 + #define HOST1X_UCLASS_INCR_SYNCPT_COND_F(v) \ 53 + host1x_uclass_incr_syncpt_cond_f(v) 54 + static inline u32 host1x_uclass_incr_syncpt_indx_f(u32 v) 55 + { 56 + return (v & 0xff) << 0; 57 + } 58 + #define HOST1X_UCLASS_INCR_SYNCPT_INDX_F(v) \ 59 + host1x_uclass_incr_syncpt_indx_f(v) 60 + static inline u32 host1x_uclass_wait_syncpt_r(void) 61 + { 62 + return 0x8; 63 + } 64 + #define HOST1X_UCLASS_WAIT_SYNCPT \ 65 + host1x_uclass_wait_syncpt_r() 66 + static inline u32 host1x_uclass_wait_syncpt_indx_f(u32 v) 67 + { 68 + return (v & 0xff) << 24; 69 + } 70 + #define HOST1X_UCLASS_WAIT_SYNCPT_INDX_F(v) \ 71 + host1x_uclass_wait_syncpt_indx_f(v) 72 + static inline u32 host1x_uclass_wait_syncpt_thresh_f(u32 v) 73 + { 74 + return (v & 0xffffff) << 0; 75 + } 76 + #define HOST1X_UCLASS_WAIT_SYNCPT_THRESH_F(v) \ 77 + host1x_uclass_wait_syncpt_thresh_f(v) 78 + static inline u32 host1x_uclass_wait_syncpt_base_r(void) 79 + { 80 + return 0x9; 81 + } 82 + #define HOST1X_UCLASS_WAIT_SYNCPT_BASE \ 83 + host1x_uclass_wait_syncpt_base_r() 84 + static inline u32 host1x_uclass_wait_syncpt_base_indx_f(u32 v) 85 + { 86 + return (v & 0xff) << 24; 87 + } 88 + #define HOST1X_UCLASS_WAIT_SYNCPT_BASE_INDX_F(v) \ 89 + host1x_uclass_wait_syncpt_base_indx_f(v) 90 + static inline u32 host1x_uclass_wait_syncpt_base_base_indx_f(u32 v) 91 + { 92 + return (v & 0xff) << 16; 93 + } 94 + #define HOST1X_UCLASS_WAIT_SYNCPT_BASE_BASE_INDX_F(v) \ 95 + host1x_uclass_wait_syncpt_base_base_indx_f(v) 96 + static inline u32 host1x_uclass_wait_syncpt_base_offset_f(u32 v) 97 + { 98 + return (v & 0xffff) << 0; 99 + } 100 + #define HOST1X_UCLASS_WAIT_SYNCPT_BASE_OFFSET_F(v) \ 101 + host1x_uclass_wait_syncpt_base_offset_f(v) 102 + static inline u32 host1x_uclass_load_syncpt_base_r(void) 103 + { 104 + return 0xb; 105 + } 106 + #define HOST1X_UCLASS_LOAD_SYNCPT_BASE \ 107 + host1x_uclass_load_syncpt_base_r() 108 + static inline u32 host1x_uclass_load_syncpt_base_base_indx_f(u32 v) 109 + { 110 + return (v & 0xff) << 24; 111 + } 112 + #define HOST1X_UCLASS_LOAD_SYNCPT_BASE_BASE_INDX_F(v) \ 113 + host1x_uclass_load_syncpt_base_base_indx_f(v) 114 + static inline u32 host1x_uclass_load_syncpt_base_value_f(u32 v) 115 + { 116 + return (v & 0xffffff) << 0; 117 + } 118 + #define HOST1X_UCLASS_LOAD_SYNCPT_BASE_VALUE_F(v) \ 119 + host1x_uclass_load_syncpt_base_value_f(v) 120 + static inline u32 host1x_uclass_incr_syncpt_base_base_indx_f(u32 v) 121 + { 122 + return (v & 0xff) << 24; 123 + } 124 + #define HOST1X_UCLASS_INCR_SYNCPT_BASE_BASE_INDX_F(v) \ 125 + host1x_uclass_incr_syncpt_base_base_indx_f(v) 126 + static inline u32 host1x_uclass_incr_syncpt_base_offset_f(u32 v) 127 + { 128 + return (v & 0xffffff) << 0; 129 + } 130 + #define HOST1X_UCLASS_INCR_SYNCPT_BASE_OFFSET_F(v) \ 131 + host1x_uclass_incr_syncpt_base_offset_f(v) 132 + static inline u32 host1x_uclass_indoff_r(void) 133 + { 134 + return 0x2d; 135 + } 136 + #define HOST1X_UCLASS_INDOFF \ 137 + host1x_uclass_indoff_r() 138 + static inline u32 host1x_uclass_indoff_indbe_f(u32 v) 139 + { 140 + return (v & 0xf) << 28; 141 + } 142 + #define HOST1X_UCLASS_INDOFF_INDBE_F(v) \ 143 + host1x_uclass_indoff_indbe_f(v) 144 + static inline u32 host1x_uclass_indoff_autoinc_f(u32 v) 145 + { 146 + return (v & 0x1) << 27; 147 + } 148 + #define HOST1X_UCLASS_INDOFF_AUTOINC_F(v) \ 149 + host1x_uclass_indoff_autoinc_f(v) 150 + static inline u32 host1x_uclass_indoff_indmodid_f(u32 v) 151 + { 152 + return (v & 0xff) << 18; 153 + } 154 + #define HOST1X_UCLASS_INDOFF_INDMODID_F(v) \ 155 + host1x_uclass_indoff_indmodid_f(v) 156 + static inline u32 host1x_uclass_indoff_indroffset_f(u32 v) 157 + { 158 + return (v & 0xffff) << 2; 159 + } 160 + #define HOST1X_UCLASS_INDOFF_INDROFFSET_F(v) \ 161 + host1x_uclass_indoff_indroffset_f(v) 162 + static inline u32 host1x_uclass_indoff_rwn_read_v(void) 163 + { 164 + return 1; 165 + } 166 + #define HOST1X_UCLASS_INDOFF_INDROFFSET_F(v) \ 167 + host1x_uclass_indoff_indroffset_f(v) 168 + static inline u32 host1x_uclass_load_syncpt_payload_32_r(void) 169 + { 170 + return 0x4e; 171 + } 172 + #define HOST1X_UCLASS_LOAD_SYNCPT_PAYLOAD_32 \ 173 + host1x_uclass_load_syncpt_payload_32_r() 174 + static inline u32 host1x_uclass_wait_syncpt_32_r(void) 175 + { 176 + return 0x50; 177 + } 178 + #define HOST1X_UCLASS_WAIT_SYNCPT_32 \ 179 + host1x_uclass_wait_syncpt_32_r() 180 + 181 + #endif
+36
drivers/gpu/host1x/hw/hw_host1x08_vm.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022 NVIDIA Corporation. 4 + */ 5 + 6 + #define HOST1X_CHANNEL_DMASTART 0x0000 7 + #define HOST1X_CHANNEL_DMASTART_HI 0x0004 8 + #define HOST1X_CHANNEL_DMAPUT 0x0008 9 + #define HOST1X_CHANNEL_DMAPUT_HI 0x000c 10 + #define HOST1X_CHANNEL_DMAGET 0x0010 11 + #define HOST1X_CHANNEL_DMAGET_HI 0x0014 12 + #define HOST1X_CHANNEL_DMAEND 0x0018 13 + #define HOST1X_CHANNEL_DMAEND_HI 0x001c 14 + #define HOST1X_CHANNEL_DMACTRL 0x0020 15 + #define HOST1X_CHANNEL_DMACTRL_DMASTOP BIT(0) 16 + #define HOST1X_CHANNEL_DMACTRL_DMAGETRST BIT(1) 17 + #define HOST1X_CHANNEL_DMACTRL_DMAINITGET BIT(2) 18 + #define HOST1X_CHANNEL_CMDFIFO_STAT 0x0024 19 + #define HOST1X_CHANNEL_CMDFIFO_STAT_EMPTY BIT(13) 20 + #define HOST1X_CHANNEL_CMDFIFO_RDATA 0x0028 21 + #define HOST1X_CHANNEL_CMDP_OFFSET 0x0030 22 + #define HOST1X_CHANNEL_CMDP_CLASS 0x0034 23 + #define HOST1X_CHANNEL_CHANNELSTAT 0x0038 24 + #define HOST1X_CHANNEL_CMDPROC_STOP 0x0048 25 + #define HOST1X_CHANNEL_TEARDOWN 0x004c 26 + #define HOST1X_CHANNEL_SMMU_STREAMID 0x0084 27 + 28 + #define HOST1X_SYNC_SYNCPT_CPU_INCR(x) (0x6400 + 4 * (x)) 29 + #define HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(x) (0x6600 + 4 * (x)) 30 + #define HOST1X_SYNC_SYNCPT_INTR_DEST(x) (0x6684 + 4 * (x)) 31 + #define HOST1X_SYNC_SYNCPT_THRESH_INT_ENABLE_CPU0(x) (0x770c + 4 * (x)) 32 + #define HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(x) (0x7790 + 4 * (x)) 33 + #define HOST1X_SYNC_SYNCPT(x) (0x8080 + 4 * (x)) 34 + #define HOST1X_SYNC_SYNCPT_INT_THRESH(x) (0xa088 + 4 * (x)) 35 + #define HOST1X_SYNC_SYNCPT_CH_APP(x) (0xb090 + 4 * (x)) 36 + #define HOST1X_SYNC_SYNCPT_CH_APP_CH(v) (((v) & 0x3f) << 8)