17b0b0191SHector Martin// SPDX-License-Identifier: GPL-2.0+ OR MIT 27b0b0191SHector Martin/* 37b0b0191SHector Martin * Common Apple T6000 / T6001 / T6002 "M1 Pro/Max/Ultra" SoC 47b0b0191SHector Martin * 57b0b0191SHector Martin * Other names: H13J, "Jade Chop", "Jade", "Jade 2C" 67b0b0191SHector Martin * 77b0b0191SHector Martin * Copyright The Asahi Linux Contributors 87b0b0191SHector Martin */ 97b0b0191SHector Martin 107b0b0191SHector Martin/ { 117b0b0191SHector Martin #address-cells = <2>; 127b0b0191SHector Martin #size-cells = <2>; 137b0b0191SHector Martin 14*76f3ffebSSasha Finkelstein aliases { 15*76f3ffebSSasha Finkelstein gpu = &gpu; 16*76f3ffebSSasha Finkelstein }; 17*76f3ffebSSasha Finkelstein 187b0b0191SHector Martin cpus { 197b0b0191SHector Martin #address-cells = <2>; 207b0b0191SHector Martin #size-cells = <0>; 217b0b0191SHector Martin 22d32c1530SHector Martin cpu-map { 23d32c1530SHector Martin cluster0 { 24d32c1530SHector Martin core0 { 25d32c1530SHector Martin cpu = <&cpu_e00>; 26d32c1530SHector Martin }; 27d32c1530SHector Martin core1 { 28d32c1530SHector Martin cpu = <&cpu_e01>; 29d32c1530SHector Martin }; 30d32c1530SHector Martin }; 31d32c1530SHector Martin 32d32c1530SHector Martin cluster1 { 33d32c1530SHector Martin core0 { 34d32c1530SHector Martin cpu = <&cpu_p00>; 35d32c1530SHector Martin }; 36d32c1530SHector Martin core1 { 37d32c1530SHector Martin cpu = <&cpu_p01>; 38d32c1530SHector Martin }; 39d32c1530SHector Martin core2 { 40d32c1530SHector Martin cpu = <&cpu_p02>; 41d32c1530SHector Martin }; 42d32c1530SHector Martin core3 { 43d32c1530SHector Martin cpu = <&cpu_p03>; 44d32c1530SHector Martin }; 45d32c1530SHector Martin }; 46d32c1530SHector Martin 47d32c1530SHector Martin cluster2 { 48d32c1530SHector Martin core0 { 49d32c1530SHector Martin cpu = <&cpu_p10>; 50d32c1530SHector Martin }; 51d32c1530SHector Martin core1 { 52d32c1530SHector Martin cpu = <&cpu_p11>; 53d32c1530SHector Martin }; 54d32c1530SHector Martin core2 { 55d32c1530SHector Martin cpu = <&cpu_p12>; 56d32c1530SHector Martin }; 57d32c1530SHector Martin core3 { 58d32c1530SHector Martin cpu = <&cpu_p13>; 59d32c1530SHector Martin }; 60d32c1530SHector Martin }; 61d32c1530SHector Martin }; 62d32c1530SHector Martin 637b0b0191SHector Martin cpu_e00: cpu@0 { 647b0b0191SHector Martin compatible = "apple,icestorm"; 657b0b0191SHector Martin device_type = "cpu"; 667b0b0191SHector Martin reg = <0x0 0x0>; 677b0b0191SHector Martin enable-method = "spin-table"; 687b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 6983fb5b55SRob Herring next-level-cache = <&l2_cache_0>; 7083fb5b55SRob Herring i-cache-size = <0x20000>; 7183fb5b55SRob Herring d-cache-size = <0x10000>; 72d32c1530SHector Martin operating-points-v2 = <&icestorm_opp>; 73d32c1530SHector Martin capacity-dmips-mhz = <714>; 74d32c1530SHector Martin performance-domains = <&cpufreq_e>; 757b0b0191SHector Martin }; 767b0b0191SHector Martin 777b0b0191SHector Martin cpu_e01: cpu@1 { 787b0b0191SHector Martin compatible = "apple,icestorm"; 797b0b0191SHector Martin device_type = "cpu"; 807b0b0191SHector Martin reg = <0x0 0x1>; 817b0b0191SHector Martin enable-method = "spin-table"; 827b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 8383fb5b55SRob Herring next-level-cache = <&l2_cache_0>; 8483fb5b55SRob Herring i-cache-size = <0x20000>; 8583fb5b55SRob Herring d-cache-size = <0x10000>; 86d32c1530SHector Martin operating-points-v2 = <&icestorm_opp>; 87d32c1530SHector Martin capacity-dmips-mhz = <714>; 88d32c1530SHector Martin performance-domains = <&cpufreq_e>; 897b0b0191SHector Martin }; 907b0b0191SHector Martin 917b0b0191SHector Martin cpu_p00: cpu@10100 { 927b0b0191SHector Martin compatible = "apple,firestorm"; 937b0b0191SHector Martin device_type = "cpu"; 947b0b0191SHector Martin reg = <0x0 0x10100>; 957b0b0191SHector Martin enable-method = "spin-table"; 967b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 9783fb5b55SRob Herring next-level-cache = <&l2_cache_1>; 9883fb5b55SRob Herring i-cache-size = <0x30000>; 9983fb5b55SRob Herring d-cache-size = <0x20000>; 100d32c1530SHector Martin operating-points-v2 = <&firestorm_opp>; 101d32c1530SHector Martin capacity-dmips-mhz = <1024>; 102d32c1530SHector Martin performance-domains = <&cpufreq_p0>; 1037b0b0191SHector Martin }; 1047b0b0191SHector Martin 1057b0b0191SHector Martin cpu_p01: cpu@10101 { 1067b0b0191SHector Martin compatible = "apple,firestorm"; 1077b0b0191SHector Martin device_type = "cpu"; 1087b0b0191SHector Martin reg = <0x0 0x10101>; 1097b0b0191SHector Martin enable-method = "spin-table"; 1107b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 11183fb5b55SRob Herring next-level-cache = <&l2_cache_1>; 11283fb5b55SRob Herring i-cache-size = <0x30000>; 11383fb5b55SRob Herring d-cache-size = <0x20000>; 114d32c1530SHector Martin operating-points-v2 = <&firestorm_opp>; 115d32c1530SHector Martin capacity-dmips-mhz = <1024>; 116d32c1530SHector Martin performance-domains = <&cpufreq_p0>; 1177b0b0191SHector Martin }; 1187b0b0191SHector Martin 1197b0b0191SHector Martin cpu_p02: cpu@10102 { 1207b0b0191SHector Martin compatible = "apple,firestorm"; 1217b0b0191SHector Martin device_type = "cpu"; 1227b0b0191SHector Martin reg = <0x0 0x10102>; 1237b0b0191SHector Martin enable-method = "spin-table"; 1247b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 12583fb5b55SRob Herring next-level-cache = <&l2_cache_1>; 12683fb5b55SRob Herring i-cache-size = <0x30000>; 12783fb5b55SRob Herring d-cache-size = <0x20000>; 128d32c1530SHector Martin operating-points-v2 = <&firestorm_opp>; 129d32c1530SHector Martin capacity-dmips-mhz = <1024>; 130d32c1530SHector Martin performance-domains = <&cpufreq_p0>; 1317b0b0191SHector Martin }; 1327b0b0191SHector Martin 1337b0b0191SHector Martin cpu_p03: cpu@10103 { 1347b0b0191SHector Martin compatible = "apple,firestorm"; 1357b0b0191SHector Martin device_type = "cpu"; 1367b0b0191SHector Martin reg = <0x0 0x10103>; 1377b0b0191SHector Martin enable-method = "spin-table"; 1387b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 13983fb5b55SRob Herring next-level-cache = <&l2_cache_1>; 14083fb5b55SRob Herring i-cache-size = <0x30000>; 14183fb5b55SRob Herring d-cache-size = <0x20000>; 142d32c1530SHector Martin operating-points-v2 = <&firestorm_opp>; 143d32c1530SHector Martin capacity-dmips-mhz = <1024>; 144d32c1530SHector Martin performance-domains = <&cpufreq_p0>; 1457b0b0191SHector Martin }; 1467b0b0191SHector Martin 1477b0b0191SHector Martin cpu_p10: cpu@10200 { 1487b0b0191SHector Martin compatible = "apple,firestorm"; 1497b0b0191SHector Martin device_type = "cpu"; 1507b0b0191SHector Martin reg = <0x0 0x10200>; 1517b0b0191SHector Martin enable-method = "spin-table"; 1527b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 15383fb5b55SRob Herring next-level-cache = <&l2_cache_2>; 15483fb5b55SRob Herring i-cache-size = <0x30000>; 15583fb5b55SRob Herring d-cache-size = <0x20000>; 156d32c1530SHector Martin operating-points-v2 = <&firestorm_opp>; 157d32c1530SHector Martin capacity-dmips-mhz = <1024>; 158d32c1530SHector Martin performance-domains = <&cpufreq_p1>; 1597b0b0191SHector Martin }; 1607b0b0191SHector Martin 1617b0b0191SHector Martin cpu_p11: cpu@10201 { 1627b0b0191SHector Martin compatible = "apple,firestorm"; 1637b0b0191SHector Martin device_type = "cpu"; 1647b0b0191SHector Martin reg = <0x0 0x10201>; 1657b0b0191SHector Martin enable-method = "spin-table"; 1667b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 16783fb5b55SRob Herring next-level-cache = <&l2_cache_2>; 16883fb5b55SRob Herring i-cache-size = <0x30000>; 16983fb5b55SRob Herring d-cache-size = <0x20000>; 170d32c1530SHector Martin operating-points-v2 = <&firestorm_opp>; 171d32c1530SHector Martin capacity-dmips-mhz = <1024>; 172d32c1530SHector Martin performance-domains = <&cpufreq_p1>; 1737b0b0191SHector Martin }; 1747b0b0191SHector Martin 1757b0b0191SHector Martin cpu_p12: cpu@10202 { 1767b0b0191SHector Martin compatible = "apple,firestorm"; 1777b0b0191SHector Martin device_type = "cpu"; 1787b0b0191SHector Martin reg = <0x0 0x10202>; 1797b0b0191SHector Martin enable-method = "spin-table"; 1807b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 18183fb5b55SRob Herring next-level-cache = <&l2_cache_2>; 18283fb5b55SRob Herring i-cache-size = <0x30000>; 18383fb5b55SRob Herring d-cache-size = <0x20000>; 184d32c1530SHector Martin operating-points-v2 = <&firestorm_opp>; 185d32c1530SHector Martin capacity-dmips-mhz = <1024>; 186d32c1530SHector Martin performance-domains = <&cpufreq_p1>; 1877b0b0191SHector Martin }; 1887b0b0191SHector Martin 1897b0b0191SHector Martin cpu_p13: cpu@10203 { 1907b0b0191SHector Martin compatible = "apple,firestorm"; 1917b0b0191SHector Martin device_type = "cpu"; 1927b0b0191SHector Martin reg = <0x0 0x10203>; 1937b0b0191SHector Martin enable-method = "spin-table"; 1947b0b0191SHector Martin cpu-release-addr = <0 0>; /* To be filled by loader */ 19583fb5b55SRob Herring next-level-cache = <&l2_cache_2>; 19683fb5b55SRob Herring i-cache-size = <0x30000>; 19783fb5b55SRob Herring d-cache-size = <0x20000>; 198d32c1530SHector Martin operating-points-v2 = <&firestorm_opp>; 199d32c1530SHector Martin capacity-dmips-mhz = <1024>; 200d32c1530SHector Martin performance-domains = <&cpufreq_p1>; 20183fb5b55SRob Herring }; 20283fb5b55SRob Herring 20383fb5b55SRob Herring l2_cache_0: l2-cache-0 { 20483fb5b55SRob Herring compatible = "cache"; 20583fb5b55SRob Herring cache-level = <2>; 20683fb5b55SRob Herring cache-unified; 20783fb5b55SRob Herring cache-size = <0x400000>; 20883fb5b55SRob Herring }; 20983fb5b55SRob Herring 21083fb5b55SRob Herring l2_cache_1: l2-cache-1 { 21183fb5b55SRob Herring compatible = "cache"; 21283fb5b55SRob Herring cache-level = <2>; 21383fb5b55SRob Herring cache-unified; 21483fb5b55SRob Herring cache-size = <0xc00000>; 21583fb5b55SRob Herring }; 21683fb5b55SRob Herring 21783fb5b55SRob Herring l2_cache_2: l2-cache-2 { 21883fb5b55SRob Herring compatible = "cache"; 21983fb5b55SRob Herring cache-level = <2>; 22083fb5b55SRob Herring cache-unified; 22183fb5b55SRob Herring cache-size = <0xc00000>; 2227b0b0191SHector Martin }; 2237b0b0191SHector Martin }; 2247b0b0191SHector Martin 225d32c1530SHector Martin icestorm_opp: opp-table-0 { 226d32c1530SHector Martin compatible = "operating-points-v2"; 227d32c1530SHector Martin 228d32c1530SHector Martin opp01 { 229d32c1530SHector Martin opp-hz = /bits/ 64 <600000000>; 230d32c1530SHector Martin opp-level = <1>; 231d32c1530SHector Martin clock-latency-ns = <7500>; 232d32c1530SHector Martin }; 233d32c1530SHector Martin opp02 { 234d32c1530SHector Martin opp-hz = /bits/ 64 <972000000>; 235d32c1530SHector Martin opp-level = <2>; 236d32c1530SHector Martin clock-latency-ns = <23000>; 237d32c1530SHector Martin }; 238d32c1530SHector Martin opp03 { 239d32c1530SHector Martin opp-hz = /bits/ 64 <1332000000>; 240d32c1530SHector Martin opp-level = <3>; 241d32c1530SHector Martin clock-latency-ns = <29000>; 242d32c1530SHector Martin }; 243d32c1530SHector Martin opp04 { 244d32c1530SHector Martin opp-hz = /bits/ 64 <1704000000>; 245d32c1530SHector Martin opp-level = <4>; 246d32c1530SHector Martin clock-latency-ns = <40000>; 247d32c1530SHector Martin }; 248d32c1530SHector Martin opp05 { 249d32c1530SHector Martin opp-hz = /bits/ 64 <2064000000>; 250d32c1530SHector Martin opp-level = <5>; 251d32c1530SHector Martin clock-latency-ns = <50000>; 252d32c1530SHector Martin }; 253d32c1530SHector Martin }; 254d32c1530SHector Martin 255d32c1530SHector Martin firestorm_opp: opp-table-1 { 256d32c1530SHector Martin compatible = "operating-points-v2"; 257d32c1530SHector Martin 258d32c1530SHector Martin opp01 { 259d32c1530SHector Martin opp-hz = /bits/ 64 <600000000>; 260d32c1530SHector Martin opp-level = <1>; 261d32c1530SHector Martin clock-latency-ns = <8000>; 262d32c1530SHector Martin }; 263d32c1530SHector Martin opp02 { 264d32c1530SHector Martin opp-hz = /bits/ 64 <828000000>; 265d32c1530SHector Martin opp-level = <2>; 266d32c1530SHector Martin clock-latency-ns = <18000>; 267d32c1530SHector Martin }; 268d32c1530SHector Martin opp03 { 269d32c1530SHector Martin opp-hz = /bits/ 64 <1056000000>; 270d32c1530SHector Martin opp-level = <3>; 271d32c1530SHector Martin clock-latency-ns = <19000>; 272d32c1530SHector Martin }; 273d32c1530SHector Martin opp04 { 274d32c1530SHector Martin opp-hz = /bits/ 64 <1296000000>; 275d32c1530SHector Martin opp-level = <4>; 276d32c1530SHector Martin clock-latency-ns = <23000>; 277d32c1530SHector Martin }; 278d32c1530SHector Martin opp05 { 279d32c1530SHector Martin opp-hz = /bits/ 64 <1524000000>; 280d32c1530SHector Martin opp-level = <5>; 281d32c1530SHector Martin clock-latency-ns = <24000>; 282d32c1530SHector Martin }; 283d32c1530SHector Martin opp06 { 284d32c1530SHector Martin opp-hz = /bits/ 64 <1752000000>; 285d32c1530SHector Martin opp-level = <6>; 286d32c1530SHector Martin clock-latency-ns = <28000>; 287d32c1530SHector Martin }; 288d32c1530SHector Martin opp07 { 289d32c1530SHector Martin opp-hz = /bits/ 64 <1980000000>; 290d32c1530SHector Martin opp-level = <7>; 291d32c1530SHector Martin clock-latency-ns = <31000>; 292d32c1530SHector Martin }; 293d32c1530SHector Martin opp08 { 294d32c1530SHector Martin opp-hz = /bits/ 64 <2208000000>; 295d32c1530SHector Martin opp-level = <8>; 296d32c1530SHector Martin clock-latency-ns = <45000>; 297d32c1530SHector Martin }; 298d32c1530SHector Martin opp09 { 299d32c1530SHector Martin opp-hz = /bits/ 64 <2448000000>; 300d32c1530SHector Martin opp-level = <9>; 301d32c1530SHector Martin clock-latency-ns = <49000>; 302d32c1530SHector Martin }; 303d32c1530SHector Martin opp10 { 304d32c1530SHector Martin opp-hz = /bits/ 64 <2676000000>; 305d32c1530SHector Martin opp-level = <10>; 306d32c1530SHector Martin clock-latency-ns = <53000>; 307d32c1530SHector Martin }; 308d32c1530SHector Martin opp11 { 309d32c1530SHector Martin opp-hz = /bits/ 64 <2904000000>; 310d32c1530SHector Martin opp-level = <11>; 311d32c1530SHector Martin clock-latency-ns = <56000>; 312d32c1530SHector Martin }; 313d32c1530SHector Martin opp12 { 314d32c1530SHector Martin opp-hz = /bits/ 64 <3036000000>; 315d32c1530SHector Martin opp-level = <12>; 316d32c1530SHector Martin clock-latency-ns = <56000>; 317d32c1530SHector Martin }; 318d32c1530SHector Martin /* Not available until CPU deep sleep is implemented 319d32c1530SHector Martin opp13 { 320d32c1530SHector Martin opp-hz = /bits/ 64 <3132000000>; 321d32c1530SHector Martin opp-level = <13>; 322d32c1530SHector Martin clock-latency-ns = <56000>; 323d32c1530SHector Martin turbo-mode; 324d32c1530SHector Martin }; 325d32c1530SHector Martin opp14 { 326d32c1530SHector Martin opp-hz = /bits/ 64 <3168000000>; 327d32c1530SHector Martin opp-level = <14>; 328d32c1530SHector Martin clock-latency-ns = <56000>; 329d32c1530SHector Martin turbo-mode; 330d32c1530SHector Martin }; 331d32c1530SHector Martin opp15 { 332d32c1530SHector Martin opp-hz = /bits/ 64 <3228000000>; 333d32c1530SHector Martin opp-level = <15>; 334d32c1530SHector Martin clock-latency-ns = <56000>; 335d32c1530SHector Martin turbo-mode; 336d32c1530SHector Martin }; 337d32c1530SHector Martin */ 338d32c1530SHector Martin }; 339d32c1530SHector Martin 3407b0b0191SHector Martin pmu-e { 3417b0b0191SHector Martin compatible = "apple,icestorm-pmu"; 3427b0b0191SHector Martin interrupt-parent = <&aic>; 3437b0b0191SHector Martin interrupts = <AIC_FIQ 0 AIC_CPU_PMU_E IRQ_TYPE_LEVEL_HIGH>; 3447b0b0191SHector Martin }; 3457b0b0191SHector Martin 3467b0b0191SHector Martin pmu-p { 3477b0b0191SHector Martin compatible = "apple,firestorm-pmu"; 3487b0b0191SHector Martin interrupt-parent = <&aic>; 3497b0b0191SHector Martin interrupts = <AIC_FIQ 0 AIC_CPU_PMU_P IRQ_TYPE_LEVEL_HIGH>; 3507b0b0191SHector Martin }; 3517b0b0191SHector Martin 3527b0b0191SHector Martin timer { 3537b0b0191SHector Martin compatible = "arm,armv8-timer"; 3547b0b0191SHector Martin interrupt-parent = <&aic>; 3557b0b0191SHector Martin interrupt-names = "phys", "virt", "hyp-phys", "hyp-virt"; 3567b0b0191SHector Martin interrupts = <AIC_FIQ 0 AIC_TMR_GUEST_PHYS IRQ_TYPE_LEVEL_HIGH>, 3577b0b0191SHector Martin <AIC_FIQ 0 AIC_TMR_GUEST_VIRT IRQ_TYPE_LEVEL_HIGH>, 3587b0b0191SHector Martin <AIC_FIQ 0 AIC_TMR_HV_PHYS IRQ_TYPE_LEVEL_HIGH>, 3597b0b0191SHector Martin <AIC_FIQ 0 AIC_TMR_HV_VIRT IRQ_TYPE_LEVEL_HIGH>; 3607b0b0191SHector Martin }; 3617b0b0191SHector Martin 3627b0b0191SHector Martin clkref: clock-ref { 3637b0b0191SHector Martin compatible = "fixed-clock"; 3647b0b0191SHector Martin #clock-cells = <0>; 3657b0b0191SHector Martin clock-frequency = <24000000>; 3667b0b0191SHector Martin clock-output-names = "clkref"; 3677b0b0191SHector Martin }; 3687b0b0191SHector Martin 369d08e455aSJanne Grunau clk_200m: clock-200m { 370d08e455aSJanne Grunau compatible = "fixed-clock"; 371d08e455aSJanne Grunau #clock-cells = <0>; 372d08e455aSJanne Grunau clock-frequency = <200000000>; 373d08e455aSJanne Grunau clock-output-names = "clk_200m"; 374d08e455aSJanne Grunau }; 375d08e455aSJanne Grunau 37651979fbbSJanne Grunau /* 37751979fbbSJanne Grunau * This is a fabulated representation of the input clock 37851979fbbSJanne Grunau * to NCO since we don't know the true clock tree. 37951979fbbSJanne Grunau */ 38051979fbbSJanne Grunau nco_clkref: clock-ref-nco { 38151979fbbSJanne Grunau compatible = "fixed-clock"; 38251979fbbSJanne Grunau #clock-cells = <0>; 38351979fbbSJanne Grunau clock-output-names = "nco_ref"; 38451979fbbSJanne Grunau }; 385*76f3ffebSSasha Finkelstein 386*76f3ffebSSasha Finkelstein reserved-memory { 387*76f3ffebSSasha Finkelstein #address-cells = <2>; 388*76f3ffebSSasha Finkelstein #size-cells = <2>; 389*76f3ffebSSasha Finkelstein ranges; 390*76f3ffebSSasha Finkelstein 391*76f3ffebSSasha Finkelstein gpu_globals: globals { 392*76f3ffebSSasha Finkelstein status = "disabled"; 393*76f3ffebSSasha Finkelstein }; 394*76f3ffebSSasha Finkelstein 395*76f3ffebSSasha Finkelstein gpu_hw_cal_a: hw-cal-a { 396*76f3ffebSSasha Finkelstein status = "disabled"; 397*76f3ffebSSasha Finkelstein }; 398*76f3ffebSSasha Finkelstein 399*76f3ffebSSasha Finkelstein gpu_hw_cal_b: hw-cal-b { 400*76f3ffebSSasha Finkelstein status = "disabled"; 401*76f3ffebSSasha Finkelstein }; 402*76f3ffebSSasha Finkelstein 403*76f3ffebSSasha Finkelstein uat_handoff: uat-handoff { 404*76f3ffebSSasha Finkelstein status = "disabled"; 405*76f3ffebSSasha Finkelstein }; 406*76f3ffebSSasha Finkelstein 407*76f3ffebSSasha Finkelstein uat_pagetables: uat-pagetables { 408*76f3ffebSSasha Finkelstein status = "disabled"; 409*76f3ffebSSasha Finkelstein }; 410*76f3ffebSSasha Finkelstein 411*76f3ffebSSasha Finkelstein uat_ttbs: uat-ttbs { 412*76f3ffebSSasha Finkelstein status = "disabled"; 413*76f3ffebSSasha Finkelstein }; 414*76f3ffebSSasha Finkelstein }; 4157b0b0191SHector Martin}; 416