From 42052e37cbcd59828932c4b3188c6a53f5c55bb5 Mon Sep 17 00:00:00 2001 From: strongtz Date: Sat, 3 Apr 2021 13:59:57 +0800 Subject: [PATCH] polaris: touchscreen working in Linux You can boot Linux without providing a device tree. Because it's embedded in edk2. The following patches are required for getting working touchscreen: 0008-soc-qcom-geni-move-GENI_IF_DISABLE_RO-to-common-head.patch 0009-soc-qcom-geni-move-struct-geni_wrapper-to-header.patch 0010-soc-qcom-geni-Add-support-for-gpi-dma.patch 0011-spi-spi-geni-qcom-Add-support-for-GPI-dma.patch 0012-i2c-qcom-geni-Add-support-for-GPI-DMA.patch The above patches can be found in: https://gitlab.com/sdm845-mainline/sdm845-linux --- sdm845Pkg/Devices/polaris.dsc | 2 +- sdm845Pkg/Devices/polaris.fdf | 892 +++++++++++++------- sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dtb | Bin 81791 -> 96541 bytes sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dts | 69 +- sdm845Pkg/FdtBlob/sdm845.dtsi | 874 ++++++++++++++++++- 5 files changed, 1506 insertions(+), 331 deletions(-) mode change 100644 => 100755 sdm845Pkg/Devices/polaris.fdf diff --git a/sdm845Pkg/Devices/polaris.dsc b/sdm845Pkg/Devices/polaris.dsc index 18ba6b2..6a47993 100644 --- a/sdm845Pkg/Devices/polaris.dsc +++ b/sdm845Pkg/Devices/polaris.dsc @@ -7,7 +7,7 @@ SUPPORTED_ARCHITECTURES = AARCH64 BUILD_TARGETS = DEBUG|RELEASE SKUID_IDENTIFIER = DEFAULT - FLASH_DEFINITION = sdm845Pkg/Devices/845.fdf + FLASH_DEFINITION = sdm845Pkg/Devices/polaris.fdf !include sdm845Pkg/sdm845Pkg.dsc diff --git a/sdm845Pkg/Devices/polaris.fdf b/sdm845Pkg/Devices/polaris.fdf old mode 100644 new mode 100755 index e6b9318..971cbb5 --- a/sdm845Pkg/Devices/polaris.fdf +++ b/sdm845Pkg/Devices/polaris.fdf @@ -1,290 +1,602 @@ -# -# Copyright (c) 2018, Linaro Limited. All rights reserved. -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -################################################################################ -# -# FD Section -# The [FD] Section is made up of the definition statements and a -# description of what goes into the Flash Device Image. Each FD section -# defines one flash "device" image. A flash device image may be one of -# the following: Removable media bootable image (like a boot floppy -# image,) an Option ROM image (that would be "flashed" into an add-in -# card,) a System "Flash" image (that would be burned into a system's -# flash) or an Update ("Capsule") image that will be used to update and -# existing system flash. -# -################################################################################ - -[FD.sdm845Pkg_UEFI] -BaseAddress = 0xd0000000|gArmTokenSpaceGuid.PcdFdBaseAddress # The base address of the Firmware in NOR Flash. -Size = 0x00200000|gArmTokenSpaceGuid.PcdFdSize # The size in bytes of the FLASH Device -ErasePolarity = 1 - -# This one is tricky, it must be: BlockSize * NumBlocks = Size -BlockSize = 0x00001000 -NumBlocks = 0x200 - -################################################################################ -# -# Following are lists of FD Region layout which correspond to the locations of different -# images within the flash device. -# -# Regions must be defined in ascending order and may not overlap. -# -# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by -# the pipe "|" character, followed by the size of the region, also in hex with the leading -# "0x" characters. Like: -# Offset|Size -# PcdOffsetCName|PcdSizeCName -# RegionType -# -################################################################################ - -# from ArmVirtPkg/ArmVirtQemuKernel.fdf -# -# Implement the Linux kernel header layout so that the loader will identify -# it as something bootable, and execute it with a FDT pointer in x0 or r2. -# -0x00000000|0x00008000 -DATA = { - 0x01, 0x00, 0x00, 0x10, # code0: adr x1, . - 0xff, 0x1f, 0x00, 0x14, # code1: b 0x8000 - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, # text_offset: 512 KB - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, # image_size: 2 MB - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # flags - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res2 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res3 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res4 - 0x41, 0x52, 0x4d, 0x64, # magic: "ARM\x64" - 0x00, 0x00, 0x00, 0x00 # res5 -} - -0x00008000|0x001f8000 -gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize -FV = FVMAIN_COMPACT - - -################################################################################ -# -# FV Section -# -# [FV] section is used to define what components or modules are placed within a flash -# device file. This section also defines order the components and modules are positioned -# within the image. The [FV] section consists of define statements, set statements and -# module statements. -# -################################################################################ - -[FV.FvMain] -BlockSize = 0x40 -NumBlocks = 0 # This FV gets compressed so make it just big enough -FvAlignment = 8 # FV alignment and FV attributes setting. -ERASE_POLARITY = 1 -MEMORY_MAPPED = TRUE -STICKY_WRITE = TRUE -LOCK_CAP = TRUE -LOCK_STATUS = TRUE -WRITE_DISABLED_CAP = TRUE -WRITE_ENABLED_CAP = TRUE -WRITE_STATUS = TRUE -WRITE_LOCK_CAP = TRUE -WRITE_LOCK_STATUS = TRUE -READ_DISABLED_CAP = TRUE -READ_ENABLED_CAP = TRUE -READ_STATUS = TRUE -READ_LOCK_CAP = TRUE -READ_LOCK_STATUS = TRUE - - APRIORI DXE { - INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf - } - - INF MdeModulePkg/Core/Dxe/DxeMain.inf - - # - # PI DXE Drivers producing Architectural Protocols (EFI Services) - # - INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf - INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf - INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf - INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf - INF EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf - INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf - INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf - INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf - - # - # Multiple Console IO support - # - INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf - INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf - INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf - INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf - INF MdeModulePkg/Universal/SerialDxe/SerialDxe.inf - - INF ArmPkg/Drivers/ArmGic/ArmGicDxe.inf - INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf - - INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf - - INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf - - - # - # Virtual Keyboard - # - INF EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf - - INF sdm845Pkg/Drivers/sdm845Dxe/sdm845Dxe.inf - INF sdm845Pkg/Drivers/SimpleFbDxe/SimpleFbDxe.inf - - FILE DRIVER = 0d35cd8e-97ea-4f9a-96af-0f0d89f76567 { - SECTION DXE_DEPEX = sdm845Pkg/Binary/polaris/UFSDxe/UFSDxe.depex - SECTION PE32 = sdm845Pkg/Binary/polaris/UFSDxe/UFSDxe.efi - SECTION UI = "UFSDxe" - } - - FILE DRIVER = f541d663-4a48-40aa-aabf-ff158ccae34c { - SECTION DXE_DEPEX = sdm845Pkg/Binary/polaris/SmemDxe/SmemDxe.depex - SECTION PE32 = sdm845Pkg/Binary/polaris/SmemDxe/SmemDxe.efi - SECTION UI = "SmemDxe" - } - - # - # USB Host Support - # - INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf - - # - # USB Mass Storage Support - # - INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf - - # - # USB Peripheral Support - # - INF EmbeddedPkg/Drivers/AndroidFastbootTransportUsbDxe/FastbootTransportUsbDxe.inf - - # - # Fastboot - # - INF EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf - - # - # FAT filesystem + GPT/MBR partitioning - # - INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf - INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf - INF FatPkg/EnhancedFatDxe/Fat.inf - INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf - - INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf - - INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf - - # - # ACPI Support - # - INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf - INF MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf - INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf - # INF RuleOverride = ACPITABLE sdm845Pkg/AcpiTables/AcpiTables.inf - - FILE FREEFORM = 7E374E25-8E01-4FEE-87F2-390C23C606CD { - # SECTION RAW = sdm845Pkg/AcpiTables/testing/CSRT.aml - SECTION RAW = sdm845Pkg/AcpiTables/testing/DBG2.aml - SECTION RAW = sdm845Pkg/AcpiTables/polaris/DSDT.aml - # SECTION RAW = sdm845Pkg/AcpiTables/testing/FACS.aml - SECTION RAW = sdm845Pkg/AcpiTables/testing/FADT.aml - SECTION RAW = sdm845Pkg/AcpiTables/testing/GTDT.aml - SECTION RAW = sdm845Pkg/AcpiTables/testing/IORT.aml - SECTION RAW = sdm845Pkg/AcpiTables/testing/MADT.aml - # SECTION RAW = sdm845Pkg/AcpiTables/testing/MCFG.aml - SECTION RAW = sdm845Pkg/AcpiTables/testing/PPTT.aml - # SECTION RAW = sdm845Pkg/AcpiTables/testing/TPM2.aml - - # SECTION RAW = sdm845Pkg/AcpiTables/test2/CSRT.aml - # SECTION RAW = sdm845Pkg/AcpiTables/test2/DBG2.aml - # SECTION RAW = sdm845Pkg/AcpiTables/test2/DSDT.aml - # SECTION RAW = sdm845Pkg/AcpiTables/test2/FACS.aml - # SECTION RAW = sdm845Pkg/AcpiTables/test2/FADT.aml - # SECTION RAW = sdm845Pkg/AcpiTables/test2/GTDT.aml - # SECTION RAW = sdm845Pkg/AcpiTables/test2/IORT.aml - # SECTION RAW = sdm845Pkg/AcpiTables/test2/MADT.aml - # SECTION RAW = sdm845Pkg/AcpiTables/test2/MCFG.aml - # SECTION RAW = sdm845Pkg/AcpiTables/test2/PPTT.aml - - SECTION UI = "AcpiTables" - } - - # - # FDT support - # - INF EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf - - FILE FREEFORM = 25462CDA-221F-47DF-AC1D-259CFAA4E326 { - SECTION RAW = sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dtb - } - - # - # SMBIOS Support - # - INF sdm845Pkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf - INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf - - # - # UEFI applications - # - INF ShellPkg/Application/Shell/Shell.inf -!ifdef $(INCLUDE_TFTP_COMMAND) - INF ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf -!endif #$(INCLUDE_TFTP_COMMAND) - - # - # Bds - # - INF MdeModulePkg/Universal/PrintDxe/PrintDxe.inf - INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf - INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf - INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - INF MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf - INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf - INF MdeModulePkg/Application/UiApp/UiApp.inf - INF sdm845Pkg/Drivers/LogoDxe/LogoDxe.inf - -[FV.FVMAIN_COMPACT] -FvAlignment = 8 -ERASE_POLARITY = 1 -MEMORY_MAPPED = TRUE -STICKY_WRITE = TRUE -LOCK_CAP = TRUE -LOCK_STATUS = TRUE -WRITE_DISABLED_CAP = TRUE -WRITE_ENABLED_CAP = TRUE -WRITE_STATUS = TRUE -WRITE_LOCK_CAP = TRUE -WRITE_LOCK_STATUS = TRUE -READ_DISABLED_CAP = TRUE -READ_ENABLED_CAP = TRUE -READ_STATUS = TRUE -READ_LOCK_CAP = TRUE -READ_LOCK_STATUS = TRUE - - INF ArmPlatformPkg/PrePi/PeiUniCore.inf - - FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { - SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { - SECTION FV_IMAGE = FVMAIN - } - } - -!include sdm845Pkg/CommonFdf.fdf.inc +# +# Copyright (c) 2018, Linaro Limited. All rights reserved. +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +################################################################################ +# +# FD Section +# The [FD] Section is made up of the definition statements and a +# description of what goes into the Flash Device Image. Each FD section +# defines one flash "device" image. A flash device image may be one of +# the following: Removable media bootable image (like a boot floppy +# image,) an Option ROM image (that would be "flashed" into an add-in +# card,) a System "Flash" image (that would be burned into a system's +# flash) or an Update ("Capsule") image that will be used to update and +# existing system flash. +# +################################################################################ + +[FD.sdm845Pkg_UEFI] +BaseAddress = 0xd0000000|gArmTokenSpaceGuid.PcdFdBaseAddress # The base address of the Firmware in NOR Flash. +Size = 0x00200000|gArmTokenSpaceGuid.PcdFdSize # The size in bytes of the FLASH Device +ErasePolarity = 1 + +# This one is tricky, it must be: BlockSize * NumBlocks = Size +BlockSize = 0x00001000 +NumBlocks = 0x200 + +################################################################################ +# +# Following are lists of FD Region layout which correspond to the locations of different +# images within the flash device. +# +# Regions must be defined in ascending order and may not overlap. +# +# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by +# the pipe "|" character, followed by the size of the region, also in hex with the leading +# "0x" characters. Like: +# Offset|Size +# PcdOffsetCName|PcdSizeCName +# RegionType +# +################################################################################ + +# from ArmVirtPkg/ArmVirtQemuKernel.fdf +# +# Implement the Linux kernel header layout so that the loader will identify +# it as something bootable, and execute it with a FDT pointer in x0 or r2. +# +0x00000000|0x00008000 +DATA = { + 0x01, 0x00, 0x00, 0x10, # code0: adr x1, . + 0xff, 0x1f, 0x00, 0x14, # code1: b 0x8000 + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, # text_offset: 512 KB + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, # image_size: 2 MB + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # flags + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res2 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res3 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res4 + 0x41, 0x52, 0x4d, 0x64, # magic: "ARM\x64" + 0x00, 0x00, 0x00, 0x00 # res5 +} + +0x00008000|0x001f8000 +gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize +FV = FVMAIN_COMPACT + + +################################################################################ +# +# FV Section +# +# [FV] section is used to define what components or modules are placed within a flash +# device file. This section also defines order the components and modules are positioned +# within the image. The [FV] section consists of define statements, set statements and +# module statements. +# +################################################################################ + +[FV.FvMain] +BlockSize = 0x40 +NumBlocks = 0 # This FV gets compressed so make it just big enough +FvAlignment = 8 # FV alignment and FV attributes setting. +ERASE_POLARITY = 1 +MEMORY_MAPPED = TRUE +STICKY_WRITE = TRUE +LOCK_CAP = TRUE +LOCK_STATUS = TRUE +WRITE_DISABLED_CAP = TRUE +WRITE_ENABLED_CAP = TRUE +WRITE_STATUS = TRUE +WRITE_LOCK_CAP = TRUE +WRITE_LOCK_STATUS = TRUE +READ_DISABLED_CAP = TRUE +READ_ENABLED_CAP = TRUE +READ_STATUS = TRUE +READ_LOCK_CAP = TRUE +READ_LOCK_STATUS = TRUE + +APRIORI DXE { + + # + # PI DXE Drivers producing Architectural Protocols (EFI Services) + # + INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf + INF MdeModulePkg/Core/Dxe/DxeMain.inf + INF MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf + INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf + INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf + INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf + INF ArmPkg/Drivers/ArmGic/ArmGicDxe.inf + INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf + INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf + INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf + INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf + + # + # FAT filesystem + GPT/MBR partitioning + # + INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf + INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf + INF FatPkg/EnhancedFatDxe/Fat.inf + INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf + + INF EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf + INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf + INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf + INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf + INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf + INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf + + INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf + INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf + INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf + + FILE DRIVER = 9A5163E7-5C29-453F-825C-837A46A81E15 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SerialDxe/SerialDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/SerialDxe/SerialDxe.efi + SECTION UI = "SerialDxe" + } + + FILE DRIVER = f541d663-4a48-40aa-aabf-ff158ccae34c { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SmemDxe/SmemDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/SmemDxe/SmemDxe.efi + SECTION UI = "SmemDxe" + } + + FILE DRIVER = 8E9BD160-B184-11DF-94E2-0800200C9A66 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/DALSys/DALSys.depex + SECTION PE32 = sdm845Pkg/Binary/845/DALSys/DALSys.efi + SECTION UI = "DALSys" + } + + FILE DRIVER = 8681CC5A-0DF6-441E-B4B8-E915C538F067 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/HWIODxeDriver/HWIODxeDriver.depex + SECTION PE32 = sdm845Pkg/Binary/845/HWIODxeDriver/HWIODxeDriver.efi + SECTION UI = "HWIODxeDriver" + } + + FILE DRIVER = 10e193df-9966-44e7-b17c-59dd831e20fc { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ChipInfo/ChipInfo.depex + SECTION PE32 = sdm845Pkg/Binary/845/ChipInfo/ChipInfo.efi + SECTION UI = "ChipInfo" + } + + FILE DRIVER = B105211B-BBBD-4ADD-A3B0-D1CF4A52154C { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PlatformInfoDxeDriver/PlatformInfoDxeDriver.depex + SECTION PE32 = sdm845Pkg/Binary/845/PlatformInfoDxeDriver/PlatformInfoDxeDriver.efi + SECTION UI = "PlatformInfoDxeDriver" + } + + FILE DRIVER = 9A00771F-36D4-4DD5-8916-C48ED9B16B86 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/HALIOMMU/HALIOMMU.depex + SECTION PE32 = sdm845Pkg/Binary/845/HALIOMMU/HALIOMMU.efi + SECTION UI = "HALIOMMU" + } + + FILE DRIVER = E43128A8-8692-42B6-8AFA-676158578D18 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ULogDxe/ULogDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ULogDxe/ULogDxe.efi + SECTION UI = "ULogDxe" + } + + FILE DRIVER = ABA01FF8-2CCB-4E12-8B2E-CD3F4A742993 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/CmdDbDxe/CmdDbDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/CmdDbDxe/CmdDbDxe.efi + SECTION UI = "CmdDbDxe" + } + + FILE DRIVER = CB29F4D1-7F37-4692-A416-93E82E219711 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/NpaDxe/NpaDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/NpaDxe/NpaDxe.efi + SECTION UI = "NpaDxe" + } + + FILE DRIVER = CB29F4D1-7F37-4692-A416-93E82E219766 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/RpmhDxe/RpmhDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/RpmhDxe/RpmhDxe.efi + SECTION UI = "RpmhDxe" + } + + FILE DRIVER = B43C22DB-6333-490C-872D-0A73439059FD { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PdcDxe/PdcDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/PdcDxe/PdcDxe.efi + SECTION UI = "PdcDxe" + } + + FILE DRIVER = 4DB5DEA6-5302-4D1A-8A82-677A683B0D29 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ClockDxe/ClockDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ClockDxe/ClockDxe.efi + SECTION UI = "ClockDxe" + } + + FILE DRIVER = 1B52138D-3FA3-4E50-B958-20887353F809 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/CPRDxe/CPRDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/CPRDxe/CPRDxe.efi + SECTION UI = "CPRDxe" + } + + FILE DRIVER = AF9763A2-033B-4109-8E17-56A98D380C92 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/DALTLMM/DALTLMM.depex + SECTION PE32 = sdm845Pkg/Binary/845/DALTLMM/DALTLMM.efi + SECTION UI = "DALTLMM" + } + + FILE DRIVER = 04DE8591-D2B3-4077-BBBE-B12070094EB6 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/I2C/I2C.depex + SECTION PE32 = sdm845Pkg/Binary/845/I2C/I2C.efi + SECTION UI = "I2C" + } + + FILE DRIVER = 2a7b4bef-80cd-49e1-b473-374ba4d673fc { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SPMI/SPMI.depex + SECTION PE32 = sdm845Pkg/Binary/845/SPMI/SPMI.efi + SECTION UI = "SPMI" + } + + FILE DRIVER = 5776232e-082d-4b75-9a0e-fe1d13f7a5d9 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PmicDxe/PmicDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/PmicDxe/PmicDxe.efi + SECTION UI = "PmicDxe" + } + + FILE DRIVER = 11faed4c-b21f-4d88-8e48-c4c28a1e50df { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbPwrCtrlDxe/UsbPwrCtrlDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbPwrCtrlDxe/UsbPwrCtrlDxe.efi + SECTION UI = "UsbPwrCtrlDxe" + } + + FILE DRIVER = 94f8a6a7-dc34-4101-88c1-99179cceae83 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbfnDwc3Dxe/UsbfnDwc3Dxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbfnDwc3Dxe/UsbfnDwc3Dxe.efi + SECTION UI = "UsbfnDwc3Dxe" + } + + FILE DRIVER = cd823a4d-7dec-4531-ae5d-4134fa4127b8 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbConfigDxe/UsbConfigDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbConfigDxe/UsbConfigDxe.efi + SECTION UI = "UsbConfigDxe" + } + + FILE DRIVER = 0A134F0E-075E-40B3-9C63-3B3906804663 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbInitDxe/UsbInitDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbInitDxe/UsbInitDxe.efi + SECTION UI = "UsbInitDxe" + } + + FILE DRIVER = 3299a266-15f0-4346-8318-716336736d3e { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbDeviceDxe/UsbDeviceDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbDeviceDxe/UsbDeviceDxe.efi + SECTION UI = "UsbDeviceDxe" + } + + FILE DRIVER = 5bd181db-0487-4f1a-ae73-820e165611b3 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ButtonsDxe/ButtonsDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ButtonsDxe/ButtonsDxe.efi + SECTION UI = "ButtonsDxe" + } + + INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf + +} + + INF MdeModulePkg/Core/Dxe/DxeMain.inf + + # + # PI DXE Drivers producing Architectural Protocols (EFI Services) + # + INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf + INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf + INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf + INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf + INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf + INF EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf + INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf + INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf + INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf + + # + # Multiple Console IO support + # + INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf + INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf + INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf + INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf + + INF ArmPkg/Drivers/ArmGic/ArmGicDxe.inf + INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf + + INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf + + FILE DRIVER = 9A5163E7-5C29-453F-825C-837A46A81E15 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SerialDxe/SerialDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/SerialDxe/SerialDxe.efi + SECTION UI = "SerialDxe" + } + + FILE DRIVER = f541d663-4a48-40aa-aabf-ff158ccae34c { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SmemDxe/SmemDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/SmemDxe/SmemDxe.efi + SECTION UI = "SmemDxe" + } + + FILE DRIVER = 8E9BD160-B184-11DF-94E2-0800200C9A66 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/DALSys/DALSys.depex + SECTION PE32 = sdm845Pkg/Binary/845/DALSys/DALSys.efi + SECTION UI = "DALSys" + } + + FILE DRIVER = 8681CC5A-0DF6-441E-B4B8-E915C538F067 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/HWIODxeDriver/HWIODxeDriver.depex + SECTION PE32 = sdm845Pkg/Binary/845/HWIODxeDriver/HWIODxeDriver.efi + SECTION UI = "HWIODxeDriver" + } + + FILE DRIVER = 10e193df-9966-44e7-b17c-59dd831e20fc { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ChipInfo/ChipInfo.depex + SECTION PE32 = sdm845Pkg/Binary/845/ChipInfo/ChipInfo.efi + SECTION UI = "ChipInfo" + } + + FILE DRIVER = B105211B-BBBD-4ADD-A3B0-D1CF4A52154C { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PlatformInfoDxeDriver/PlatformInfoDxeDriver.depex + SECTION PE32 = sdm845Pkg/Binary/845/PlatformInfoDxeDriver/PlatformInfoDxeDriver.efi + SECTION UI = "PlatformInfoDxeDriver" + } + + FILE DRIVER = 9A00771F-36D4-4DD5-8916-C48ED9B16B86 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/HALIOMMU/HALIOMMU.depex + SECTION PE32 = sdm845Pkg/Binary/845/HALIOMMU/HALIOMMU.efi + SECTION UI = "HALIOMMU" + } + + FILE DRIVER = E43128A8-8692-42B6-8AFA-676158578D18 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ULogDxe/ULogDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ULogDxe/ULogDxe.efi + SECTION UI = "ULogDxe" + } + + FILE DRIVER = ABA01FF8-2CCB-4E12-8B2E-CD3F4A742993 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/CmdDbDxe/CmdDbDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/CmdDbDxe/CmdDbDxe.efi + SECTION UI = "CmdDbDxe" + } + + FILE DRIVER = CB29F4D1-7F37-4692-A416-93E82E219711 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/NpaDxe/NpaDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/NpaDxe/NpaDxe.efi + SECTION UI = "NpaDxe" + } + + FILE DRIVER = CB29F4D1-7F37-4692-A416-93E82E219766 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/RpmhDxe/RpmhDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/RpmhDxe/RpmhDxe.efi + SECTION UI = "RpmhDxe" + } + + FILE DRIVER = B43C22DB-6333-490C-872D-0A73439059FD { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PdcDxe/PdcDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/PdcDxe/PdcDxe.efi + SECTION UI = "PdcDxe" + } + + FILE DRIVER = 4DB5DEA6-5302-4D1A-8A82-677A683B0D29 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ClockDxe/ClockDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ClockDxe/ClockDxe.efi + SECTION UI = "ClockDxe" + } + + FILE DRIVER = 1B52138D-3FA3-4E50-B958-20887353F809 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/CPRDxe/CPRDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/CPRDxe/CPRDxe.efi + SECTION UI = "CPRDxe" + } + + FILE DRIVER = AF9763A2-033B-4109-8E17-56A98D380C92 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/DALTLMM/DALTLMM.depex + SECTION PE32 = sdm845Pkg/Binary/845/DALTLMM/DALTLMM.efi + SECTION UI = "DALTLMM" + } + + FILE DRIVER = 04DE8591-D2B3-4077-BBBE-B12070094EB6 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/I2C/I2C.depex + SECTION PE32 = sdm845Pkg/Binary/845/I2C/I2C.efi + SECTION UI = "I2C" + } + + FILE DRIVER = 2a7b4bef-80cd-49e1-b473-374ba4d673fc { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/SPMI/SPMI.depex + SECTION PE32 = sdm845Pkg/Binary/845/SPMI/SPMI.efi + SECTION UI = "SPMI" + } + + FILE DRIVER = 5776232e-082d-4b75-9a0e-fe1d13f7a5d9 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/PmicDxe/PmicDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/PmicDxe/PmicDxe.efi + SECTION UI = "PmicDxe" + } + + FILE DRIVER = 11faed4c-b21f-4d88-8e48-c4c28a1e50df { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbPwrCtrlDxe/UsbPwrCtrlDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbPwrCtrlDxe/UsbPwrCtrlDxe.efi + SECTION UI = "UsbPwrCtrlDxe" + } + + FILE DRIVER = 94f8a6a7-dc34-4101-88c1-99179cceae83 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbfnDwc3Dxe/UsbfnDwc3Dxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbfnDwc3Dxe/UsbfnDwc3Dxe.efi + SECTION UI = "UsbfnDwc3Dxe" + } + + FILE DRIVER = cd823a4d-7dec-4531-ae5d-4134fa4127b8 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbConfigDxe/UsbConfigDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbConfigDxe/UsbConfigDxe.efi + SECTION UI = "UsbConfigDxe" + } + + FILE DRIVER = 0A134F0E-075E-40B3-9C63-3B3906804663 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbInitDxe/UsbInitDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbInitDxe/UsbInitDxe.efi + SECTION UI = "UsbInitDxe" + } + + FILE DRIVER = 3299a266-15f0-4346-8318-716336736d3e { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbDeviceDxe/UsbDeviceDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbDeviceDxe/UsbDeviceDxe.efi + SECTION UI = "UsbDeviceDxe" + } + + FILE DRIVER = 5bd181db-0487-4f1a-ae73-820e165611b3 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/ButtonsDxe/ButtonsDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/ButtonsDxe/ButtonsDxe.efi + SECTION UI = "ButtonsDxe" + } + + FILE DRIVER = 5af77f10-90df-4e7e-8325-a17ec09d5443 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UsbMsdDxe/UsbMsdDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UsbMsdDxe/UsbMsdDxe.efi + SECTION UI = "UsbMsdDxe" + } + + FILE DRIVER = 0d35cd8e-97ea-4f9a-96af-0f0d89f76567 { + SECTION DXE_DEPEX = sdm845Pkg/Binary/845/UFSDxe/UFSDxe.depex + SECTION PE32 = sdm845Pkg/Binary/845/UFSDxe/UFSDxe.efi + SECTION UI = "UFSDxe" + } + + # + # Virtual Keyboard + # + INF EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf + + INF sdm845Pkg/Drivers/sdm845Dxe/sdm845Dxe.inf + INF sdm845Pkg/Drivers/SimpleFbDxe/SimpleFbDxe.inf + + # + # USB Host Support + # + INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf + + # + # USB Mass Storage Support + # + INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf + + # + # USB Peripheral Support + # + INF EmbeddedPkg/Drivers/AndroidFastbootTransportUsbDxe/FastbootTransportUsbDxe.inf + + # + # Fastboot + # + INF EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf + + # + # FAT filesystem + GPT/MBR partitioning + # + INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf + INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf + INF FatPkg/EnhancedFatDxe/Fat.inf + INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf + + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf + + INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf + + # + # ACPI Support + # + INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf + INF MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf + INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf + # INF RuleOverride = ACPITABLE sdm845Pkg/AcpiTables/AcpiTables.inf + + FILE FREEFORM = 7E374E25-8E01-4FEE-87F2-390C23C606CD { + SECTION RAW = sdm845Pkg/AcpiTables/testing/DBG2.aml + SECTION RAW = sdm845Pkg/AcpiTables/845/DSDT.aml + SECTION RAW = sdm845Pkg/AcpiTables/testing/CSRT.aml + SECTION RAW = sdm845Pkg/AcpiTables/testing/FADT.aml + SECTION RAW = sdm845Pkg/AcpiTables/testing/FACS.aml + SECTION RAW = sdm845Pkg/AcpiTables/testing/GTDT.aml + SECTION RAW = sdm845Pkg/AcpiTables/testing/IORT.aml + SECTION RAW = sdm845Pkg/AcpiTables/testing/MCFG.aml + SECTION RAW = sdm845Pkg/AcpiTables/testing/MADT.aml + SECTION RAW = sdm845Pkg/AcpiTables/testing/PPTT.aml + SECTION RAW = sdm845Pkg/AcpiTables/testing/TPM2.aml + SECTION UI = "AcpiTables" + } + + # + # FDT support + # + INF EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf + + FILE FREEFORM = 25462CDA-221F-47DF-AC1D-259CFAA4E326 { + SECTION RAW = sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dtb + } + + # + # SMBIOS Support + # + INF sdm845Pkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf + INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf + + # + # UEFI applications + # + INF ShellPkg/Application/Shell/Shell.inf +!ifdef $(INCLUDE_TFTP_COMMAND) + INF ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf +!endif #$(INCLUDE_TFTP_COMMAND) + + # + # Bds + # + INF MdeModulePkg/Universal/PrintDxe/PrintDxe.inf + INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf + INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf + INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf + INF MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf + INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf + INF MdeModulePkg/Application/UiApp/UiApp.inf + INF sdm845Pkg/Drivers/LogoDxe/LogoDxe.inf + +[FV.FVMAIN_COMPACT] +FvAlignment = 8 +ERASE_POLARITY = 1 +MEMORY_MAPPED = TRUE +STICKY_WRITE = TRUE +LOCK_CAP = TRUE +LOCK_STATUS = TRUE +WRITE_DISABLED_CAP = TRUE +WRITE_ENABLED_CAP = TRUE +WRITE_STATUS = TRUE +WRITE_LOCK_CAP = TRUE +WRITE_LOCK_STATUS = TRUE +READ_DISABLED_CAP = TRUE +READ_ENABLED_CAP = TRUE +READ_STATUS = TRUE +READ_LOCK_CAP = TRUE +READ_LOCK_STATUS = TRUE + + INF ArmPlatformPkg/PrePi/PeiUniCore.inf + + FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { + SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { + SECTION FV_IMAGE = FVMAIN + } + } + +!include sdm845Pkg/CommonFdf.fdf.inc + + diff --git a/sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dtb b/sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dtb index 6eba9d0346986590a5768ac9e43bb777c42e0b7c..6f3952f99cfe380d91a2ccbe2d6f5e7835bee873 100644 GIT binary patch literal 96541 zcmd^o37jKWd1tA6re{2dXYhRi!ehX|l-*L_5I~sA213kXFbQ$DT2gn5ky;u_-P6ND zXcAy;4&zP2kzGP&Ab{C$Z6M(axVf^<0hokfZ!U%;BoNre?B-e)$o~J|dtcS7QmMMt z-QzLveyXZ>eAoNl_rCY)Rq54T`+xX9z0C0kdY(7wWvZ{h^-3HMz;O@MVZA{)K7qquubuGg8WNq@Cow2I1N5Q{+Gqzi=qCDN&0_98hnEMx1_-*$p88@_yqaikOH5i|NoK( zpCJFqH24Jh-<1ZRApd(~@Yep@&1$m!|8^RDg8Uy&gHMqE_tM}K5O?-}v zY2zSK&c%ta*CKvNWv=?z#l~{6UTkKY<>~7DVxv`=URqpgSIXJtYPr&QEI{UFAKjRn z%a&?KVi3hrv-(&Rft=7h3p5XvtL7=JHEH|BW0aJ@pHck1STAXZ6&QHz~ zhk?4-iTr0ajuekej+sY@e(RNbqjkJMoiix>F2LVl$^?Tn0y$SDD>w3^Q^jZG=n_r${}2fe)#{e(RTkaLO2n-fLZ z0uo{1F1fh$BKXDGWc*iuK=8awAsv5qE*bwd_Zocf`gHtK*v%;8LDWc2XHlZ*Q$5s+U%7qlCp!UtA80rlp!l;S61cKL6al++AiH1+hnRbcdPyN9AIN>4`l1bVj#owW9${(iBGUXQ-{#t#^JnSxwd zM}#gPIyKRwZ@%eXgOSjlk@`48AbD`S&bKhmaCj)!i+;1ws98!ZKd9}IF#e%9ln=vf zqtR>^O!bVh1AsJkPd4If@A<&7-lS#=LY0ydOsqj{~l=_Z;VWuyY!&0#(oKmKwcc*Kh!F!p4=h%{wWdF(awRb)?x`I-NXc-f|*%K?sCpee!P3~)_j2nW+w0w#wm<_Qv* z$2Q8NZ{4+9|Mm^+L34AnMm)!VR^_{bpdf|dB0RFEmRO^U^#i`olJ`(H1=8; zw#x$Iq?xIWY?OxJkOpPbL)r*k9a({Vn`k3eU+{mF+lcnyw$X)1Z?%m`GoouuNstxr z*@Ui1?nhqN?E9{+FG6~&x+cwtt}$dIE8w#UT~ov#d0nf&QonIA>aH_0jb69Jh$GoqqltOOx`_M_+#RzUW=So3&UWy~-9N&ZTk?wMiNkRE&cRBrNP;PG& zT>k9)LHT$$KJ7IqpXe^9j#;iprdq~IX1i1DgwFxde+Np={RijHe!EtwH2q=U(V47E z6kGMfAq`8`GD3b zNoL|vZb!$tjp`Wn8EDQ{=hI{*eU*)}?sn3YweF-L>mUw+$E8cZ)L)mZ8`Lj+ppi8} zxhh|RZU;W;$On0MJk&`;)(6~d(-bXk4+oivL;JqkFtVhMY4(6N9B5jfk*42&vb10m zw1s_lIBCdx@!Om<KC3RZwE&=6I5CG%KxQr@F}2 zuP%1l{<3%@(nlEhbDXSR#XdPWXF$p~%X@Zp(ZK8m{MU)~fUmus7veGR+ulBSpz9vT zJkcZZM~6qk)#eaZ@GshZBVp6=-KP^Ftl(evmdS4X*(UP>{$mr)>Uj+R@*CLXG5#_9 z@v*#-fRG`q@PF7h?sfA_{g;NB7x14LHSa-4ZVdnM$vdO?m%i$h_u3N?{K@>7sQ`0h z__;BdOqlm=F9CmQI3KR4hOi?4*dN^7jsF`n%nRh7nwaX@evkh7g>L-cy(@yB8@BQr z1!!9f|Hpmz+V$~sBW?pk@Spg~E2H=inLXuwp%CSt&$|r}!8fMrv_J8`{(&g|NPg5Y zfC&CG|K*-;{y)e@@kjH+z3`v=e&MAwzwKRh%FCR0TNHmRH{J{XXBT4aNBoChAH^Tf z_0-?YLuLpY@_*bpC%W+`ryK)RSZTlV?-aW6AGgN5zZ;>T>e}?K8^TspPC=;*(a~PcsI;E+NZklCwunEXT0Yd>*J4%yMwy+U-1dg zD%{zPANQ%FWA305!GGTWJ+VIi*oZr*NAQ2{b*oYQXaDMnE}!0yPfWz`!zTj2%cu6^ z6L0#)sV@A<(VqIR{}rq6w0{!5)xKF)2wj{$Kg^8`sAl$@kR%tB+5vk8cJc$VpL>a&GqZ2*#|0^f{ZGHSP?LY*Lw*Q+)?{V|K?Xmsi{KrRo>i^gOXKYTBgg-Ir zPHH3dfBQRc?&kl>gUk!&6fmBi`hVB?%`|+W(X1~i3<>ACCV^vl(nra%tin(xtfdcp z4_B^_@5G_^TbWL^UTGl%fp9SzK`G0I9U7!V=gceR(73I?j-z*x98a@SFxNOEYVR#!3#vjB4g2s8( zxX6w)VW?l`^LhxE>yDKh^WI#sQ>=NdO0j(0TPQA;@%BT@Yj+w=zgRNLBs|)G@CCR& z7zYFMa173@G?mu)~1Q`V#FVUgMm0`>%rHMy5yKVv~lK{cvq1N0cD$?nXgqB zkNB1HywNyu)y4_(793g^-2V@rtU*^+S%jr5@4}V!XPUBn7}v{994~7$rB_(GR`)ke`=UOnGZ&3`&!I0(v^D~Ts56VoWZ7d$a)Ual)tME z6NF5tLtDC|(vUjvK>}%Rxeo36rt3idXu};B;(EyQF4De`ST`As6Y5s(t{eUFhU?a9 zEO9jrD1vh?u0h+E>%LR0`ja*wyvixx^l7E zZ2Q*Z8GQPJlj;O5UYdR2xkbIX)T#KTS?w|+2PYvBIs6b1MOvqLzY5v}?IJnAR0WRcfUC{3bPj;4C*5tMQWjp{sNxS0#+biRkFy-17+tvoPJjth* z?{jTC2RH`G(T{Cw{T;hIk9os5;YLy}I+V-h!Mr3Mc3A7X9;6@V!E_RjZS14x zv3-(waL&a*8Tx4twKZ2)%uC{7A9wc6gJWe}SIkS|VTaDXdFVLm)`NLTJnRtGHxC`p zTpr9*9<(t%G7HCevw<8__k*|^|KBOKTYeow#EO=Y9_PLfXNH-Yh-_$UdETad25GsU zcm#mRC)3t9(G3s2r)hYE1=Kt625Y!piGyj#yn}X6I!s$y&3w}jyaDsW`B%G+Lga+_ zk3swwtXkrqAChnu?9ip!MUzryA@ z`U__Ggj+{{nU6!x_gWr~{=By$PwV39&v~~uQGX&w4;^hre-E+s%kP>rtv=RM%5Ndi4@CobaFY_6slk^821nrq*f5h2N`}+mZGj&V0v90RwrAoirEc(T! z-)Z>uM%ny1g*suscrMBi4eFiLPiW^NC+P?Uk}~h@B+()1_4>wfOVerFcCA@Ou90QE zzVS6Q#rrI*)3zSlJE?8?-j2$e)V3_!YTIsiTaup8bl&x$oUjYChQ@q9chxY`47Prm zJKOaV(?%X{7r<0dF7r2*S$HptxTY~TkpFZdD-sUc6mbBv<7A}NBwQG2Kl?w-S^G~7 zyyt--4>vZ8omQh(!yh=i{@Y{6r}mciI+U~S#*AAHe zC@{1fYZp5{kM!^1fRFV)f#Z`noOeUSe?Jm=qQj$eSnH}6CW3$08kt~sR$c>uWK7nT z0`m}d|2s~q@1*%NWy>tIJ1c&tRjvC?oQn9XXs$9#bb||DPaR~wg|ya%WA$I#H0r55 zME?JZw8$UQZC9ZEvO}3NxpdVIlrG2QINkSJx z5>pnoWAK+=F&is~tj|&J1xpKK{@{!*8X-@3V&e;+@4AGq-AKLBuBq?cpdO+Z&TV8} z-~27mN^aysz0JEe1K+!M6>zrAcKj{kkHR7R$$P>gBagw#Z*X_4EUei)+8%Ka;|Oq# z*{jN;xI6#(YXFV#^&`0UNsdu>6nEFjEI=c;S0PQl!khmGb9$finnQr|U5n59h(664 zuvyQYZ&vxAG874X*p{ozLZG#nvbTUG*YX+u2?uS6;h%A6{9l~-zdG@MbK?KkiIbk< z{y!)FeJB0{C;mex&i-d{*>xn&IwEfe@oBR*y%TG>9(gg1KCWvl9@c{-Fdudq`H#27 z75n17mgqaWNlSps{%_{t1i%Wa4}+G{xL#jtbG;cxtUQA=b-%bU>$T-<^U)ST-zg)H zeTeI0IBytu8?X31Xz-I*14e6_n)Za3l#lgUG@Z0%hT)7rugpPNL`Q@pO^kkyu8q>vz4;b*#=y{p}f7?U?aAEI@_VA9*sZYLw->r>kzZ!UjC#Y z2pjY#PXRD#QxCoT3D>9MI{aDW{RH`ww07v_PYO^GLxCsi4@XbGzL9pAv~*ls?x!8j zh#liuDtGajjNNB!&>s{~WrhMz+o8iLOQ)9(@8|x2UX`j4U2M=FtO~*gb$G3%o#qc7 zZDCv;{v7gtg8V^RJM{7gt56X`fv5Fsc_Zz>xgP0kwjIu_KL}JPb=aUkSVeUi3OsFx z4u8th>7~Q_xjzVYQ==|6=nvKa%242GJsm#H!le0w$66Ryhc86lkCQ)$-|taxsNdi@ z-q0nhh!5b%n0t@3HtFRX)_~4X;AuPBJFj6({||a@s>_6 z9p1lvL%8!Jb+Iwua0^w(P~d4j9X`Xtr1=ICA{|$UKacc}lW*vG4=4U0wH1?)5&a7_;RM?Mi5Z$5La@`Ica=n~%dg<_f z?i+%eG1g&&bA?raG8A}PPlwlAm^9y@YhbPpr-Aq5ef? z9GRLL_Gcr{8)s2|orOg|-Pu4~*9@3`3DQq@$~h~0hLe7iH~eKJy#afe=crS`4PYPs zXpM9b3OudXhR?PzY5wS^EsWcSGsxRcf3%K2NYg_vf3OA-845gYhaPlZw^==$S$`0y zupfW0M%^J4c-jsf{*0y5ONaMIe-QM^*gH1ED@8npFb^WA8}x@An|sIR1h5(Kgc*Uf z-U3&^_f!xv{BIWf8bSu|Y6S6%o%khA{8A@=nG=7g6MvW!f4CFB(uqI9iSwNkm4WX{ zIemYl@7N4|1$YdsUypkOdB>)Va_T&z@7S0Rks!z5Zu}ja_XrM7GmMZg>~7t6Y~}#R z`p)C9IQovw&}Wdxz{|APz?;16VvLncTMKG1nrfw?9>t}7WEoG-EvcVlza z+l3}h1xAR6qvx~O=USMwvEf-3#_7+p&$weBJ^xcg{u}A<*TNiffbFHb`1>EUc?K6A zd_+ggC*N&*$0ofUdW=oCQw)XzPutNBI*xC)9bk)_(lKQ}FJiaO`%1QMy~lR_vW_YGwUM)vliRi;GALG zb;$S0+0MOmct7_I!J+``5VONxzF`fZ3{7*~g7;QToGhTd~v z`MPFWJM@|}tU*N#1)jE}9r*4d>1?(g&a6KOR48@Wpg&kcbr}jgZHEqDXzBFQ;r-hm zgfAFS7aQ{j@22V)3Ouc+L)A~3Kj3>YaXYLa?z_j7-cb}!pwe(>%Bs?1Q}X+3|SHkRfOW-J}or*e(p| zP=JaU3OsE`I}|OQ&9=jt^#_3p`|$^&J5*b)+o8kRb#!n`CnE|GY|2| ze_1o_+r&{73h*h5}%6arx351unCd}bhy*kSBuncm@+FKS`ghe{_nGf1c_KD@3 z?xheLZ7q1<5w0uCez_>HWuPhl>89T&58B5`T-ojmHjgmBg?QCT|1RP$a?+nd{7xtR zXEvRYYRwJj3VhNO)I;h;-PwBW{1)O&5AbSma`{3|wyU!+f^&|8^8<@x%ZI2-22DQ* zDw}lDW*svu$NTs0cj||(2Q2GA8T63*;XT!lc<@-NLv!TtFWE6Y2BH=l4$k_OeJbuzVvrJ`3pay`hPFE!yHt zJ+mGFf9nr|MG?vr8?Sr$gEfFM6nG*Yj-LKtBkizg>1?(g&WIiBv#8LNMHd_N2WzM@ zLxHF5&|$;U>7~Ps*y@?kqp`)~*w?Xcz9H^zQk0AC5yrk~p7WVK>it@+RH6bAsKYGG z`f4UJ2YE)w%Gt}HW)d)KLLe;0)S)u*r)P`ULdL{ejbgckJtj?F0PE;<;3>$ZUl6&Q zrD`F^E)>4w1-e#76yoEJvU!r%UTn4xmyh|(6S5*hA&_^?WU9b3n)D7lkkJ|MK-Om6 zE@`cwxw1ZZ20B!37F%;(dA90RYB*uHCvFO30%0I`<_3ts9Gf0u-(z4JHZt@wNqOGC z+dSY5-GaF51KAFQw=_h{)Cbd;r)170FvCn%F2R+%`4Es{#x4 z63Pj$@+9@yb9NNDt05tIdj6Tw3u;bMqc{ z+M6~Td`eXI<@Dq{eKcS6I*J>Ki=hnJ+YOs%+BX^Y12*+d{C zkbWW5#Vqp>GFQrZtt=^|zi-kDHa$Suyv!PJA0;^L7wCh1mGoi2rtdjCA@43Tx)>O= z$Kd5`r|IEocGGG5Wfxn2d5@Jm*akc@fMree?t*Ze97|S#%8-?FLC!pxv7`_iOA3%w zg1M6KR>l(TD{Rwk9ZL#XBc@*6v7|6;%k1^RcS)LcamJF&2+}Ga+Us`2Cc;T8vyqsw*|FA75P673J0j}&juNZ$Mf7D)a z5xYjZzcGdV-5FQheoPrCALJgoH*>|mAu4Hi>|tK7v4>@-uT=RE#tuesP>tfNtv<;@ z(u|;7)JAx#uVCz91m(fl!wAyB*ux0YsDh!#2-3mW!wAxQw44#7gRzGZq=T`C5u}5$ zhY_TMv4;_)gRzGZq(w*6qmDhSC+kK%_8NN>k1!m2jyiPu9eenX1)vMh?y+ZKy|L#6 zaS=q1R_-m0J!->ht2#dPJNB?Hp&n1)*aPM1IDETk!s-HJOFaD%TP`+B*`TyYUuIr^ zV@oQv+#W1eN}WP(gkz5NoT4Mn+ahxg>?!FlHcH5r@`FJg=}8y{ zT0C3*?n1fn(exEa6Tqfr?4yAs$TC`q$#O2>BC?cADoRY2X97|}pie}4%96m_Z0c)? zP*&Jjl()H~>cRhdi|JjzikQ}YBf1y{e1bgV@-1jfHBp|nxo@^j6Vu16#mua(BG!*Q zF9v*)Jn^>a(ob=IzE#Qf(9fdE)3<)EPL^karb68@B_MRL+_IAs3uh86hnC^H90nDSP-HoaVW6 zFOHwkuiBxEQ*E2Z*gNzUFxNX8tLt5(D5st+{or1UX$uqC>zy*_xXJO=!VG<`)fVM4 z?aV(oZ0h{O`wsw@y~bst&U;bt8lPPZI5+eU>@!Ib1}P4(i`>j3xHp?cue1l_%R%M zj|*+Uy&waDw68}I{i2t-M{Juh$iOtoFl0{2`JR{Xf{^)3Io~7oVcNpe-7^S0X_G(X zlwi}+KJ2e-A88}}*Aiq_V!kkFHqcGW2I7)S^8wEFn!3FaZp@We9M zdSGYto3t}tT|Gb_gEQipxY~!cUi)QNOIx1vQ%2T_SKi;S4C$RWVuNaIQ!Rmco7IQZ zAK!(+mnwpx&+?DtPw$Uf4PlYd8}^!&gRN;8Z`EIO`DOGYvxqJqzBe` zB`)S9LuG!erd65ucx^A>qqk*m-Ygpn%p^eReAw>1Oz>n6UOs>m?cz8N29`0dFywP3 zXk5p7kudp~@0%Q5sh3r1w3(RyY%gBN7%gNp`S&*aY49iVOlv{ug5_- z7=UYT9&vT^*?CEefo-f|7!l5$8AucHotN0X;qgV~y8Cp1zbxzD%F_kXl<^r=3c*>tQWkSTtWo_Y~3}LGg zmO(et7axwe*kZG~Sn9NDg%P1k6$oAS<;d7!;j|oeH#`Ol%tBa`GkG|^NuE%!J(!QM z>kgc(9J{`VIAyS9J->kjUc3GRa2z8waI921|A06hHq(UtXIvS`_gVI8VWsY*lPQ&| z!|ux#$RiBqK)d(gyB&?(geMmmJ_E~OPrDBQZ`!`8!#rlAf2u6IABwovNp<~Un`d~2 zFX3#4A81B+kUxDSX(_*tI{b2}b)1qq>PtymspCf?JbTq~WBfK!$B!w$qj=;FM{)#d zh79bqZl)ii6Z8+$o>TN*Mo;KtyAKdg2Sntv&7?mVdTr?l$m>ndKmMvhibN)EV7pT}Y1gT|kd?AML7f#NE+_NNJ6GwnM+|K{ zFq3aOZFqF_m!!U?_R0#ybpsz_+HKf$L)L`6;QP^bOHFN`u-y!wBzsprGG@i>BhXnw ze^*}GesNy;gubP`9-UC9fLGr5mb~Lzl$UKX$A(P3MpAe^HjUS)v4v5`7L?Zr@EGFt z8cpF<0DQcyf_lM@=`*Kn8Y(4<9zxHNScycy`q{ z=D0{#?XymKdyO-b#%3myY{ojS2ro=iVqHOeo${iJ;=C{)jgFmk%6aL3(t4CteTp?F zsUN;a9=!cTn2pd;eWA@nE?jnZ=?is;b+Jet=xgG2xJ>I1j>|F~cW01pJrc)g@Qro1 z2;aw~@eRjl(VpQuBIH=GZUZ)9X+eFMHpa|6~l=B$XLe*UI3zTwT5=rF>y^1zSdcF)i>s> zT)w=yjQi%Swyir)Am`k$F{|8gU{^t%ljaSqbIf76ym?O_=N+_hs9n*uI}?l4**dJQ zI>#KA%Xcx2Z#aIF@1(J<$!^<98q2xAQfx4H`O*o*>l@6UH!yy)ju~zhM?SFu*X6_h z7UvVpsdDZJ8@;be9An8V#cqEpjaS|sRinHT$5rx5vDL??@rsP3QC^8-DS4&X<~3=& zBBN)NSK|0dUMcqY;kW^)7_X#pS$IVqoXcxEjn|kv z632KYjm5$%>fl^nvkANohGTJmW3TXvIyjeCErD0iUg10kP_cR?jkm%p>fl^njWk}7 z5jMuFdyFl1rt8&wdpdXkk+^O!HfapoPCO}#%)8l%Ss?@&OJn!LLH!f(^*)$*q=yhZ zmtp*RoE(3nau!RS>T-q92pg5vJik~fN>vT&rsd@`QkD0KPMm8|3G%kfcwwhjsWi#f zl{fIS#5HqJ{#3z60XV^*I%N}@B&l1&Wz*fUuPkn%G0O)wadAU z=q%*Zzs^Ejm2pEl%de+1<3Rh@S%|0d^sTe}MsybP>0f6duFAL}osF!gGc(ieUuPkn z%G0;bMmD0ekWc?Q3vpG(o;qunE7RDK!a=TWD+Ye7Ih2PA~IaPu3=Rd`-et zeXS>tqpCA24{l-bR{^Ob>kj$l{$UPrw+#=djZK+*;9NeuC)$XOrQxg2FgFaw_KTc& zWG>QaPq!-VN@v>Dputnw7hKlMx=A~Iu8P_ zUeV`G-?a+esBB4i>&ZqLGp$O!(W&6g=2Br){)rgQf6haB^t58Y&+xx0~Z$t3GSWnEwnE({eHN$Xw(5uZ_Hny9ztHgk#zHH6GNV`+5FV&XXCWi>BJNC_&+cdO`|D!i&r<=|@bd9Bs z-)vwt4nPPQ#!b}AU_R1p=m;0k+|B=2yaI>iA$oWf($s@{WagIe7rGkMGRlogP-<`< zg=QvoT78;Sm75CXB)V3Fz)DlWSezv8t^{S`G1Vnl{V+rHM1$5hx0DB zC3P;oB}L~q$K-fhOpch&`5#F@Y@3~5FU0O6o!?^RRy%(^(p%Sgs1MaS>y+kO*uPvm zXa7?LmTz|uZz*WHAYuxS2}Z4qWd4UEZ|}~?9@x$ zN~2z&AocZ4BpL1#ov|*iov^NHI)@**1 zBpABtelard%Xa_Oke{^suOpq@?xWk(?oR>-30-x+1ljjx-QN)Mle)hZ>EybPZByN! zD;3A7tM0gmyie=?#*m-X{Wp+KuKV~l)x8W361wV+cUMD~4Y^KTCMN!?E(-BowHPB0-G?F@_HlyS@J1iMy+7EZ1n*7fn59nXIa zjI3^@u5U-$t!sRaWMS8tJBIqe_+;iVpqn;#D9sV%gfP4ZBYaxjIi9#QIo?ERjv^<7Ax-Etl_vePOOt*)O0)lU1^Pdi zCjDcS<~VXf7|Mxt+Eh7DIPhE_qTh+q?0?OP{neF|{aI=1Ro9#*CS^ZjKp32@_g~%> zOSn(^@7uu2tt;1lw2r*S`|n2Yao!%IOF!Y#7256c0(Q8>hb=k$0RVxrT!AC9b}n#c zZz75M^)~hr5d$PV6lHwG?$rX441w-2&(-yR?~hSHyJz@o9E=nH04~=pl%}h#qh9k^ zORmV4G7u8q$+dLa7q3-Ywijh~zm3RV8~Z?-_ZEk6oWKG4LTk5uPC~CizC0jav-)L4^#ZGl`9?P*0H@yVo}A@&rP zcfz%L$TRSD67zofB|KZ49e;~B?O57~c)2OrcFZ=Bzy-L@K8~o1;2w_P3QNn?@Cb07 zy<8R7cX9K>Id=m#$`|178+gYI(yq+!u()bx8Tqe!L~VWP?VX?}dh4_PQQh@d|ETUv z?cKf+)ZgyUy~bh1`VM${m0Rgg+mL)dK+h#rZNi+*LWdLs}rKssDwXbu$dC@f@$; z+mWaB!*%zc%C0;Hj_JP#V$j5}2PCAP?Lk2aspS@97sj~}9T3#G|moJO6r?=+Sc%g3s%3U>q>(au92md?IcB3{5@^Q0XpKgT@gLCE4H})4{G#-`Y zvdIA~A9Jx=ce5uxDv+}^g9f628tvyokjhYt8Li^i_$Xb`@q5Fx)cO5LyLIM! zDaaC>i*b$CnfoQSXGe6yL<^TiU9Lvl+kNY8ydcP)iAb+X3Mbf#(8P79jD6M2TNro; zvec*(hIQ{@bK)Nz-;~&ISO?NTNc;`~@5wj^pq=u{`#xTE9RTzG?(Yylw%Fc{f$g4a z@i}IZFXj~Hdj!C#H|SYRJ{ny1WjyAjZ$+H8ZTDqFPv(3X83?2`6YBGqnTL>}{Xw6+ zRcByznSP60k%s(CztN@@p4DbhcvhEz>J(m-4|Y)^Wf#Q zg=uV_8SEG>?*$1hGUTCsY1XkTuCFEA74}4p*%s_YZR-O<80ps{LRnM#(6-nN*GXKP zp|Y7ifrI?}wHeL@iLYZ)lFf)sU@~2q4NO9K6+%7yHb^jN8-K_o?e{2l-}(`oR-5=; zn-0DwlGf(B=91LrcotyW9PQMj-KiJQ7vI7L3+w>4QYenk;pTmq@(_;e>k&IBA1jTR zdjyFo+(E7Tp2p40LjVgyqleGfu#X@u`UJ{@J{H(M#|yUA>+F@~Ouyb<{}ZmvJA{jj zbKF2%?&{5kn)OBrTl{wFReV0j{yj+GQJ0}pz;kJl2Wg@2neQAp_i9j9aDVelfRTzr zAAj$}zv0BcY2&1aDLd9F+R{>7tH2wZ?5vEI>(fpF+^~}ZW+0E;4^dX~RT)2tIP(tJ zJj%!k_4PP*;b1^rcn={#^Oyjve5Z(U(u4opc?oR8FPB?hvDs{MfMFp5%MtcG8m9~` z0tV#VqDuK5l;!QGv0ywBh<7lsnHiJmd7o#5WoX+#r>{g>>xO(?huKv?K7-2ed?((t zao`Po331LF2nT8YX`D%A&Q+2Xt-b4tq`@hvC4zJli@1K7jpK>z0K-dNR`g z4F?0SoGkH5xnLiHPa2pX?_LqU-m(ZeY_B=Krfve^KwH*qe;aY8CvoBZA!))l$dzr+ zG~0<++77Rji&y$kUNJ5UjVItDd(C^{2F_Lp*$`eOn&!^VrXc4Q?GV=@^QB)#ZsO$ zx67zKw9HJDbl6|=rtM)Ru#}de!M1YXbIgswR~EbA#fBmaz{EKZ$41u8*}i7|S4`Df ztKkd1n6>kSHEildyeg^|Tq1MhGAIKto)m_^_-NOGySUAWRzvtNT zQIwIAw%2>2X_+IlPfHt=O4UNKG^!iG69;ld=f{9SmeP~)+M(}dS%_e9t?&En3CZ-l z0wP#I>KiRmzh#A z_%l+Q|4zau{@S(1F-GKWvD7T$I~mAj<#2?zkXnzSQ=sSaCm+@We1`7b@!1b~{QiW^ zgFgtr86Hl(6<)sY{$arKCdty+c@lB9)yHgJqVK_;y*_-YyAF*uH#)X>w1IQH1J@M7 zbk8=DHdmVBos2w6Q`@9pn#PuDxchJyZHwi2pMd|3*;cV$Dj^erdI|f)U6N<4B#^Po z)?>CEw|%j7wxP&}{~AZ1P8zx!^|NcBv-Rg}W{RYa!rFrI(R)7j23DGR(0{j|%}>|| zZG8n1o2R%@KbxN%6V}9x;hy`3kDsu4iW~8>BL*{3=JTKTj@1~h`dQI= zz1(gWit_m-^l1sK-ve+&?!gIXieq+g%I1n&k}~*+p>hmfeaOch8kk#%58)j4TpYZz ztqB8PB(!iZscYn2-=bhYKLt1!9{L%&*Lf}pI_lHJKcQUc;?nck3-lm!@DC9P2LpHo zb8zO<4>Gv<)EoK_zJ*Y34*Q(GAd-`az_Q$#Pwiesn)ruMU5yha$g#)r}w`W)T(2@&KP`mkx+&%RlZOly+Fh20I6x%WnZ5y&o}ahs*R zs?EaMg1$%D*jHG_EBvWkQ8&5bB3HHDD}XyQdmR6$=80Ph%z4e~N~Pv5V$u^MSX+{Q zwr10yo7B&SzJ&5mg*ZcBLEVrP8fU7HeL9p!d?ouF^(F1uM;}uhy=K_b{LUEd0R{n* zQqOR1WdZ!$@M4{%rW}B34^J|=A`1NQH=m;ERYvxF^JzAnIfV$@;el!|{AL;LhAX=K zaGXh)KTBI!*g|}swoAt|(t=$E_Jd^P`7PEV)K~K>W)iHu_F6v_-LmaPuaJ#;(LV?h zw~u}@BMi6DPgqa(1@d+K3G>-Mcn`rV{W-6wuUv7F>wVErJ_BBq4|3iw`pIWQd892l zjs&*8P5p%bTmadA`$?HN2o#6?!dj#^uxipT;sqgt`@bKFe!{j7bc?+euq8xri$X$% ze7iP1g6-n)V163&*#^EpR$5_9V9CRoUuO;@t$hpQfUFySP9Ot$WUTmosdH%Z9wKsY+y)pQG00k??U&3m8CnV~!ykRjjPpBD zD+wG`LfJlzxQ;Wd_ZN|-Oq6{E(eL5P@O2zY;UB_yhBHh<5x0I$e9?(FoOsiTA9dm_ zC(a3<$^`j?`}T(*|B*Q8mnfgi4>&(Gj~|d@^4V{njQE|BWAY%oj3@LFtY2ncv_0;w zbv_LF5q}4mZlC8P*AS)*Xez7Up%Y;)VtcPNN!8BYYa?mm!UqkNNe#y|_Ak=wbh|>; zNF4#AZIA&kZG%kC#z_bD#WVJ~D)EsNyeuxfCsrNsN}W=FoE!2=eG(sYqQM#Ba-SX9 zx~anTQk0l-v_V9lN{hHdV84PVP4h4o1}jhCk9XQU=wJNtAB1UX5BlS+_*K#qeCapQ zz5~4&|8?QruK<|H205fZt|BdV(BJb8!DTxTSC54Cf4+vU-B@)T?Zvn!vq4ahKeLbjxT^#WKSi^k+7+flkM)R zgcQp3;K;|)4i8Fxu#98fF1sg$<3U?^(J!+6mdO(13qwI8CT9tNDH#=xD8jzY14?A z_GKEuU1OBK^%7)Cy<{`NXq{vcR?rMRu8+m*a{v(CFBVSTQ$n4})a6W6uKu!?e# zp@a8M>cyJht}M2(Z%ZkU$)xQels}6j!oNd6qg9DI{}BSL(d)j44FioK^Y1+GyFAMa zf~2jU_WW;T?8m{h>rXkhL9Yy%@8iTcVW9uP>z0~$LgbZN)ed%=3D;2ovlk%JuPlA3 z=RL^lQBTgQi6XSKxNf4J*ApK>>lvxHTTl4Bu6q7I18Mv{zvQ0LdmS7DGq&NM7P2Z zfCNCGOd-!<$uoB>rp&#+cqK~dJBb6G27BreiFuGue2tUd@lhlc2jyZHFJ~UcM+a`; z@kp=^Qjf}PwO5&xx1059p%iYi0ATVD*D(m-<0$#X)+|X$`SoCHbo(U9!->lb(DjU5 zggIkp+cY)9aCXyNWid>of#NS6+ItTf z7_5^+TlOI;@o@iX?WS3uoSK@nQ)$(!U=a>>V00=up$t^4)9zl@mSa7BvEaOGN(~$P zG<@*yM^2NqE~L%wtLeS;vQAz1J`QQ}$>0y4M=Hk=Gq9m8knU*CkClV3&LIs0i^n=a zKYO3yd5=BI=HcRgJ9+O7$mrk@TjcJDBC+Aid1P20@Qszn`KpdK%9r;986}j{Esa6?-V zzW@ldihU!^q0QR|;pOT=GLf&kVBhIw+uDXNjlzo#sJjd~m#{Z&VH~MQy#l?WUV|sg z)e0tffsYQ_yVWUipH8=KkTqs+os!Z<8?lXNkS=Q89{MTJ@x*MH+g)b@v%Wk;r~La^ zyHHZjtY;QSXy;Rt<}YSuV58CLKhCU9D90L5M8CKM|38EL^3C)=VxbL};A-(U{OxtL zi|CnjGRuvckIzfFA6Xzh-j~TY(~bIt2j-Hy4=gq~4HNE!Ly+%aXdLq+m1pnkr8r0n z&u<}5+eq{!zSLL_Y4qz$sdonArrBG_D<8mP917Z{+QV^^uC)!3o5<_&lK&gVY~Uer zUcHPUq`$5m{4s^G;cQ&3Tz%UC>1dmnv28@Cl3u?$A`Zj4I;s_CtFyBKZ0Lt!5Nrz{ z0KP)NPHmKQvk;eaZ^r);hqSGeMl_fcz{w6?*Dm?EFY_9uCW{0Qm%VStNpQhR^Ro`^ zzeXnQiwAiz%>a9l^hRitzVHw`A0@irM(lhT-{uY70U-l8wLRK41La7w^Ca8L0w?f4 z;ML3YEbVpe?(?9hfwEY{)-S2FFyKaHQ-4RJZHN-+4yLMHZ&$LNX|-3n8qB~wg# z;eAg4fbS2?H3-3SYZGT--X-gEVVz_R*zO-OOmKmJ2(G66?YpD0%8T1d*+h}+!HkYPFKI_CwPMn%o zn2HmhbK>((e8GwHhDdQ=f_3DoopnbIz;zOHQ0? zGMfK8PW*SBIN$A5n2$Jd-XCiI$DH`bo%ruL@lQDMPdf2CocLN8&pgJ7|CAHw!yC&t z!+Qvg^FCDL1t;#bd*&J^|A|igNlyI9PW&lO{Had-S|@&;6Mvc$f4UQA-%#0p+KE5Y ziT{ifzut*I%ZWeRi9g4QKi7%h;KZNj#Gh~Dwx7uS=MeJPce>Yna}&ezs0xJ$#0mX? z?YA|&XWTB8v^=Z*^ukPmc}U(Xb-qx0v#=6c@N2l|#xf&6H(}q7BoDwx);xROE6Cbr zsez5&OL(7aLiYZ*Y)FUm(1?$juNBKxZn5m^qX3cPU?B5tz>sj)DlS%*T_|^b%dRVs zW*@WVqC>7}iVlwzJEaAD&w}#A-bXzI7$Z*+A5id*m9Zzk{K>`)v`1_vpbYI$t~W~_ zP83D?%KG^iY})m4grUwwo_eubn{BL6ocOm9I4_RqN5pC`6kFy`bF5z|!>=JF!Ifbz z{etzg6H~nL7&f>fyWAu3KZ(--aPm1{H1f2X^#wmDq#VFE{{O~6Bv}drEz%+Hoz^leNmNRb4_kPAK zzXs_)MH%bN@+{_YU$trGF)&~Cr18vb3EOAkt1dJq1m+*WVRR5JWEuF2ehDu6jsHgj z`3!{RFd1oEQEAtHCy{;zyulg!Q4`BgZ0w7crt*I<(!#&lI96#nYw*ZtATH+?UHqG6 z7E3v3#n%?)S=wD;xzv@-w3TORq(^*nHy7}hXI=+UCiOtMH3yX~cqV4`AhJBlfgeGf z!IlerAxsPWVWgG*DB=t*{A!pMcpqtnA48nMgu`-p!jOz*=wN+eBR=$1b$mS+38<=4d0)QwwyQ!LH7 zom>9mSo)S&njYVUe^)Hcx!IrKuYhH2qhx^6x~``;m0%@2BtmG7gKs|4PLF z%t_O}+%)GeZkj#YO&^P;UmZ)+YdiApe-F}}LuK0dxRC9PD$5<-!8=c(Ow)JUwAc*c zZD-W-JG}Ew79#MGwAdzj2l!)1AcXi2+`sCi@Ae*?T?^BKPhAE0wljtJ`#*jngx`O+ zci{a_TJYI+f?q2)a)>iH`1MsMeYdwil4e^H*1`+DWu%o}%$M!I!#n3^RzrBm6HUAH z0OqVglp9vH$_um(TvLe9il&v8%3@XP;O~+6hG$ofPd++LIgjWR(w|;&hM38%ugoh`dmzNL-~}R;>Y|b@GtQS4*cET;rFgO z={SDOulA2`jZfPnp?!a_md3xUuSWHEcTB%3zpKyR0)5p-uB$J{>G_XbO_RqCv|)YX z_?NwZ&En%Cwyv-$TOdo9Ux?F+rn~U1u`2yLyhmKKYI$S+gMJuIci}sJB`)h7-nn02 zi_nUum6qi#KH}+s59($Ox3_HT=-C=>i2tZxEkxwG`sa}h`lZUF{PV*s4a>WAlg!_( zPY3t`y)HYB>h^9gnO=b3Wyg>D;Ho3v-Cq6{H{DgAF1z)Af2|+{0?tpvbnUM;nME1>*#orHom~_#TJjb^tx;@ZcF~(1H8+YC?A4b zH=$icrqRQ4yL)Vn_F45$3g10;_J$W6eKe3TX{CG*#G!Lm^9&&Y5HN%Vy}jR=MFhd> z{_G*dzl0+*+mI5Q4?iEZ$Gg4p|Fs(8?WcWEKEflMeLhYWS9J7eNVA*=p08k~V$4sH zj5v{bcMm|qf!5ydln_C%yf!`WmU*Dlr$EweXVm|!hp&Zv;7d(f>m>C`eD^Ik5$$3;a4wFqu>o|@;-pWsgGZ^A6T?Y-eu607byno}Q&wdWdwGBZ>_h*UkxhwsI z_gzv)eB}}!7|l(T!c{aY*M@E6JkXMM!3!VD6TVQ?|6xSy{|A7SK-J;9imhV3Lf+xq zXsVML0W)>K2%^$<7`PruoiNacsD83R8~-7T7=(v+;UAflO-r2vzTpa<%U5;kw#9Bx zQC=Wy?f#D=v`M3vJ%x3ZtrY~%<>|CrP*=B~ggigL37+8_q%Kd!dARl5gLHR2zpx3O z@>;dvxjdD&%aeXe^TT?6v45VzxgUAm z_2eih0aZ6Ry=+KqH}-6x9DW8?_?-(Hk@d+2K4nk~eSfImFAG0_v-=7zGGtwpzKG$G zIJg$adO&trLoL>@th>lBE1O{TEYA|O-=L1-V`#r3bE&yB*Qy*vPcO^gsU2JjVdS+y z{sN~^!ZRE6vo8-b4?$%0F8uP1CK<|p3D?5O#4k7SXkc;Ja}sv4L|L~`$Fu9ekJpj5 zC3QSjovRjd+^#ZsC_sMa;4t+&R$3gvqY9sZ$V6ayQd?U&jgPr#m7oZ#a%LHP5%yN7 z;7itRX$Iy&=Yus|zklns4V$1<;gw9^J>uOfXn4#I)X z*>Ax0X-=B-pYEhThWImV8ke&_j}zNZ+ECwne{o~6(ncmi24*?zJ1-O>PkDU{agIwi zeE@O|e#54rSJ@Z*9;7L6ri1Mql_ulna~fjTivM6QGmUl#=sgO<-CZHQ%nSKQvbyZH zx%9LD0T?5HKvyi@q1(n7+Be-lSGv%_G~cdAn!%y_-VZow$Q#t3cKyQ08~Ki&ON|Ep zH!|zLjJIQa+PAJRi z^e24Aaysnfua)i@v=i2Ct8LlKPFTOK(su1+WQ%sfarJcC$yc>K!|`le{K+Y$dj{=< zb=zuN_OcV!Z>zLjI~m=go$#LeblS<+K>u|3lfO~AXV6YqH@7V>apoSEI`PY#_ye7| z=%vTF!}@KNHt7ow=xA(PO#K#{wNN*45ZC_@QvOVbFJ}o z`jdYEeer$UY$v?OSD$*O?u%Kst+r(^JJB@^z31M{m=@Rx|JNN`K`P}MEl3G6cS z!i9z`VW@1T4QoqnENR9>?Aw-io(385-nx;^F*2*W16V7Hue}6oMQLj^p+qKa z{p#;@`20Y=gwETqeA}^>(X)Tp*YjNkZbUxNlV?Hy7`Hu3uUMr>e+wXH=^ey1ALRRU*bcg^WxG-5 zrvY~wxS9t&;Qgk_r7SY6e0aYpl9uOLUqZR??lk@7av9$fUIrIZF?eZw@xDL!a$nL8 zb|E8jh-dgGzxPIYFm@hz0j?Ds7aBB?6Vc!uEyNGpgcIQr4sar2>msth2x+%H_!|Ex zArT0dCOe+7TiM&A#pzsgQm_L0&|PoY0h%ZyZSR**NS(TJUWc^E$qg~4u|tg=PYA>N zvOM$sXg;zJ+=>%n(7xe!Q*0i1$@fxt|7Z8QK+M2{=HSWaHEK)sO7;dS&E^9~_N^g% z(nTBWdLgcVghPA{u9Q=cv%+`Zn)pB8V#hmF#DCx_+^h;axU{`P?dppwHco%S4a)1y zVy8M=tC;^I&NhmzvR^HmR2}a}AdXL~4D*!ZDbLdgPoq4I@iflU1W%JZP4R@6)Oi-1 zoFL&fZ{`SEZp_0s?1y>E@s#Ijgr`xSq;#CI37#f-n&Jsmc@`W{Wn8d8m2u$V(}2a= zu(!}&D$;SZii`7jUOn4rbc(I{w%6{IvE84KN-ucqILE4G#1<;}a$pCAE$qtY&2eiH zrivYG%2}=~S4-I2<#@B=Veeq9M|w@{2UAv+m108(HKxjPZV0XQ5H{u+##wM1>@%M5)*;ma3iOez}f0j$dDR zu~$C6Smc&j`memo++4Lpc}xR3?|FC)>|lka#-rsXw)E-9_ubqVW?&xr?Ach$Vr8Y{ z*DA}EnqMlG7Elv>?gFG+$5p^kI3HqE zDZR={6_mqty}BrSE|nDkTM=N3J@c|$n|CDK-O~O^l~L53mu97S#6NNk=6iwVvlixy zJ!0`DPBko%wrA3?fF_K9GP|fgDh#RNr~`5qM$pgzLfN2Uu8OUl>H4dUMWgLD=dZS{ z%r+W9hNXiIKG5l;tOfi|#c#q|>iDlN1d;4{ZW<{Y4lP#DVn zP=$oV&@V-8P68daeZ(}V{nxl{3%vBh??l8>!=5V&dOy&4vS4P&Z7(&Owc{QVD-GDX zCR%e&qO>rqsd{n6ew9>t=7_7s%NR^7kv6*XVWSv$=OQ{9n+MD5M4yE?FnBfQ>f+MM z;U>DfX*UmB7@OAh7MJj19X_Ps^e#G1r!8c6QuLS`A5-K|#wq zWHQ9OC2G6QvEq>mY{8E4rUXiBEt8lT?_g+cZ*B<|PVY2ZEw=sU5=2>Q;*aonO$u%b z6NGsTePLO-am<2Z(_D^2=rwec6&aK~>omnMq$&$|-;w?gEhPU5x4qZ6N9*3;PGz)_ zp`l$WcCei2&tve#|KIUO^kMG4h&EloaL{O1Fi(M6IP4s&b{2e&H^NE2Wn98s8{bX0 zuBrl6m+^TH&(qX8Qxf!6bb2}P|*F)F0cb|51UY8BG@WasHkuwOE zD=QvF^f@uCHH!S!siZk`Tdv@n4du#g1O2DsVL*nP5SUEo|D0J6PyY%rf+nx$3-aOHTh#C<97PjYU%VNNOaK z8jYmJBB}96Y9f-FjHIR_sa!DP8DXN*P`)Dj)wG)20cri#50-fA%6b7nV#*UtjQkuj zBU2^hjQFj&q6;*FEN9kaToN|z@fR9x>|~DV!z8AFzHvQGjGerfF%u$v`8Sg5MZH1W zC#w*?ZMO^Q| z@iZJqa3CE1B+}n$;;D1VLOXEXY2!>&m^8*5c*21XA%6UUM%ZpOCSH2~0~3`92?#9v z9XKkNB=2~q-3+^p$h%N&w~j}(*39$?q6yv}T%U*IP9`9*EYp6#^GYuOXUb9vn~gB4 z3w7q-jN=FIj@s2=^6tg@a^u2ECzz>DBHZ1mRD+orMuEei_^&C#pYF#Gi}1<7kdNsv z6ya004F357{8^x9@jFHMIr6U*;pfQz`Xc-s`QMPi4-@-`dG`N_BK#crA1uPpk^iTQ z@N?vUR{?&W{eP(lKS%!e7vbl~|Eop#Ir4ujgKzym>NN8G{}V;{Ir9Hz5q^&RpDDu6 zk^gfA_<8pK{UZDv`Tw{GKS%yYi|}*g|FaCf^?%ww*Z;p(gr6h-|5=2eBmZ9%;pfQz zR|WWa_W$oi_&M_bKSlUC^8c?Q{EYm!Vo2CA0KeXCgiTa|ip2h(`1>>X+FlI)%&dyU zv945IYDe{D>9JX!<6_Y`$RgL`MBKfIKcm)&I?eF1_Ti<4ZrG~NuPiLoyTNRYqNVzG zmaRmMR;O9_9aN+mnnytMb^`AWc*cMn;AHY3TM1+5&KU;=-#r}%K80z(V-}`-&ktw1 zGmA6xEW<##cOm`0_WAI#q?j>ZY|*N>+TF_m?Zcq>yMg}_lP4ueBbIYblH!xl>DHrq zceP&glR}%ZZAs-gaVjN8%=1munBkn9NgJW`08S}APSgjKe~kDDpolQI`~tmkQgIUg ze=p?>x5DxwfR;aiNJS<_)mF`~&1-r>_sQYto)oqE<$AL%?oCL<)r)cZ&m6ADaHQ;X zvXXD7H%|Z)VeC=4xb#xx!}zWfFQXU=o7}L>dVFeuwfW^2Sz1t4XEq42f#$wy(X7I^m@p3<(oYrOzH>1KR4l zA2#$#fm~hrQsqw#XsbW}gejj>pQ-ZBkVqaJYb#xhI~*=*t~#c55sP|-H8IDo^f`RARg~AD>ffdNsH-PwLLFjmgKQtSd*DR0>3Q-|3U`-u+vUh z{^LT;*k1Inc2-yy43r5tx$_L>mw+2gG8W^OUV=1*4ZK_SB5I!#23k)%Y)w z5y*?<{ii!owIL}c4P#O1_W@HjmB(I7e~x7Oj>6wWyk=q0AG0)(661_rhqyy)>=@wj zBwxlI)^({_@vC8Vsg5`UX%VmDBwD^g19Oj94$4H_Qgdop8p4+}D4QN)Uo=xB#k8-& zzU=y>{8MFL`n9!{=y?s`t=g9~Q+C4C07)^QtFRNvJ*9TSJUEu0KEyfrR_#QZDLY}9 zLsHD=D(u9nd`j)K&yk;YVw>Kook%lfCk)?6+KQdnbq=%>`(E^4F^=|g`%wmQ$*G|_1-m0BQ zGi4{-3n3}ya}{>tkRs*t`tfgvKXK0N+UW+sTeXwU!)YrS?{F)PXw2s-?8IU8DYerP zM}D@u8*yyaPNeDjlivzENP^9pD^aiB6{88uPKo>AF@_sv^J4lCg~?pJTGA z1LRjETkAmbITpqFQ~mimuM+xXh~V;P-xHU&6G1nhZ7$9~$hKA@6gv zK9JleFa3)0>QU;nRsf2uM{t$4hW55P<0EHPdKc1zo?{=!mGc}<5|mD<*J#zdNI)Q7 zhDMyrJT&W=2I{FC!WR;l{oWZ-*)wU#3ZkDsqN3V!){F=!d@E6AJe?no*$;ZBOsXdpahjP;1>8rxu^i9>~d6v8io}Tvxt^ivZg!XR& zj_YBe(QRD}yLA#rC`DB^8^M1%uIAnyiN5`V-27Q?kdPnK;krn#-s!fheprh-N`rmA zr6GT?OQzomjYSQg0A&6Wc&rnK58z;&{24UPtH#APfQduhn9l1l(0cM>t-a_iguSro zb?ag6vbPj2*RX2S^`c(8*wh!?EM&rFIOXPIlZ3h-;Nv=5EAq z5)6|D-`o+9x|4=FF5QR!T*CQgU45ps*laAH_v^JqV{y_`A7{~D#-X}kvbW=G6SlI( zA}(cl4X)H*WkK8Yo{2;JH|$8Ouyn2Mk?60=h|YBAyCXu9FaJ z4~47I-6EUUiduKmoeVhF5i?5NyL_Cv2K#a2Zx>F63yF;(xA3R@)m{Ep41{Czr{LLvfbrF4j-IZC?fpzBOq)*)(LwGNaMb-3e; zxIPQh+naG^$klDe(`AwOuV6V>$X>VjpapBXPIkp#Pw5a`A)XlPwIg9DyP)L zLKyYBohs8w=O7M4$H}mHn4|89Y_e&}VW$)Mw#PH&*%zGEPSBPs@(;|HTb-3&-LKAT zlMy*MpH0c(Cy2;WowDsJu9IU#LJ%F3qJeELo900sXdk!UZzTf+*Pg=984s#O;{h{^ z$AhsKf4KpUihF+WIO;rfhkK9agGP9uae`!lxrlutrZG-q)9%5`aajU?Q~koY{s`$ zf5-2xW7;GRsdvY>WspNU<=PAn(qS2w2h;L+*kNtcJV-ywgK!>?5w_9mSU-6@>@E1F z^-y1PZN;=a9`-hV(>%D)m9-Vq@_5*xbJIL@9Ch_zS{@HOgl(FKj%O|prYR5lm>#92 zi@e!DiqZWDuBQL*Rim!o!Vqyu^GNSc0o=j_Gc^&}*dKfi3EE}=%bfpKq>)c4(tpqm z53YF|9!Uo6PC7T^dJG3)_AB4Om2?POTAfPAk9z~ACv%smg-oO*<)1+OwGiQ9n+6@^ zz6{`4fRoBhUQNL4!_*Hb&$j?GkPqS4;7Y$MwJ?5T73O@syIf~M1ma+xyL0b=Je1$b zdk5tSSnNcdjc(0wwVom=G|_+V+#BWRq3F&@oUD91@3XWlEc7`(k-lTUc!p2B4eVFK z9J2H=;1SocpU3q9)y1`+^FK+h{X~udHo6-7Vcxc__G6u8?APkp8>C_E_eq%P*FYm< zztX=NU_ag)5_gdQ(dMJ{zh%%fzLD=^TlK$|(r6rBcW?^v$ZNSi z&*G*m`g+=+^jCmY7o_d{ISWH?BR?>ZfWW-OZf}t^oB~FehhxXlh*B9C^%={2 zZ<4n2J+=BmxYFz?9^~Em5diQhp#vMlbF?2q8ucN4UI*RtF+XqZQ|c-6CJ1peIsyZU z2+Z3~9iL-)j9y3k^u9ctPECw1hjDf4awY7F*|%NKJ1qY}dJe2Be5gdVZ&+Gf2-3{83+t5m|=x$2H215b(5-4llMiMgDl);X9##2g^s?ZGkP7>A7eE|-XZ;Qjrt)3JdHxnyDXhSdT!v4@mpY&Wk`Qq z2P#9r(?&Xczr`u?N3K7Uj;jOLM~3ys>|BJjP} zo<^ZBN2IOjJFrgi-zDGFn~@jsD6Qc$q;IZEff4G-HS;1p2kIeXck;$0X$fJSa15Mhz0Bei`6K`L$m)P~>7o5`_`Y(sNZ&!e89)?u)xI)OQ}_(&o1z~?lj|t-e5gI?h@;?p$RwI%;1Tt10ph>5psF4@SPW@jh;`P5p?!^pqK;=)IEa^3Q~9r%wB zf1U$>1@Y%Q@Lzb7Uk2!n*~6?s%@)n^2Hf*MxK26<0Z$v*@0Av(s4aYt#c}O-4rwE5 z3q?8(Y76UN&k*o53LQy^bVjeEwuM+t;WK1gScgaq0Z*gQ^97d9AUy~5&GgHXuI-x5 zOem7bH2m7`uSpr4&M{)`z2VyK0&s7`v1rTC@3yqI>+HZn8HO8U9s;I>fai_s;#C%> zs9n9#;y86t3XwLFc2%t7fOa){9lv+mbTsYCQB&$&q3`<`uSu#8qr}$ ze+e5vf8>9H#3}N}`z(&@kMl?ykw0F=9Q>gG>=^={Mxmpw|BhZq^~YFEkvDnn zUjFy0VVj>tKmNzT=!Ch2{r`0I`o758ZIHej_+>nSqwR zj$BV&PaUM^Ks|V$7$ysYoAAx`&D0hD*COpA-~0iKN?e+ zy4=7YAf2Q9p!$r%~vs_q2ob+`u2>Ne5*aa=c!r><9r* z8|g4_afbQ$l?w9FoLsmHL>&tWHPt!5tpzuBx-QJ#UkCv+{L#D6RpCgkju zCe2me)G@fvf}1_g@^kapKHoF3Zab`1@g9#!lQJ2d#<+$;{}j19)kaXJ{gb_dK-d0P zf=q1uVs`Y8mOIh$+C`sfLRRDrVtLn1q6&OYLGSQ089nD6p0G&|39R~=D`mu5%g)C; zVRyl+%{RPy6DK@Tz0hF)&OjWq z#J4oX%CrYz{C8NomdFg}Cgc)d`6Mk78P3@{(X02UB$I~YL*7pTcKU;{CtFcUey-c8 zY@oi2_IJZ>0HnEwyt12tILoQ1??Rk>+#q#q6W)z$HlK90{Lkm)6JPV+WAm+z;^(06 zLi%kuo@=jsE|D;wd*k(Pd!@AqGmr-09Y;HjPTdPvE_v03MGtQ?%$b*{Br5NRd2*h+ zPzk->{EC)^ef9n9n_x59gBCO?>Ms7@#Q-}>9uh?b!mM`yQiFuAF)+mu{A&#?W@5he zn_Zd@A7%M*g|9a-t4PY}s>wca|i0*Atg#_t0lJ@(C6WKcKt$>SFOE?h|m^|j-ub-y{jq0p@_@W5&>at)4aN7kq1 z4?8CIAP$W~UP_yGd~ny_ejP~zZB}ZA%k@YsW_R5*xItozd6q{g-67}onm~a6-oQ&1 z9;0ktX`Q!c5;{0jR>&6HgKd>*aA4E+q?Sw?<$WLW7>I-V82bwAX>M|k&2-N0o@4cw z_h9HFtOFh;;8GKvT@sJ}Y3g1oeAuyM4aFEH|q3OJoYdG7%CWgi~x?u9!3DiV-F*M+gz z{T|B7*tdYR99gF04}e&D*W#LzrB+o@GP1l3m=a=pvONrvC5LzN5ebl?F7UB5Z*xaA zfd6S>j??KioHk>N2Jmy_F<%)$9z(7?_P*IxO~xMcrl40^TeIbh>|y1Vx>*E%o;=yQ z>9bF`xQI<%2iRv>p%wB&I*Jt2hVES9_^)2@L zAgltnz z{XYTE;UFIBdVJhFz-gnx(l49?Ox;RypIVz?g9IozH{zP|LEfj*;hg(C$KN_Ehj3N* zsPu!Q_FfbFM_wW!$_@H)U9177t>27;dFo&15NBW-efM<6ck}E3%)&R_izUJy$ELC#+leF$6p*E1PG@JSo| zQ}>#HrGD5ZSwB)o*gplkG{jvL%fUYBI&$_{aoX1I3E&Z*2UN0p{AWNCI&v=kXLI$u z2?IYC$kiKL=apq)vz?D~kC$$J(c?8*!X~dZZ_zB_2@YhJJ)Wwz3}zJWKCGovNT;9j z;N@YQP)5G5A_+FGIOKZ=Xgo>X$cTJpS6pnmQ14zga@2b(9Z1D(SrJ$Uwie%EJB2MI z4Ze`tw)PAHG}hO$!tE zS1c0wz5<8x$5nJEol>>hnDm{EEs#cf@RjjTEp{61@+nU)aCiph!3W2G3+3kQ6Ejxs z@keYv=#T$f#8oHd_W_$`c*+S`s?i=m9-7}5L0iHrWukOb=)O-taP+~ z5?dQSdH$|^o}0rbwpmVlS6*6wSzeW#wxzs|7xAi?zNO;yEy~MQnd3u7uc-oF9Fwy4 zi}ji|zA)|hg7TU|IfkrW(*?XpW*{&4G5gF}r$13%)?NB|ohabN7CV^N3E?%vMO6gX zH%v?K*Xv{fFIL4sUijua^_tG%Ws~~!I#s}n|KSbfHQV35)P|hbFl6g%rhwNAfj^Mf zNu$@v9KEb-_VJo6;B{XPuecqb6cdUHZe5w4uV1Hfro&(vZCfwS;S>A&38T{qN2hVy zXOyj9X6;wbbQ&(NA1LBAW!l!1)3#z>w$te2mFYBGUN0-+HEr6~38!tvye$7dUYSnA z<@JgjUPrXgEl(OFmM6uEEEn^#okkz8OsC=UdQ}duxW1;0zfU>iNzBWp_3_Gd8ZNIN zEaEj|>T4#izHFzF;)N+f#to&PQ9tB8X0~nJs5aDbiycQrd|xa_S+zaes!X>r@XWYl ziYM+f`gq=?Jd-g@rmpU6%jKIpo`G-1HB)^3BEHFZCfXXlQ=*>B*P6Xg-;A54_>xH0 z#<9N1*e2bx@uX?-8kcYGI0t<*E}P=ZG6VT0;~e>>W?L>_>%M*ZX52T$mkn+(U(+lx z=8^A=nMKSaem3rt zv>oM+i_o`dT>Rc5zR9>qz9)^oC;Rl31klO$8AW5{_vP@tQQNPMkz!@3W2s8FZga;= z=vp*h-k-xWZbQjqGKcSk)~!3Hl5=^|xK(*F_N!RuyfK!% zGaZ)8`_(zT<2p{PE4FrLEh(Mz##{2ubXYFm2a5P6<1P8l7~h)d_pQ9Km+zrw249!& z9XWjCx#niZTk^>axGtaX%;6KyUCQnVo4yCh9b?I>z;Ev=;#F}+)ikf%ah1FZe3kNL z`}XeDrAE&*FYAu!{*}B6{E=h9Kwha4GtDb^%p|YOpy~R? zcjfSk+uT)*nWbtk0!f(<#Oqd|qiMK~|20nRgG=3Bkof>WyBr(H6Gx@(sg0DoW|U>%N~ff>cqb&xxblUHUScX{1g#49y& zr+FC-bM(p#-Y%~fH*Wd1JBgN_TKBuQNHkjwEC8=Eh#(mG0nNUT1T7 z#r2iUbAXl6D{s6NUg-|b<@G~Fyiy}8}{Z}jY>2ZFV>gr!a4cH@}HP7j%_EN z%#(RH8!_Sx(jPf*Gi+2I^R&MHNdLnCx$$pVnnL%&ipm*QdyUmP86pfTt6A$`2}M;? z^s42>|37h`$bOi5BJ4)L>GqE*Z&brW3;b#@kz9G>e)gnku*2FkuiRDIlCll7XC9wn z?U+|qWz5>o8B-FQ;USJoEQg4M~IiFRGP?v01`r^EOM$s*FR~ ztg?~KOb5Dono+A^ukM;IC0pEA+CL`fYw|yBtJaxY<@0XTCVza*E35X}NFK*jPpv%oUl?D6 zTB$Cj|5TzKpo=`K@nyu_`i$o#Idjut{H>^bp8e==aed;J3y)?a#f%#&qEO(OoHZbPkPO#_Qv)4Q9m3ClSfP>G%F_0EU!5v5CXhbBd#ZI$1IR{&M z5uQMw3okXimPYu2CC`4oT*||;@@(6(P&70lL*Msl;dk;Ju+IHEz{mI_G_FV9Y4Drt z)}tP7alKBh%6Q#08NosM-PZ#D7H^EEJB=d%D0veo{~E+E;GpfhIH()1v^}r%0Hz%U zom-lCAAAn1dUdaQ$!p=KpFtNK^?g1YRBFwKxM;dO(-;AkI*z{%n9irzl3)Bic6mUY z@=-3_i|;rae=RSeN4*q>wx)CQeOIg>2oK?7o`b}llz!*z#H6#`kI=sc_^GzC*jcGo zk%&P4u&-$=yI3m{-oZ2TV2@3G?+mRge&&)i=y!Yvm)8j#q=}wp$IO2H~agGaS@XwU>1by*@_rUzd`x&PV&yjLCKeG1{jHYjn+zYB{C_*wzd;n z&^HOgx_Gy?Ge6gHo;|~-#{EtkD|0M`ieTJCy%Odoowkl1G0oi^8CGyu9x~=#1WY@) zM`>XNuLCt(d##)GjZFtwz;1CHhSyykHRHC*wPfZLE#9Th~=9x7PVT z0i4pavFw^q?IQ1}Y5PIhxMIb|fmu0J8?uj-KDxl>w6Wszxq8-tD+l9_%~Rj08-dMD z1%8`sekr5tk7RT$U6sx0xrq&FbBq^-ety}(r_Fy3M}f`xz85e?=I5t{*tf~%ueWlm zpRWOSb-g;9C-xv++MJ=NZ(;j#{haMjp17OOyVkH1&%4UZ>fp zhP`%|eU@&SAm#1`{(wF!DYbFGbq-`0j__pV*|t9VM-v{>NBE^GpCQW5XW4-kLie!a&;BcTkMs+hQ~7;`#}7EwY)#-Jq{et&xdd z92bh(z*r3=W*WUEm96j+t z+R6AO65`*2Bco@%*P6c6?@fk&>`%Kn5=(G(9h*kd({NZ>wyjORG2tO?@+Sf3>sua? zzSn_+gg$*aFW+u`e>~wK`o0ZtzP^3gdvi&LMzyocLveSae1A^QFl;Cy|}%S*@> znQp=L>in6WE1^$c*8Fzs`=*44==*lS`T9b`At`&KZr_7q*;3E0&&JBP8j8_ewzd+gLXE9e%@?KtMUa=g)z!`$C&e!j?Y)us94 zeKa?J&&09IrOB~P?PcVgLP~CW-NrOELlO>-J42@Yw(u7xz&2fH-cN2h6S z{=WYm8Jg?|(=<;aCE-gs$8i+t&c4KzlYLE^=H}Og*j`bt{zYWa?-}@<5#ua>7&uQZRp%Pr z3ts19SFT8wJP?w;^ESXsICyQ?y#2_t|Fv*68mXqt0bI!ISvaoX0DYl_wc-Kq^y51k zGc&aXXY6CylnwY^u`z+XnY?PcGnLWm|5Hz(7z3M)|GY-mGpQ8 zzFcWk;^M!$-T$O}$-`r}y-O9Zi$j8yN$dVbsRUbwvcI%8~*=ERt zv?g#clo|`QVA8}bf9wMRb5_cyj#tcEf=u6|b~LC;N5<@TBTd?4wT8fBmYwo$X ze)6EC)qCI`7+O~^1P#`U)J=4;6;x+V02IBh$JMr-_R4bYVxwF4SIc)zY2zUeOXmRV zCBR|Rq#h{$bv6xl-u-_guKo>pkMgx;_B?I(v%d$w!`hdD_MSUSV+Y2sIkw$>9rJ5{UlHJJerxQyZ;&9 zf$Vf&x)RM-WXGcm)pqOn1p!x03UJ9Y?sxXQeF7i@#gIJsU0?r!%+y{#C?Ag-??*ZJ zKYET2N3j)jyce&f3!BD!Yay<>?>UY5dmQ*Rh=&O*dmQ~j0`FNw{1+XV4aTL%HcDlz zZTI|h#2x?M^GF&NfB$8q(dKGj{UeMtwrF45dnNYG8%M0HBegO3#5SOfe<^`Q=l243 zb>@HYNRl#7$2IL!+(#>#pVE!AEZzi6c01zUp0~e)7X;Z$3-FpiI32-ZeQxLD*n`RZ z+woP8uhcJig-#;3%W%l%neV1#3 zEYC5Ed@)}z`$(fqt8JbvVLE(J_UoFrc!ZyWIDOmh*M*imo7yw_Tw+gj^Abw*KiHE~ zP6nz=m@dm;_Ke>1cDg--;!|w~#izOqYziWGwoRiA#cf)BMfxvp94($<%As!_`wD$w z4x6gQJAKMC5F{-O$yD3YyyI8TM0&noVL!Z#Z^3WWw;m>4gm|B}f;Kb~pJCf@eTK#+ zd<6&VcC$Wn6lGXm$D}-;5udNy2SfZD=l3wK|PrL zsqNm1>##y$4vQI8WQd7L|!_#VPtc=!Lb4~`jVFyA< zqc7!o4dT?Bd`XjO_uDj`CrzMFJB745j@>vGaNzzSweQ?>0kb^nW&A$)f?un3y|B}X zIG`Y%f%yn~{yk15dH@^--G<&aOFrje75fPjIEw_9OMK*$`D~ z*D+kKwv8w)@*pkxpX}j2ppDP~lmnskUvbj-Upn!>vT@QIWgFQAdMcx~5%{H~O*m}? zI^?#IJ1uTe8?o)eSy4CiH*Obepe`Y|UAz@pv=!xd+r>G+3`|GZlh-a-C$B>$$4mD4 z#JwifHqc0%Nn`ButBqQnH&r&ymB(ctBw!Xqd&Ms_<5@$+@!shfrLQ%Gq|viV>z^Uxw2jf zvo3h0Kk!Q4ys~fP6=SQ=cmXa)oiT$CGh2q37GtqZfh42sW|ZfcVFG31e8l!=N3H;- zJm}kwJd7&?aUhF44}1mjlG?v(W_HY{P8DNo)Cy{*iv$GP#=#d$Wbo_D8GI?z_ndFY zsbH#4=X@w#*Yt~Om3+w~sb|$hrmvC*9i<*HH<3Vmrp3?c0%jWY&dv#UE+d_kY<_AF zXyD5nhV^CisNy@o)oJ&e1duB&ceUC;lG2m@)uHcAFcTrI)90^9qUQy?G7s%feYeE= zR2tAreE0oG)4paBMObG{qhIlQ#$I1(uNbE!o&Lvs`UUx5p#}aI#t+Izd~zP2&WW1s zi;T!@zS;?~hc!~E9FAm)uX@OQ#^p~wq)&Mt-1+%WdE77Bra{)7@6oMDlc|y7@B9ex zK7iwc79TYBJ`eE^;rOskgFby@T8Z!1pgFkfgsj8cQHFu?&Rf3$ z?Oth?5*nMLX?&@P*`d3r7S^(D0{v&kx58GnibMqJlC+6OCCzwAqUUcT)sZpl+gaZi zUuPYPe63m(1)*%Q5C4)to*0+XG7-;YXJmTJrcz8J6a01O;~9MQXVy6bd9V+oKi`Jq zT6<;xKpeCS!NGh?*VEVmrv8^8O|E&n_^7j84?gYdA4Ia0ciNY<7351gE(6zToxXL? z8W6#Ued_^@Q}#T+WIE~7cC@X+6Ap}Md_O|}nnS{`G7;~_u^RLtc$TF>Q+;Kvvw|d{ zJAoqN@B1DTyFv4g^Wnhg+U?CH3NblZUoqp#J0m9PJCmj#l>m_V2ulKpeHX(*~%U1oI#C zq{J<5+)ot!5Bm^GC_d}xpW|SiN}C~n`v-^O+>Si*FQWNT)q0pwo1Q<>uM8zpk?&Rdgk(%)HNy_WQ9*M7FYzo zJh|LruE__Y*7dz6Rm4HN|K|58yvE4BZ+^dpOOGK!9k3Q>e1YFapigjxfFGeSfO*l# z;-a3jbEwoh5_~T94HQZJAAmWr_7(hEf`mbJ=-QTbPy1*a(1+`Zvxzov4(JSYRrQ@s zwE@nzSeSg>Ho$cHIOjaPvY+P_`pOj-xo))${2J(3yX^Ykp$)K~a_foxSnS6mY6E;S z5M+hVCfY!aWe_M1ecpPTH@0Tr*YSc-;y6bg{&#N!tozuuc;_%MUx$iqgL#M@3&L8r zzTEatPEFobF$<|C1qcYXzV^NdakN!|C$#UNBTJAbf{}UeV>Thi#d__|$ImZD&ABOT zse(Uo=IjR~s+SlObn?JFLC5UUalqPcFfPdb>91SDD$fIeKaNA;CgKm{D78BszsHYD z06<{A+$*-RxEA&r%Zqq@4x@-J3)u3~CzGC(KV`n#tT&v*fgF2f(sbu5es>M9^8FDM zxdK@F8}dGR%CWS;i_6||&#$j%%C5O(Pt2ONOR1$y*<)|!ElrAVkSfc6b{UA3Df_G^ ze^%3A*S(aPa4hq*dHz4Q?2R8gwgy~BUvJ$lJ2hM2Z{>vf zCRU!zhhOo=0Jtt+!s^pPqk;d;=-Hg)I5chsUTVG@0gcN*@~^f6Ktdq>Be2Kq1a?76 z31Xg@_nVQXeKGa;Il$!4vX>C0-!S|I4yEv4lX!`~X((cP?!=d!c-x70ocIMN-gV-f zuBc3qKfeFD8R@s-VEd+gGKO+~Wd346ib;o0%DTY6kQ9>!*`*z@t%-dX#kwcm^$Xg` z*w*$N!0GQhe54w}lmS&^?K^%YNkwe`9R^hE?0<0zW?9@r?R=cnaLnO-dA-g>b(%(W z1di503B0rpN@W`-9q5byH5M8y4^YZY;Bp9YwE?fRDecFxgIC&<DK|1Bm_q%?JUEBugr5lWBY^jdR_g}5HZ zfj)3-6<5xqNejNW^FCZDr-czS^-CDRU8|9{#lBhel6^SRI&Jv9NT}j3Hrw;g|8Y38p)f0VQpPv5{Y19p&^uKW0 zik|-t<@0^2T9JRO$OVBi_5F_#wy`u*t!n-e$Rq9Jz@1D&*nyDadSN*Yd2lgNQ{1}1TaL+9k8cJL0VwJ^J4I1pTst2cIzSMt6I>OU^4%+;mkX5_W! zqwZ?gL+{!3s>=(Dinky7JZb*-Pd#7n+WG51R)55G@7Guu!P<21|7AdhMG1;-^Suct zA5pgtl>XAC{kX*~(OUM85z5w*?ufluTKRLSYV~vnc2`?<1uX9!3;3mF6y3=JplMlY? z*M@;DXZh|!pZGki9SUDu#vie9=(6u-#Ctd>2ljP{8X~d5mxg-%8DjOO2Kgz&=oPodOz|`}75bH@a9#$J}Kk-cz&xI-}XetGr zNI@r4&`b)NO+nac)n!pmbHwK_Q@PVdV9JX5%Dy(P^cmid>AeJCX%nnR+L(v&(J92P z&PU0Q!TQ3${niUY4BpKXLZh!5eyhaC8CO}ga6p8L^%OHiAz91n#3>|+@pRIj2B zs<0XuCnj#HU!KG_{*vK~n7}YJwXcMX5?Ge;LGysTzH$Qi>W`?q6N9=+OMAn9lK1Z# zD2pvObU%qQ(oRW-wn^-BLdcTdX6>^}O2)Dbv`@^>tml{AKTyc`W*o*=QLQyIeZrR| zd|=52OkCS%+yvsoH)t<&vn$D{F$8Oqy>CXGJQe;q#I3LIaPGUj7a(2h_?#0Do%p;H zuR8IX6R$h*1t-qVN$D>+@rDzBofALr#5p_BvMndhTMtdw{uoK}9*3r1aBz74py`nl zXVca66(_#x#Q&uer{5_4Z#wZ$JMrIg;=k?0f5(Y`#)9U#9!pZU+l#1cjDjg#DBnvzr=~Z z)QP{$iND;5pLXJ}aN@6Y;%A)rtDN|&o%mTN{)0Boc7nE?_s)#;8P7sK+f)ARc~QXUKp+Od(=F&svou!BXyi#6== zD;=U4sLtC&U>V+tT zgcnA66I@>VIooq=AUbocPwlHa;-gcbj`#y6(aMF1nVC3m`T1$SM z$ucN!`u-b!*_I$zgd5&#t|A5D_oZN##k>j6_jFhNNss5UoGS*6`L{w`&XE`hi(lHS z#yRFOZu9q}kKt4}hS_GRGxH}fPx)aBGmU}iYA21C=BwD&qYYmb6u~)+sIfsh)AAMj z(#OQU+5g@Q8KHADrenueF=^l40jc%`9y^ZO&CxAC@g?^4E`PQk;ooUrtaqLNRviA< z=JD^;1jEwGt{KaJq#R3JUNp^C{v#zlmM;tEn6~^6N=FtwkZ;{Vc}qThR`coS3|2PD z4*+ZaG&2$0{58Oue}b6^ZvHx8%|FRZ1Sek{T=P$v>{Nb$G|ivM$v^Gn&*tQ>Ir;jH zaF_oTn@=9X$1dHP)>&U%X|m6ZkZa_=30LF0gAqv|wDzA5St{0d|0TpZcd-2Tb1vt? z@65m-$iNS0V9qPt@?XrrU(3MX$iRP>h7Yj)JM<24ymR4W8JPaW`H$7-z`cln#({q* zlg~Mzi~l2lUHWeY%<)C(eF$;tsPHE;@E>O2$1?E$NW%xmGw{;^JMtd912E@dr3fDl zu#JVh5#sw=^p6Mc@s9k#V@R}e9Xw-U@gJ784N3Fw@veJ+kit*F(%(^zxV&vh`MjTb za4kja*%RvtEVO9Dn3io+`LquH&XuGr^f>%+2NqhaFQL_}VF|~CM6ZLbH6$r~#!JJj zZ|2#2p~ohn^fLVg?0P_w5_)MkkKVdNFVnw(-c7GWw(^I5X*iGGR~&ko{s{EG<6@Aa zmxlA`eYZmoOHdM2zpJ753obp|ArGc^)5q6=&wPZ~hY>&cMx3;q%B}T+Pt8lnmNUM8 z?O&`rWzTqNSZP_>Qs>VDzS6F6z(G*n_ju2J;hF=V@%%eoIFH^O@MC&?Hn{s)Zuv7_ z8qTBli!Qyww&(x;I&f9?GhXGvH3!b4{e0xdvRVh#^7nYxyxc8+CIjcun|JBi0WqQX zo$m~guP|)+UjW9iOApE74@S1tsK0Heefx~#``NPAtz$k#e(jbO-ntZ-GvHE>XX4QD z)~pBSAOeTDptt`#4TPXJ&@r_%-uFtlx+6SP#BkI`a;J1*bx*%PiwQ%4=oZo5PfsQ=G z`7As#HBMp(mY>-9U4TV5d@-lqg?82C&f4M)?HkvDmiQOyWc8FU6n*;uJ!vI&XKhHJ z>F|w~ZrG}mck<+s<$dTHgC{cI2vI+7;oZ2>CJfX|?K1&##s~k1Sq#F%yWx)wWMR=c z=9}EryL{EAZe8pF73G!a^TiZx(ir4NiLUZ$tdw(kI`tOo3R*clzjPHmlcxn;o{aNw z_1u@s^WR(rPkDq^%DFt%hAvO`Pnw?C_TO%vr}Nga%aiRQt0(y9@O<O@H*VF;_4{;v4j)QoR^AP{T;Qg1v zT#w+rh{8?8IX@?iaOe#<(LcpU^*P_yx0mY?v%w24Iq5qOiXlyDy%%wgzY2d6(QjB7 zc0Ket#CcHOQV&}tDNV-BYh9Dbip&2A+zIs%!~YSFCOm3k&?}wcUk~<^>6WMX-y^^= z^2c<=+f^>mjWAwrn(n_+y0F00T9@>}JU^j+Tcz##No9+ELRq%6Kly#F&k_5{ z7nJT(=qJ=|t93cZPpIEkX}f+hwM9R{c(|>8@&{U0pHR20*5x2Sp?+JX z?fS{|7X4&5TZ*kS^G)*<-BJLYsmv;yNFE@UEyGh&B{mo?X2IW)k`S} zH!B}>-#+=O`0KhGZb`oF7)NxxvwNGTCT*Lw-*)u*v3xm=ceC=1Vl87}`!J9H!h?ou z7oa2m0sU##=j>y|VYA-t;g1al)f40TFW%w6MgIXwUtnqJXz9@T#)}8g*=T+sbXPk| z+;aju4cO6np z+sHS(=fhrxG0PS4MY}ol_h(=Df>!~L!SXrGF`IOi?>$~{ec-@n92m*T^Kq+`A!@fa zDFUQyEc&Zjnu-F3#Tjy>nA%r;6pM{G%(0oT!@wMzUiQ z$Z=vdE5?R$piROikmJNzicw&X-S3}B@*zh8BRP@7`aB=Io<;`4M*eY7{F3{5M$_S3 zxnm!rR9On2^96a~O&$pDbF^9i53v`n2SW>4S^}GqlCUo*-WZFlN z|7SS<+~QGp{@>4MxGn#~FGBne9QcQ!(%%3siMR`sK%Vi!lprQvBg&b z+xrKP*v(DOTOI6L%k6CCW%T)W*sb}Ent}MaXT;%8lRTAq zs_-<$(=<;fcsj|`DV}C{n&k;E^6)HWP!)_zsj?I+pYZTq5(JXLs_;%S;E$vw%~ zDV}C{n&k;pd6qJu%D9vQRmM>cpSTK}lipIa5^}KahRch1HYDoRuv4NBU6(v`D&ECL z4Y8%VY$6b0eqO743*42Z2h^~K{Y-21)kYQD;#}_3J#1f$C4aAjt#oQ?scN$U3&*Bf zZNX4oe4Pg7qm^Mba2fhljf=KcrcgvKWmX_;iW|9_my7sX)15-L|3vGZ-7i6kE2%$K~(BGSZamAz&pKFpDugds)oSQSqm@pld6~c^ z7w9fHIn|{}g<9by`>i@uqgGL4dF9ga4xH3T<6%c)BeS=>f@df3?EuGT*qCud=N*?} z`xcW+OBXdGv}bB-T*p-w8ZBW^z{zIvIj_a#MC&vRN!X5$5#O3lY;4~Qw`o#E@yoW6 zCqnz!y3eoSBh%t6=J`n3ecVScV8r8K#BX$=FR_M1ltw}a(QSv=)eDvl`3;8{LEt9# z0W}3&VXT={G}~-sk;XVbY8aa&a{vTRuiI|orpP;H62vVeYW?M6c)pH}vFvDMa$wW$ zDokZj;0=+tumT5Rlbmmak>6Q?Y%3kS9*u|R;IJ6V7SUTLdA0UMi;69BWiR%|GW&+Q z^rN2bDfm@G(-M~O#48&;s!ZM#wk~UwvuzrEh-}<0{asWIdst-l7cpKyJ=>ts`Brh0 zg^$kKrdNkqtN3nZh~WZ_#L(kM;Qhuz)yD{8N}?htdl@y-Y&Ni2nC+%*dSyWR)PVHq zY`PiR@U0gsRt-I``SgqkE>R3LZ0xJ(fw`xulhIySfR~s1lPccwDtip$vT!2xm)M_b zof3F-m8%z4jzd9xACtyJbXMq#7l3oDJTlTlxuZ$`~d%cj@5bDaHnXe5mm zx(D;+OYN4*m?pvH@HR*Ty_mRk-roKq5;yGT=GAD7yvVqU4wT!*YfCr#_xf?Csv`h5 z1vGOL+d0dgyyzwDa*y4l*X&x;(wKnV54xx*Y{IcH45OWy7qYQa zD?OQC;bB?n-SUOeh*HJjW`WG((b5%Jy!O$6lV( zxMj3)NibajT-HrAIhZft>G!7JS*T-%%yHb+v4^`T zv*I^r{AM|wIE9oH+2*w0OiABNN#8t$0-#g|S~-oElD!Gpn-x&6q>&(HvpkFBG}H1) zB&AHzEJN5zO2uY{G*gCdRubvZK{i(-zwF0_60haFRh&yYYA0QX)J%F~8QW9Couo@i z(AgO2`m7GT*Qk}1AV_=h=P&aiaj%tnTMk}HSo$90`a0BN*pw+K=1X*W+Y_MI;P~Sd zU}hb|l)NS71DfY3?c5hwWJ))A*Nk7qbOF<<#1YF#Oijo9@?BWaS_oaFDI_^FGZ8hy z);0bTn=bBK{29#ueA63uFjZjV$8BeL8B+rDXnZQwOZR<|$4yE3S(O!hcoZ`(G+f+J zAQ}Is;0DV)lx}X+oNkB1u(yg@wCY5d{c!4m$#k`8W4Ila*l{BbZeLc>8Tj^z{FCUkq4&!khA+w#pw;{XOv`f^|H9nHE+{q^;3+rJpX8Xy*~V84obr;fYL F{~!G6U#S29 diff --git a/sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dts b/sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dts index ece7c9f..688f6d1 100644 --- a/sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dts +++ b/sdm845Pkg/FdtBlob/sdm845-xiaomi-polaris.dts @@ -33,6 +33,8 @@ #size-cells = <2>; ranges; + bootargs = "efi=novamap pd_ignore_unused video=efifb:off clk_ignore_unused acpi=off"; + // For simplefb hack stdout-path = "display0"; @@ -66,6 +68,7 @@ regulator-max-microvolt = <1800000>; gpio = <&tlmm 23 0>; + regulator-always-on; regulator-boot-on; enable-active-high; }; @@ -320,6 +323,7 @@ regulator-min-microvolt = <2856000>; regulator-max-microvolt = <3008000>; regulator-initial-mode = ; + regulator-always-on; }; vreg_lvs1a_1p8: lvs1 { @@ -364,8 +368,11 @@ }; }; -&apps_smmu { - /* Enable this when upstream smmu driver gets patched */ +&gpi_dma0 { + status = "okay"; +}; + +&gpi_dma1 { status = "okay"; }; @@ -377,6 +384,15 @@ ; }; +// Keep these always on until we get panel driver working +&ibb { + regulator-always-on; +}; + +&lab { + regulator-always-on; +}; + /* NFC */ &i2c3 { status = "okay"; @@ -397,17 +413,24 @@ /* touchscreen */ &i2c14 { + #dma-cells = <3>; status = "okay"; + clock-frequency = <400000>; + + dmas = <&gpi_dma1 0 6 QCOM_GPI_I2C>, + <&gpi_dma1 1 6 QCOM_GPI_I2C>; + dma-names = "tx", "rx"; touchscreen: synaptics-dsi-i2c@20 { compatible = "syna,rmi4-i2c"; reg = <0x20>; #address-cells = <1>; #size-cells = <0>; - interrupts-extended = <&tlmm 125 IRQ_TYPE_EDGE_FALLING>; + interrupts-extended = <&tlmm 125 0x2008>; - pinctrl-names = "default"; + pinctrl-names = "default", "sleep"; pinctrl-0 = <&ts_default_pins>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; vdd-supply = <&vreg_l28a_3p0>; vio-supply = <&vreg_tp_vddio>; @@ -485,13 +508,39 @@ pins = "gpio99", "gpio125"; drive-strength = <16>; bias-pull-up; + input-enable; + }; + }; + + ts_reset_suspend: ts_reset_suspend { + mux { + pins = "gpio99"; + function = "gpio"; + }; + + config { + pins = "gpio99"; + bias-disable; + drive-strength = <0x2>; + }; + }; + + ts_int_suspend: ts_int_suspend { + mux { + pins = "gpio125"; + function = "gpio"; + }; + + config { + pins = "gpio125"; + bias-disable; + drive-strength = <0x2>; }; }; - }; &uart6 { - status = "okay"; + status = "disabled"; bluetooth { compatible = "qcom,wcn3990-bt"; @@ -556,8 +605,12 @@ vdda-pll-supply = <&vdda_ufs1_1p2>; }; +&venus { + status = "disabled"; +}; + &wifi { - status = "okay"; + status = "disabled"; vdd-0.8-cx-mx-supply = <&vreg_l5a_0p8>; vdd-1.8-xo-supply = <&vreg_l7a_1p8>; @@ -676,7 +729,5 @@ pmsg-size = <0x200000>; ecc-size = <0x0>; }; - - }; }; diff --git a/sdm845Pkg/FdtBlob/sdm845.dtsi b/sdm845Pkg/FdtBlob/sdm845.dtsi index b69be74..5c92c01 100644 --- a/sdm845Pkg/FdtBlob/sdm845.dtsi +++ b/sdm845Pkg/FdtBlob/sdm845.dtsi @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include #include #include @@ -114,7 +116,7 @@ no-map; qcom,client-id = <1>; - //qcom,vmid = <15>; + qcom,vmid = <15>; }; qseecom_mem: memory@8ab00000 { @@ -198,6 +200,9 @@ capacity-dmips-mhz = <607>; dynamic-power-coefficient = <100>; qcom,freq-domain = <&cpufreq_hw 0>; + operating-points-v2 = <&cpu0_opp_table>; + interconnects = <&gladiator_noc MASTER_APPSS_PROC 3 &mem_noc SLAVE_EBI1 3>, + <&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>; #cooling-cells = <2>; next-level-cache = <&L2_0>; L2_0: l2-cache { @@ -220,6 +225,9 @@ capacity-dmips-mhz = <607>; dynamic-power-coefficient = <100>; qcom,freq-domain = <&cpufreq_hw 0>; + operating-points-v2 = <&cpu0_opp_table>; + interconnects = <&gladiator_noc MASTER_APPSS_PROC 3 &mem_noc SLAVE_EBI1 3>, + <&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>; #cooling-cells = <2>; next-level-cache = <&L2_100>; L2_100: l2-cache { @@ -239,6 +247,9 @@ capacity-dmips-mhz = <607>; dynamic-power-coefficient = <100>; qcom,freq-domain = <&cpufreq_hw 0>; + operating-points-v2 = <&cpu0_opp_table>; + interconnects = <&gladiator_noc MASTER_APPSS_PROC 3 &mem_noc SLAVE_EBI1 3>, + <&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>; #cooling-cells = <2>; next-level-cache = <&L2_200>; L2_200: l2-cache { @@ -258,6 +269,9 @@ capacity-dmips-mhz = <607>; dynamic-power-coefficient = <100>; qcom,freq-domain = <&cpufreq_hw 0>; + operating-points-v2 = <&cpu0_opp_table>; + interconnects = <&gladiator_noc MASTER_APPSS_PROC 3 &mem_noc SLAVE_EBI1 3>, + <&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>; #cooling-cells = <2>; next-level-cache = <&L2_300>; L2_300: l2-cache { @@ -277,6 +291,9 @@ &CLUSTER_SLEEP_0>; dynamic-power-coefficient = <396>; qcom,freq-domain = <&cpufreq_hw 1>; + operating-points-v2 = <&cpu4_opp_table>; + interconnects = <&gladiator_noc MASTER_APPSS_PROC 3 &mem_noc SLAVE_EBI1 3>, + <&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>; #cooling-cells = <2>; next-level-cache = <&L2_400>; L2_400: l2-cache { @@ -296,6 +313,9 @@ &CLUSTER_SLEEP_0>; dynamic-power-coefficient = <396>; qcom,freq-domain = <&cpufreq_hw 1>; + operating-points-v2 = <&cpu4_opp_table>; + interconnects = <&gladiator_noc MASTER_APPSS_PROC 3 &mem_noc SLAVE_EBI1 3>, + <&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>; #cooling-cells = <2>; next-level-cache = <&L2_500>; L2_500: l2-cache { @@ -315,6 +335,9 @@ &CLUSTER_SLEEP_0>; dynamic-power-coefficient = <396>; qcom,freq-domain = <&cpufreq_hw 1>; + operating-points-v2 = <&cpu4_opp_table>; + interconnects = <&gladiator_noc MASTER_APPSS_PROC 3 &mem_noc SLAVE_EBI1 3>, + <&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>; #cooling-cells = <2>; next-level-cache = <&L2_600>; L2_600: l2-cache { @@ -334,6 +357,9 @@ &CLUSTER_SLEEP_0>; dynamic-power-coefficient = <396>; qcom,freq-domain = <&cpufreq_hw 1>; + operating-points-v2 = <&cpu4_opp_table>; + interconnects = <&gladiator_noc MASTER_APPSS_PROC 3 &mem_noc SLAVE_EBI1 3>, + <&osm_l3 MASTER_OSM_L3_APPS &osm_l3 SLAVE_OSM_L3>; #cooling-cells = <2>; next-level-cache = <&L2_700>; L2_700: l2-cache { @@ -433,6 +459,266 @@ }; }; + cpu0_opp_table: cpu0_opp_table { + compatible = "operating-points-v2"; + opp-shared; + + cpu0_opp1: opp-300000000 { + opp-hz = /bits/ 64 <300000000>; + opp-peak-kBps = <800000 4800000>; + }; + + cpu0_opp2: opp-403200000 { + opp-hz = /bits/ 64 <403200000>; + opp-peak-kBps = <800000 4800000>; + }; + + cpu0_opp3: opp-480000000 { + opp-hz = /bits/ 64 <480000000>; + opp-peak-kBps = <800000 6451200>; + }; + + cpu0_opp4: opp-576000000 { + opp-hz = /bits/ 64 <576000000>; + opp-peak-kBps = <800000 6451200>; + }; + + cpu0_opp5: opp-652800000 { + opp-hz = /bits/ 64 <652800000>; + opp-peak-kBps = <800000 7680000>; + }; + + cpu0_opp6: opp-748800000 { + opp-hz = /bits/ 64 <748800000>; + opp-peak-kBps = <1804000 9216000>; + }; + + cpu0_opp7: opp-825600000 { + opp-hz = /bits/ 64 <825600000>; + opp-peak-kBps = <1804000 9216000>; + }; + + cpu0_opp8: opp-902400000 { + opp-hz = /bits/ 64 <902400000>; + opp-peak-kBps = <1804000 10444800>; + }; + + cpu0_opp9: opp-979200000 { + opp-hz = /bits/ 64 <979200000>; + opp-peak-kBps = <1804000 11980800>; + }; + + cpu0_opp10: opp-1056000000 { + opp-hz = /bits/ 64 <1056000000>; + opp-peak-kBps = <1804000 11980800>; + }; + + cpu0_opp11: opp-1132800000 { + opp-hz = /bits/ 64 <1132800000>; + opp-peak-kBps = <2188000 13516800>; + }; + + cpu0_opp12: opp-1228800000 { + opp-hz = /bits/ 64 <1228800000>; + opp-peak-kBps = <2188000 15052800>; + }; + + cpu0_opp13: opp-1324800000 { + opp-hz = /bits/ 64 <1324800000>; + opp-peak-kBps = <2188000 16588800>; + }; + + cpu0_opp14: opp-1420800000 { + opp-hz = /bits/ 64 <1420800000>; + opp-peak-kBps = <3072000 18124800>; + }; + + cpu0_opp15: opp-1516800000 { + opp-hz = /bits/ 64 <1516800000>; + opp-peak-kBps = <3072000 19353600>; + }; + + cpu0_opp16: opp-1612800000 { + opp-hz = /bits/ 64 <1612800000>; + opp-peak-kBps = <4068000 19353600>; + }; + + cpu0_opp17: opp-1689600000 { + opp-hz = /bits/ 64 <1689600000>; + opp-peak-kBps = <4068000 20889600>; + }; + + cpu0_opp18: opp-1766400000 { + opp-hz = /bits/ 64 <1766400000>; + opp-peak-kBps = <4068000 22425600>; + }; + }; + + cpu4_opp_table: cpu4_opp_table { + compatible = "operating-points-v2"; + opp-shared; + + cpu4_opp1: opp-300000000 { + opp-hz = /bits/ 64 <300000000>; + opp-peak-kBps = <800000 4800000>; + }; + + cpu4_opp2: opp-403200000 { + opp-hz = /bits/ 64 <403200000>; + opp-peak-kBps = <800000 4800000>; + }; + + cpu4_opp3: opp-480000000 { + opp-hz = /bits/ 64 <480000000>; + opp-peak-kBps = <1804000 4800000>; + }; + + cpu4_opp4: opp-576000000 { + opp-hz = /bits/ 64 <576000000>; + opp-peak-kBps = <1804000 4800000>; + }; + + cpu4_opp5: opp-652800000 { + opp-hz = /bits/ 64 <652800000>; + opp-peak-kBps = <1804000 4800000>; + }; + + cpu4_opp6: opp-748800000 { + opp-hz = /bits/ 64 <748800000>; + opp-peak-kBps = <1804000 4800000>; + }; + + cpu4_opp7: opp-825600000 { + opp-hz = /bits/ 64 <825600000>; + opp-peak-kBps = <2188000 9216000>; + }; + + cpu4_opp8: opp-902400000 { + opp-hz = /bits/ 64 <902400000>; + opp-peak-kBps = <2188000 9216000>; + }; + + cpu4_opp9: opp-979200000 { + opp-hz = /bits/ 64 <979200000>; + opp-peak-kBps = <2188000 9216000>; + }; + + cpu4_opp10: opp-1056000000 { + opp-hz = /bits/ 64 <1056000000>; + opp-peak-kBps = <3072000 9216000>; + }; + + cpu4_opp11: opp-1132800000 { + opp-hz = /bits/ 64 <1132800000>; + opp-peak-kBps = <3072000 11980800>; + }; + + cpu4_opp12: opp-1209600000 { + opp-hz = /bits/ 64 <1209600000>; + opp-peak-kBps = <4068000 11980800>; + }; + + cpu4_opp13: opp-1286400000 { + opp-hz = /bits/ 64 <1286400000>; + opp-peak-kBps = <4068000 11980800>; + }; + + cpu4_opp14: opp-1363200000 { + opp-hz = /bits/ 64 <1363200000>; + opp-peak-kBps = <4068000 15052800>; + }; + + cpu4_opp15: opp-1459200000 { + opp-hz = /bits/ 64 <1459200000>; + opp-peak-kBps = <4068000 15052800>; + }; + + cpu4_opp16: opp-1536000000 { + opp-hz = /bits/ 64 <1536000000>; + opp-peak-kBps = <5412000 15052800>; + }; + + cpu4_opp17: opp-1612800000 { + opp-hz = /bits/ 64 <1612800000>; + opp-peak-kBps = <5412000 15052800>; + }; + + cpu4_opp18: opp-1689600000 { + opp-hz = /bits/ 64 <1689600000>; + opp-peak-kBps = <5412000 19353600>; + }; + + cpu4_opp19: opp-1766400000 { + opp-hz = /bits/ 64 <1766400000>; + opp-peak-kBps = <6220000 19353600>; + }; + + cpu4_opp20: opp-1843200000 { + opp-hz = /bits/ 64 <1843200000>; + opp-peak-kBps = <6220000 19353600>; + }; + + cpu4_opp21: opp-1920000000 { + opp-hz = /bits/ 64 <1920000000>; + opp-peak-kBps = <7216000 19353600>; + }; + + cpu4_opp22: opp-1996800000 { + opp-hz = /bits/ 64 <1996800000>; + opp-peak-kBps = <7216000 20889600>; + }; + + cpu4_opp23: opp-2092800000 { + opp-hz = /bits/ 64 <2092800000>; + opp-peak-kBps = <7216000 20889600>; + }; + + cpu4_opp24: opp-2169600000 { + opp-hz = /bits/ 64 <2169600000>; + opp-peak-kBps = <7216000 20889600>; + }; + + cpu4_opp25: opp-2246400000 { + opp-hz = /bits/ 64 <2246400000>; + opp-peak-kBps = <7216000 20889600>; + }; + + cpu4_opp26: opp-2323200000 { + opp-hz = /bits/ 64 <2323200000>; + opp-peak-kBps = <7216000 20889600>; + }; + + cpu4_opp27: opp-2400000000 { + opp-hz = /bits/ 64 <2400000000>; + opp-peak-kBps = <7216000 22425600>; + }; + + cpu4_opp28: opp-2476800000 { + opp-hz = /bits/ 64 <2476800000>; + opp-peak-kBps = <7216000 22425600>; + }; + + cpu4_opp29: opp-2553600000 { + opp-hz = /bits/ 64 <2553600000>; + opp-peak-kBps = <7216000 22425600>; + }; + + cpu4_opp30: opp-2649600000 { + opp-hz = /bits/ 64 <2649600000>; + opp-peak-kBps = <7216000 22425600>; + }; + + cpu4_opp31: opp-2745600000 { + opp-hz = /bits/ 64 <2745600000>; + opp-peak-kBps = <7216000 25497600>; + }; + + cpu4_opp32: opp-2803200000 { + opp-hz = /bits/ 64 <2803200000>; + opp-peak-kBps = <7216000 25497600>; + }; + }; + pmu { compatible = "arm,armv8-pmuv3"; interrupts = ; @@ -805,15 +1091,65 @@ clock-names = "core"; }; + qup_opp_table: qup-opp-table { + compatible = "operating-points-v2"; + + opp-50000000 { + opp-hz = /bits/ 64 <50000000>; + required-opps = <&rpmhpd_opp_min_svs>; + }; + + opp-75000000 { + opp-hz = /bits/ 64 <75000000>; + required-opps = <&rpmhpd_opp_low_svs>; + }; + + opp-100000000 { + opp-hz = /bits/ 64 <100000000>; + required-opps = <&rpmhpd_opp_svs>; + }; + + opp-128000000 { + opp-hz = /bits/ 64 <128000000>; + required-opps = <&rpmhpd_opp_nom>; + }; + }; + + gpi_dma0: dma-controller@800000 { + #dma-cells = <3>; + compatible = "qcom,sdm845-gpi-dma"; + reg = <0 0x00800000 0 0x60000>; + interrupts = , + , + , + , + , + , + , + , + , + , + , + , + ; + dma-channels = <13>; + dma-channel-mask = <0xfa>; + iommus = <&apps_smmu 0x0016 0x0>; + status = "disabled"; + }; + qupv3_id_0: geniqup@8c0000 { compatible = "qcom,geni-se-qup"; reg = <0 0x008c0000 0 0x6000>; clock-names = "m-ahb", "s-ahb"; clocks = <&gcc GCC_QUPV3_WRAP_0_M_AHB_CLK>, <&gcc GCC_QUPV3_WRAP_0_S_AHB_CLK>; + iommus = <&apps_smmu 0x3 0x0>; #address-cells = <2>; #size-cells = <2>; ranges; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core"; status = "disabled"; i2c0: i2c@880000 { @@ -826,6 +1162,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>, + <&aggre1_noc MASTER_QUP_1 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -839,6 +1181,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; + dmas = <&gpi_dma0 0 0 QCOM_GPI_SPI>, + <&gpi_dma0 1 0 QCOM_GPI_SPI>; + dma-names = "tx", "rx"; status = "disabled"; }; @@ -850,6 +1198,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart0_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -863,6 +1216,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>, + <&aggre1_noc MASTER_QUP_1 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -876,6 +1235,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -887,6 +1249,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart1_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -900,6 +1267,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>, + <&aggre1_noc MASTER_QUP_1 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -913,6 +1286,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -924,6 +1300,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart2_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -937,6 +1318,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>, + <&aggre1_noc MASTER_QUP_1 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -950,6 +1337,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -961,6 +1351,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart3_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -974,6 +1369,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>, + <&aggre1_noc MASTER_QUP_1 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -987,6 +1388,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -998,6 +1402,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart4_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1011,6 +1420,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>, + <&aggre1_noc MASTER_QUP_1 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -1024,6 +1439,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1035,6 +1453,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart5_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1048,6 +1471,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>, + <&aggre1_noc MASTER_QUP_1 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -1061,6 +1490,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1072,6 +1504,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart6_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1085,6 +1522,8 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; status = "disabled"; }; @@ -1098,6 +1537,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1109,19 +1551,50 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart7_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre1_noc MASTER_QUP_1 0 &config_noc SLAVE_BLSP_1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_1 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; }; + gpi_dma1: dma-controller@0xa00000 { + #dma-cells = <3>; + compatible = "qcom,sdm845-gpi-dma"; + reg = <0 0x00a00000 0 0x60000>; + interrupts = , + , + , + , + , + , + , + , + , + , + , + , + ; + dma-channels = <13>; + dma-channel-mask = <0xfa>; + iommus = <&apps_smmu 0x06d6 0x0>; + status = "disabled"; + }; + qupv3_id_1: geniqup@ac0000 { compatible = "qcom,geni-se-qup"; reg = <0 0x00ac0000 0 0x6000>; clock-names = "m-ahb", "s-ahb"; clocks = <&gcc GCC_QUPV3_WRAP_1_M_AHB_CLK>, <&gcc GCC_QUPV3_WRAP_1_S_AHB_CLK>; + iommus = <&apps_smmu 0x6c3 0x0>; #address-cells = <2>; #size-cells = <2>; ranges; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core"; status = "disabled"; i2c8: i2c@a80000 { @@ -1134,6 +1607,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>, + <&aggre2_noc MASTER_QUP_2 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -1147,6 +1626,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1158,6 +1640,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart8_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1171,6 +1658,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>, + <&aggre2_noc MASTER_QUP_2 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -1184,6 +1677,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1195,6 +1691,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart9_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1208,6 +1709,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>, + <&aggre2_noc MASTER_QUP_2 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -1221,6 +1728,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1232,6 +1742,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart10_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1245,6 +1760,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>, + <&aggre2_noc MASTER_QUP_2 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -1258,6 +1779,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1269,6 +1793,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart11_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1282,6 +1811,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>, + <&aggre2_noc MASTER_QUP_2 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -1295,6 +1830,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1306,6 +1844,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart12_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1319,6 +1862,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>, + <&aggre2_noc MASTER_QUP_2 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -1332,6 +1881,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1343,6 +1895,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart13_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1356,6 +1913,12 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>, + <&aggre2_noc MASTER_QUP_2 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; status = "disabled"; }; @@ -1369,6 +1932,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1380,6 +1946,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart14_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1393,7 +1964,13 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; status = "disabled"; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>, + <&aggre2_noc MASTER_QUP_2 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "qup-core", "qup-config", "qup-memory"; }; spi15: spi@a9c000 { @@ -1406,6 +1983,9 @@ interrupts = ; #address-cells = <1>; #size-cells = <0>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; @@ -1417,6 +1997,11 @@ pinctrl-names = "default"; pinctrl-0 = <&qup_uart15_default>; interrupts = ; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qup_opp_table>; + interconnects = <&aggre2_noc MASTER_QUP_2 0 &config_noc SLAVE_BLSP_2 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_BLSP_2 0>; + interconnect-names = "qup-core", "qup-config"; status = "disabled"; }; }; @@ -1643,56 +2228,58 @@ mem_noc: interconnect@1380000 { compatible = "qcom,sdm845-mem-noc"; reg = <0 0x01380000 0 0x27200>; - #interconnect-cells = <1>; + #interconnect-cells = <2>; qcom,bcm-voters = <&apps_bcm_voter>; }; dc_noc: interconnect@14e0000 { compatible = "qcom,sdm845-dc-noc"; reg = <0 0x014e0000 0 0x400>; - #interconnect-cells = <1>; + #interconnect-cells = <2>; qcom,bcm-voters = <&apps_bcm_voter>; }; config_noc: interconnect@1500000 { compatible = "qcom,sdm845-config-noc"; reg = <0 0x01500000 0 0x5080>; - #interconnect-cells = <1>; + #interconnect-cells = <2>; qcom,bcm-voters = <&apps_bcm_voter>; }; system_noc: interconnect@1620000 { compatible = "qcom,sdm845-system-noc"; reg = <0 0x01620000 0 0x18080>; - #interconnect-cells = <1>; + #interconnect-cells = <2>; qcom,bcm-voters = <&apps_bcm_voter>; }; aggre1_noc: interconnect@16e0000 { compatible = "qcom,sdm845-aggre1-noc"; reg = <0 0x016e0000 0 0x15080>; - #interconnect-cells = <1>; + #interconnect-cells = <2>; qcom,bcm-voters = <&apps_bcm_voter>; }; aggre2_noc: interconnect@1700000 { compatible = "qcom,sdm845-aggre2-noc"; reg = <0 0x01700000 0 0x1f300>; - #interconnect-cells = <1>; + #interconnect-cells = <2>; qcom,bcm-voters = <&apps_bcm_voter>; }; mmss_noc: interconnect@1740000 { compatible = "qcom,sdm845-mmss-noc"; reg = <0 0x01740000 0 0x1c100>; - #interconnect-cells = <1>; + #interconnect-cells = <2>; qcom,bcm-voters = <&apps_bcm_voter>; }; ufs_mem_hc: ufshc@1d84000 { compatible = "qcom,sdm845-ufshc", "qcom,ufshc", "jedec,ufs-2.0"; - reg = <0 0x01d84000 0 0x2500>; + reg = <0 0x01d84000 0 0x2500>, + <0 0x01d90000 0 0x8000>; + reg-names = "std", "ice"; interrupts = ; phys = <&ufs_mem_phy_lanes>; phy-names = "ufsphy"; @@ -1712,7 +2299,8 @@ "ref_clk", "tx_lane0_sync_clk", "rx_lane0_sync_clk", - "rx_lane1_sync_clk"; + "rx_lane1_sync_clk", + "ice_core_clk"; clocks = <&gcc GCC_UFS_PHY_AXI_CLK>, <&gcc GCC_AGGRE_UFS_PHY_AXI_CLK>, @@ -1721,7 +2309,8 @@ <&rpmhcc RPMH_CXO_CLK>, <&gcc GCC_UFS_PHY_TX_SYMBOL_0_CLK>, <&gcc GCC_UFS_PHY_RX_SYMBOL_0_CLK>, - <&gcc GCC_UFS_PHY_RX_SYMBOL_1_CLK>; + <&gcc GCC_UFS_PHY_RX_SYMBOL_1_CLK>, + <&gcc GCC_UFS_PHY_ICE_CORE_CLK>; freq-table-hz = <50000000 200000000>, <0 0>, @@ -1730,7 +2319,8 @@ <0 0>, <0 0>, <0 0>, - <0 0>; + <0 0>, + <0 300000000>; status = "disabled"; }; @@ -1760,21 +2350,50 @@ }; }; + cryptobam: dma@1dc4000 { + compatible = "qcom,bam-v1.7.0"; + reg = <0 0x01dc4000 0 0x24000>; + interrupts = ; + clocks = <&rpmhcc 15>; + clock-names = "bam_clk"; + #dma-cells = <1>; + qcom,ee = <0>; + qcom,controlled-remotely = <1>; + iommus = <&apps_smmu 0x704 0x1>, + <&apps_smmu 0x706 0x1>, + <&apps_smmu 0x714 0x1>, + <&apps_smmu 0x716 0x1>; + }; + + crypto: crypto@1dfa000 { + compatible = "qcom,crypto-v5.4"; + reg = <0 0x01dfa000 0 0x6000>; + clocks = <&gcc GCC_CE1_AHB_CLK>, + <&gcc GCC_CE1_AHB_CLK>, + <&rpmhcc 15>; + clock-names = "iface", "bus", "core"; + dmas = <&cryptobam 6>, <&cryptobam 7>; + dma-names = "rx", "tx"; + iommus = <&apps_smmu 0x704 0x1>, + <&apps_smmu 0x706 0x1>, + <&apps_smmu 0x714 0x1>, + <&apps_smmu 0x716 0x1>; + }; + ipa: ipa@1e40000 { compatible = "qcom,sdm845-ipa"; - iommus = <&apps_smmu 0x720 0x3>; + iommus = <&apps_smmu 0x720 0x0>, + <&apps_smmu 0x722 0x0>; reg = <0 0x1e40000 0 0x7000>, <0 0x1e47000 0 0x2000>, <0 0x1e04000 0 0x2c000>; reg-names = "ipa-reg", "ipa-shared", "gsi"; - - memory-region = <&ipa_fw_mem>; - interrupts-extended = <&intc 0 311 IRQ_TYPE_EDGE_RISING>, - <&intc 0 432 IRQ_TYPE_LEVEL_HIGH>, + interrupts-extended = <&intc GIC_SPI 311 IRQ_TYPE_EDGE_RISING>, + <&intc GIC_SPI 432 IRQ_TYPE_LEVEL_HIGH>, <&ipa_smp2p_in 0 IRQ_TYPE_EDGE_RISING>, <&ipa_smp2p_in 1 IRQ_TYPE_EDGE_RISING>; interrupt-names = "ipa", @@ -1785,9 +2404,9 @@ clocks = <&rpmhcc RPMH_IPA_CLK>; clock-names = "core"; - interconnects = <&aggre2_noc MASTER_IPA &mem_noc SLAVE_EBI1>, - <&aggre2_noc MASTER_IPA &system_noc SLAVE_IMEM>, - <&gladiator_noc MASTER_APPSS_PROC &config_noc SLAVE_IPA_CFG>; + interconnects = <&aggre2_noc MASTER_IPA 0 &mem_noc SLAVE_EBI1 0>, + <&aggre2_noc MASTER_IPA 0 &system_noc SLAVE_IMEM 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_IPA_CFG 0>; interconnect-names = "memory", "imem", "config"; @@ -1797,8 +2416,6 @@ qcom,smem-state-names = "ipa-clock-enabled-valid", "ipa-clock-enabled"; - modem-remoteproc = <&mss_pil>; - status = "disabled"; }; @@ -2007,6 +2624,13 @@ "gpio2", "gpio3"; function = "qup0"; }; + + config { + pins = "gpio0", "gpio1", + "gpio2", "gpio3"; + drive-strength = <6>; + bias-disable; + }; }; qup_spi1_default: qup-spi1-default { @@ -2697,6 +3321,7 @@ clocks = <&aoss_qmp>; clock-names = "apb_pclk"; + arm,coresight-loses-context-with-cpu; out-ports { port { @@ -2716,6 +3341,7 @@ clocks = <&aoss_qmp>; clock-names = "apb_pclk"; + arm,coresight-loses-context-with-cpu; out-ports { port { @@ -2735,6 +3361,7 @@ clocks = <&aoss_qmp>; clock-names = "apb_pclk"; + arm,coresight-loses-context-with-cpu; out-ports { port { @@ -2754,6 +3381,7 @@ clocks = <&aoss_qmp>; clock-names = "apb_pclk"; + arm,coresight-loses-context-with-cpu; out-ports { port { @@ -2773,6 +3401,7 @@ clocks = <&aoss_qmp>; clock-names = "apb_pclk"; + arm,coresight-loses-context-with-cpu; out-ports { port { @@ -2792,6 +3421,7 @@ clocks = <&aoss_qmp>; clock-names = "apb_pclk"; + arm,coresight-loses-context-with-cpu; out-ports { port { @@ -2811,6 +3441,7 @@ clocks = <&aoss_qmp>; clock-names = "apb_pclk"; + arm,coresight-loses-context-with-cpu; out-ports { port { @@ -2830,6 +3461,7 @@ clocks = <&aoss_qmp>; clock-names = "apb_pclk"; + arm,coresight-loses-context-with-cpu; out-ports { port { @@ -2965,8 +3597,58 @@ <&gcc GCC_SDCC2_APPS_CLK>; clock-names = "iface", "core"; iommus = <&apps_smmu 0xa0 0xf>; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&sdhc2_opp_table>; status = "disabled"; + + sdhc2_opp_table: sdhc2-opp-table { + compatible = "operating-points-v2"; + + opp-9600000 { + opp-hz = /bits/ 64 <9600000>; + required-opps = <&rpmhpd_opp_min_svs>; + }; + + opp-19200000 { + opp-hz = /bits/ 64 <19200000>; + required-opps = <&rpmhpd_opp_low_svs>; + }; + + opp-100000000 { + opp-hz = /bits/ 64 <100000000>; + required-opps = <&rpmhpd_opp_svs>; + }; + + opp-201500000 { + opp-hz = /bits/ 64 <201500000>; + required-opps = <&rpmhpd_opp_svs_l1>; + }; + }; + }; + + qspi_opp_table: qspi-opp-table { + compatible = "operating-points-v2"; + + opp-19200000 { + opp-hz = /bits/ 64 <19200000>; + required-opps = <&rpmhpd_opp_min_svs>; + }; + + opp-100000000 { + opp-hz = /bits/ 64 <100000000>; + required-opps = <&rpmhpd_opp_low_svs>; + }; + + opp-150000000 { + opp-hz = /bits/ 64 <150000000>; + required-opps = <&rpmhpd_opp_svs>; + }; + + opp-300000000 { + opp-hz = /bits/ 64 <300000000>; + required-opps = <&rpmhpd_opp_nom>; + }; }; qspi: spi@88df000 { @@ -2978,6 +3660,8 @@ clocks = <&gcc GCC_QSPI_CNOC_PERIPH_AHB_CLK>, <&gcc GCC_QSPI_CORE_CLK>; clock-names = "iface", "core"; + power-domains = <&rpmhpd SDM845_CX>; + operating-points-v2 = <&qspi_opp_table>; status = "disabled"; }; @@ -3190,8 +3874,8 @@ resets = <&gcc GCC_USB30_PRIM_BCR>; - interconnects = <&aggre2_noc MASTER_USB3_0 &mem_noc SLAVE_EBI1>, - <&gladiator_noc MASTER_APPSS_PROC &config_noc SLAVE_USB3_0>; + interconnects = <&aggre2_noc MASTER_USB3_0 0 &mem_noc SLAVE_EBI1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3_0 0>; interconnect-names = "usb-ddr", "apps-usb"; usb_1_dwc3: dwc3@a600000 { @@ -3238,8 +3922,8 @@ resets = <&gcc GCC_USB30_SEC_BCR>; - interconnects = <&aggre2_noc MASTER_USB3_1 &mem_noc SLAVE_EBI1>, - <&gladiator_noc MASTER_APPSS_PROC &config_noc SLAVE_USB3_1>; + interconnects = <&aggre2_noc MASTER_USB3_1 0 &mem_noc SLAVE_EBI1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3_1 0>; interconnect-names = "usb-ddr", "apps-usb"; usb_2_dwc3: dwc3@a800000 { @@ -3260,8 +3944,10 @@ interrupts = ; power-domains = <&videocc VENUS_GDSC>, <&videocc VCODEC0_GDSC>, - <&videocc VCODEC1_GDSC>; - power-domain-names = "venus", "vcodec0", "vcodec1"; + <&videocc VCODEC1_GDSC>, + <&rpmhpd SDM845_CX>; + power-domain-names = "venus", "vcodec0", "vcodec1", "cx"; + operating-points-v2 = <&venus_opp_table>; clocks = <&videocc VIDEO_CC_VENUS_CTL_CORE_CLK>, <&videocc VIDEO_CC_VENUS_AHB_CLK>, <&videocc VIDEO_CC_VENUS_CTL_AXI_CLK>, @@ -3275,6 +3961,9 @@ iommus = <&apps_smmu 0x10a0 0x8>, <&apps_smmu 0x10b0 0x0>; memory-region = <&venus_mem>; + interconnects = <&mmss_noc MASTER_VIDEO_P0 0 &mem_noc SLAVE_EBI1 0>, + <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_VENUS_CFG 0>; + interconnect-names = "video-mem", "cpu-cfg"; video-core0 { compatible = "venus-decoder"; @@ -3283,6 +3972,40 @@ video-core1 { compatible = "venus-encoder"; }; + + venus_opp_table: venus-opp-table { + compatible = "operating-points-v2"; + + opp-100000000 { + opp-hz = /bits/ 64 <100000000>; + required-opps = <&rpmhpd_opp_min_svs>; + }; + + opp-200000000 { + opp-hz = /bits/ 64 <200000000>; + required-opps = <&rpmhpd_opp_low_svs>; + }; + + opp-320000000 { + opp-hz = /bits/ 64 <320000000>; + required-opps = <&rpmhpd_opp_svs>; + }; + + opp-380000000 { + opp-hz = /bits/ 64 <380000000>; + required-opps = <&rpmhpd_opp_svs_l1>; + }; + + opp-444000000 { + opp-hz = /bits/ 64 <444000000>; + required-opps = <&rpmhpd_opp_nom>; + }; + + opp-533000097 { + opp-hz = /bits/ 64 <533000097>; + required-opps = <&rpmhpd_opp_turbo>; + }; + }; }; videocc: clock-controller@ab00000 { @@ -3350,6 +4073,35 @@ #power-domain-cells = <1>; }; + dsi_opp_table: dsi-opp-table { + compatible = "operating-points-v2"; + + opp-19200000 { + opp-hz = /bits/ 64 <19200000>; + required-opps = <&rpmhpd_opp_min_svs>; + }; + + opp-180000000 { + opp-hz = /bits/ 64 <180000000>; + required-opps = <&rpmhpd_opp_low_svs>; + }; + + opp-275000000 { + opp-hz = /bits/ 64 <275000000>; + required-opps = <&rpmhpd_opp_svs>; + }; + + opp-328580000 { + opp-hz = /bits/ 64 <328580000>; + required-opps = <&rpmhpd_opp_svs_l1>; + }; + + opp-358000000 { + opp-hz = /bits/ 64 <358000000>; + required-opps = <&rpmhpd_opp_nom>; + }; + }; + mdss: mdss@ae00000 { compatible = "qcom,sdm845-mdss"; reg = <0 0x0ae00000 0 0x1000>; @@ -3369,6 +4121,10 @@ interrupt-controller; #interrupt-cells = <1>; + interconnects = <&mmss_noc MASTER_MDP0 0 &mem_noc SLAVE_EBI1 0>, + <&mmss_noc MASTER_MDP1 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "mdp0-mem", "mdp1-mem"; + iommus = <&apps_smmu 0x880 0x8>, <&apps_smmu 0xc80 0x8>; @@ -3394,6 +4150,8 @@ <&dispcc DISP_CC_MDSS_VSYNC_CLK>; assigned-clock-rates = <300000000>, <19200000>; + operating-points-v2 = <&mdp_opp_table>; + power-domains = <&rpmhpd SDM845_CX>; interrupt-parent = <&mdss>; interrupts = <0 IRQ_TYPE_LEVEL_HIGH>; @@ -3418,6 +4176,30 @@ }; }; }; + + mdp_opp_table: mdp-opp-table { + compatible = "operating-points-v2"; + + opp-19200000 { + opp-hz = /bits/ 64 <19200000>; + required-opps = <&rpmhpd_opp_min_svs>; + }; + + opp-171428571 { + opp-hz = /bits/ 64 <171428571>; + required-opps = <&rpmhpd_opp_low_svs>; + }; + + opp-344000000 { + opp-hz = /bits/ 64 <344000000>; + required-opps = <&rpmhpd_opp_svs_l1>; + }; + + opp-430000000 { + opp-hz = /bits/ 64 <430000000>; + required-opps = <&rpmhpd_opp_nom>; + }; + }; }; dsi0: dsi@ae94000 { @@ -3440,6 +4222,8 @@ "core", "iface", "bus"; + operating-points-v2 = <&dsi_opp_table>; + power-domains = <&rpmhpd SDM845_CX>; phys = <&dsi0_phy>; phy-names = "dsi"; @@ -3504,6 +4288,8 @@ "core", "iface", "bus"; + operating-points-v2 = <&dsi_opp_table>; + power-domains = <&rpmhpd SDM845_CX>; phys = <&dsi1_phy>; phy-names = "dsi"; @@ -3569,48 +4355,58 @@ qcom,gmu = <&gmu>; + interconnects = <&mem_noc MASTER_GFX3D 0 &mem_noc SLAVE_EBI1 0>; + interconnect-names = "gfx-mem"; + gpu_opp_table: opp-table { compatible = "operating-points-v2"; opp-710000000 { opp-hz = /bits/ 64 <710000000>; opp-level = ; + opp-peak-kBps = <7216000>; }; opp-675000000 { opp-hz = /bits/ 64 <675000000>; opp-level = ; + opp-peak-kBps = <7216000>; }; opp-596000000 { opp-hz = /bits/ 64 <596000000>; opp-level = ; + opp-peak-kBps = <6220000>; }; opp-520000000 { opp-hz = /bits/ 64 <520000000>; opp-level = ; + opp-peak-kBps = <6220000>; }; opp-414000000 { opp-hz = /bits/ 64 <414000000>; opp-level = ; + opp-peak-kBps = <4068000>; }; opp-342000000 { opp-hz = /bits/ 64 <342000000>; opp-level = ; + opp-peak-kBps = <2724000>; }; opp-257000000 { opp-hz = /bits/ 64 <257000000>; opp-level = ; + opp-peak-kBps = <1648000>; }; }; }; adreno_smmu: iommu@5040000 { - compatible = "qcom,sdm845-smmu-v2", "qcom,smmu-v2"; + compatible = "qcom,sdm845-smmu-v2", "qcom,adreno-smmu", "qcom,smmu-v2"; reg = <0 0x5040000 0 0x10000>; #iommu-cells = <1>; #global-interrupts = <2>; @@ -3778,6 +4574,21 @@ cell-index = <0>; }; + imem@146bf000 { + compatible = "simple-mfd"; + reg = <0 0x146bf000 0 0x1000>; + + #address-cells = <1>; + #size-cells = <1>; + + ranges = <0 0 0x146bf000 0x1000>; + + pil-reloc@94c { + compatible = "qcom,pil-reloc-info"; + reg = <0x94c 0xc8>; + }; + }; + apps_smmu: iommu@15000000 { compatible = "qcom,sdm845-smmu-500", "arm,mmu-500"; reg = <0 0x15000000 0 0x80000>; @@ -3861,7 +4672,7 @@ gladiator_noc: interconnect@17900000 { compatible = "qcom,sdm845-gladiator-noc"; reg = <0 0x17900000 0 0xd080>; - #interconnect-cells = <1>; + #interconnect-cells = <2>; qcom,bcm-voters = <&apps_bcm_voter>; }; @@ -3869,6 +4680,7 @@ compatible = "qcom,apss-wdt-sdm845", "qcom,kpss-wdt"; reg = <0 0x17980000 0 0x1000>; clocks = <&sleep_clk>; + interrupts = ; }; apss_shared: mailbox@17990000 { @@ -3976,7 +4788,7 @@ }; }; - slimbam: dma@17184000 { + slimbam: dma-controller@17184000 { compatible = "qcom,bam-v1.7.0"; qcom,controlled-remotely; reg = <0 0x17184000 0 0x2a000>; -- 2.45.2